Files
Messenger/docker-compose.yml
Codex e44e8d1355
Some checks failed
Android CI / android (push) Has been cancelled
Android Release / release (push) Has been cancelled
CI / test (push) Has been cancelled
infra: wire firebase credentials into docker backend and worker
2026-03-09 23:19:06 +03:00

166 lines
5.7 KiB
YAML

x-app-env: &app-env
APP_NAME: ${APP_NAME:-BenyaMessenger}
ENVIRONMENT: ${ENVIRONMENT:-production}
DEBUG: ${DEBUG:-false}
API_V1_PREFIX: ${API_V1_PREFIX:-/api/v1}
AUTO_CREATE_TABLES: ${AUTO_CREATE_TABLES:-true}
SECRET_KEY: ${SECRET_KEY:-change-me-please-with-a-long-random-secret}
JWT_ALGORITHM: ${JWT_ALGORITHM:-HS256}
ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-30}
REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS:-30}
EMAIL_VERIFICATION_TOKEN_EXPIRE_HOURS: ${EMAIL_VERIFICATION_TOKEN_EXPIRE_HOURS:-24}
PASSWORD_RESET_TOKEN_EXPIRE_HOURS: ${PASSWORD_RESET_TOKEN_EXPIRE_HOURS:-1}
POSTGRES_DSN: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-messenger}
REDIS_URL: redis://redis:6379/0
S3_ENDPOINT_URL: http://minio:9000
S3_PUBLIC_ENDPOINT_URL: ${S3_PUBLIC_ENDPOINT_URL:-http://localhost:${MINIO_API_PORT:-9000}}
S3_ACCESS_KEY: ${MINIO_ROOT_USER:-minioadmin}
S3_SECRET_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin}
S3_REGION: ${S3_REGION:-us-east-1}
S3_BUCKET_NAME: ${S3_BUCKET_NAME:-messenger-media}
S3_PRESIGN_EXPIRE_SECONDS: ${S3_PRESIGN_EXPIRE_SECONDS:-900}
MAX_UPLOAD_SIZE_BYTES: ${MAX_UPLOAD_SIZE_BYTES:-104857600}
FRONTEND_BASE_URL: ${FRONTEND_BASE_URL:-http://localhost}
SMTP_HOST: ${SMTP_HOST:-mailpit}
SMTP_PORT: ${SMTP_PORT:-1025}
SMTP_USERNAME: ${SMTP_USERNAME:-}
SMTP_PASSWORD: ${SMTP_PASSWORD:-}
EMAIL_PROVIDER: ${EMAIL_PROVIDER:-log}
SMTP_USE_TLS: ${SMTP_USE_TLS:-false}
SMTP_USE_SSL: ${SMTP_USE_SSL:-false}
SMTP_TIMEOUT_SECONDS: ${SMTP_TIMEOUT_SECONDS:-10}
SMTP_FROM_EMAIL: ${SMTP_FROM_EMAIL:-no-reply@benyamessenger.local}
FIREBASE_ENABLED: ${FIREBASE_ENABLED:-true}
FIREBASE_CREDENTIALS_PATH: ${FIREBASE_CREDENTIALS_PATH:-/run/secrets/firebase-service-account.json}
FIREBASE_WEBPUSH_LINK: ${FIREBASE_WEBPUSH_LINK:-https://chat.daemonlord.ru/}
LOGIN_RATE_LIMIT_PER_MINUTE: ${LOGIN_RATE_LIMIT_PER_MINUTE:-10}
REGISTER_RATE_LIMIT_PER_MINUTE: ${REGISTER_RATE_LIMIT_PER_MINUTE:-5}
RESET_RATE_LIMIT_PER_MINUTE: ${RESET_RATE_LIMIT_PER_MINUTE:-5}
REFRESH_RATE_LIMIT_PER_MINUTE: ${REFRESH_RATE_LIMIT_PER_MINUTE:-30}
MESSAGE_RATE_LIMIT_PER_MINUTE: ${MESSAGE_RATE_LIMIT_PER_MINUTE:-30}
DUPLICATE_MESSAGE_COOLDOWN_SECONDS: ${DUPLICATE_MESSAGE_COOLDOWN_SECONDS:-10}
CELERY_TASK_ALWAYS_EAGER: ${CELERY_TASK_ALWAYS_EAGER:-false}
services:
postgres:
image: postgres:16-alpine
container_name: messenger-postgres
environment:
POSTGRES_DB: ${POSTGRES_DB:-messenger}
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
ports:
- "${POSTGRES_PORT:-5432}:5432"
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-messenger}"]
interval: 5s
timeout: 5s
retries: 20
redis:
image: redis:7-alpine
container_name: messenger-redis
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
minio:
image: minio/minio:latest
container_name: messenger-minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
MINIO_API_CORS_ALLOW_ORIGIN: ${S3_CORS_ALLOW_ORIGIN:-*}
ports:
- "${MINIO_API_PORT:-9000}:9000"
- "${MINIO_CONSOLE_PORT:-9001}:9001"
volumes:
- minio_data:/data
minio-init:
image: minio/mc:latest
depends_on:
- minio
entrypoint:
- /bin/sh
- -ec
- >
mc alias set local http://minio:9000 ${MINIO_ROOT_USER:-minioadmin} ${MINIO_ROOT_PASSWORD:-minioadmin};
mc mb --ignore-existing local/${S3_BUCKET_NAME:-messenger-media};
mc anonymous set download local/${S3_BUCKET_NAME:-messenger-media}
restart: "no"
backend:
build:
context: .
dockerfile: Dockerfile
container_name: messenger-backend
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
minio-init:
condition: service_completed_successfully
environment:
<<: *app-env
RUN_MIGRATIONS_ON_STARTUP: ${RUN_MIGRATIONS_ON_STARTUP:-true}
ports:
- "${BACKEND_PORT:-8000}:8000"
volumes:
- ${FIREBASE_CREDENTIALS_HOST_PATH:-./secrets/firebase-service-account.json}:${FIREBASE_CREDENTIALS_PATH:-/run/secrets/firebase-service-account.json}:ro
healthcheck:
test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8000/health/ready').read()\""]
interval: 10s
timeout: 5s
retries: 12
worker:
build:
context: .
dockerfile: Dockerfile
container_name: messenger-worker
command: celery -A app.celery_app:celery_app worker --loglevel=info
depends_on:
redis:
condition: service_healthy
backend:
condition: service_started
environment:
<<: *app-env
AUTO_CREATE_TABLES: false
RUN_MIGRATIONS_ON_STARTUP: false
volumes:
- ${FIREBASE_CREDENTIALS_HOST_PATH:-./secrets/firebase-service-account.json}:${FIREBASE_CREDENTIALS_PATH:-/run/secrets/firebase-service-account.json}:ro
mailpit:
image: axllent/mailpit:latest
container_name: messenger-mailpit
ports:
- "${MAILPIT_SMTP_PORT:-1025}:1025"
- "${MAILPIT_UI_PORT:-8025}:8025"
web:
build:
context: ./web
dockerfile: Dockerfile
container_name: messenger-web
depends_on:
- backend
ports:
- "${WEB_PORT:-80}:80"
volumes:
pg_data:
redis_data:
minio_data: