Add web client and containerized deployment stack
All checks were successful
CI / test (push) Successful in 19s
All checks were successful
CI / test (push) Successful in 19s
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.
This commit is contained in:
159
docker-compose.yml
Normal file
159
docker-compose.yml
Normal file
@@ -0,0 +1,159 @@
|
||||
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:
|
||||
Reference in New Issue
Block a user