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} networks: - nw_memegoat 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 networks: - nw_memegoat 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 networks: - nw_memegoat #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 networks: - nw_memegoat - nw_caddy command: > node dist/src/main depends_on: db: condition: service_healthy redis: condition: service_healthy s3: condition: service_started clamav: condition: service_started environment: NODE_ENV: production POSTGRES_HOST: ${POSTGRES_HOST:-memegoat-db} POSTGRES_PORT: ${POSTGRES_PORT:-5432} POSTGRES_DB: ${POSTGRES_DB:-app} POSTGRES_USER: ${POSTGRES_USER:-app} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-app} REDIS_HOST: ${REDIS_HOST:-memegoat-redis} REDIS_PORT: ${REDIS_PORT:-6379} S3_ENDPOINT: ${S3_ENDPOINT:-memegoat-s3} S3_PORT: ${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_HOST:-smtp.mail.ovh.net} MAIL_PORT: ${MAIL_PORT:-465} MAIL_USER: ${MAIL_USER} MAIL_PASS: ${MAIL_PASS} MAIL_FROM: ${MAIL_FROM:-noreply@memegoat.fr} 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: memegoat-clamav CLAMAV_PORT: 3310 MAX_IMAGE_SIZE_KB: 1024 MAX_GIF_SIZE_KB: 4096 clamav: image: clamav/clamav:latest container_name: memegoat-clamav restart: always networks: - nw_memegoat healthcheck: test: ["CMD", "clamdscan", "--version"] interval: 20s timeout: 10s retries: 5 frontend: build: context: . dockerfile: frontend/Dockerfile target: runner container_name: memegoat-frontend networks: - nw_caddy restart: always environment: NODE_ENV: production NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-https://api.memegoat.fr} depends_on: - backend documentation: build: context: . dockerfile: documentation/Dockerfile target: runner container_name: memegoat-docs networks: - nw_caddy restart: always environment: NODE_ENV: production volumes: postgres_data: minio_data: networks: nw_memegoat: internal: true nw_caddy: external: true