# Arquivo de referência pra distribuição ao cliente final.
#
# Diferença do docker-compose.yml de dev: usa "image:" (imagem já publicada
# no registry) em vez de "build: ." — quem roda este arquivo NÃO precisa do
# código-fonte, só deste arquivo + de um .env preenchido.
#
# Registry público (mesmo modelo do linuxcontrolcenter) — "docker compose
# pull" funciona sem "docker login" e sem credencial nenhuma pra distribuir
# ou rotacionar por cliente.
#
# Redis e Postgres também são espelhados dentro do projeto pwnedworker no
# registry (em vez de vir direto do Docker Hub) — assim o cliente só precisa
# liberar UM domínio de saída (registry.7dev.net.br), não três. Ver
# 01-requisitos.md.
#
# Tag "stable" acompanha a última versão testada. Pra fixar uma versão
# específica (rollback, ambiente que não quer atualizar sozinho), troque
# "stable" por uma tag semver publicada em paralelo, ex:
# registry.7dev.net.br/pwnedworker/app:0.1.0
services:
  redis:
    image: registry.7dev.net.br/pwnedworker/redis:7-alpine
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  postgres:
    image: registry.7dev.net.br/pwnedworker/postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-pwnedworker}
      POSTGRES_USER: ${POSTGRES_USER:-pwnedworker}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?defina POSTGRES_PASSWORD no .env}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-pwnedworker}"]
      interval: 5s
      timeout: 3s
      retries: 5

  web:
    image: registry.7dev.net.br/pwnedworker/app:stable
    restart: unless-stopped
    # Usa o entrypoint da própria imagem (docker/entrypoint-web.sh): aplica
    # a migração e, se INITIAL_ADMIN_USERNAME/PASSWORD estiverem no .env,
    # provisiona o usuário inicial automaticamente — o cliente nunca roda
    # comando nenhum de criação de usuário.
    ports:
      - "8000:8000"
    env_file:
      - .env
    # /ready confirma que a aplicação responde E que banco e Redis estão
    # acessíveis. Como o Gunicorn só sobe depois de o entrypoint terminar a
    # migração, "web saudável" equivale a "schema pronto" — é disso que o
    # worker depende abaixo.
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://localhost:8000/ready"]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s
    depends_on:
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy

  worker:
    image: registry.7dev.net.br/pwnedworker/app:stable
    restart: unless-stopped
    command: celery -A pwnedworker worker -l info --concurrency=4
    env_file:
      - .env
    # Mesma checagem que o chart Helm usa como livenessProbe. Sem ela o
    # worker aparece só como "Up" no "docker compose ps", nunca "healthy",
    # e quem segue a doc acha que subiu errado.
    healthcheck:
      test: ["CMD", "celery", "-A", "pwnedworker", "inspect", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    depends_on:
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy
      # service_healthy, não service_started: o worker não roda "migrate"
      # (quem roda é o entrypoint do "web"), então subir antes da migração
      # terminar faria as primeiras tarefas estourarem em tabela inexistente.
      web:
        condition: service_healthy

volumes:
  postgres_data:
