# Homologação em hml-ada.elopro.app, no servidor compartilhado do ecossistema. # # Regras que este arquivo respeita, por construção: # - não declara, não reinicia e não depende de nenhum serviço de outro # aplicativo: rede, volume e nome de projeto são exclusivos deste módulo; # - não expõe porta em 0.0.0.0: só 127.0.0.1, para o Nginx fazer o proxy; # - Redis é um contêiner isolado deste aplicativo, com senha e volume próprios, # nunca o Redis compartilhado dos outros aplicativos; # - Postgres não é declarado aqui: é o banco gerenciado do Elo Pro, informado # em DATABASE_URL. Nenhuma migration roda no start — é passo manual aprovado. # # docker compose -f docker-compose.staging.yml --env-file .env.staging up -d --build # docker compose -f docker-compose.staging.yml --env-file .env.staging \ # run --rm web migrate --dry-run name: adaptador-planilhas-hml services: redis: image: redis:7-alpine restart: unless-stopped command: - "redis-server" - "--requirepass" - "${ADAPTER_REDIS_PASSWORD:?defina ADAPTER_REDIS_PASSWORD}" - "--save" - "900" - "1" - "--appendonly" - "no" - "--maxmemory" - "256mb" - "--maxmemory-policy" - "noeviction" ports: - "127.0.0.1:${ADAPTER_REDIS_PORT:-56380}:6379" volumes: - redis-data:/data healthcheck: test: ["CMD-SHELL", "redis-cli -a \"$$REDIS_PASSWORD\" ping | grep -q PONG"] interval: 10s timeout: 5s retries: 10 environment: REDIS_PASSWORD: ${ADAPTER_REDIS_PASSWORD} networks: [adaptador-hml] web: image: ${ADAPTER_IMAGE:-adaptador-planilhas:local} build: context: . target: runner restart: unless-stopped command: ["web"] env_file: - .env.staging environment: ADAPTER_ENV: staging NODE_ENV: production PORT: "3000" HOSTNAME: 0.0.0.0 ports: - "127.0.0.1:${ADAPTER_WEB_PORT:-3110}:3000" depends_on: redis: condition: service_healthy healthcheck: test: - CMD - node - -e - "fetch('http://127.0.0.1:3000/api/health/live').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" interval: 30s timeout: 5s start_period: 20s retries: 3 logging: &logging driver: json-file options: max-size: "10m" max-file: "5" networks: [adaptador-hml] worker: image: ${ADAPTER_IMAGE:-adaptador-planilhas:local} build: context: . target: runner restart: unless-stopped command: ["worker"] env_file: - .env.staging environment: ADAPTER_ENV: staging NODE_ENV: production depends_on: redis: condition: service_healthy # SIGTERM chega ao processo do worker porque o entrypoint usa # `node --import tsx` (sem processo filho). O handler espera o tick corrente # para o `finally` liberar o lock. 30s cobrem um job médio. stop_grace_period: 30s healthcheck: test: ["CMD", "/app/docker/entrypoint.sh", "worker-health"] interval: 30s timeout: 5s start_period: 20s retries: 3 logging: *logging networks: [adaptador-hml] networks: adaptador-hml: name: adaptador-planilhas-hml volumes: redis-data: name: adaptador-planilhas-hml-redis