Aller au contenu principal

Passbolt sur Google Cloud Run

Passbolt sur Google Cloud Run

Passbolt (Community Edition) est un gestionnaire de mots de passe gratuit, open source et orienté équipe, avec un chiffrement fondé sur GPG et un partage d'identifiants par utilisateur et par groupe — sous licence AGPL-3.0, environ 6 000 étoiles sur GitHub. Il occupe une niche différente du module Vaultwarden de ce catalogue : Vaultwarden est un coffre personnel compatible Bitwarden, tandis que Passbolt est conçu autour du partage d'identifiants chiffrés par GPG entre utilisateurs et groupes à l'échelle de l'organisation. Ce module déploie l'image officielle passbolt/passbolt 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 Passbolt 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​

Passbolt s'exécute comme un unique conteneur Apache/PHP sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Conteneur Apache/PHP, port 80, 1 vCPU / 2Gi par défaut, min_instance_count = 0 (mise à l'échelle à zéro)
Base de donnéesCloud SQL for MySQL (MYSQL_8_0)Obligatoire — Passbolt est une application CakePHP exclusivement MySQL ; variables d'environnement distinctes DATASOURCES_DEFAULT_*, et non un DSN unique
État cryptographiqueDeux buckets GCS dédiés (storage, jwt)Contiennent la paire de clés GPG du serveur et la paire de clés JWT générées par l'application elle-même — pas des secrets générés par Terraform
SecretsSecret ManagerSeul le mot de passe de la base de données est généré par le socle — Passbolt lui-même n'apporte aucun secret (la sortie secret_ids de Passbolt_Common est toujours vide)
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 :

  • MySQL est obligatoire. database_type = "MYSQL_8_0" est imposé par Passbolt_Common ; Passbolt repose sur CakePHP avec un schéma exclusivement MySQL.
  • Aucun secret applicatif côté serveur. Contrairement à WordPress (plusieurs sels) ou aux applications de la famille Laravel (APP_KEY), Passbolt n'a aucune clé de chiffrement générée par Terraform. Son modèle de sécurité est entièrement côté client : l'extension de navigateur génère localement une paire de clés GPG et un mot de passe maître lors de la configuration. La paire de clés GPG propre au serveur (pour chiffrer des données à destination de Passbolt) et sa paire de clés JWT (jetons d'authentification de l'API) sont toutes deux générées par l'entrypoint de l'éditeur au premier démarrage et conservées sur des volumes GCS dédiés — elles ne sont ni créées ni renouvelées par Terraform.
  • Deux volumes GCS spécialisés, et non un seul, et pas tout le répertoire /etc/passbolt. storage est monté de façon ciblée sur /etc/passbolt/gpg ; jwt est monté de façon ciblée sur /etc/passbolt/jwt. Monter un volume unique sur l'ensemble de /etc/passbolt masquerait les fichiers de configuration/PHP intégrés (app.php, bootstrap.php, routes.php) qui se trouvent directement dans ce répertoire de l'image — la même catégorie de bug que ce catalogue a déjà rencontrée avec Cloudreve.
  • HTTPS = "on" est toujours injecté. Le bootstrap.php de Passbolt a $trustProxy = false codé en dur ; il ne tient donc pas compte de X-Forwarded-Proto par défaut — mais il vérifie directement la valeur littérale de env('HTTPS'). Comme Cloud Run termine le TLS en périphérie et transmet du HTTP simple au conteneur, cette surcharge statique permet à Passbolt de générer correctement des URL https:// dans les e-mails et les liens absolus.
  • enable_cloudsql_volume vaut false par défaut au niveau des variables de ce module — de façon asymétrique avec Passbolt_GKE, où il vaut true par défaut (les deux correspondent à la valeur par défaut true de Passbolt_Common). Définissez-le explicitement à true pour des connexions MySQL par socket sur Cloud Run.
  • Pas d'assistant de configuration web à la première visite. Le seul moyen de créer un compte administrateur est le job d'initialisation admin-bootstrap, qui affiche dans Cloud Logging une URL de configuration à usage unique que l'opérateur ouvre dans une extension de navigateur compatible Passbolt.
  • Pas de Redis. enable_redis = false par défaut — Passbolt n'a aucune intégration Redis utilisée par ce module.

2. Services Google Cloud et comment les explorer​

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

A. Cloud Run — le service Passbolt​

  • 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"

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

B. Cloud SQL for MySQL​

