Resolves BARAAA-70 - agenthub-ofelia-1 container restart loop The Ofelia scheduler was not defined in the compose file, only the Ofelia labels on the backup service existed. This caused a container restart loop because there was no Ofelia service to read those labels and execute scheduled tasks. Changes: - Add ofelia service with mcuadros/ofelia:latest image - Mount Docker socket read-only for container monitoring - Depend on postgres (aligned with compose.lan.yml) - Add ofelia.enabled=true label for auto-activation - Add verification script (scripts/verify-ofelia.sh) - Add verification documentation (docs/BARAAA-70-VERIFICATION.md) After deployment, the Ofelia container should start successfully and detect the backup-daily cron job (daily at 3am UTC). Co-Authored-By: Paperclip <noreply@paperclip.ing>
158 lines
4.3 KiB
YAML
158 lines
4.3 KiB
YAML
services:
|
|
app:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
environment:
|
|
NODE_ENV: production
|
|
PORT: 3000
|
|
HOST: 0.0.0.0
|
|
LOG_LEVEL: info
|
|
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
|
|
POSTGRES_PORT: ${POSTGRES_PORT:-5432}
|
|
POSTGRES_USER: ${POSTGRES_USER:-agenthub}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
POSTGRES_DB: ${POSTGRES_DB:-agenthub}
|
|
REDIS_HOST: ${REDIS_HOST:-redis}
|
|
REDIS_PORT: ${REDIS_PORT:-6379}
|
|
JWT_SECRET: ${JWT_SECRET}
|
|
ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-https://agenthub-v2.barodine.net}
|
|
networks:
|
|
- default
|
|
- coolify
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_started
|
|
restart: unless-stopped
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
- 'coolify.name=agenthub'
|
|
- 'coolify.type=application'
|
|
- 'traefik.enable=true'
|
|
- 'traefik.docker.network=coolify'
|
|
- 'traefik.http.routers.agenthub.rule=Host(`agenthub-v2.barodine.net`)'
|
|
- 'traefik.http.routers.agenthub.entrypoints=websecure'
|
|
- 'traefik.http.routers.agenthub.tls=true'
|
|
- 'traefik.http.routers.agenthub.tls.certresolver=letsencrypt'
|
|
- 'traefik.http.services.agenthub.loadbalancer.server.port=3000'
|
|
- 'traefik.http.middlewares.agenthub-headers.headers.customrequestheaders.X-Forwarded-Proto=https'
|
|
- 'traefik.http.routers.agenthub.middlewares=agenthub-headers'
|
|
healthcheck:
|
|
test: ['CMD', 'curl', '-f', 'http://localhost:3000/healthz']
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
environment:
|
|
POSTGRES_DB: ${POSTGRES_DB:-agenthub}
|
|
POSTGRES_USER: ${POSTGRES_USER:-agenthub}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
POSTGRES_INITDB_ARGS: '--encoding=UTF8 --locale=C'
|
|
PGDATA: /var/lib/postgresql/data/pgdata
|
|
volumes:
|
|
- postgres_data_v2:/var/lib/postgresql/data
|
|
ports:
|
|
- '15432:5432'
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-agenthub} -d ${POSTGRES_DB:-agenthub}']
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 10s
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
- 'coolify.type=database'
|
|
|
|
redis:
|
|
image: redis:7-alpine
|
|
command:
|
|
- redis-server
|
|
- --save 60 100
|
|
- --appendonly yes
|
|
- --appendfsync everysec
|
|
- --maxmemory 256mb
|
|
- --maxmemory-policy allkeys-lru
|
|
volumes:
|
|
- redis_data:/data
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ['CMD', 'redis-cli', 'ping']
|
|
interval: 10s
|
|
timeout: 3s
|
|
retries: 3
|
|
start_period: 5s
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
- 'coolify.type=database'
|
|
|
|
backup:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.backup
|
|
environment:
|
|
PGHOST: postgres
|
|
PGPORT: 5432
|
|
PGDATABASE: ${POSTGRES_DB:-agenthub}
|
|
PGUSER: ${POSTGRES_USER:-agenthub}
|
|
PGPASSWORD: ${POSTGRES_PASSWORD}
|
|
BACKUP_DIR: /backups
|
|
RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-14}
|
|
S3_ENDPOINT: ${S3_ENDPOINT:-}
|
|
S3_BUCKET: ${S3_BUCKET:-}
|
|
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-}
|
|
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-}
|
|
GPG_RECIPIENT_KEY: ${GPG_RECIPIENT_KEY:-}
|
|
volumes:
|
|
- backup_data:/backups
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
restart: 'no'
|
|
profiles:
|
|
- backup
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
- 'coolify.type=service'
|
|
- 'ofelia.enabled=true'
|
|
- 'ofelia.job-exec.backup-daily.schedule=0 0 3 * * *'
|
|
- 'ofelia.job-exec.backup-daily.command=/usr/local/bin/backup.sh'
|
|
|
|
ofelia:
|
|
image: mcuadros/ofelia:latest
|
|
command: daemon --docker
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- postgres
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
- 'coolify.type=service'
|
|
- 'ofelia.enabled=true'
|
|
|
|
volumes:
|
|
postgres_data_v2:
|
|
driver: local
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
redis_data:
|
|
driver: local
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
backup_data:
|
|
driver: local
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
|
|
networks:
|
|
default:
|
|
labels:
|
|
- 'coolify.managed=true'
|
|
coolify:
|
|
external: true
|