Docker Compose est le moyen le plus rapide d'exécuter une instance du Registre Sannvit, qu'il s'agisse d'un environnement de développement local ou d'un déploiement de production sur un seul hôte. Tout ce qui suit suppose que vous avez déjà cloné le dépôt.
La pile est répartie entre un fichier de base et des surcouches (overrides) que vous ajoutez selon vos besoins :
| Service | Fichier compose | Ce que c'est |
|---|---|---|
db | docker-compose.yml | Un simple postgres:17 — l'unique base de données de la pile |
keycloak | docker-compose.keycloak.yml | Authentification — Direct Access Grant, sans interface de connexion hébergée |
api / alerting | docker-compose.api.yml | Le service d'ingestion, plus son exécuteur autonome d'intégrité/alerting dans un second conteneur |
dashboard | docker-compose.dashboard.yml | L'interface web |
rustfs | docker-compose.rustfs.yml | Stockage d'objets compatible S3 fourni — optionnel, voir Utiliser votre propre stockage compatible S3 |
mail | docker-compose.mail.yml | Intercepteur SMTP pour le développement uniquement (Mailpit), pour que les e-mails d'invitation/réinitialisation/alerte atterrissent quelque part de visible |
nginx / caddy | docker-compose.nginx.yml / docker-compose.caddy.yml | Proxy inverse optionnel avec terminaison TLS devant les sous-domaines app. / api. / auth. |
L'application communique directement avec Postgres en clair et Keycloak gère l'authentification — sans services supplémentaires entre les deux — ce qui garde une empreinte assez réduite pour être installée sur l'infrastructure propre d'un client.
.env se trouve à la racine du dépôt et est lu par chaque fichier compose.
cp .env.example .env
Au minimum, renseignez ces secrets avant de démarrer quoi que ce soit — openssl rand -hex 24 pour chacun :
POSTGRES_PASSWORDJWT_SECRETKEYCLOAK_ADMIN_PASSWORDKEYCLOAK_SERVICE_CLIENT_SECRETS3_ROOT_PASSWORD (nécessaire uniquement si vous utilisez le stockage d'objets fourni)EXPORT_SECRET_KEY (nécessaire uniquement avant d'utiliser la fonctionnalité d'export SFTP des dossiers de preuves)Des valeurs réservées au développement conviennent pour un usage local — évitez simplement de les réutiliser dans un contexte réel.
docker/run.sh gère les fichiers de surcouche compose actifs et lit toujours .env depuis la racine du dépôt, quel que soit le répertoire de travail de votre shell :
cd docker
./run.sh config add keycloak rustfs mail api api.dev dashboard dashboard.dev
./run.sh start
api.dev / dashboard.dev ajoutent le rechargement à chaud (source montée en bind-mount, tsx watch / HMR Nuxt) par-dessus leurs services de base.
npm run prod
ce qui équivaut à :
cd docker
COMPOSE_FILE=docker-compose.yml:docker-compose.keycloak.yml:docker-compose.rustfs.yml:docker-compose.api.yml:docker-compose.dashboard.yml \
COMPOSE_ENV_FILES=../.env COMPOSE_IGNORE_ORPHANS=true \
docker compose up -d --wait --build
!WARNING Avant de faire cela en conditions réelles :
- Les valeurs de
.env.examplesont des exemples, pas des secrets — définissez des valeurs réelles et uniques pour chaque entrée listée ci-dessus.- Placez un véritable proxy inverse avec terminaison TLS devant la pile (
docker-compose.nginx.ymlou.caddy.yml) plutôt que d'exposer les ports bruts des services, et définissezPROXY_DOMAINdans.env.- Changez le secret du client
ledger-servicede Keycloak par rapport à la valeur par défaut de développement de l'export du royaume (docker/volumes/keycloak/ledger-realm.json) via la console d'administration Keycloak, et mettez à jourKEYCLOAK_SERVICE_CLIENT_SECRETdans.enven conséquence.- Faites pointer
SMTP_*vers un vrai relais plutôt que Mailpit, et définissezDASHBOARD_URLsur le domaine public réel du tableau de bord — voir E-mail (SMTP) ci-dessous.- Mettez en place des procédures de sauvegarde appropriées pour le volume
db.
Il s'agit d'une étape unique par base de données neuve — elle ne fait pas partie de run.sh start. Attendez que db et keycloak signalent un état sain (./run.sh status), puis, depuis la racine du dépôt :
for f in api/drizzle/0*.sql; do
psql -h localhost -U postgres -d postgres -v ON_ERROR_STOP=1 -f "$f"
done
cd api
npm install
npm run db:functions # applique src/db/functions/*.sql — pas les objets drizzle-kit
npm run seed:demo # org + équipe + clé d'ingestion de démo (la clé est affichée une fois, conservez-la)
Aucun utilisateur du tableau de bord n'est initialisé par défaut — seed:demo crée uniquement une organisation/équipe/clé d'ingestion de démo pour le côté SDK. Pour obtenir une connexion humaine, initialisez plutôt le premier administrateur (depuis api/, une fois db et keycloak démarrés et les migrations appliquées) :
npm run seed:admin -- you@example.com --org-name="Your Org Name"
Cela affiche un mot de passe généré, une seule fois. Chaque utilisateur suivant est invité via le tableau de bord (Organisation → Utilisateurs → Inviter) par un compliance_admin existant, et non via ce script.
http://localhost:3000http://localhost:4010 (GET /healthz)http://localhost:8180http://localhost:8025http://localhost:9001 (RustFS fourni, si vous l'avez conservé)run.sh utiles./run.sh logs [service] # suivre les logs
./run.sh status # docker compose ps
./run.sh recreate [service] # forcer la recréation d'un service
./run.sh stop # tout arrêter
Appeler docker compose directement plutôt que run.sh nécessite d'indiquer explicitement le fichier d'environnement, par exemple depuis la racine du dépôt :
docker compose --env-file .env -f docker/docker-compose.yml -f docker/docker-compose.keycloak.yml up -d
Par défaut, la pile fournit un conteneur RustFS comme stockage d'objets pour le contenu des payloads — le registre lui-même ne stocke qu'un pointeur + un hash. Si vous préférez pointer vers un bucket existant (AWS S3, Cloudflare R2, Backblaze B2, votre propre MinIO/RustFS, etc.) :
rustfs — n'exécutez pas ./run.sh config add rustfs, ou exécutez ./run.sh config remove rustfs si elle est déjà présente..env, définissez S3_ENDPOINT, S3_PORT, S3_USE_SSL, et optionnellement S3_REGION vers le fournisseur externe, ainsi que S3_ACCESS_KEY / S3_SECRET_KEY avec des identifiants restreints à ce bucket. Définissez LEDGER_BUCKET avec le nom du bucket.CreateBucket.Le second plan d'intégrité en ajout seul est un second bucket (LEDGER_INTEGRITY_BUCKET, par défaut ledger-integrity) sur le même endpoint, créé avec le verrouillage d'objets S3 (Object Lock) activé — indélébile pendant sa fenêtre de rétention, même par les administrateurs.
!CAUTION Le conteneur RustFS fourni comporte des bugs ouverts dans son implémentation d'Object Lock. C'est acceptable pour le développement, mais les déploiements de production devraient faire pointer
LEDGER_INTEGRITY_BUCKETvers une implémentation mature d'Object Lock via l'option « apportez votre propre S3 » — AWS S3 réel, Backblaze B2, ou GCS via l'interopérabilité S3.
L'API du registre envoie les e-mails d'invitation, de réinitialisation de mot de passe et de synthèse d'alertes via SMTP.
Développement local — capturez les e-mails au lieu de les envoyer :
./run.sh config add mail
./run.sh start
Chaque e-mail atterrit sur http://localhost:8025 (Mailpit) au lieu d'une vraie boîte de réception.
Production — livrer de vrais e-mails :
SMTP_ADMIN_EMAIL, SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, et SMTP_SENDER_NAME dans le .env de cet environnement. Laissez SMTP_ALLOW_INSECURE_AUTH non défini — il n'existe que pour Mailpit.DASHBOARD_URL sur le domaine public réel du tableau de bord — il est intégré dans les liens des e-mails d'invitation/réinitialisation.mail en production, sinon elle interceptera le courrier réel../run.sh recreate api alerting.Si votre fournisseur exige une vérification de domaine (SPF/DKIM, identité de l'expéditeur — courant avec SES et Postmark), celle-ci doit être effectuée du côté du fournisseur avant que le courrier ne soit réellement livré.
docker-compose.*.yml concerné si nécessaire.docker compose pull.api / dashboard si leur code source a changé : docker compose -f docker-compose.api.yml -f docker-compose.dashboard.yml up -d --build.Sauvegardez toujours votre base de données avant une mise à jour.
Pour un déploiement en cluster au-delà d'un seul hôte Compose, il existe un chemin Kubernetes basé sur Helm — construction/publication des images, secrets, DNS, et helm install — traité séparément de Docker Compose.