Passbolt stocke toutes les données applicatives — utilisateurs, groupes, dossiers, ressources de mots de passe chiffrées, autorisations de partage — dans une instance gérée Cloud SQL MySQL 8.0. La connexion à la base de données utilise les noms de variables d'environnement distincts propres à Passbolt (DATASOURCES_DEFAULT_HOST/_USERNAME/_PASSWORD/_DATABASE, vérifiés dans le fichier /passbolt/env.sh de l'éditeur), alimentés par le module applicatif à partir des valeurs standard DB_* du socle.

  • 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"

Voir App_CloudRun pour le modèle de connexion, les sauvegardes et la rotation des mots de passe.

C. Cloud Storage — les volumes des paires de clés GPG et JWT​

Deux buckets GCS sont provisionnés par Passbolt_Common et montés via GCS Fuse : storage sur /etc/passbolt/gpg, jwt sur /etc/passbolt/jwt. Il ne s'agit pas de buckets génériques de téléversement ou de médias — ils contiennent la paire de clés GPG du serveur et la paire de clés JWT générées par l'application, toutes deux créées une seule fois au premier démarrage puis réutilisées à chaque démarrage suivant. La perte de l'un ou l'autre bucket invalide tous les identifiants que Passbolt a chiffrés côté serveur et toutes les sessions JWT émises.

  • Console : Cloud Storage → repérez les deux buckets (leurs noms comportent les suffixes storage et jwt).
  • CLI :
    gsutil ls -p "$PROJECT" | grep passbolt
    gsutil ls gs://<storage-bucket-name>/ # expect serverkey.asc, serverkey_private.asc

D. Secret Manager​

Passbolt lui-même n'apporte aucun secret — la seule entrée Secret Manager liée à ce déploiement est le mot de passe de la base de données, géré par le socle.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT" --filter="name~passbolt"

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 domaine personnalisé, Cloud CDN et Cloud Armor peut être ajouté ; les paramètres d'entrée et la sortie VPC contrôlent la connectivité.

  • Console : Cloud Run (URL du service) ; Network services → Load balancing.
  • CLI :
    gcloud run services describe <service-name> --region "$REGION" --format='value(status.url)'

Voir App_CloudRun.

F. Cloud Logging et Monitoring​

Les journaux du conteneur sont envoyés à Cloud Logging — y compris l'URL de configuration à usage unique affichée par le job d'initialisation admin-bootstrap. Les métriques Cloud Run et Cloud SQL sont envoyées à Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte facultatifs.

  • Console : Logging → Logs Explorer ; Monitoring → Dashboards / Alerting.
  • CLI :
    gcloud run services logs read <service-name> --project "$PROJECT" --region "$REGION" --limit 50

3. Comportement de l'application Passbolt​

  • La chaîne de jobs d'initialisation en deux étapes, et pourquoi le second job n'a rien de trivial. Passbolt_Common définit deux Cloud Run Jobs ordonnés, tous deux avec execute_on_apply = true :

    1. db-init (mysql:8.0-debian) — crée le rôle et la base de données MySQL (le script db-init.sh partagé par tout le catalogue, compatible caching_sha2_password).

    2. admin-bootstrap (passbolt/passbolt:<version>, depends_on_jobs = ["db-init"]) — enregistre le compte administrateur initial.

      Les Cloud Run Jobs invoquent directement la command/les args d'un conteneur, en contournant entièrement la chaîne /docker-entrypoint.sh de l'éditeur — si bien qu'un simple cake passbolt register_user sur un conteneur fraîchement provisionné échoue avec une erreur interne 500, car la paire de clés GPG du serveur (normalement générée pendant la séquence de démarrage de l'entrypoint de l'éditeur) n'existe pas encore, et le schéma n'a pas non plus été installé. Le job charge donc les fonctions de l'entrypoint de l'éditeur (/passbolt/entrypoint.sh, /passbolt/env.sh, /passbolt/deprecated_paths.sh), génère ou importe la paire de clés GPG du serveur si elle manque, génère un certificat SSL autosigné s'il manque, exécute la fonction install() de l'éditeur (qui gère aussi la génération de la paire de clés JWT et l'installation/la migration du schéma de la base de données), et seulement ensuite exécute cake passbolt register_user -u <admin_email> -f <admin_first_name> -l <admin_last_name> -r admin — sans l'option -q/silencieuse, afin que l'URL de configuration à usage unique soit affichée et arrive dans Cloud Logging. Vérifié dans le code source réel /passbolt/entrypoint.sh de l'éditeur. Idempotent : gpg_gen_key/install() ne font rien une fois que les clés et le schéma existent déjà depuis une exécution précédente.

  • Pas d'assistant de configuration à la première visite, et un modèle d'amorçage réellement différent de la plupart des applications de ce catalogue. Passbolt exige que le client (une extension de navigateur) génère sa propre paire de clés GPG et son mot de passe maître — il n'y a aucun mot de passe côté serveur à initialiser ni rien à récupérer dans Secret Manager. Récupérez plutôt l'URL de configuration à usage unique :

    gcloud logging read \
    'resource.type="cloud_run_job" AND resource.labels.job_name~admin-bootstrap' \
    --project "$PROJECT" --limit 20 --format='value(textPayload)' | grep '/setup/start/'
  • Point de contrôle de santé. GET /healthcheck/status.json renvoie un 200 sans authentification avec {"header":{"status":"success",...},"body":"OK"} une fois l'application prête — vérifié par des tests de conteneur en local et un déploiement réel. Les sondes de démarrage et de vivacité ciblent toutes deux ce chemin par défaut.

  • Inspecter l'exécution des jobs :

    gcloud run jobs list --project "$PROJECT" --region "$REGION"
    gcloud run jobs executions list --job <job-name> --project "$PROJECT" --region "$REGION"

