volumes: logs: media: postgres-data: static-files: x-db-connection-env: &db-connection-env POSTGRES_HOST: ${POSTGRES_HOST:-db} POSTGRES_PORT: ${POSTGRES_PORT:-5432} POSTGRES_DB: &pg-database ${POSTGRES_DB:-newsreader} POSTGRES_USER: &pg-user ${POSTGRES_USER:-newsreader} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-newsreader} x-db-env: &db-env <<: *db-connection-env PGUSER: *pg-user PGDATABASE: *pg-database x-django-env: &django-env <<: *db-connection-env ALLOWED_HOSTS: ${ALLOWED_HOSTS:-localhost,127.0.0.1,django} INTERNAL_IPS: ${INTERNAL_IPS:-localhost,127.0.0.1,django} # see token_urlsafe from python's secret module to generate one DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-Ojg68lYsP3kq2r5JgozUzKVSRFywm17BTMS5iwpLM44} DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE:-newsreader.conf.production} ADMINS: ${ADMINS:-""} VERSION: ${VERSION:-""} # Email EMAIL_HOST: ${EMAIL_HOST:-localhost} EMAIL_PORT: ${EMAIL_PORT:-25} EMAIL_HOST_USER: ${EMAIL_HOST_USER:-""} EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-""} EMAIL_USE_TLS: ${EMAIL_USE_TLS:-no} EMAIL_USE_SSL: ${EMAIL_USE_SSL:-no} EMAIL_DEFAULT_FROM: ${EMAIL_DEFAULT_FROM:-webmaster@localhost} # Sentry SENTRY_DSN: ${SENTRY_DSN:-""} services: db: environment: <<: *db-env image: postgres:15 healthcheck: test: /usr/bin/pg_isready start_period: 10s interval: 5s timeout: 10s retries: 10 volumes: - postgres-data:/var/lib/postgresql/data rabbitmq: image: rabbitmq:4 memcached: image: memcached:1.6 entrypoint: - memcached - -m 64 django: build: &app-build context: . target: production environment: <<: *django-env entrypoint: ["/bin/sh", "/app/bin/docker-entrypoint.sh"] command: | uv run --no-sync -- gunicorn --bind 0.0.0.0:8000 --workers 3 --chdir /app/src/ newsreader.wsgi:application healthcheck: test: /usr/bin/curl --fail http://django:8000 || exit 1 start_period: 10s interval: 10s timeout: 10s retries: 5 depends_on: memcached: condition: service_started db: condition: service_healthy volumes: - logs:/app/logs - media:/app/media - static-files:/app/static celery: build: <<: *app-build environment: <<: *django-env command: | uv run --no-sync -- celery --app newsreader --workdir /app/src/ worker --loglevel INFO --concurrency 2 --beat --scheduler django -n worker1@%h -n worker2@%h healthcheck: test: uv run --no-sync -- celery --app newsreader status || exit 1 start_period: 10s interval: 10s timeout: 10s retries: 5 depends_on: rabbitmq: condition: service_started django: condition: service_healthy volumes: - logs:/app/logs