services: db: image: postgres:16 environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} restart: unless-stopped volumes: [pgdata:/var/lib/postgresql/data] ports: ["127.0.0.1:${DB_HOST_PORT}:5432"] healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 3s retries: 20 app: build: . restart: unless-stopped depends_on: db: {condition: service_healthy} environment: DATABASE_URL: postgresql+psycopg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} JWT_SECRET: ${JWT_SECRET} ADMIN_USERNAME: ${ADMIN_USERNAME} ADMIN_PASSWORD: ${ADMIN_PASSWORD} TRUSTED_PROXIES: ${TRUSTED_PROXIES:-} # APP_BIND: 0.0.0.0 — доступ из LAN (по умолчанию, как раньше); 127.0.0.1 — только через reverse-proxy с TLS (см. README «Публикация») ports: ["${APP_BIND:-0.0.0.0}:${APP_PORT}:8000"] healthcheck: test: ["CMD", "python", "-c", "import sys, urllib.request; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8000/healthz', timeout=3).status == 200 else 1)"] interval: 15s timeout: 5s start_period: 30s retries: 5 volumes: pgdata: