Déploiement
magot se livre en image conteneur unique, déployable chez un hébergeur
suisse ou dans le datacenter de la banque. Seule dépendance : PostgreSQL 16+
standard (aucune extension propriétaire ; pgcrypto seulement).
Contenu de l'image
| Processus | un seul : API app (:3000) + webhook d'autorisation (:3001), mémoire d'autorisation partagée |
| Base | node:22-alpine, code TypeScript compilé, dépendances de production seules |
| Utilisateur | node (non-root), système de fichiers en lecture seule supporté |
| Sonde | HEALTHCHECK : l'API répond et voit sa base (GET /health), le webhook répond |
| Arrêt | SIGTERM → plus de nouvelles requêtes, requêtes en cours terminées, décisions d'autorisation en attente écrites, tâches de fond achevées ; forcé après 20 s |
| Migrations | tâche unique node dist/db/migrate.js à chaque version ; applique MAGOT_APP_PASSWORD au rôle applicatif |
| Exploitation | node dist/scripts/<script>.js (credentials émetteur, fournisseurs d'identité, abonnements d'événements) |
Démarrage autonome (docker compose)
cd deploy
cp .env.example .env # secrets : mots de passe, MAGOT_SECRETS_KEY
docker compose up -d # db → migrate (tâche unique) → magot
deploy/compose.yaml applique les réglages de durcissement : système de
fichiers en lecture seule, aucune capacité Linux, no-new-privileges, ports
publiés sur 127.0.0.1 seulement. Une banque qui fournit son Postgres retire
le service db et renseigne DATABASE_URL_ADMIN / DATABASE_URL_APP.
Deux rôles Postgres
- admin (
DATABASE_URL_ADMIN) : uniquement pour les migrations et les scripts d'exploitation ; magot_app(DATABASE_URL_APP) : le service tourne avec lui ; il n'est pas propriétaire du schéma, chaque requête est cloisonnée par établissement (Row Level Security), et il n'a aucun droit de modifier ou supprimer le journal d'événements.
Exposition réseau
| Port | Qui l'appelle | Exposition |
|---|---|---|
3000 API app | apps mobiles, SDK, app de la banque | derrière le reverse proxy TLS de la banque |
3001 webhook | processeur carte, core banking | mTLS uniquement (AUTHZ_TLS_KEY/CERT/CA) ; sans TLS, il n'écoute qu'à l'intérieur du conteneur |
Secrets
| Variable | Rôle |
|---|---|
MAGOT_SECRETS_KEY | 32 octets (base64) ; scelle en base les secrets HMAC (émetteurs, abonnements). Sans elle, le service refuse de démarrer s'il existe des secrets à desceller |
POSTGRES_PASSWORD, MAGOT_APP_PASSWORD | rôles Postgres |
AUTHZ_TLS_* | certificat serveur du webhook + autorité des certificats clients |
APNS_* | notifications (facultatif) |
À fournir par le coffre de la banque (fichiers montés ou variables injectées).
Liste complète commentée : deploy/.env.example.
Limites actuelles
- Une seule instance : la décision d'autorisation s'appuie sur une mémoire locale (snapshots) préchauffée au démarrage. La haute disponibilité passe aujourd'hui par un redémarrage rapide (≈ secondes) et la politique de repli de l'émetteur ; le passage à plusieurs instances actives est prévu.
- Observabilité : journaux sur la sortie standard ; métriques et traces (OpenTelemetry) à venir.