metalfrom.eu/infra/docker-compose.yml.backup
Nicolas Fryder d4e1bf2e15 chore: initial commit — snapshot VPS 2026-06-27
- apps/api      : API REST Node.js/Fastify + PostgreSQL/PostGIS
- apps/geocoder : Worker Python géocodage Nominatim
- apps/worker   : Scraper Python Metal-Archives
- apps/web      : Frontend statique Leaflet/clustering/heatmap
- infra/        : docker-compose + init.sql

Déployé via Coolify + Traefik sur VPS OVH.
2026-06-27 08:53:39 +00:00

158 lines
4.6 KiB
Text

services:
db:
image: postgis/postgis:16-3.4
environment:
POSTGRES_DB: bm
POSTGRES_USER: bm
POSTGRES_PASSWORD: ${BM_DB_PASSWORD}
volumes:
- bm_pg_data:/var/lib/postgresql/data
networks:
- bm_internal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U bm -d bm"]
interval: 10s
timeout: 5s
retries: 10
redis:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
volumes:
- bm_redis_data:/data
networks:
- bm_internal
geocoder-enqueue:
image: python:3.12-slim
working_dir: /app
volumes:
- ../apps/geocoder:/app:ro
environment:
DATABASE_URL: ${DATABASE_URL}
GEOCODE_ENQUEUE_BATCH: "90000"
command: ["sh", "-lc", "pip install -r requirements.txt && python src/enqueue.py"]
networks:
- bm_internal
restart: "no"
geocoder-worker:
image: python:3.12-slim
working_dir: /app
volumes:
- ../apps/geocoder:/app:ro
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: ["sh", "-lc", "pip install -r requirements.txt && python src/worker.py"]
networks:
- bm_internal
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
- traefik_net
labels:
- traefik.enable=true
- traefik.docker.network=stack-vps_admin
- traefik.http.routers.pgadmin.rule=Host(`pgadmin.bm.nicolasfryder.ovh`)
- traefik.http.routers.pgadmin.entrypoints=websecure
- traefik.http.routers.pgadmin.tls=true
- traefik.http.routers.pgadmin.tls.certresolver=le
- traefik.http.routers.pgadmin.middlewares=auth@file
- traefik.http.services.pgadmin.loadbalancer.server.port=80
api:
build:
context: ../apps/api
environment:
PORT: "3000"
DATABASE_URL: postgresql://bm:${BM_DB_PASSWORD}@db:5432/bm
BM_IMPORT_TOKEN: ${BM_IMPORT_TOKEN}
depends_on:
db:
condition: service_healthy
volumes:
- ./overrides/api/src/server.js:/app/src/server.js:ro
networks:
- bm_internal
- traefik_net
labels:
- traefik.enable=true
- traefik.http.routers.bm-api.rule=Host(`bm.nicolasfryder.ovh`)
- traefik.http.routers.bm-api.entrypoints=websecure
- traefik.http.routers.bm-api.tls=true
- traefik.http.routers.bm-api.tls.certresolver=le
# CORS middleware
- traefik.http.middlewares.bm-cors.headers.accessControlAllowOriginList=https://metalfrom.eu,https://www.metalfrom.eu
- traefik.http.middlewares.bm-cors.headers.accessControlAllowMethods=GET,POST,PUT,PATCH,DELETE,OPTIONS
- traefik.http.middlewares.bm-cors.headers.accessControlAllowHeaders=*
- traefik.http.middlewares.bm-cors.headers.accessControlAllowCredentials=true
- traefik.http.middlewares.bm-cors.headers.addVaryHeader=true
- traefik.http.routers.bm-api.middlewares=bm-cors@docker
code:
image: lscr.io/linuxserver/code-server:latest
environment:
PUID: "1001"
PGID: "1001"
TZ: "Europe/Paris"
PASSWORD: ${CODESERVER_PASSWORD}
SUDO_PASSWORD: ${CODESERVER_PASSWORD}
DEFAULT_WORKSPACE: /workspace
volumes:
- bm_codeserver_config:/config
- /srv/stacks/bm:/workspace
networks:
- bm_internal
- traefik_net
labels:
- traefik.enable=true
- traefik.docker.network=stack-vps_admin
- traefik.http.routers.bm-code.rule=Host(`code.bm.nicolasfryder.ovh`)
- traefik.http.routers.bm-code.entrypoints=websecure
- traefik.http.routers.bm-code.tls=true
- traefik.http.services.bm-code.loadbalancer.server.port=8443
worker:
build:
context: ../apps/worker
environment:
DB_DSN: postgresql://bm:${BM_DB_PASSWORD}@db:5432/bm
MA_LIST_URL: https://www.metal-archives.com/lists/FR
MA_STATE_PATH: /app/ma_state.json
depends_on:
db:
condition: service_healthy
volumes:
- /srv/stacks/bm/infra/ma_state.json:/app/ma_state.json:ro
networks:
- bm_internal
restart: "no"
networks:
traefik_net:
external: true
name: stack-vps_admin
bm_internal:
driver: bridge
volumes:
bm_pg_data:
bm_redis_data:
bm_codeserver_config:
pgadmin_data: