Infisical Common — Configuration applicative partagée
Infisical_Common est la couche applicative partagée d'Infisical. Elle n'est
pas déployée seule ; elle fournit plutôt la configuration propre à Infisical
sur laquelle reposent Infisical_GKE et Infisical_CloudRun,
afin que les deux variantes de plateforme se comportent de manière identique là où cela compte. Les utilisateurs
finaux ne configurent jamais directement cette couche — elle n'a aucune entrée propre dans l'interface
de déploiement — mais comprendre ce qu'elle fournit explique les valeurs par défaut que vous voyez dans la
documentation des plateformes.
Pour l'infrastructure qui provisionne et exécute réellement Infisical, consultez les guides de plateforme (Infisical_GKE, Infisical_CloudRun) et les guides du socle (App_GKE, App_CloudRun, App_Common).
1. Ce que fournit cette couche
| Domaine | Fourni par Infisical_Common | Où cela apparaît |
|---|---|---|
| Secrets cryptographiques | Génère ENCRYPTION_KEY (16 octets aléatoires, hex), AUTH_SECRET (32 octets aléatoires, base64) et ADMIN_PASSWORD (24 caractères aléatoires) et les stocke dans Secret Manager. Un secret REDIS_URL conditionnel est ajouté lorsque l'authentification Redis est configurée. | Injectés automatiquement ; à récupérer via Secret Manager (voir ci-dessous) |
| Image de conteneur | Encapsule l'image officielle infisical/infisical avec un script de point d'entrée personnalisé ; build via Cloud Build | Sortie container_image du déploiement de plateforme |
| Moteur de base de données | Impose Cloud SQL for PostgreSQL 15 comme seul moteur pris en charge | Sortie database_type / §Base de données dans les guides de plateforme |
| Amorçage de la base de données | Définit le job db-init (crée le rôle + la base de données) et le job admin-bootstrap (amorçage sans interface du super-administrateur via la CLI) | Sortie initialization_jobs |
| Stockage objet | Aucun — Infisical n'a besoin d'aucun bucket ; la sortie storage_buckets vaut toujours [] | s.o. |
| Contrôles de santé | Fournit la sonde de démarrage/de vivacité par défaut ciblant /api/status ; la variante CloudRun remplace ensuite la sonde de démarrage par une sonde TCP et désactive la sonde de vivacité au niveau du module | §Observabilité dans les guides de plateforme |
2. Secrets cryptographiques dans Secret Manager
Trois secrets sont générés automatiquement et stockés dans Secret Manager — ils ne sont jamais définis en clair :
ENCRYPTION_KEY— 16 octets aléatoires, encodés en hexadécimal (32 caractères hex). Utilisée par Infisical pour chiffrer chaque secret qu'il stocke. Ne la renouvelez jamais après le premier démarrage — son renouvellement rend tous les secrets précédemment stockés définitivement impossibles à déchiffrer.AUTH_SECRET— 32 octets aléatoires, encodés en base64. Utilisé pour signer les jetons JWT de session/d'authentification d'Infisical. Son renouvellement invalide toutes les sessions actives — ne le renouvelez que pendant une fenêtre de maintenance.ADMIN_PASSWORD— un mot de passe aléatoire de 24 caractères pour le premier compte super-administrateur amorcé. Ce secret est injecté uniquement dans lessecret_env_varsdu job d'initialisationadmin-bootstrap— il n'est jamais présent dans l'environnement du conteneur du serveur en cours d'exécution.
Un quatrième secret, REDIS_URL, est créé de manière conditionnelle : uniquement lorsque
enable_redis = true et redis_auth != "". Lorsque redis_auth est vide (la
valeur par défaut), le socle injecte lui-même une paire correcte de variables d'environnement en clair REDIS_HOST/
REDIS_PORT (résolue à partir de la découverte NFS au moment de l'apply) et aucun secret REDIS_URL
n'est créé ici — en créer un inconditionnellement figerait un hôte erroné
(127.0.0.1) dans le cas sans authentification. La condition var.redis_auth != "" qui
contrôle l'inclusion de ce secret dans secret_ids est encapsulée dans nonsensitive()
car redis_auth est une variable Terraform sensible ; sans cela, la
condition contamine toute la map secret_ids et casse le for_each
en aval qui la consomme.
Récupérez les secrets après le déploiement :
# List secrets for this deployment (names include the resource prefix):
gcloud secrets list --project "$PROJECT" --filter="name~infisical"
# Read a secret version:
gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"
Le mot de passe de la base de données est généré et géré séparément par le socle ; le nom
de son secret est indiqué dans les sorties du déploiement de plateforme
(database_password_secret). Consultez App_Common pour le modèle partagé
de secrets et de Workload Identity.
3. Moteur de base de données et amorçage
Infisical nécessite PostgreSQL 15 ; le moteur est imposé et MySQL ou d'autres moteurs ne sont pas pris en charge. Deux jobs d'initialisation s'exécutent en séquence :
db-init— un job ponctuel utilisantpostgres:15-alpine. Il détecte le socket du Cloud SQL Auth Proxy (Cloud Run) ou le sidecar en loopback (GKE), attend que PostgreSQL accepte les connexions, puis crée (ou met à jour) de manière idempotente le rôle applicatif et crée (ou réattribue la propriété de) la base de données applicative, en accordant tous les privilèges.execute_on_apply = true— il s'exécute à chaque apply et peut être relancé sans risque.admin-bootstrap— un job ponctuel utilisantinfisical/cli:latest, qui dépend dedb-init. Il exécuteinfisical bootstrap --ignore-if-bootstrappedcontre l'API HTTP du serveur en cours d'exécution (INFISICAL_API_URL, définie à partir desite_urlet, lorsque celle-ci est vide, résolue à l'exécution à partir deGKE_SERVICE_URL/CLOUDRUN_SERVICE_URLinjectées par la plateforme, localhost n'étant qu'un dernier recours) pour créer le premier compte super-administrateur, l'organisation et l'identité machine d'administration de l'instance — évitant ainsi la fenêtre d'inscription via l'interface web « ouverte jusqu'à ce que le premier visiteur la revendique ».execute_on_apply = false: sur Cloud Run, les jobs d'initialisation s'exécutent strictement avant la création du Service, ce job ne peut donc pas atteindre un serveur actif au moment de l'apply et doit être déclenché manuellement après le premier déploiement sain. Sur GKE,execute_on_applyne contrôle que l'attente du job par Terraform — le pod du job est planifié immédiatement dans tous les cas, et il réessaie (jusqu'à 20 tentatives, à 15 secondes d'intervalle) jusqu'à ce que le serveur réponde àsite_url.
Inspectez directement la base de données avec :
gcloud sql connect <instance-name> --user=<db-user> --database=<db-name> --project "$PROJECT"
Les noms de l'instance, de la base de données et de l'utilisateur figurent dans les sorties du déploiement de plateforme.
4. Image de conteneur et point d'entrée
L'image personnalisée (Infisical_Common/scripts/Dockerfile) encapsule
infisical/infisical:${INFISICAL_VERSION} avec un point d'entrée shell léger
(entrypoint.sh) qui s'exécute avant le démarrage du serveur Infisical :
- Assemble
DB_CONNECTION_URIau démarrage du conteneur, et non au moment du plan. Infisical accepte une seule variable d'environnement de chaîne de connexion, et non des variables distinctes pour l'hôte/l'utilisateur/le mot de passe — mais leDB_PASSWORDd'exécution (une valeur de Secret Manager) n'est pas connu lorsque Terraform génère l'image, et ne peut pas y être encodé en URL. Le point d'entrée l'encode en URL et construit l'URI à partir des valeurs distinctesDB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAMEinjectées par le socle. - Choisit
sslmodeselon la forme deDB_HOST: un chemin de socket Unix (/*, Auth Proxy de Cloud Run, TLS terminé par le proxy) →disable;127.0.0.1/localhost(loopback du sidecar Auth Proxy de GKE, TLS également déjà terminé) →disable; tout le reste (une IP privée brute, TCP direct) →require, car Cloud SQL rejette les connexions TCP non chiffrées sur IP privée. - L'argument de build
INFISICAL_VERSIONfait correspondre"latest"à une version épinglée. Plutôt que de transmettreapplication_version = "latest"directement au tag de l'image de base, l'ARGINFISICAL_VERSIONdu Dockerfile résout"latest"en une version éprouvée épinglée (v0.162.10au moment de la rédaction de ce module) — conformément à la convention de ce catalogue de ne pas construire sur un tag d'image de baselatestmouvant, et à la recommandation d'Infisical lui-même de ne pas exécuterlatesttel quel en production. - S'exécute en tant qu'utilisateur non root de l'image (UID 1000). Le Dockerfile ne
passe que brièvement en
USER rootpour exécuterchmod +xsur le script de point d'entrée, puis revient à l'utilisateur par défaut de l'image de base avantENTRYPOINT.
5. Paramètres principaux de l'application
Infisical_Common établit l'environnement Infisical de base afin que
l'application démarre correctement dès le premier lancement :
HOST = "0.0.0.0"— Infisical écoute sur toutes les interfaces ; sa propre valeur par défaut est localhost uniquement, ce qui le rendrait inaccessible à l'intérieur du conteneur.PORTn'est délibérément pas défini. Cloud Run rejettePORTcomme nom de variable d'environnement réservé sur les Jobs, et les Services Cloud Run l'injectent de toute façon automatiquement à partir decontainer_port. Le port d'écoute par défaut d'Infisical (8080) correspond à la valeur par défaut decontainer_port, de sorte que GKE (qui n'a pas d'injection automatique de ce type) se lie quand même correctement dès l'installation.SITE_URL— définie à partir devar.site_urllorsqu'elle n'est pas vide, sinon par défauthttp://localhost:${container_port}. Utilisée pour les liens d'invitation/d'e-mail, CORS, et comme cible du jobadmin-bootstrap. La variante Cloud Run calcule une URLrun.appprévisible et la transmet automatiquement commesite_url; la variante GKE transmetvar.site_urltelle quelle sans aucun calcul — consultez les pièges du guide de plateforme GKE pour l'implication opérationnelle.DATABASE_URL/DB_CONNECTION_URIn'est intentionnellement PAS construite ici — voir le §4 ci-dessus ; elle est assemblée au démarrage du conteneur parentrypoint.shà la place.
6. Comportement des sondes de santé
L'objet de sonde par défaut (défini dans Infisical_Common/variables.tf) cible
/api/status, qui renvoie HTTP 200 avec un corps JSON une fois qu'Infisical, sa
connexion à la base de données et (si activé) Redis sont tous sains.
- Cloud Run remplace ce comportement au niveau du module.
/api/statusne renvoie un code 2xx qu'après une disponibilité complète — une sonde de démarrage HTTP sur ce chemin ne réussirait jamais pendant la période précédant la connexion de Redis/de la base de données, c'est pourquoiInfisical_CloudRundéfinit par défaut sastartup_probeen TCP (réussit dès que le port est lié) et désactive entièrement la sonde de vivacité pour éviter de redémarrer en boucle un conteneur qui n'a pas encore fini de se connecter. - GKE conserve la valeur par défaut HTTP
/api/statuspour les sondes de démarrage et de vivacité — les sondes natives de Kubernetes ne présentent pas le même mode de défaillance « le service n'est jamais créé » que la barrière de démarrage de Cloud Run, si bien qu'une sonde HTTP plus lente à réussir y est acceptable.
7. Stockage d'objets
La propre sortie storage_buckets d'Infisical_Common est toujours une liste vide —
Infisical stocke tout son état persistant dans PostgreSQL et n'a besoin d'aucun stockage objet
propre. Le bucket GCS générique data visible dans les sorties des guides de plateforme
provient de la valeur par défaut de la variable storage_buckets du socle (partagée par
tous les modules applicatifs de ce catalogue), et non de quoi que ce soit qu'Infisical_Common
déclare ou que l'application utilise réellement.
Pour la configuration propre à Infisical destinée aux utilisateurs (variables par groupe, sorties, et comment explorer chaque service depuis la console et la CLI), consultez les guides de plateforme : Infisical_GKE et Infisical_CloudRun.
Guides associés
- Infisical sur Google Cloud Run — cette configuration déployée sur Cloud Run.
- Infisical sur GKE Autopilot — cette configuration déployée sur GKE.
Need RAD to do something it does not do yet? Request it on the roadmap, or vote on what is already there.