version: '3.8' services: db: image: postgres:15-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data - ./backups:/backups deploy: resources: limits: memory: 1G cpus: '1.0' healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 30s timeout: 10s retries: 5 redis: image: redis:7-alpine restart: unless-stopped command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data deploy: resources: limits: memory: 512M cpus: '0.5' web: build: context: ./app dockerfile: Dockerfile restart: unless-stopped environment: - DEBUG=False - ALLOWED_HOSTS=${ALLOWED_HOSTS} - SECRET_KEY=${SECRET_KEY} - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 volumes: - ./app/media:/app/media - ./app/static:/app/static - ./backups:/app/backups depends_on: db: condition: service_healthy redis: condition: service_started deploy: resources: limits: memory: 1G cpus: '1.0' ports: - "127.0.0.1:8000:8000" worker: build: context: ./app dockerfile: Dockerfile restart: unless-stopped command: celery -A core worker -l info --concurrency=2 environment: - DEBUG=False - SECRET_KEY=${SECRET_KEY} - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 volumes: - ./app/media:/app/media - ./backups:/app/backups depends_on: db: condition: service_healthy redis: condition: service_started deploy: resources: limits: memory: 512M cpus: '0.5' beat: build: context: ./app dockerfile: Dockerfile restart: unless-stopped command: celery -A core beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler environment: - DEBUG=False - SECRET_KEY=${SECRET_KEY} - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 volumes: - ./app/media:/app/media - ./backups:/app/backups depends_on: db: condition: service_healthy redis: condition: service_started deploy: resources: limits: memory: 256M cpus: '0.25' grampsweb: image: ghcr.io/gramps-project/grampsweb:latest restart: unless-stopped environment: GRAMPSWEB_TREE: ${GRAMPSWEB_TREE:-Stiftung} GRAMPSWEB_SECRET_KEY: ${GRAMPSWEB_SECRET_KEY} GRAMPSWEB_ADMIN_EMAIL: ${GRAMPSWEB_ADMIN_EMAIL} GRAMPSWEB_ADMIN_PASSWORD: ${GRAMPSWEB_ADMIN_PASSWORD} volumes: - gramps_users:/app/users - gramps_index:/app/indexdir - gramps_thumb_cache:/app/thumbnail_cache - gramps_cache:/app/cache - gramps_secret:/app/secret - ./media:/app/media ports: - "127.0.0.1:5000:5000" deploy: resources: limits: memory: 512M cpus: '0.5' volumes: postgres_data: redis_data: gramps_users: gramps_index: gramps_thumb_cache: gramps_cache: gramps_secret: networks: default: driver: bridge