Sync deploy: backend, frontend, worker, docker, config

This commit is contained in:
Azouhri Abdelaziz
2026-02-04 16:21:59 +01:00
parent bd6a8965ea
commit 408229af12

View File

@@ -0,0 +1,478 @@
# =============================================================================
# Coolify: single-file staging stack (no include:)
# =============================================================================
# Use this as "Docker Compose Location" in Coolify: docker/docker-compose.coolify-merged.yml
# Base Directory: /. Set all env vars in Coolify Environment Variables.
# Merges: base + staging-standalone + staging + staging-prod-frontend + staging-prod-api + prod + monitoring.
# =============================================================================
services:
postgres:
image: postgres:16-alpine
container_name: toolsplatform-postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
deploy:
resources:
limits:
memory: 768M
reservations:
memory: 256M
redis:
image: redis:7-alpine
container_name: toolsplatform-redis
restart: unless-stopped
command: redis-server --appendonly yes --maxmemory 400mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
networks:
- backend
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
start_period: 5s
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 128M
minio:
image: minio/minio:latest
container_name: toolsplatform-minio
restart: unless-stopped
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
volumes:
- minio_data:/data
networks:
- backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
start_period: 10s
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 128M
keycloak:
image: quay.io/keycloak/keycloak:latest
container_name: toolsplatform-keycloak
restart: unless-stopped
command: start-dev
ports:
- "8180:8080"
environment:
KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN}
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://postgres:5432/${DB_NAME}
KC_DB_USERNAME: ${DB_USER}
KC_DB_PASSWORD: ${DB_PASSWORD}
KC_HOSTNAME: ${KEYCLOAK_PUBLIC_URL:-https://auth.getlinkzen.com}
KC_HOSTNAME_ADMIN: ${KEYCLOAK_PUBLIC_URL:-https://auth.getlinkzen.com}
KC_HOSTNAME_URL: ${KEYCLOAK_PUBLIC_URL:-https://auth.getlinkzen.com}
KC_HOSTNAME_STRICT: "false"
KC_PROXY: edge
KC_PROXY_HEADERS: xforwarded
KC_HTTP_ENABLED: "true"
volumes:
- keycloak_data:/opt/keycloak/data
networks:
- backend
- frontend
depends_on:
postgres:
condition: service_healthy
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
stirling-pdf:
image: stirlingtools/stirling-pdf:latest-fat
container_name: toolsplatform-stirling
restart: unless-stopped
ports:
- "8090:8080"
environment:
SECURITY_ENABLELOGIN: "false"
SECURITY_CUSTOMGLOBALAPIKEY: "dev-api-key-change-in-production"
INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "true"
LANGS: "en_GB,fr_FR,ar_AR"
SYSTEM_MAXFILESIZE: "500"
SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE: "500MB"
SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE: "500MB"
volumes:
- stirling_data:/usr/share/tessdata
- stirling_configs:/configs
networks:
- processing
deploy:
resources:
limits:
memory: 1536M
reservations:
memory: 512M
imagor:
image: shumc/imagor:latest
container_name: toolsplatform-imagor
restart: unless-stopped
ports:
- "8082:8000"
environment:
IMAGOR_UNSAFE: "1"
UPLOAD_LOADER_ENABLE: "1"
UPLOAD_LOADER_MAX_ALLOWED_SIZE: "67108864"
IMAGOR_AUTO_WEBP: "1"
IMAGOR_RESULT_STORAGE_PATH: "/tmp/imagor"
volumes:
- imagor_data:/tmp/imagor
networks:
- processing
- backend
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 128M
rembg:
image: danielgatis/rembg
container_name: toolsplatform-rembg
restart: unless-stopped
ports:
- "5000:7000"
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
echo "Pre-downloading rembg models to /root/.u2net ..."
rembg d u2net u2netp u2net_human_seg isnet-general-use
echo "Starting rembg server on port 7000 ..."
exec rembg s --host 0.0.0.0 --port 7000
volumes:
- rembg_models:/root/.u2net
networks:
- processing
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:7000/ || exit 1"]
interval: 15s
timeout: 5s
retries: 5
start_period: 600s
deploy:
resources:
limits:
memory: 1280M
reservations:
memory: 512M
languagetool:
image: erikvl87/languagetool
container_name: toolsplatform-languagetool
restart: unless-stopped
ports:
- "8010:8010"
environment:
Java_Xms: "512m"
Java_Xmx: "2g"
networks:
- processing
deploy:
resources:
limits:
memory: 2048M
reservations:
memory: 512M
api-gateway:
build:
context: ../backend
dockerfile: Dockerfile.prod
container_name: toolsplatform-api-gateway
restart: unless-stopped
volumes: []
env_file:
- .env
environment:
NODE_ENV: production
PRISMA_QUERY_ENGINE_LIBRARY: /app/node_modules/.prisma/client/libquery_engine-linux-musl-openssl-3.0.x.so.node
API_PORT: "4000"
API_HOST: 0.0.0.0
DATABASE_URL: postgresql://postgres:${DB_PASSWORD:-postgres}@postgres:5432/${DB_NAME:-toolsplatform}?schema=app
REDIS_HOST: redis
REDIS_PORT: "6379"
MINIO_ENDPOINT: minio
MINIO_PORT: "9000"
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin}
MINIO_BUCKET: uploads
MINIO_USE_SSL: "false"
KEYCLOAK_URL: http://keycloak:8080
KEYCLOAK_PUBLIC_URL: ${KEYCLOAK_PUBLIC_URL:-http://localhost:8180}
KEYCLOAK_REALM: ${KEYCLOAK_REALM:-toolsplatform}
KEYCLOAK_ISSUER_URI: ${KEYCLOAK_ISSUER_URI:-http://localhost:8180/realms/toolsplatform}
KEYCLOAK_CLIENT_ID: api-gateway
KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET}
ADMIN_ROLE: platform-admin
ADMIN_DASHBOARD_ENABLED: "true"
STIRLING_PDF_URL: http://stirling-pdf:8080
IMAGOR_URL: http://imagor:8000
REMBG_URL: http://rembg:7000
LANGUAGETOOL_URL: http://languagetool:8010
depends_on:
- postgres
- redis
- minio
- keycloak
networks:
- backend
- frontend
- processing
ports:
- "4000:4000"
deploy:
resources:
limits:
memory: 1536M
reservations:
memory: 256M
worker:
build:
context: ../worker
dockerfile: Dockerfile.prod
container_name: toolsplatform-worker
restart: unless-stopped
volumes: []
env_file:
- .env
environment:
NODE_ENV: production
DATABASE_URL: postgresql://postgres:${DB_PASSWORD:-postgres}@postgres:5432/${DB_NAME:-toolsplatform}?schema=app
REDIS_HOST: redis
REDIS_PORT: "6379"
MINIO_ENDPOINT: minio
MINIO_PORT: "9000"
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin}
MINIO_BUCKET: uploads
MINIO_USE_SSL: "false"
REMBG_URL: http://rembg:7000
IMAGOR_URL: http://imagor:8000
STIRLING_PDF_URL: http://stirling-pdf:8080
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
minio:
condition: service_started
rembg:
condition: service_healthy
networks:
- backend
- processing
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
frontend:
build:
context: ../frontend
dockerfile: Dockerfile.prod
container_name: toolsplatform-frontend
restart: unless-stopped
env_file:
- .env
environment:
PORT: "3000"
HOSTNAME: 0.0.0.0
networks:
- frontend
ports:
- "${FRONTEND_PORT:-3000}:3000"
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ../config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention.time=15d
networks:
- backend
restart: unless-stopped
ports:
- "9090:9090"
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 256M
grafana:
image: grafana/grafana:latest
container_name: grafana
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin}
GF_USERS_ALLOW_SIGN_UP: "false"
GF_SERVER_HTTP_PORT: "3000"
volumes:
- grafana_data:/var/lib/grafana
- ../config/grafana/provisioning:/etc/grafana/provisioning:ro
networks:
- frontend
- backend
restart: unless-stopped
ports:
- "3001:3000"
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 128M
loki:
image: grafana/loki:latest
container_name: loki
volumes:
- loki_data:/loki
- ../config/loki/loki-config.yml:/etc/loki/loki-config.yml:ro
command: -config.file=/etc/loki/loki-config.yml
networks:
- backend
restart: unless-stopped
deploy:
resources:
limits:
memory: 768M
reservations:
memory: 256M
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /var/log:/var/log:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ../config/promtail/promtail-config.yml:/etc/promtail/promtail-config.yml:ro
command: -config.file=/etc/promtail/promtail-config.yml
networks:
- backend
restart: unless-stopped
deploy:
resources:
limits:
memory: 256M
reservations:
memory: 64M
backup:
image: offen/docker-volume-backup:latest
container_name: backup
environment:
BACKUP_CRON_EXPRESSION: "0 3 * * *"
BACKUP_RETENTION_DAYS: "7"
BACKUP_FILENAME: "backup-%Y-%m-%d.tar.gz"
volumes:
- postgres_data:/backup/postgres:ro
- minio_data:/backup/minio:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- backup_archive:/archive
networks:
- backend
restart: unless-stopped
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 64M
networks:
backend:
name: toolsplatform-backend
driver: bridge
frontend:
name: toolsplatform-frontend
driver: bridge
processing:
name: toolsplatform-processing
driver: bridge
volumes:
postgres_data:
name: toolsplatform-postgres-data
redis_data:
name: toolsplatform-redis-data
minio_data:
name: toolsplatform-minio-data
keycloak_data:
name: toolsplatform-keycloak-data
stirling_data:
name: toolsplatform-stirling-data
stirling_configs:
name: toolsplatform-stirling-configs
imagor_data:
name: toolsplatform-imagor-data
rembg_models:
name: toolsplatform-rembg-models
prometheus_data:
name: toolsplatform-prometheus-data
grafana_data:
name: toolsplatform-grafana-data
loki_data:
name: toolsplatform-loki-data
backup_archive:
name: toolsplatform-backup-archive