Aller au contenu principal

Infisical sur Google Cloud Run

Infisical sur Google Cloud Run

Infisical est une plateforme open source de gestion des secrets, chiffrée de bout en bout : les équipes et les pipelines CI/CD stockent, injectent et font pivoter les secrets applicatifs depuis une plateforme unique, à l'aide de SDK clients, d'une CLI ou de l'interface web. Ce module déploie Infisical sur Cloud Run v2 en s'appuyant sur le socle App_CloudRun, qui provisionne et gère l'infrastructure Google Cloud partagée.

Ce guide se concentre sur les services cloud utilisés par Infisical et sur la manière de les explorer et de les exploiter depuis la console Google Cloud et la ligne de commande. Pour les mécanismes communs à toutes les applications Cloud Run — identité du service, entrée et équilibrage de charge, mise à l'échelle et concurrence, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls, sauvegardes et cycle de vie du déploiement — reportez-vous au guide du socle App_CloudRun plutôt que de les répéter ici.


1. Vue d'ensemble​

Infisical s'exécute sous forme de conteneur Node.js (une image construite sur mesure qui encapsule l'image officielle infisical/infisical) sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service Node.js construit sur mesure, 1 vCPU / 2Gi par défaut, mise à l'échelle automatique serverless ; mise à l'échelle à zéro prise en charge
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — Infisical ne prend pas en charge MySQL ni d'autres moteurs
Cache et limitation de débitRedis (facultatif, activé par défaut)Redis hébergé sur NFS par défaut, ou un Redis externe authentifié via redis_auth
SecretsSecret ManagerENCRYPTION_KEY, AUTH_SECRET, ADMIN_PASSWORD générés automatiquement ; mot de passe de la base de données
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut ; équilibreur de charge HTTPS externe + domaine personnalisé en option

