# Docker Deployment Guide - SIGED Sistema Militar

Guia completo para configuração e deployment do SIGED usando Docker e Docker Compose.

## Pré-requisitos

- Docker (versão 20.10 ou superior)
- Docker Compose (versão 2.0 ou superior)
- Git
- Terminal/Console (Bash, PowerShell ou similares)

### Instalação de Docker

#### Windows
1. Baixar [Docker Desktop para Windows](https://www.docker.com/products/docker-desktop)
2. Instalar seguindo as instruções do instalador
3. Abrir PowerShell e verificar: `docker --version`

#### macOS
```bash
# Via Homebrew
brew install docker docker-compose
```

#### Linux (Ubuntu/Debian)
```bash
# Instalar Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

# Instalar Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

## Configuração Local com Docker

### 1. Clonar ou Preparar o Projeto

```bash
# Se ainda não tiver o projeto
git clone https://seu-repositorio.git SIGED
cd SIGED

# Ou se já tem o projeto
cd "Conversão SIGED para Laravel"
```

### 2. Configurar Variáveis de Ambiente

```bash
# Copiar arquivo de exemplo
cp .env.example .env

# Editar .env com suas configurações
# Variáveis importantes:
# - DB_DATABASE=siged_laravel
# - DB_USERNAME=siged_user
# - DB_PASSWORD=sua_senha_segura
# - APP_KEY=base64:... (gerar com comando abaixo)
```

### 3. Gerar Chave da Aplicação

```bash
# Antes de rodar docker-compose, gerar a chave
php artisan key:generate

# Ou depois que os containers estiverem rodando
docker-compose exec app php artisan key:generate
```

### 4. Construir e Iniciar os Containers

```bash
# Build das imagens (primeira vez)
docker-compose build

# Iniciar os containers em background
docker-compose up -d

# Verificar status dos containers
docker-compose ps
```

### 5. Instalar Dependências

```bash
# Instalar dependências PHP com Composer
docker-compose exec app composer install

# Instalar dependências JavaScript (se houver)
docker-compose exec app npm install
# docker-compose exec app npm run build
```

### 6. Executar Migrations e Seeds

```bash
# Rodar todas as migrations
docker-compose exec app php artisan migrate

# Rodar seeds (dados de teste)
docker-compose exec app php artisan db:seed

# Ou seeder específico
docker-compose exec app php artisan db:seed --class=MigracaoTestSeeder
```

### 7. Verificar Acessibilidade

```bash
# A aplicação estará disponível em:
# http://localhost (Nginx)
# http://localhost:3306 (MySQL - para cliente MySQL)
# http://localhost:6379 (Redis)
```

## Comandos Úteis

### Gerenciar Containers

```bash
# Ver logs de um serviço
docker-compose logs app
docker-compose logs mysql
docker-compose logs nginx

# Acompanhar logs em tempo real
docker-compose logs -f app

# Parar todos os containers
docker-compose stop

# Reiniciar containers
docker-compose restart

# Parar e remover containers
docker-compose down

# Remover volumes (dados do banco)
docker-compose down -v
```

### Executar Comandos no Container

```bash
# Acessar terminal PHP
docker-compose exec app bash

# Executar comando Laravel
docker-compose exec app php artisan tinker
docker-compose exec app php artisan cache:clear
docker-compose exec app php artisan view:cache

# Executar testes
docker-compose exec app php artisan test
```

### Gerenciar Banco de Dados

```bash
# Acessar MySQL console
docker-compose exec mysql mysql -u siged_user -p siged_laravel

# Fazer backup do banco
docker-compose exec mysql mysqldump -u siged_user -p siged_laravel > backup.sql

# Restaurar backup
docker-compose exec -T mysql mysql -u siged_user -p siged_laravel < backup.sql
```

### Redis Commands

```bash
# Acessar Redis console
docker-compose exec redis redis-cli

# Dentro do Redis:
# FLUSHDB          - Limpar dados
# KEYS *           - Listar todas as chaves
# GET key_name     - Obter valor
# DEL key_name     - Deletar chave
```

## Troubleshooting

### Problema: Container não inicia

```bash
# Verificar logs detalhados
docker-compose logs app

# Verificar saúde dos containers
docker-compose ps

# Reconstruir imagem
docker-compose down
docker-compose build --no-cache
docker-compose up -d
```

### Problema: Permissão negada em volumes

```bash
# Ajustar permissões (Linux/macOS)
chmod -R 775 storage bootstrap/cache
chown -R 1000:1000 storage bootstrap/cache

# No Docker, isso geralmente é feito no Dockerfile
```

### Problema: Porta já está em uso

```bash
# Encontrar processo usando a porta
lsof -i :80
lsof -i :3306
lsof -i :6379

# Ou parar containers anteriores
docker-compose down
```

### Problema: Banco de dados não conecta

```bash
# Verificar se MySQL está pronto
docker-compose exec mysql mysqladmin ping

# Ver logs do MySQL
docker-compose logs mysql

# Verificar variáveis de ambiente
docker-compose exec app env | grep DB_
```

## Deploy em Produção

### Preparação

1. **Segurança:**
   - Usar senhas fortes
   - Não versioniar .env
   - Usar secrets no Docker Swarm ou Kubernetes

2. **Performance:**
   - Otimizar imagem Docker (multi-stage builds)
   - Usar reverse proxy (Nginx/Traefik)
   - Configurar recursos (CPU/Memory limits)

3. **Monitoramento:**
   - Implementar health checks
   - Coletar logs (ELK stack, etc)
   - Monitorar performance

### Exemplo: Docker Swarm

```bash
# Inicializar Swarm
docker swarm init

# Fazer deploy
docker stack deploy -c docker-compose.yml siged

# Verificar status
docker stack ls
docker service ls
```

### Exemplo: Kubernetes

```bash
# Converter docker-compose para Kubernetes
kompose convert -f docker-compose.yml

# Fazer deploy
kubectl apply -f .

# Verificar status
kubectl get pods
kubectl logs <pod-name>
```

## Desenvolvimento com Hot Reload

### PHP (Xdebug)

```bash
# Adicionar ao Dockerfile:
RUN pecl install xdebug && docker-php-ext-enable xdebug

# Configurar IDE (VS Code, PHPStorm)
# Port: 9003
# Path mapping: /app -> ./
```

### JavaScript/Assets

```bash
# Compilar assets em desenvolvimento
docker-compose exec app npm run watch

# Ou usar Vite
docker-compose exec app npm run dev
```

## Backup e Restore

### Backup Completo

```bash
#!/bin/bash
BACKUP_DIR="./backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Backup do banco
docker-compose exec -T mysql mysqldump \
  -u siged_user -psenha siged_laravel \
  > $BACKUP_DIR/db_$TIMESTAMP.sql

# Backup de arquivos
tar -czf $BACKUP_DIR/files_$TIMESTAMP.tar.gz \
  --exclude=node_modules \
  --exclude=vendor \
  --exclude=storage/logs \
  .

echo "Backup concluído: $BACKUP_DIR"
```

### Restore

```bash
# Restaurar banco
docker-compose exec -T mysql mysql \
  -u siged_user -psenha siged_laravel \
  < backups/db_20240101_120000.sql

# Restaurar arquivos
tar -xzf backups/files_20240101_120000.tar.gz
```

## Recursos Adicionais

- [Documentação oficial Docker](https://docs.docker.com/)
- [Documentação Docker Compose](https://docs.docker.com/compose/)
- [Laravel Docker Documentation](https://laravel.com/docs/deployment#docker)
- [Nginx Documentation](https://nginx.org/en/docs/)
- [MySQL Documentation](https://dev.mysql.com/doc/)

## Suporte

Para problemas e dúvidas:
- Verificar logs: `docker-compose logs`
- Consultar documentação oficial
- Abrir issue no repositório GitHub
- Contatar time de desenvolvimento