4. Variables de configuration​

Les variables sont regroupées exactement comme sur la plateforme de déploiement. Seuls les paramètres propres à Passbolt ou notables pour lui sont listés ; toutes les autres entrées sont héritées de 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_iddemoSuffixe court qui rend les noms de ressources uniques par environnement. Utilisez une valeur distincte (par ex. cr) de celle d'un Passbolt_GKE déployé en parallèle (gke) pour éviter une collision de noms.
support_users[]Adresses e-mail qui reçoivent 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_namepassboltNom de base des ressources. Ne pas modifier après le premier déploiement.
display_namePassboltNom lisible affiché dans la console.
application_versionlatestTag de l'image passbolt/passbolt.
admin_emailadmin@example.comAdresse e-mail du compte administrateur enregistré par admin-bootstrap.
admin_first_name / admin_last_nameAdmin / UserPrénom et nom du compte administrateur initial.
enable_gcs_storage_volumetrueMonte les volumes GCS storage (GPG) et jwt. À laisser activé.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinir à false pour ne provisionner que l'infrastructure.
container_image_sourceprebuiltDéploie directement l'image officielle ; Passbolt ne prend en charge que l'image préconstruite.
cpu_limit1000m1 vCPU.
memory_limit2GiLimite de mémoire — PHP 8.x + Apache.
min_instance_count0Mise à l'échelle à zéro par défaut.
max_instance_count1Instance unique par défaut.
container_port80Port d'écoute de Passbolt (Apache).
execution_environmentgen2Environnement d'exécution requis.
enable_cloudsql_volumetrueAsymétrique avec la valeur par défaut true de Passbolt_GKE. Définir à true pour des connexions MySQL par socket — le DATASOURCES_DEFAULT_HOST de Passbolt accepte directement le répertoire du socket.
cloudsql_volume_mount_path/cloudsqlChemin du conteneur pour le socket de l'Auth Proxy.
container_protocolhttp1"http1" ou "h2c".
enable_image_mirroringtrueCopie l'image Passbolt dans Artifact Registry.

Groupe 5 — Accès et réseau​

