Nouveau service apps/admin (admin.metalfrom.eu / admin.dev.metalfrom.eu) :
- Frontend statique vanilla JS/CSS reprenant le design system du site
(login, dashboard stats, table bands éditable, queue d'enrichissement,
historique crawl_run, logs live, checkpoints, journal d'audit)
- nginx reverse-proxy /admin/api/* et /admin/auth/* vers le service api
interne (same-origin côté navigateur, pas de CORS cross-site nécessaire
pour le cookie de session)
apps/api :
- Nouvelle auth dédiée au dashboard, séparée du token BM_IMPORT_TOKEN
existant : login bcrypt + session JWT en cookie httpOnly/secure/
sameSite=strict, rate-limit + lockout après 5 échecs/15min, seeding
du compte admin via env vars (jamais de mot de passe en clair en DB
ou en git)
- Routes /admin/api/* : stats, queue (breakdown priorité identique au
crawler Python), bands (recherche/tri/pagination/édition + audit log),
crawl-runs, crawl-checkpoints, logs, audit-log
- trustProxy activé (Traefik + nginx en amont)
apps/crawler :
- log_event() écrit dans la nouvelle table crawl_log (run start/finish/
erreurs) pour que le dashboard affiche les logs sans exposer le socket
Docker (choix délibéré : pas de docker.sock monté, accès DB only)
migration 006_admin_dashboard.sql : admin_users, admin_login_attempts,
admin_audit_log, crawl_log
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause identifié: compose_parsing_version=1 (DEV) vs 5 (PROD).
La v1 stripe coolify: external: true → crée uuid_coolify au lieu du vrai réseau.
La v5 préserve correctement l'external network declaration.
Fix appliqué:
- DB Coolify: compose_parsing_version mis à 5 pour l'app DEV
- Tous services sur networks: [coolify] explicitement
- Section networks: coolify external: true, name: coolify dans les deux compose files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Coolify gère le réseau Docker de manière autonome :
- Crée un réseau projet UUID pour la communication inter-services
- Connecte automatiquement les services avec labels Traefik (même enable=false)
au vrai réseau coolify via docker network connect après le démarrage
Déclarer coolify: external: true dans le compose causait un bug Coolify 4.1.2
qui strippait la config en coolify: null → créait aec2c803..._coolify au lieu
du vrai réseau coolify.
Suppression complète de bm_internal et coolify des deux compose files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Coolify ne développe pas \${VAR:-default} dans les labels Docker.
Labels prod: bm-api, bm-web, bm-pgadmin (inchangés).
docker-compose.dev.yml: override pour l'env dev avec les labels
dev-api, dev-web, dev-pgadmin et CORS_ORIGINS dev.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
- Ajoute geocoder-worker et worker sur le réseau coolify pour
résoudre le hostname DB (lgrep99...) qui n'est accessible que
depuis le réseau coolify
- CORS_ORIGINS env var optionnel pour configurer les origines
autorisées (utilisé par l'env dev)