# Guia: Downloads de Arquivos Grandes em Docker

## Problema
Downloads de arquivos grandes (>50MB) ficam corrompidos ou incompletos em ambiente Docker com Nginx + FastCGI, baixando apenas 40MB-80MB do arquivo.

## Soluções Implementadas

### 1. Código PHP Otimizado para Docker
```php
// Chunks menores (8KB em vez de 64KB)
$chunkSize = 1024 * 8;

// Flush mais frequente (a cada 512KB ou 0.25 segundos)
if ($totalBytes % (1024 * 512) === 0 || ($currentTime - $lastFlushTime) > 0.25) {
    if (ob_get_level()) {
        ob_flush();
    }
    flush();
}

// Headers específicos para Nginx
'X-Accel-Buffering' => 'no',
'X-Sendfile-Type' => 'X-Accel-Redirect',
```

### 2. Configuração do PHP (local.ini)
```ini
upload_max_filesize=2G
post_max_size=2G
memory_limit=8G
max_execution_time=3600
max_input_time=3600

; Configurações específicas para downloads
output_buffering=Off
implicit_flush=On
zlib.output_compression=Off

; Configurações de buffer para FastCGI
fastcgi.logging=0
fastcgi.buffering=0

; Configurações de timeout para downloads
default_socket_timeout=3600
max_input_vars=10000

; Configurações de memória para streams
stream_read_buffer_size=8192
stream_write_buffer_size=8192
```

### 3. Configuração do Nginx (nginx.conf)
```nginx
# Configurações globais
client_max_body_size 10G;
fastcgi_buffering off;
fastcgi_buffer_size 8k;
fastcgi_buffers 16 8k;
fastcgi_busy_buffers_size 16k;

# Headers críticos
add_header X-Accel-Buffering no;
add_header X-Sendfile-Type X-Accel-Redirect;

# Timeouts aumentados
fastcgi_read_timeout 3600s;
fastcgi_send_timeout 3600s;
```

## Testes e Diagnóstico

### 1. Comando de Teste Específico para Docker
```bash
# Teste básico
php artisan docker:test-download

# Teste com arquivo específico
php artisan docker:test-download --file=caminho/do/arquivo.pdf

# Teste com tamanho específico
php artisan docker:test-download --size=200
```

### 2. Verificar Configurações do Docker
```bash
# Verificar se está em container
ls -la /.dockerenv

# Verificar configurações do PHP
php -i | grep -E "(max_execution_time|output_buffering|zlib.output_compression)"

# Verificar se está rodando com PHP-FPM
php -i | grep "Server API"
```

### 3. Logs de Monitoramento
```bash
# Logs do container
docker logs syllos_usuarios

# Logs do Nginx
docker exec syllos_usuarios tail -f /var/log/nginx/error.log

# Logs da aplicação
docker exec syllos_usuarios tail -f /var/www/syllos_usuarios/storage/logs/laravel.log
```

## Troubleshooting Específico para Docker

### Problema: Download para em 40MB
**Solução:**
1. Verificar `fastcgi_buffering off` no nginx.conf
2. Verificar `X-Accel-Buffering: no` no header
3. Verificar `output_buffering = Off` no local.ini
4. Usar chunks de 8KB em vez de 64KB

### Problema: Timeout após 30 segundos
**Solução:**
1. Aumentar `fastcgi_read_timeout` para 3600s
2. Aumentar `max_execution_time` para 3600
3. Verificar `request_terminate_timeout` no PHP-FPM

### Problema: Erro 502 Bad Gateway
**Solução:**
1. Verificar se o container PHP-FPM está rodando
2. Verificar conectividade entre containers
3. Verificar configurações do docker-compose.yml

### Problema: Arquivo corrompido
**Solução:**
1. Verificar se `zlib.output_compression = Off`
2. Verificar se `gzip off` no Nginx
3. Usar chunks menores (8KB)
4. Flush mais frequente (a cada 512KB)

## Configuração do Docker Compose

### docker-compose.yml (exemplo)
```yaml
version: '3.8'

services:
  syllos_usuarios:
    build: .
    container_name: syllos_usuarios
    ports:
      - "9002:9000"
    volumes:
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    environment:
      - S3_ATTACH_STORAGE_NAME=s3_attachments
    networks:
      - app-network

  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./syllos_usuarios:/var/www/syllos_usuarios
    depends_on:
      - syllos_usuarios
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
```

## Comandos Úteis para Docker

### Reiniciar Containers
```bash
# Reiniciar todos os containers
docker-compose restart

# Reiniciar apenas o container da aplicação
docker-compose restart syllos_usuarios

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

### Verificar Logs
```bash
# Logs em tempo real
docker-compose logs -f

# Logs específicos
docker-compose logs syllos_usuarios
docker-compose logs nginx

# Entrar no container para debug
docker exec -it syllos_usuarios bash
```

### Verificar Configurações
```bash
# Verificar configuração do Nginx
docker exec nginx nginx -t

# Verificar configuração do PHP
docker exec syllos_usuarios php --ini

# Verificar variáveis de ambiente
docker exec syllos_usuarios env | grep S3
```

### Limpar Cache
```bash
# Limpar cache do Laravel
docker exec syllos_usuarios php artisan cache:clear
docker exec syllos_usuarios php artisan config:clear

# Limpar cache do Nginx
docker exec nginx rm -rf /var/cache/nginx/*
```

## Monitoramento em Docker

### 1. Métricas de Container
```bash
# Verificar uso de recursos
docker stats syllos_usuarios nginx

# Verificar uso de memória
docker exec syllos_usuarios free -h

# Verificar uso de disco
docker exec syllos_usuarios df -h
```

### 2. Logs de Performance
```bash
# Monitorar logs de download
docker exec syllos_usuarios tail -f /var/www/syllos_usuarios/storage/logs/laravel.log | grep "download"

# Monitorar logs de erro do Nginx
docker exec nginx tail -f /var/log/nginx/downloads_error.log
```

### 3. Alertas Recomendados
```bash
# Alertar se container não responder
# Alertar se uso de memória > 80%
# Alertar se download demorar > 10 minutos
# Alertar se taxa de erro > 5%
```

## Otimizações Específicas para Docker

### 1. Configurações de Rede
```yaml
# docker-compose.yml
services:
  syllos_usuarios:
    networks:
      - app-network
    sysctls:
      - net.core.rmem_max=16777216
      - net.core.wmem_max=16777216
```

### 2. Configurações de Memória
```yaml
# docker-compose.yml
services:
  syllos_usuarios:
    deploy:
      resources:
        limits:
          memory: 4G
        reservations:
          memory: 2G
```

### 3. Configurações de Volume
```yaml
# docker-compose.yml
services:
  nginx:
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./syllos_usuarios:/var/www/syllos_usuarios:ro
```

## Suporte

Em caso de problemas:
1. Execute `php artisan docker:test-download`
2. Verifique logs dos containers
3. Teste com arquivo pequeno primeiro
4. Verifique conectividade entre containers
5. Entre em contato com o time de infraestrutura

## Histórico de Mudanças

- **v1.0**: Implementação inicial para Docker
- **v1.1**: Otimização de chunks para 8KB
- **v1.2**: Configurações específicas de buffer
- **v1.3**: Comando de teste para Docker
- **v1.4**: Configurações de timeout aumentadas 