VariableValeur par défautDescription
ingress_settingsallContrôle du trafic entrant.
vpc_egress_settingPRIVATE_RANGES_ONLYContrôle de la sortie VPC.
enable_iapfalseIdentity-Aware Proxy.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres supplémentaires non secrets. HTTPS = "on" et (lorsqu'elle est connue) APP_FULL_BASE_URL sont définis automatiquement.
secret_environment_variables{}Correspondance variable d'environnement → nom de secret Secret Manager. Passbolt lui-même n'en apporte aucun.

Groupe 11 — Cloud Storage​

VariableValeur par défautDescription
gcs_volumes[]Buckets GCS supplémentaires à monter, en plus des deux que Passbolt provisionne automatiquement (storage, jwt).
enable_nfstrueProvisionne un volume Filestore. Non utilisé par le modèle de persistance de Passbolt — les paires de clés GPG/JWT résident sur des volumes GCS dédiés et tout le reste dans MySQL. Valeur par défaut générique sans conséquence.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typeMYSQL_8_0Moteur Cloud SQL. Passbolt nécessite MySQL.
db_namepassboltNom de la base de données MySQL.
db_userpassboltUtilisateur applicatif MySQL.
database_password_length32Longueur du mot de passe généré (16–64).
db_host_env_var_name / db_user_env_var_name / db_name_env_var_name / db_password_env_var_nameDATASOURCES_DEFAULT_HOST / _USERNAME / _DATABASE / _PASSWORDDéfinies par passbolt.tf, non exposées à l'utilisateur — Passbolt lit des noms de variables d'environnement CakePHP/PDO distincts, et non les noms standard DB_* du socle.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser la chaîne de 2 jobs par défaut de Passbolt_Common (db-init → admin-bootstrap). Une liste non vide la remplace entièrement.
cron_jobs[]Passbolt n'a par défaut aucune tâche récurrente planifiée par la plateforme.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /healthcheck/status.json, délai de 20 s, 20 tentativesPoint de contrôle d'état de Passbolt, sans authentification.
liveness_probeHTTP /healthcheck/status.json, délai de 60 sMême point de terminaison.
uptime_check_config{ enabled=false, path="/" }Test de disponibilité Cloud Monitoring.

Groupe 21 — Redis​

VariableValeur par défautDescription
enable_redisfalseNon utilisé par Passbolt. Présent pour la compatibilité avec la plateforme.

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

Intégration VPC-SC standard d'App_CloudRun — voir App_CloudRun.


5. Sorties​

Renvoyées lorsqu'un déploiement réussit — 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 s'exécute le service.
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_bucketsLes buckets GCS storage (GPG) et jwt.
container_imageImage déployée.
initialization_jobsNoms des jobs d'initialisation créés (db-init, admin-bootstrap).
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / github_repository_urlÉtat de la CI/CD.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeÉtat de VPC-SC.

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 héritée au moment du plan. Ce module transmet sa configuration au 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
database_typeMYSQL_8_0CritiqueLe schéma CakePHP de Passbolt est exclusivement MySQL — tout autre moteur empêche complètement le démarrage.
enable_gcs_storage_volumetrueCritiqueLe désactiver supprime les volumes persistants de la paire de clés GPG du serveur et de la paire de clés JWT générées par l'application — tous les identifiants que Passbolt a chiffrés côté serveur, et toutes les sessions JWT émises, deviennent irrécupérables au prochain redémarrage du conteneur.
Ordre de initialization_jobs (db-init → admin-bootstrap)Laissez [] sauf si vous maîtrisez parfaitement la dépendanceCritiqueLa reproduction, par le job admin-bootstrap, de la séquence de génération des clés GPG et d'installation du schéma de l'éditeur est indispensable — un job de remplacement naïf qui exécute directement cake passbolt register_user échoue avec une erreur interne, car la paire de clés GPG du serveur et le schéma n'existent pas encore.
enable_cloudsql_volumetrue (attention : vaut false par défaut sur cette variante)MoyenLe DATASOURCES_DEFAULT_HOST de Passbolt fonctionne directement sur le socket Unix du Cloud SQL Auth Proxy ; laisser la valeur par défaut false côté Cloud Run utilise à la place une connexion TCP directe, qui fonctionne toujours mais renonce à la terminaison TLS du socket et ne correspond ni à la valeur par défaut de Passbolt_Common ni à la variante GKE.
admin_email / admin_first_name / admin_last_nameÀ définir délibérément avant le premier déploiementMoyenCes valeurs initialisent l'unique compte administrateur créé par le job admin-bootstrap ; il n'existe ensuite aucun moyen de les modifier dans l'application, sauf via l'interface d'administration de Passbolt une fois connecté.
Aucun mot de passe administrateur à perdre——Contrairement à la plupart des applications de ce catalogue, il n'existe aucun identifiant administrateur conservé dans Secret Manager à récupérer. Si l'URL de configuration à usage unique est manquée et expire, la solution consiste à supprimer puis relancer le job admin-bootstrap (il est idempotent pour les étapes GPG/JWT/schéma, mais register_user lui-même peut nécessiter une nouvelle invocation pour obtenir une nouvelle URL — consultez la documentation de la CLI de Passbolt pour réémettre un lien de configuration).

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 — voir App_CloudRun. La configuration applicative propre à Passbolt, partagée avec la variante GKE, est décrite dans Passbolt_Common.

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