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: