Aller au contenu principal

Vaultwarden sur Google Cloud Run

Vaultwarden sur Google Cloud Run

Vaultwarden est un gestionnaire de mots de passe léger, auto-hébergé et compatible avec Bitwarden, écrit en Rust. Ce module déploie Vaultwarden 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 Vaultwarden 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​

Vaultwarden s'exécute sous forme de binaire Rust compilé sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service binaire Rust, 1 vCPU / 512 Mi par défaut, mise à l'échelle automatique selon les requêtes
Base de donnéesCloud SQL for PostgreSQL 15 (par défaut) ou MySQL 8.0Moteur configurable ; le job d'initialisation s'adapte automatiquement
Stockage d'objetsCloud StorageUn bucket vaultwarden-attachments dédié
SecretsSecret ManagerMot de passe de la base de données ; Vaultwarden gère lui-même son jeton d'administration en interne
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 :

  • Les inscriptions sont fermées par défaut. signups_allowed = false empêche la création anonyme de comptes. Activez-les uniquement pendant la configuration initiale de l'administrateur, puis désactivez-les.
  • Aucun jeton d'administration n'est généré automatiquement. Le panneau /admin est désactivé tant que vous ne fournissez pas ADMIN_TOKEN dans environment_variables. C'est la valeur par défaut sécurisée.
  • domain doit être défini pour WebAuthn et TOTP. Sans l'URL publique complète, les codes QR de 2FA pointent vers localhost et les e-mails d'invitation à une organisation contiennent des liens cassés.
  • Les sondes de santé ciblent /alive, le point de terminaison de santé léger dédié de Vaultwarden. Vaultwarden démarre en quelques secondes ; la sonde de démarrage utilise un délai initial de 30 s.
  • cpu_limit doit être d'au moins 1000m. Cloud Run gen2 avec CPU toujours allouée (requis pour un gestionnaire de mots de passe avec min_instance_count ≥ 1) exige au moins 1 vCPU.
  • execution_environment = "gen2" est la valeur par défaut et ne doit pas être modifiée ; elle est requise pour les connexions par socket Unix au Cloud SQL Auth Proxy.
  • min_instance_count = 1 garde le coffre-fort actif. La mise à l'échelle à zéro rend un gestionnaire de mots de passe indisponible pendant plusieurs secondes ; les clients Bitwarden affichent des erreurs de connexion.

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 Vaultwarden​

Vaultwarden s'exécute sous forme de service Cloud Run v2 qui se met à l'échelle automatiquement selon la charge de requêtes, entre les nombres minimal et maximal d'instances. Chaque déploiement crée une révision immuable ; le trafic peut être réparti entre les révisions pour des déploiements progressifs sûrs.

  • Console : Cloud Run → sélectionnez le service pour voir 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 — PostgreSQL 15 ou MySQL 8.0​

Vaultwarden stocke toutes les données du coffre-fort dans une instance Cloud SQL gérée. Le moteur par défaut est PostgreSQL 15 ; définissez database_type = "MYSQL_8_0" pour utiliser MySQL à la place. Le service se connecte de manière privée via le Cloud SQL Auth Proxy sur un socket Unix (sans IP publique). Lors du premier déploiement, un job d'initialisation crée la base de données et l'utilisateur de l'application.

  • Console : SQL → sélectionnez l'instance pour voir 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> --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 des mots de passe.

C. Cloud Storage​

Un bucket Cloud Storage dédié (vaultwarden-attachments) est provisionné pour les pièces jointes. Le compte de service de la charge de travail y reçoit l'accès automatiquement.

  • Console : Cloud Storage → Buckets.
  • CLI :
    gcloud storage buckets list --project "$PROJECT"
    gcloud storage ls gs://<attachments-bucket>/ # bucket name is in the Outputs

Consultez App_CloudRun pour les montages GCS Fuse et les options CMEK.

D. Secret Manager​

Le mot de passe de la base de données est stocké dans Secret Manager et injecté dans le service à l'exécution. Vaultwarden gère lui-même son jeton d'administration interne et ses clés de signature RSA dans le répertoire /data — ceux-ci ne sont pas stockés dans Secret Manager.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT"
    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 à son URL run.app. Un équilibreur de charge HTTPS externe avec un domaine personnalisé, Cloud CDN (avec prudence — ne mettez pas en cache les réponses d'API authentifiées) et Cloud Armor peuvent être ajoutés. Cloud Armor est vivement recommandé pour protéger le point de terminaison de connexion de Vaultwarden contre les attaques par force brute.

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

Consultez App_CloudRun.

F. Cloud Logging et Monitoring​

Les journaux des conteneurs sont envoyés vers Cloud Logging ; les métriques de Cloud Run et de Cloud SQL sont envoyées vers Cloud Monitoring, avec des tests de disponibilité (ciblant /alive) et des règles d'alerte en option.

  • 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 Vaultwarden​

  • Configuration de la base de données au premier déploiement. Un job d'initialisation crée la base de données et l'utilisateur Vaultwarden avant le démarrage du service. Il est idempotent. L'image de job appropriée est sélectionnée automatiquement : postgres:15-alpine pour PostgreSQL, mysql:8.0-debian pour MySQL.
  • Aucune migration de schéma au démarrage. Vaultwarden gère automatiquement l'évolution de son schéma interne ; aucune commande de migration n'est nécessaire.
  • Aucune tâche planifiée requise. Contrairement à de nombreuses applications web, Vaultwarden n'a aucun job cron obligatoire. Toutes les opérations du coffre-fort sont déclenchées par des requêtes.
  • Chemin de santé. Les sondes de démarrage et d'activité ciblent toutes deux /alive, qui renvoie OK lorsque le serveur est prêt. Le délai initial est de 30 s, en phase avec le démarrage rapide de Vaultwarden en Rust.
  • Panneau d'administration. Le panneau /admin est désactivé tant que ADMIN_TOKEN n'est pas fourni via environment_variables. Générez un jeton aléatoire sécurisé (par exemple avec openssl rand -base64 48) et injectez-le à l'exécution.
  • SMTP pour les notifications. Vaultwarden utilise SMTP pour la vérification des comptes, les codes de récupération 2FA et les e-mails d'accès d'urgence. Configurez SMTP_HOST, SMTP_PORT, SMTP_FROM, SMTP_USERNAME et SMTP_PASSWORD (via secret_environment_variables) comme un ensemble complet — une configuration SMTP partielle provoque des échecs de distribution silencieux.

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Vaultwarden ou notables pour lui 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(required)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.
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 et paramètres Vaultwarden​

VariableValeur par défautDescription
application_namevaultwardenNom de base des ressources. Ne le modifiez pas après le premier déploiement.
display_nameVaultwarden Password ManagerNom convivial affiché dans la console.
description(set)Description du service.
application_version1.32.7Tag de version de l'image Vaultwarden.
domain""URL publique complète (par exemple https://vault.example.com). Requise pour WebAuthn, les codes QR TOTP, les invitations à une organisation et les liens des pièces jointes.
signups_allowedfalseAutoriser l'auto-inscription de nouveaux utilisateurs. Activez-la uniquement pendant la configuration initiale ; désactivez-la immédiatement après avoir créé les comptes administrateurs.
web_vault_enabledtrueServir l'interface web de Vaultwarden. Désactivez-la pour un accès uniquement par API via les clients natifs.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
container_image_sourcecustomcustom effectue le build à partir du Dockerfile ; prebuilt utilise une URI d'image existante.
cpu_limit1000mCPU par instance. Minimum de 1000m imposé par validation (exigence de Cloud Run gen2).
memory_limit512MiMémoire par instance. Vaultwarden est très léger au repos.
min_instance_count1Nombre minimal d'instances. Conservez ≥ 1 pour éviter l'indisponibilité du coffre-fort due aux démarrages à froid.
max_instance_count3Nombre maximal d'instances (plafond de coût).
container_port80Port HTTP Rocket de Vaultwarden. Doit correspondre à ROCKET_PORT.
enable_cloudsql_volumetrueSidecar Cloud SQL Auth Proxy pour les connexions par socket Unix. Requis.
execution_environmentgen2Gen2 est requis pour la prise en charge des sockets Unix. Ne le modifiez pas.
cpu_always_allocatedfalsePar défaut, Vaultwarden sert à la demande (facturation à la requête). Passez à true uniquement si vous activez le serveur de notifications push WebSocket de Vaultwarden — sinon, la CPU limitée entre les requêtes casse la connexion WS persistante que les clients interrogent.
timeout_seconds300Durée maximale d'une requête en secondes (0–3600).
traffic_split[]Répartir le trafic entre les révisions pour des déploiements progressifs.
max_revisions_to_retain7Nombre d'anciennes révisions à conserver pour un retour arrière.

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

VariableValeur par défautDescription
ingress_settingsallRéseaux autorisés à atteindre le service (all / internal / internal-and-cloud-load-balancing).
vpc_egress_settingPRIVATE_RANGES_ONLYMode d'acheminement du trafic sortant via le connecteur VPC.
enable_iapfalseExiger une connexion Google via Identity-Aware Proxy. Remarque : IAP peut empêcher les clients Bitwarden natifs de se connecter.
iap_authorized_users / iap_authorized_groups[]Personnes autorisées à accéder via IAP.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables(SMTP/log defaults)Paramètres en texte clair. Les variables principales ROCKET_PORT, SIGNUPS_ALLOWED, WEB_VAULT_ENABLED, DATA_FOLDER et, en option, DOMAIN sont injectées automatiquement. Les valeurs par défaut incluent LOG_LEVEL=warn, SHOW_PASSWORD_HINT=false et des valeurs SMTP fictives.
secret_environment_variables{}Correspondance variable d'environnement → nom de secret Secret Manager (par exemple { SMTP_PASSWORD = "vaultwarden-smtp-pass" }).
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​

VariableValeur par défautDescription
backup_schedule0 2 * * *Planification cron des sauvegardes automatiques (UTC).
backup_retention_days30Durée de rétention ; la valeur par défaut de 30 jours reflète l'importance de la récupération du coffre-fort.
enable_backup_import / backup_source / backup_uri / backup_formatoptions de restaurationRestaurer à partir d'une sauvegarde lors du déploiement.

Groupe 8 — CI/CD et Binary Authorization​

Intégration standard Cloud Build / Cloud Deploy d'App_CloudRun — consultez App_CloudRun. Entrées principales : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy, enable_binary_authorization, binauthz_evaluation_mode.

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 Cloud Armor​

VariableValeur par défautDescription
enable_cloud_armorfalseRecommandé pour Vaultwarden. Provisionne un équilibreur de charge HTTPS global + le WAF Cloud Armor pour protéger le point de terminaison de connexion contre la force brute.
admin_ip_ranges[]Plages CIDR autorisées pour l'accès privilégié.
application_domains[]Noms d'hôte personnalisés. Définissez également domain sur l'URL https:// complète.
enable_cdnfalseCloud CDN. Ne mettez pas en cache les réponses d'API authentifiées — assurez-vous que des en-têtes Cache-Control: no-store sont en place.
max_images_to_retain / delete_untagged_images / image_retention_days(set)Règle de nettoyage d'Artifact Registry.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueProvisionner le bucket des pièces jointes.
storage_buckets[{ name_suffix = "data" }]Buckets supplémentaires.
enable_nfsfalseVolume NFS Filestore facultatif. Non requis pour Vaultwarden sur Cloud Run (les données sont dans Cloud SQL et GCS).
nfs_mount_path/mnt/nfsChemin de montage NFS dans le conteneur.
gcs_volumes[]Montages de volumes GCS Fuse.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15POSTGRES_15 (par défaut) ou MYSQL_8_0. L'image du job d'initialisation est sélectionné automatiquement.
db_namevaultwardenNom de la base de données. Immuable après le premier déploiement.
db_uservaultwardenUtilisateur de l'application. Immuable après le premier déploiement.
database_password_length32Longueur du mot de passe généré (16–64).
enable_auto_password_rotation / rotation_propagation_delay_secdésactivéRotation du mot de passe de la base de données.
db_host_env_var_name / db_user_env_var_name / db_name_env_var_name / db_port_env_var_name / service_url_env_var_name""Noms de variables d'environnement supplémentaires sous lesquels les informations de connexion sont injectées.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job de configuration de base de données intégré (qui sélectionne automatiquement l'image appropriée pour PostgreSQL ou MySQL).
cron_jobs[]Vaultwarden n'a aucune tâche planifiée requise ; ajoutez ici des Cloud Run Jobs personnalisés si nécessaire.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /alive, délai de 30 s, 6 échecsChemin de santé dédié de Vaultwarden ; 30 s correspond au démarrage rapide en Rust.
liveness_probeHTTP /alive, délai de 30 s, 3 échecsSonde de vivacité.
uptime_check_configdésactivé, /aliveTest de disponibilité Cloud Monitoring.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 21 — Redis​

VariableValeur par défautDescription
enable_redisfalseVaultwarden n'utilise pas Redis nativement. Laissez désactivé sauf si vous ajoutez une intégration personnalisée.
redis_host / redis_port / redis_auth(set)Point de terminaison, port et authentification Redis.

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

VariableValeur par défautDescription
enable_vpc_scfalseAppliquer un périmètre VPC-SC (nécessite organization_id).
vpc_cidr_ranges / vpc_sc_dry_run(set)Plages CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseJournaux Cloud Audit Logs détaillés.

5. Sorties​

Renvoyées après 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.
stage_servicesURL des services propres à chaque étape (Cloud Deploy).
load_balancer_ip / load_balancer_urlIP / URL de l'équilibreur de charge HTTPS externe (lorsqu'il est activé).
database_instance_nameNom de l'instance Cloud SQL.
database_name / database_userNom / utilisateur de la base de données de l'application.
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.
network_name / network_exists / regionsRéseau VPC, présence, régions.
container_image / container_registryImage déployée et dépôt Artifact Registry.
monitoring_enabled / monitoring_notification_channels / uptime_check_namesÉtat de la surveillance, canaux, tests de disponibilité.
initialization_jobsNoms des jobs de configuration.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / github_repository_url / github_repository_owner / github_repository_name / cicd_configurationÉtat et détails de la CI/CD.
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_idRegistre et déclencheur de build.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeÉtat de VPC-SC.
audit_logging_enabled / artifact_registry_cmek_enabledÉtat des journaux d'audit et de CMEK.

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).

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
signups_allowedfalseCritiqueTant que la valeur est true, n'importe quel internaute peut s'inscrire lui-même sur le coffre-fort. Désactivez-la immédiatement après avoir créé les comptes administrateurs.
enable_cloudsql_volumetrueCritiqueVaultwarden se connecte à Cloud SQL par socket Unix ; la désactivation fait échouer toutes les connexions à la base de données au démarrage.
db_name / db_userdéfinis une seule foisCritiqueLes modifier après le premier déploiement amène Vaultwarden à se connecter à une base de données vide ; tous les identifiants semblent perdus.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans backup_uri valide fait échouer le job d'import.
domainURL https:// complèteÉlevéSans elle, les codes QR TOTP pointent vers localhost, les e-mails d'invitation à une organisation contiennent des liens cassés et les URL des pièces jointes sont invalides.
database_typedéfini une seule foisÉlevéLe modifier après le premier déploiement amène Vaultwarden à voir une base de données vide ; tous les identifiants semblent perdus.
cpu_limit1000m ou plusÉlevéCloud Run gen2 avec CPU toujours allouée rejette les valeurs inférieures à 1000m au moment du déploiement.
container_port80ÉlevéDoit correspondre à ROCKET_PORT ; en cas de discordance, les vérifications de santé de Cloud Run échouent et toutes les requêtes expirent.
execution_environmentgen2ÉlevéGen1 ne prend pas en charge le chemin de socket Unix utilisé par le Cloud SQL Auth Proxy, ce qui provoque des échecs de connexion à la base de données au démarrage.
min_instance_count1ÉlevéLa mise à l'échelle à zéro rend un gestionnaire de mots de passe indisponible pendant 5–15 s lors d'un démarrage à froid ; les clients Bitwarden affichent des erreurs de connexion.
cpu_always_allocatedfalse sauf si le push WS est activéMoyenLaisser false alors que le serveur de notifications push WebSocket est activé limite la CPU entre les requêtes et casse la connexion WS persistante ; passez à true dans ce cas.
enable_cloud_armoractiver en productionMoyenSans Cloud Armor, le point de terminaison de connexion de Vaultwarden est exposé aux attaques par force brute depuis Internet.
enable_cdnfalse ou avec contrôles de cacheMoyenMettre en cache des réponses d'API authentifiées divulgue des données du coffre-fort entre utilisateurs.
backup_retention_days30 (à augmenter en production)MoyenUn gestionnaire de mots de passe sans rétention suffisante entraîne une perte d'identifiants en cas de défaillance de la base de données.
enable_iap avec des clients natifsà utiliser avec précautionMoyenIAP exige une authentification OAuth dans un navigateur ; les clients Bitwarden natifs ne peuvent pas mener à bien le flux IAP.
variables d'environnement smtp_*à configurer comme un ensemble completÉlevéUne configuration SMTP partielle provoque des échecs silencieux d'envoi d'e-mails — les codes de récupération 2FA et les e-mails d'invitation ne sont jamais envoyés.

Pour le comportement du socle évoqué tout au long de cette page — 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 à Vaultwarden partagée avec la variante GKE est décrite dans Vaultwarden_Common.

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