Valeurs par défaut judicieuses à connaître d'emblée :

  • PostgreSQL 15 est obligatoire. database_type vaut POSTGRES_15 par défaut et c'est la seule valeur prise en charge par Infisical.
  • L'image de conteneur est construite sur mesure, ce n'est pas l'image amont. Infisical_Common construit FROM infisical/infisical:${INFISICAL_VERSION} avec un entrypoint.sh d'encapsulation qui assemble la chaîne de connexion à la base de données au démarrage du conteneur (la valeur Secret Manager DB_PASSWORD disponible à l'exécution ne peut pas être encodée pour une URL au moment du plan Terraform). application_version = "latest" correspond à une version figée et éprouvée (v0.162.10) transmise comme argument de build, conformément à la convention de ce catalogue qui proscrit de construire à partir d'images de base taguées latest.
  • Redis est activé par défaut, et ses modes de raccordement s'excluent mutuellement par construction. Lorsque redis_auth est vide (par défaut), l'injection en variables d'environnement en clair du Redis hébergé sur NFS du socle fournit REDIS_HOST/REDIS_PORT. Lorsque redis_auth est défini, Infisical_Common crée et injecte à la place son propre secret REDIS_URL. Un seul chemin est actif à la fois.
  • La sonde de démarrage est TCP, et non HTTP. Infisical expose bien un point de terminaison non authentifié /api/status qui renvoie 200 avec du JSON lorsqu'il est sain — mais seulement une fois que l'application signale une disponibilité complète (base de données + Redis + dépendances). Une sonde de démarrage HTTP sur ce chemin ne réussirait jamais ; le module utilise donc par défaut une sonde TCP (qui réussit dès que le port est lié) et désactive entièrement la sonde de vivacité pour éviter une boucle de redémarrages d'un conteneur encore en cours de démarrage.
  • Aucun stockage d'objets n'est monté. Un bucket GCS générique data est provisionné via la variable storage_buckets du socle, mais gcs_volumes est vide par défaut — Infisical conserve tout son état persistant dans PostgreSQL et n'a besoin d'aucun montage de bucket.
  • Le compte administrateur est amorcé sans interface, et non via l'interface web. Un job d'initialisation admin-bootstrap exécute la commande bootstrap de la CLI infisical contre le serveur en cours d'exécution, ce qui évite la fenêtre d'inscription « ouverte jusqu'à ce que le premier visiteur la revendique ». Sur Cloud Run, ce job ne s'exécute pas automatiquement lors de l'application — voir §3.

2. Services Google Cloud et comment les explorer​

Toutes les commandes supposent que PROJECT et REGION sont définis. Les noms des services et des ressources figurent dans les Sorties du déploiement.

A. Cloud Run — le service Infisical​

Infisical s'exécute en tant que service Cloud Run v2 qui se met à l'échelle automatiquement selon la charge de requêtes, entre le nombre minimal et maximal d'instances. Chaque déploiement crée une révision immuable.

  • Console : Cloud Run → sélectionnez le service pour consulter les révisions, le trafic, les journaux et les métriques.
  • CLI :
    gcloud run services list --project "$PROJECT" --region "$REGION"
    gcloud run services describe <service-name> --project "$PROJECT" --region "$REGION"
    gcloud run revisions list --service <service-name> --project "$PROJECT" --region "$REGION"

Consultez App_CloudRun pour la mise à l'échelle, la concurrence, l'environnement d'exécution et la répartition du trafic.

B. Cloud SQL for PostgreSQL 15​

Infisical stocke toutes les données applicatives (secrets, projets, organisations, utilisateurs, journaux d'audit) dans une instance gérée Cloud SQL for PostgreSQL 15. Le service se connecte via le Cloud SQL Auth Proxy sur un socket Unix (enable_cloudsql_volume = true par défaut) ; aucune IP publique n'est exposée. Lors du premier déploiement, le job d'initialisation db-init crée la base de données applicative et le rôle.

  • Console : SQL → sélectionnez l'instance pour consulter les connexions, les sauvegardes, les flags et les métriques.
  • CLI :
    gcloud sql instances list --project "$PROJECT"
    gcloud sql instances describe <instance-name> --project "$PROJECT"
    gcloud sql connect <instance-name> --user=<db-user> --database=<db-name> --project "$PROJECT"

Le nom de l'instance, la base de données, l'utilisateur et le secret du mot de passe figurent dans les Sorties. Consultez App_CloudRun pour le modèle de connexion, les sauvegardes et la rotation du mot de passe.

C. Redis (cache et limitation de débit)​

Redis est activé par défaut (enable_redis = true). Lorsque redis_host est laissé vide, l'IP de la VM du serveur NFS est utilisée comme hôte Redis par défaut. Lorsque redis_auth est défini, Infisical_Common provisionne son propre secret Secret Manager REDIS_URL au lieu de s'appuyer sur l'injection en variables d'environnement en clair du socle.

  • CLI :
    redis-cli -h <redis-host> ping
    # Confirm which Redis path is active in the running revision:
    gcloud run services describe <service-name> --region "$REGION" \
    --format='value(spec.template.spec.containers[0].env)'

D. Secret Manager​

Trois secrets cryptographiques sont générés automatiquement et stockés dans Secret Manager : ENCRYPTION_KEY (chiffre chaque secret stocké par Infisical), AUTH_SECRET (signe les jetons de session JWT) et ADMIN_PASSWORD (utilisé uniquement par le job admin-bootstrap, jamais injecté dans le serveur en cours d'exécution). Un secret REDIS_URL est créé de manière conditionnelle. Le mot de passe de la base de données est géré séparément par le socle.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT" --filter="name~infisical"
    gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"

Consultez App_CloudRun pour les détails d'injection et de rotation.

E. Réseau et entrée​

Le service est accessible par défaut via son URL run.app. Un équilibreur de charge HTTPS externe avec un domaine personnalisé, Cloud CDN et Cloud Armor peut être ajouté.

  • CLI :
    gcloud run services describe <service-name> --region "$REGION" --format='value(status.url)'

F. Cloud Logging et Monitoring​

Les journaux du conteneur sont envoyés vers Cloud Logging ; les métriques Cloud Run et Cloud SQL vers Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte en option.

  • CLI :
    gcloud run services logs read <service-name> --project "$PROJECT" --region "$REGION" --limit 50

3. Comportement de l'application Infisical​

  • Initialisation de la base de données au premier déploiement. Le job d'initialisation db-init exécute postgres:15-alpine, se connecte via le socket du Cloud SQL Auth Proxy et crée de manière idempotente le rôle et la base de données applicatifs (correspondant aux DB_USER/DB_NAME injectés par le socle). execute_on_apply = true : il s'exécute donc à chaque apply et peut être relancé sans risque.
  • La chaîne de connexion à la base de données est assemblée au démarrage du conteneur, et non figée au moment du plan. Infisical accepte un unique DB_CONNECTION_URI, mais le DB_PASSWORD d'exécution (une valeur Secret Manager) n'est pas connu lorsque Terraform génère l'image — entrypoint.sh l'encode pour une URL et construit l'URI à partir des valeurs distinctes DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAME, en choisissant le sslmode selon la forme de DB_HOST (chemin de socket Unix → disable ; boucle locale → disable ; IP privée brute → require).
  • Le compte administrateur est amorcé sans interface — mais pas automatiquement sur Cloud Run. Le job d'initialisation admin-bootstrap (image infisical/cli:latest, dépend de db-init) exécute infisical bootstrap --ignore-if-bootstrapped contre l'API HTTP du serveur en cours d'exécution pour créer le premier super-administrateur, l'organisation et l'identité machine d'administrateur de l'instance. Comme les jobs d'initialisation Cloud Run s'exécutent strictement avant que le Service n'existe, ce job ne peut pas joindre un serveur actif au moment de l'application — execute_on_apply = false. Déclenchez-le manuellement après avoir vérifié que le service est sain :
    curl -s "$SERVICE_URL/api/status"   # expect HTTP 200 with a JSON body
    gcloud run jobs execute <service>-admin-bootstrap --region "$REGION" --project "$PROJECT" --wait
    Le job effectue jusqu'à 20 tentatives (à 15s d'intervalle) et est idempotent (--ignore-if-bootstrapped) ; le relancer après un redéploiement est donc sans conséquence.
  • Le mot de passe administrateur réside uniquement dans Secret Manager. Récupérez l'identifiant amorcé avec :
    gcloud secrets versions access latest --secret=<prefix>-infisical-admin-password --project "$PROJECT"
    Il n'est jamais injecté dans le conteneur du serveur en cours d'exécution — uniquement dans le job admin-bootstrap.
  • Point de terminaison de santé. /api/status 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 — mais les sondes de démarrage et de vivacité de la plateforme ne l'interrogent volontairement pas directement (voir §1) ; utilisez-le plutôt pour vos propres vérifications de santé manuelles et pour la surveillance externe de disponibilité.
  • Redis est facultatif mais activé par défaut. Ne définissez enable_redis = false que si vous êtes certain de ne vouloir aucun backend de cache ou de limitation de débit ; Infisical se rabat sur un fonctionnement en mémoire sans Redis, mais perd la cohérence entre instances dès que max_instance_count > 1.

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Infisical ou notables pour celui-ci sont listés ; toutes les autres entrées sont héritées d'App_CloudRun avec leur comportement standard.

Groupe 1 — Projet et identité​

VariableValeur par défautDescription
project_id(obligatoire)Projet Google Cloud cible.
regionus-central1Région du service et des ressources régionales.

Groupe 2 — Environnement de déploiement​

VariableValeur par défautDescription
tenant_iddemoCourt suffixe qui rend les noms de ressources uniques par environnement.
support_users[]Adresses e-mail auxquelles sont accordés l'accès au projet et les alertes de surveillance.
resource_labels{}Libellés appliqués à toutes les ressources.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_nameinfisicalNom de base des ressources. Ne pas modifier après le premier déploiement.
display_nameInfisicalNom lisible affiché dans la console.
descriptionInfisical - Open Source Secrets ManagementDescription du service.
application_versionlatestTag de version de l'image. "latest" correspond à un argument de build figé (v0.162.10) — la documentation d'Infisical recommande de ne jamais exécuter un latest nu en production.
site_url""URL publique pour SITE_URL (liens d'invitation et d'e-mail, CORS) et cible de la CLI du job admin-bootstrap. Vaut par défaut l'URL run.app calculée de ce service lorsqu'elle est vide.
admin_emailadmin@techequity.cloudAdresse e-mail du premier compte super-administrateur amorcé.
admin_organizationDefault OrganizationNom de l'organisation créée pour le compte amorcé.

Groupe 4 — Exécution et mise à l'échelle​

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour ne provisionner que l'infrastructure.
container_image_sourcecustomcustom construit le Dockerfile d'Infisical_Common ; prebuilt déploie directement container_image.
cpu_limit1000mCPU par instance.
memory_limit2GiMémoire par instance.
container_port8080Port sur lequel écoute Infisical.
execution_environmentgen2Gen2 requis pour les montages NFS.
enable_cloudsql_volumetrueSidecar de socket Unix du Cloud SQL Auth Proxy — le choix du sslmode par l'entrypoint repose sur la forme du chemin de socket.
min_instance_count00 active la mise à l'échelle à zéro.
max_instance_count3Peut dépasser 1 sans risque — les migrations utilisent un verrou consultatif Postgres distribué et l'authentification repose sur JWT (aucun état de session en mémoire nécessitant de l'affinité).
enable_image_mirroringtrueRépliquer l'image construite dans Artifact Registry.

Groupe 5 — Contrôle d'accès et d'entrée​

VariableValeur par défautDescription
ingress_settingsallAccès public ; Infisical est généralement sollicité à la fois par des navigateurs et par des clients CLI/SDK.
vpc_egress_settingPRIVATE_RANGES_ONLYN'acheminer que le trafic RFC 1918 via le VPC.
enable_iapfalseExiger une connexion Google devant Infisical.
smtp_host / smtp_port / smtp_user / smtp_password / smtp_secure_enabled / mail_fromdiversesDéclarées mais non transmises à Infisical_Common — inertes, sans effet sur le déploiement.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres non secrets supplémentaires. Les variables principales d'Infisical (HOST, SITE_URL, DB_CONNECTION_URI) sont définies automatiquement.
secret_environment_variables{}Map variable d'environnement → nom de secret Secret Manager.
secret_propagation_delay30Nombre de secondes d'attente après la création d'un secret avant de poursuivre.
secret_rotation_period2592000sFréquence des notifications de rotation de Secret Manager.

Groupe 7 — Sauvegarde et restauration​

Entrées standard de sauvegarde et de restauration d'App_CloudRun — consultez App_CloudRun. Entrées principales : backup_schedule, backup_retention_days, enable_backup_import.

Groupe 8 — CI/CD et Binary Authorization​

Intégration standard Cloud Build / Cloud Deploy d'App_CloudRun — consultez App_CloudRun.

Groupe 9 — Scripts SQL personnalisés​

enable_custom_sql_scripts, custom_sql_scripts_bucket, custom_sql_scripts_path, custom_sql_scripts_use_root — exécutent du SQL depuis un bucket GCS après le provisionnement. Consultez App_CloudRun.

Groupe 10 — Équilibreur de charge, CDN et rétention des images​

Entrées standard d'App_CloudRun pour Cloud Armor, le CDN et la conservation dans Artifact Registry — consultez App_CloudRun.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueCréer les buckets GCS définis dans storage_buckets.
storage_buckets[{ name_suffix = "data" }]Bucket par défaut au niveau du socle — provisionné mais jamais monté ; Infisical n'a besoin d'aucun stockage d'objets.
enable_nfs(valeur par défaut du socle)Pertinent ici uniquement comme source par défaut de l'IP de l'hôte Redis lorsque redis_host est vide.
gcs_volumes[]Buckets GCS montés via GCS Fuse. Vide par défaut et inutilisé par Infisical.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Fixe — Infisical exige PostgreSQL.
db_nameinfisicalNom de la base de données PostgreSQL. Ne pas modifier après le déploiement initial.
db_userinfisicalUtilisateur applicatif de la base de données. Mot de passe généré automatiquement dans Secret Manager.
database_password_length32Longueur du mot de passe généré (16–64).

Groupe 13 — Jobs et tâches planifiées​

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser les jobs par défaut db-init + admin-bootstrap d'Infisical_Common.
cron_jobs[]Jobs récurrents déclenchés par Cloud Scheduler.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeTCP, container_portTransmis à Infisical_Common. TCP, et non HTTP /api/status — voir §1.
liveness_probedésactivéeTransmis à Infisical_Common. Désactivée pour la même raison que la sonde de démarrage.
uptime_check_config{ enabled=false, path="/" }Test de disponibilité Cloud Monitoring — envisagez de faire pointer path vers /api/status pour obtenir un signal de santé externe pertinent.

Groupe 21 — Cache Redis​

VariableValeur par défautDescription
enable_redistrueActiver Redis pour le cache et la limitation de débit.
redis_host""Laissez vide pour utiliser par défaut l'IP du serveur NFS.
redis_port6379Port Redis.
redis_auth"" (sensible)Lorsqu'il est défini, fait basculer Infisical sur le secret REDIS_URL propre à Infisical_Common au lieu de l'injection en variables d'environnement en clair du socle.
cubejs_api_url / hub_api_urlURL localhostDéclarées mais non transmises à Infisical_Common — inertes, sans effet.

Groupe 22 — VPC Service Controls et journalisation d'audit​

Entrées standard — consultez App_CloudRun.


5. Sorties​

Renvoyées lors d'un déploiement réussi — le moyen le plus rapide de localiser et d'explorer les ressources en cours d'exécution.

SortieDescription
service_nameNom du service Cloud Run.
service_urlURL run.app par défaut du service.
service_locationRégion dans laquelle le service s'exécute.
load_balancer_ip / load_balancer_urlIP / URL de l'équilibreur de charge HTTPS externe (si activé).
database_instance_nameNom de l'instance Cloud SQL.
database_name / database_userNom / utilisateur de la base de données applicative.
database_password_secretSecret Secret Manager contenant le mot de passe de la base de données.
database_host / database_portPoint de terminaison / port de la base de données.
storage_bucketsBuckets Cloud Storage créés (le bucket data inutilisé).
network_nameNom du réseau VPC.
container_image / container_registryImage déployée et dépôt Artifact Registry.
monitoring_enabled / uptime_check_namesÉtat de la surveillance et tests de disponibilité.
initialization_jobsNoms des jobs db-init et admin-bootstrap.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / artifact_registry_repositoryÉtat de la CI/CD et registre.
vpc_sc_enabled / audit_logging_enabledPosture de sécurité.

6. Pièges de configuration et valeurs par défaut judicieuses​

Risque : Critique (perte de données / panne / sécurité) — Élevé (service dégradé) — Moyen (coût ou dégradation partielle) — Faible (mineur).

Validation au moment du plan héritée. Ce module fait passer sa configuration par le moteur du socle App_CloudRun, qui valide les valeurs et leurs combinaisons au moment du plan. Une configuration invalide fait échouer le plan avec une erreur claire et nommée avant la création de toute ressource.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
ENCRYPTION_KEY (généré automatiquement)Ne jamais le faire pivoter après le premier démarrageCritiqueLe faire pivoter rend définitivement indéchiffrable chaque secret stocké auparavant.
AUTH_SECRET (généré automatiquement)Ne le faire pivoter que pendant une fenêtre de maintenanceCritiqueLe faire pivoter invalide toutes les sessions utilisateur actives.
db_name / db_userDéfinir une seule foisCritiqueImmuables après le premier déploiement ; un renommage recrée la base de données ou l'utilisateur et détruit toutes les données.
enable_redisTransmettre var.enable_redis sans condition à App_CloudRunCritiqueLe figer à false dans l'appel au socle laisse REDIS_URL totalement indéfini dans le cas courant sans authentification — Infisical plante au démarrage avec « Either REDIS_URL, REDIS_SENTINEL_HOSTS or REDIS_CLUSTER_HOSTS must be defined ».
database_typePOSTGRES_15CritiqueToute valeur autre que Postgres est rejetée par la validation, ou (si elle était définie d'une manière ou d'une autre) Infisical ne parviendrait pas du tout à se connecter — MySQL n'est pas pris en charge.
startup_probe / liveness_probeConserver les valeurs par défaut du module (démarrage TCP, vivacité désactivée)ÉlevéFaire pointer l'une ou l'autre vers HTTP /api/status empêche la révision Cloud Run de devenir Ready — ce point de terminaison ne renvoie 2xx qu'après une disponibilité complète (base de données + Redis + dépendances), et Cloud Run n'achemine pas de trafic vers un service qui attend encore sa propre sonde de démarrage.
Job admin-bootstrapLe déclencher manuellement après le premier déploiement sainÉlevéSans ce déclenchement, aucun compte administrateur n'existe et l'instance est inutilisable depuis l'interface ou l'API tant que le job n'a pas été exécuté.
site_urlLaisser vide pour l'URL run.app calculée automatiquement, ou définir explicitement pour un domaine personnaliséMoyenUne valeur incorrecte casse les liens d'invitation et d'e-mail, le CORS et la cible du job admin-bootstrap.
smtp_host / smtp_user / smtp_password / mail_from / cubejs_api_url / hub_api_urlN/AFaibleCes variables sont déclarées par souci de parité avec les conventions, mais ne sont jamais transmises à Infisical_Common — les définir est sans effet.
memory_limit2Gi (par défaut) ou plusMoyenDes valeurs inférieures exposent à des arrêts OOM sous une charge concurrente de récupération de secrets.

Pour le comportement du socle évoqué tout au long de ce guide — identité du service, mise à l'échelle et concurrence, entrée et équilibrage de charge, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC-SC, sauvegardes et mise en miroir des images — consultez App_CloudRun. La configuration applicative propre à Infisical, partagée avec la variante GKE, est décrite dans Infisical_Common.

Need RAD to do something it does not do yet? Request it on the roadmap, or vote on what is already there.