metalfrom.eu/docker-compose.yml
Nicolas Fryder d08584704f refactor: domaines et router Traefik configurables par env vars
APP_ENV, DOMAIN_WEB, DOMAIN_WEB_ALT, DOMAIN_API, DOMAIN_PGADMIN
permettent de déployer prod et dev sur le même Traefik sans conflit.
CORS_ORIGINS aussi injecté directement dans le service api.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 12:38:52 +02:00

106 lines
3.2 KiB
YAML

services:
redis:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
volumes:
- bm_redis_data:/data
networks:
- bm_internal
geocoder-worker:
build:
context: apps/geocoder
working_dir: /app
environment:
DATABASE_URL: ${DATABASE_URL}
NOMINATIM_BASE: "https://nominatim.openstreetmap.org"
NOMINATIM_EMAIL: ${NOMINATIM_EMAIL}
NOMINATIM_USER_AGENT: ${NOMINATIM_USER_AGENT}
NOMINATIM_MIN_DELAY: "1.05"
NOMINATIM_JITTER: "0.35"
GEOCODE_MAX_PER_RUN: "5000"
command: ["python", "src/worker.py"]
networks:
- bm_internal
- coolify
restart: unless-stopped
pgadmin:
image: dpage/pgadmin4:8
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD}
PGADMIN_CONFIG_SERVER_MODE: "True"
volumes:
- pgadmin_data:/var/lib/pgadmin
networks:
- bm_internal
- coolify
labels:
- traefik.enable=true
- traefik.docker.network=coolify
- traefik.http.routers.${APP_ENV:-prod}-pgadmin.rule=Host(`${DOMAIN_PGADMIN:-pgadmin.bm.nicolasfryder.ovh}`)
- traefik.http.routers.${APP_ENV:-prod}-pgadmin.entrypoints=https
- traefik.http.routers.${APP_ENV:-prod}-pgadmin.tls=true
- traefik.http.routers.${APP_ENV:-prod}-pgadmin.tls.certresolver=letsencrypt
- traefik.http.services.${APP_ENV:-prod}-pgadmin.loadbalancer.server.port=80
api:
build:
context: apps/api
environment:
PORT: "3000"
DATABASE_URL: ${DATABASE_URL}
BM_IMPORT_TOKEN: ${BM_IMPORT_TOKEN}
CORS_ORIGINS: ${CORS_ORIGINS:-https://metalfrom.eu,https://www.metalfrom.eu}
networks:
- bm_internal
- coolify
labels:
- traefik.enable=true
- traefik.docker.network=coolify
- traefik.http.routers.${APP_ENV:-prod}-api.rule=Host(`${DOMAIN_API:-bm.nicolasfryder.ovh}`)
- traefik.http.routers.${APP_ENV:-prod}-api.entrypoints=https
- traefik.http.routers.${APP_ENV:-prod}-api.tls=true
- traefik.http.routers.${APP_ENV:-prod}-api.tls.certresolver=letsencrypt
- traefik.http.services.${APP_ENV:-prod}-api.loadbalancer.server.port=3000
web:
build:
context: apps/web
networks:
- coolify
labels:
- traefik.enable=true
- traefik.docker.network=coolify
- traefik.http.routers.${APP_ENV:-prod}-web.rule=Host(`${DOMAIN_WEB:-metalfrom.eu}`) || Host(`${DOMAIN_WEB_ALT:-www.metalfrom.eu}`)
- traefik.http.routers.${APP_ENV:-prod}-web.entrypoints=https
- traefik.http.routers.${APP_ENV:-prod}-web.tls=true
- traefik.http.routers.${APP_ENV:-prod}-web.tls.certresolver=letsencrypt
- traefik.http.services.${APP_ENV:-prod}-web.loadbalancer.server.port=80
worker:
build:
context: apps/worker
environment:
DB_DSN: ${DATABASE_URL}
MA_LIST_URL: https://www.metal-archives.com/lists/FR
MA_STATE_PATH: /app/ma_state.json
volumes:
- worker_state:/app
networks:
- bm_internal
- coolify
restart: "no"
networks:
bm_internal:
driver: bridge
coolify:
external: true
name: coolify
volumes:
bm_redis_data:
pgadmin_data:
worker_state: