# Stack de despliegue de 'agendapro' en el server E3 (Docker Swarm single-node + Traefik). # Generado por New-E3Scaffold.ps1 - https://agendapro.consultoriae3.com # # NO EDITES A LA LIGERA: # - Las labels de Traefik van bajo deploy.labels. Fuera de ahi se IGNORAN (servicio 1/1 + HTTP 404). # - Sin clave 'build:' - Swarm no construye; la imagen tiene que existir ya. # - Sin clave 'ports:' - el unico que publica al host es Traefik (80/443). # - Los marcadores de secreto se sustituyen AL DESPLEGAR (Deploy-E3Stack.ps1 -SecretsFile). # No los rellenes con valores reales aqui si este archivo se versiona en git. version: "3.7" services: agendapro: # Taguear por SHA y no ':latest': con un tag rodante Swarm no vuelve a # hacer pull y un 'service update' no jala la imagen nueva. image: agendapro:6d67b23 networks: - network_public # El healthcheck consulta la base, no solo el puerto: un proceso vivo con # Postgres caido no esta sano, y sin esto Swarm lo daria por bueno. healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3100/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 40s environment: - NODE_ENV=production # La variable se llama PLATFORM_PORT, no PORT: `PORT` es la del backend de # demo de server/, que es otro proceso. Con la equivocada, el servidor # escucharia en 3100 por defecto igualmente, pero por casualidad. - PLATFORM_PORT=3100 - HOST=0.0.0.0 # UTC, NO America/Mexico_City. # # La agenda saca la zona de `businesses.timezone`, no del proceso, y las # pruebas corren en UTC a proposito para que la del proceso y la del # negocio nunca coincidan. Poner aqui la de Mexico haria que una recaida a # la zona del proceso pasara desapercibida en produccion, que es # exactamente el fallo que ya costo un incidente en este repo. - TZ=UTC # Postgres 14 compartido - host = nombre de servicio en network_public # Se usa la URL completa del archivo de secretos, que New-E3Database.ps1 ya # deja armada. El andamiaje generaba un marcador de solo-la-contrasena con # otro nombre del que usa ese archivo, se quedaba sin resolver, y el # servicio arrancaba sin poder conectar a Postgres. - DATABASE_URL= # Clave maestra con la que se cifran los tokens de subcuenta de cada # negocio. Sin ella el servidor arranca pero NINGUNA credencial del CRM se # puede descifrar. Se inyecta al desplegar; jamas va en este archivo. - CRM_MASTER_KEY= deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager resources: limits: cpus: "1" memory: 512M restart_policy: condition: on-failure delay: 10s update_config: order: start-first failure_action: rollback labels: - traefik.enable=true - traefik.docker.network=network_public - traefik.http.routers.agendapro.rule=Host(`agendapro.consultoriae3.com`) - traefik.http.routers.agendapro.entrypoints=websecure - traefik.http.routers.agendapro.tls=true - traefik.http.routers.agendapro.tls.certresolver=letsencryptresolver - traefik.http.routers.agendapro.service=agendapro - traefik.http.services.agendapro.loadbalancer.server.port=3100 - traefik.http.services.agendapro.loadbalancer.passHostHeader=1 networks: network_public: external: true name: network_public