Files
Messenger/docker-compose.yml
benya 2501466c7a
All checks were successful
CI / test (push) Successful in 19s
Add web client and containerized deployment stack
Web client:

- Added React + TypeScript + Vite + Tailwind application in web/.

- Implemented auth, chat list, chat messages, typing indicators, file uploads, and voice recording/playback.

- Added typed API layer, Zustand stores, and realtime websocket hook integration.

Containerization:

- Added backend Dockerfile and project .dockerignore.

- Added web multi-stage Dockerfile with nginx static hosting and API/WS reverse proxy.

- Added full docker-compose stack with postgres, redis, minio, backend, worker, mailpit, and web.

- Added MinIO bucket bootstrap init job and updated README with Docker quick-start.
2026-03-07 21:55:50 +03:00

160 lines
4.1 KiB
YAML

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: