services: postgres: image: postgres:16-alpine container_name: messenger-postgres environment: POSTGRES_DB: messenger POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5432:5432" volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d messenger"] interval: 5s timeout: 5s retries: 20 redis: image: redis:7-alpine container_name: messenger-redis ports: - "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: minioadmin MINIO_ROOT_PASSWORD: minioadmin ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data minio-init: image: minio/mc:latest depends_on: - minio entrypoint: > /bin/sh -c " mc alias set local http://minio:9000 minioadmin minioadmin && mc mb --ignore-existing local/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_NAME: BenyaMessenger ENVIRONMENT: production DEBUG: "false" API_V1_PREFIX: /api/v1 AUTO_CREATE_TABLES: "true" SECRET_KEY: "change-me-please-with-a-long-random-secret" JWT_ALGORITHM: HS256 ACCESS_TOKEN_EXPIRE_MINUTES: "30" REFRESH_TOKEN_EXPIRE_DAYS: "30" EMAIL_VERIFICATION_TOKEN_EXPIRE_HOURS: "24" PASSWORD_RESET_TOKEN_EXPIRE_HOURS: "1" POSTGRES_DSN: postgresql+asyncpg://postgres:postgres@postgres:5432/messenger REDIS_URL: redis://redis:6379/0 S3_ENDPOINT_URL: http://minio:9000 S3_ACCESS_KEY: minioadmin S3_SECRET_KEY: minioadmin S3_REGION: us-east-1 S3_BUCKET_NAME: messenger-media S3_PRESIGN_EXPIRE_SECONDS: "900" MAX_UPLOAD_SIZE_BYTES: "104857600" FRONTEND_BASE_URL: http://localhost SMTP_HOST: mailpit SMTP_PORT: "1025" SMTP_USERNAME: "" SMTP_PASSWORD: "" SMTP_USE_TLS: "false" SMTP_FROM_EMAIL: no-reply@benyamessenger.local ports: - "8000:8000" 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_NAME: BenyaMessenger ENVIRONMENT: production DEBUG: "false" API_V1_PREFIX: /api/v1 AUTO_CREATE_TABLES: "false" SECRET_KEY: "change-me-please-with-a-long-random-secret" JWT_ALGORITHM: HS256 ACCESS_TOKEN_EXPIRE_MINUTES: "30" REFRESH_TOKEN_EXPIRE_DAYS: "30" EMAIL_VERIFICATION_TOKEN_EXPIRE_HOURS: "24" PASSWORD_RESET_TOKEN_EXPIRE_HOURS: "1" POSTGRES_DSN: postgresql+asyncpg://postgres:postgres@postgres:5432/messenger REDIS_URL: redis://redis:6379/0 S3_ENDPOINT_URL: http://minio:9000 S3_ACCESS_KEY: minioadmin S3_SECRET_KEY: minioadmin S3_REGION: us-east-1 S3_BUCKET_NAME: messenger-media S3_PRESIGN_EXPIRE_SECONDS: "900" MAX_UPLOAD_SIZE_BYTES: "104857600" FRONTEND_BASE_URL: http://localhost SMTP_HOST: mailpit SMTP_PORT: "1025" SMTP_USERNAME: "" SMTP_PASSWORD: "" SMTP_USE_TLS: "false" SMTP_FROM_EMAIL: no-reply@benyamessenger.local mailpit: image: axllent/mailpit:latest container_name: messenger-mailpit ports: - "1025:1025" - "8025:8025" web: build: context: ./web dockerfile: Dockerfile container_name: messenger-web depends_on: - backend ports: - "80:80" volumes: pg_data: redis_data: minio_data: