# Local development only. Production is not deployed with this file. services: db: image: postgres:18.6 restart: unless-stopped environment: POSTGRES_DB: ${DATABASE_NAME} POSTGRES_USER: ${DATABASE_USERNAME} POSTGRES_PASSWORD: ${DATABASE_PASSWORD} # postgres 18+ defaults PGDATA to a versioned subdirectory; pin it so the volume below holds the data PGDATA: /var/lib/postgresql/data volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}" ] interval: 10s timeout: 5s retries: 5 pyrigs: build: context: . target: dev restart: unless-stopped environment: SECRET_KEY: ${SECRET_KEY} DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS} DOMAIN: ${DOMAIN:-example.com} DEBUG: ${DEBUG:-true} STAGING: ${STAGING:-false} SESSION_COOKIE_SECURE_ENABLED: ${SESSION_COOKIE_SECURE_ENABLED:-true} CSRF_COOKIE_SECURE_ENABLED: ${CSRF_COOKIE_SECURE_ENABLED:-true} FORUM_WEBHOOK_SECRET: ${FORUM_WEBHOOK_SECRET} DATABASE_ENGINE: ${DATABASE_ENGINE:-postgresql} DATABASE_NAME: ${DATABASE_NAME} DATABASE_USERNAME: ${DATABASE_USERNAME} DATABASE_PASSWORD: ${DATABASE_PASSWORD} DATABASE_HOST: ${DATABASE_HOST:-db} DATABASE_PORT: ${DATABASE_PORT:-5432} EMAIL_HOST: ${EMAIL_HOST} EMAIL_PORT: ${EMAIL_PORT:-25} EMAIL_HOST_USER: ${EMAIL_HOST_USER} EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} EMAIL_USE_TLS: ${EMAIL_USE_TLS:-false} EMAIL_USE_SSL: ${EMAIL_USE_SSL:-false} EMAIL_FROM: ${EMAIL_FROM} HCAPTCHA_SITEKEY: ${HCAPTCHA_SITEKEY:-10000000-ffff-ffff-ffff-000000000001} HCAPTCHA_SECRET: ${HCAPTCHA_SECRET:-0x0000000000000000000000000000000000000000} SENTRY_DSN: ${SENTRY_DSN:-} ports: - "8000:8000" volumes: # The source is mounted rather than copied: the Django dev server reloads on every change - .:/app healthcheck: # the dev server only starts listening once migrations have finished test: [ "CMD", "python", "-c", "import socket; socket.create_connection(('127.0.0.1', 8000), 2).close()" ] interval: 10s timeout: 5s retries: 5 start_period: 60s depends_on: db: condition: service_healthy command: - sh - -c - | python manage.py migrate --noinput && exec python manage.py runserver 0.0.0.0:8000 develop: watch: # `docker compose watch` rebuilds the image when the dependencies change - action: rebuild path: ./pyproject.toml - action: rebuild path: ./uv.lock # Rebuilds the CSS/JS bundles into pipeline/built_assets whenever the sources change assets: image: node:24-slim working_dir: /app volumes: - .:/app - node_modules:/app/node_modules - npm_cache:/root/.npm command: - sh - -c - | if [ ! -d node_modules/.bin ] || [ package-lock.json -nt node_modules/.package-lock.json ]; then npm ci fi exec npx gulp watchAssets volumes: postgres_data: node_modules: npm_cache: