Étape 0 de la refonte pipeline crawl/géocodage. Auto-requeue du géocodage - migration 013: trigger trg_bands_geocode_dirty (AFTER UPDATE OF location_text ON bands) supprime les band_locations d'un band dès que sa localisation change réellement (IS DISTINCT FROM) — plus de points fantômes après un déménagement détecté par le crawler incrémental. - enqueue.py: en plus du déclenchement manuel, un scan automatique tourne toutes les ENQUEUE_AUTO_INTERVAL_MIN minutes (défaut 60) et rattrape les bands rendus "dirty" par le trigger (idempotent, ON CONFLICT DO NOTHING — pas de canal de notification supplémentaire nécessaire). Chaque exécution (manuelle ou auto) crée une ligne crawl_run + logs rattachés, en miroir de crawler/src/db.py, pour apparaître dans l'activité admin à venir. Crawl complet en calcul glissant - remplace CRAWLER_SCHED_FULL_DAY (jour fixe du mois) par CRAWLER_FULL_CRAWL_INTERVAL_DAYS (défaut 60) basé sur le checkpoint last_full_crawl_at — robuste au calendrier et aux redémarrages (vérifié aussi au démarrage, pas seulement le tick quotidien 03:00 UTC). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
143 lines
4.1 KiB
YAML
143 lines
4.1 KiB
YAML
services:
|
|
redis:
|
|
image: redis:7-alpine
|
|
command: ["redis-server", "--appendonly", "yes"]
|
|
volumes:
|
|
- bm_redis_data:/data
|
|
networks:
|
|
- coolify
|
|
|
|
geocoder-enqueue:
|
|
build:
|
|
context: apps/geocoder
|
|
working_dir: /app
|
|
environment:
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
GEOCODE_ENQUEUE_BATCH: "100000"
|
|
GEOCODE_ENQUEUE_POLL: "15"
|
|
ENQUEUE_AUTO_INTERVAL_MIN: "60"
|
|
command: ["python", "src/enqueue.py"]
|
|
networks:
|
|
- coolify
|
|
labels:
|
|
- traefik.enable=false
|
|
restart: unless-stopped
|
|
|
|
geocoder-worker:
|
|
build:
|
|
context: apps/geocoder
|
|
working_dir: /app
|
|
environment:
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
GEOAPIFY_API_KEY: ${GEOAPIFY_API_KEY}
|
|
GEOCODER_MIN_DELAY: "0.22"
|
|
GEOCODER_JITTER: "0.10"
|
|
GEOCODE_MAX_PER_RUN: "100000"
|
|
GEOCODE_MAX_GEO_TRIES: "3"
|
|
GEOCODE_MIN_CONFIDENCE: "0.7"
|
|
command: ["python", "src/worker.py"]
|
|
networks:
|
|
- coolify
|
|
labels:
|
|
- traefik.enable=false
|
|
restart: unless-stopped
|
|
|
|
groq-worker:
|
|
build:
|
|
context: apps/geocoder
|
|
working_dir: /app
|
|
environment:
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
GROQ_API_KEY: ${GROQ_API_KEY}
|
|
GROQ_MAX_TRIES: "5"
|
|
GROQ_CALL_DELAY: "2.5"
|
|
command: ["python", "src/groq_worker.py"]
|
|
networks:
|
|
- coolify
|
|
labels:
|
|
- traefik.enable=false
|
|
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:
|
|
- coolify
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.docker.network=coolify
|
|
- traefik.http.routers.bm-pgadmin.rule=Host(`pgadmin.bm.nicolasfryder.ovh`)
|
|
- traefik.http.routers.bm-pgadmin.entrypoints=https
|
|
- traefik.http.routers.bm-pgadmin.tls=true
|
|
- traefik.http.routers.bm-pgadmin.tls.certresolver=letsencrypt
|
|
- traefik.http.services.bm-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}
|
|
ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
|
|
ADMIN_SEED_USERNAME: ${ADMIN_SEED_USERNAME}
|
|
ADMIN_SEED_PASSWORD_HASH: ${ADMIN_SEED_PASSWORD_HASH}
|
|
networks:
|
|
coolify:
|
|
aliases:
|
|
- bm-api-internal
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.docker.network=coolify
|
|
- traefik.http.routers.bm-api.rule=Host(`bm.nicolasfryder.ovh`)
|
|
- traefik.http.routers.bm-api.entrypoints=https
|
|
- traefik.http.routers.bm-api.tls=true
|
|
- traefik.http.routers.bm-api.tls.certresolver=letsencrypt
|
|
- traefik.http.services.bm-api.loadbalancer.server.port=3000
|
|
|
|
admin:
|
|
build:
|
|
context: apps/admin
|
|
args:
|
|
API_UPSTREAM: http://bm-api-internal:3000
|
|
networks:
|
|
- coolify
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.docker.network=coolify
|
|
- traefik.http.routers.bm-admin.rule=Host(`admin.metalfrom.eu`)
|
|
- traefik.http.routers.bm-admin.entrypoints=https
|
|
- traefik.http.routers.bm-admin.tls=true
|
|
- traefik.http.routers.bm-admin.tls.certresolver=letsencrypt
|
|
- traefik.http.services.bm-admin.loadbalancer.server.port=80
|
|
|
|
web:
|
|
build:
|
|
context: apps/web
|
|
networks:
|
|
- coolify
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.docker.network=coolify
|
|
- traefik.http.routers.bm-web.rule=Host(`metalfrom.eu`) || Host(`www.metalfrom.eu`)
|
|
- traefik.http.routers.bm-web.entrypoints=https
|
|
- traefik.http.routers.bm-web.tls=true
|
|
- traefik.http.routers.bm-web.tls.certresolver=letsencrypt
|
|
- traefik.http.routers.bm-web.tls.domains[0].main=metalfrom.eu
|
|
- traefik.http.routers.bm-web.tls.domains[0].sans=www.metalfrom.eu
|
|
- traefik.http.services.bm-web.loadbalancer.server.port=80
|
|
|
|
networks:
|
|
coolify:
|
|
external: true
|
|
name: coolify
|
|
|
|
volumes:
|
|
bm_redis_data:
|
|
pgadmin_data:
|