Files
memegoat/docker-compose.yml
Mathis HERRIOT b81835661c feat(docker): add production-ready docker-compose configuration with health checks
Introduce a new `docker-compose.prod.yml` file tailored for production setups. Add health checks for PostgreSQL, Redis, and ClamAV services. Update existing `docker-compose.yml` with health checks, environment refinements, service dependencies, and production-specific optimizations.
2026-01-14 16:38:07 +01:00

130 lines
3.3 KiB
YAML

services:
db:
image: postgres:17-alpine
container_name: memegoat-db
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER:-app}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-app}
POSTGRES_DB: ${POSTGRES_DB:-app}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: memegoat-redis
restart: always
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
s3:
image: minio/minio:RELEASE.2025-04-08T15-41-24Z
container_name: memegoat-s3
restart: always
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: ${S3_ACCESS_KEY:-minioadmin}
MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY:-minioadmin}
command: server /data --console-address ":9001"
volumes:
- minio_data:/data
mail:
image: axllent/mailpit
container_name: memegoat-mail
restart: always
ports:
- "1025:1025" # smtp
- "8025:8025" # web ui
backend:
build:
context: .
dockerfile: backend/Dockerfile
target: runtime
container_name: memegoat-backend
command: >
node dist/src/main
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
s3:
condition: service_started
clamav:
condition: service_started
ports:
- "3000:3000"
environment:
NODE_ENV: production
POSTGRES_HOST: db
POSTGRES_PORT: 5432
POSTGRES_DB: ${POSTGRES_DB:-app}
POSTGRES_USER: ${POSTGRES_USER:-app}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-app}
REDIS_HOST: redis
REDIS_PORT: 6379
S3_ENDPOINT: s3
S3_PORT: 9000
S3_ACCESS_KEY: ${S3_ACCESS_KEY:-minioadmin}
S3_SECRET_KEY: ${S3_SECRET_KEY:-minioadmin}
S3_BUCKET_NAME: ${S3_BUCKET_NAME:-memegoat}
MAIL_HOST: mail
MAIL_PORT: 1025
MAIL_USER: ""
MAIL_PASS: ""
MAIL_FROM: ${MAIL_FROM:-noreply@memegoat.local}
DOMAIN_NAME: ${DOMAIN_NAME:-localhost}
JWT_SECRET: ${JWT_SECRET:-super-secret-jwt-key-change-me-in-prod}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:-01234567890123456789012345678901}
PGP_ENCRYPTION_KEY: ${PGP_ENCRYPTION_KEY:-super-secret-pgp-key}
SESSION_PASSWORD: ${SESSION_PASSWORD:-super-secret-session-password-32-chars}
CORS_DOMAIN_NAME: ${CORS_DOMAIN_NAME:-*}
ENABLE_CORS: ${ENABLE_CORS:-true}
CLAMAV_HOST: clamav
CLAMAV_PORT: 3310
clamav:
image: clamav/clamav:1.4
container_name: memegoat-clamav
restart: always
healthcheck:
test: ["CMD", "clamdscan", "--version"]
interval: 20s
timeout: 10s
retries: 5
frontend:
build:
context: .
dockerfile: frontend/Dockerfile
target: runner
container_name: memegoat-frontend
restart: always
ports:
- "3001:3000"
environment:
NODE_ENV: production
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:3000}
depends_on:
- backend
volumes:
postgres_data:
minio_data: