Aller au contenu principal

Element sur Google Cloud Run

Element sur Google Cloud Run

Element est le principal client web open source (AGPLv3) pour Matrix — une application de messagerie et de collaboration auto-hébergée, chiffrée de bout en bout. Ce module déploie Element sur Cloud Run v2 en s'appuyant sur le socle App_CloudRun, qui provisionne et gère l'infrastructure Google Cloud partagée.

Element est une application monopage (SPA) statique servie par nginx : le navigateur communique directement avec un serveur d'accueil (homeserver) Matrix (tel que Synapse ou Dendrite) via HTTPS, de sorte que le conteneur lui-même ne conserve aucun état côté serveur — ni base de données, ni Redis, ni stockage persistant, ni secrets.

Ce guide se concentre sur les services cloud utilisés par Element 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 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​

Element s'exécute comme un conteneur nginx statique sur Cloud Run v2. Le déploiement assemble un ensemble volontairement réduit de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2SPA statique nginx, 1 vCPU / 512 MiB par défaut, mise à l'échelle automatique serverless ; mise à l'échelle jusqu'à zéro activée
Build du conteneurCloud Build + Artifact RegistryImage personnalisée légère FROM vectorim/element-web avec un point d'entrée générant config.json à l'exécution
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut ; équilibreur de charge HTTPS externe + domaine personnalisé en option
Secrets—Aucun. Element ne nécessite aucun secret
Base de données—Aucune. C'est le serveur d'accueil Matrix qui conserve tout l'état, pas Element
Stockage d'objets—Aucun. Element est sans état

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

  • Element est sans état. L'ensemble de l'état des conversations, des clés de chiffrement et des médias réside sur le serveur d'accueil Matrix et dans le navigateur de l'utilisateur. Element lui-même ne stocke rien côté serveur ; il n'y a donc ni base de données, ni Redis, ni bucket GCS, ni secret Secret Manager.
  • Le serveur d'accueil relève de la configuration d'exécution. homeserver_url / homeserver_name sont écrits dans /app/config.json par le point d'entrée du conteneur à chaque démarrage, de sorte qu'une même image peut pointer vers n'importe quel serveur d'accueil sans nouveau build. Les laisser vides revient par défaut au serveur public matrix.org.
  • Build personnalisé avec version épinglée. container_image_source = "custom" construit une image légère au-dessus de vectorim/element-web. application_version = "latest" se résout vers le tag éprouvé épinglé v1.11.86 via un ARG de build propre à l'application, ELEMENT_VERSION.
  • La mise à l'échelle jusqu'à zéro est activée par défaut (min_instance_count = 0, cpu_always_allocated = false). Un serveur d'assets statiques ne coûte rien au repos et démarre à froid en bien moins d'une seconde — les démarrages à froid ne posent aucun problème pour Element.
  • Entrée publique par défaut. ingress_settings = "all" rend l'interface du client accessible ; Element effectue sa propre connexion auprès du serveur d'accueil. Ajoutez IAP si vous souhaitez un contrôle par identité Google devant l'interface.
  • Port 80. nginx sert la SPA sur le port 80 ; les sondes ciblent /.

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 sont indiqués dans les Sorties du déploiement.

A. Cloud Run — le service Element​

Element s'exécute comme un service Cloud Run v2 qui se met à l'échelle automatiquement selon la charge de requêtes, entre le nombre minimal et le nombre maximal d'instances. Chaque déploiement crée une révision immuable ; le trafic peut être réparti entre révisions pour des déploiements 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. Image de conteneur — Cloud Build et Artifact Registry​

L'image Element est construite par Cloud Build à partir d'un Dockerfile léger qui ajoute un point d'entrée générant config.json au-dessus de vectorim/element-web, puis poussée vers Artifact Registry. application_version = "latest" construit la version épinglée v1.11.86.

  • Console : Cloud Build → History ; Artifact Registry → Repositories.
  • CLI :
    gcloud builds list --project "$PROJECT" --limit 5
    gcloud artifacts docker images list <region>-docker.pkg.dev/<project>/<repo> --project "$PROJECT"

Consultez App_CloudRun pour le pipeline de build, la mise en miroir des images et la règle de conservation.

C. 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é. Element étant un serveur d'assets statiques, c'est un excellent candidat pour Cloud CDN.

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

D. Identity-Aware Proxy (facultatif)​

Element est livré ouvert par défaut afin que les utilisateurs puissent se connecter auprès du serveur d'accueil. Pour restreindre à vos identités Google le simple chargement de l'interface du client, activez IAP (enable_iap = true).

  • Console : Security → Identity-Aware Proxy.
  • CLI :
    gcloud iap web get-iam-policy --resource-type=backend-services --project "$PROJECT"

Consultez App_CloudRun pour la configuration d'IAP et l'écran de consentement OAuth.

E. Cloud Logging et Monitoring​

Les journaux du conteneur (accès/erreurs nginx) sont envoyés vers Cloud Logging ; les métriques Cloud Run sont envoyées vers Cloud Monitoring, avec un test de disponibilité et une alerte en cas d'échec de ce test provisionnés lorsque le point de terminaison est publiquement accessible.

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

3. Comportement de l'application Element​

  • Génération de la configuration à l'exécution. Le point d'entrée du conteneur écrit /app/config.json à chaque démarrage à partir de HOMESERVER_URL / HOMESERVER_NAME, puis passe la main à nginx. Changer de serveur d'accueil revient à redéployer avec de nouvelles valeurs d'environnement — sans reconstruire l'image.
  • Ni base de données, ni migrations. Element sert des assets statiques ; il n'y a ni schéma, ni job d'initialisation, ni fenêtre de migration au premier démarrage. Le service est prêt (Ready) dès que nginx écoute sur le port 80.
  • La connexion est un échange entre le navigateur et le serveur d'accueil. Element authentifie l'utilisateur directement auprès du serveur d'accueil Matrix configuré ; il n'y a aucune session côté serveur dans le conteneur Cloud Run et rien à pré-remplir dans Secret Manager.
  • Vérifiez le serveur d'accueil injecté. Confirmez que l'environnement de la révision en cours correspond au serveur d'accueil voulu :
    gcloud run services describe <service-name> \
    --region "$REGION" --project "$PROJECT" \
    --format='value(spec.template.spec.containers[0].env)'
    Ouvrez ensuite $SERVICE_URL — l'écran de connexion doit afficher votre serveur d'accueil, et curl -s "$SERVICE_URL/config.json" doit renvoyer le JSON contenant votre base_url.
  • Chemin de santé. Les sondes de démarrage et de vivacité ciblent /, auquel nginx répond immédiatement et sans authentification.
  • Mise à niveau d'Element. Augmentez application_version (ou épinglez un tag element-web plus récent) et redéployez ; une nouvelle image est construite et une nouvelle révision est déployée. Comme Element réutilise un même tag de version d'un build à l'autre, c'est le déclencheur fondé sur le hachage du contenu du build qui produit la nouvelle image ; vérifiez le condensé (digest) de la révision déployée si une modification semble ne pas avoir été prise en compte.

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Element 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(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.
support_users[]Adresses e-mail bénéficiant d'un accès au projet et des alertes de surveillance.
resource_labels{}Libellés appliqués à toutes les ressources.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_nameelementNom de base des ressources. Ne pas modifier après le premier déploiement.
application_display_nameElementNom lisible affiché dans la console. Non personnalisé pour Element dans variables.tf — remplacez-le par exemple par "Element" pour un nom d'affichage plus clair.
application_versionlatestTag de l'image Element ; latest construit la version épinglée v1.11.86. Épinglez un tag element-web précis en production.
homeserver_url""URL de base du serveur d'accueil Matrix écrite dans config.json. Vide → matrix.org.
homeserver_name""Nom du serveur Matrix (identité de délégation) annoncé par Element. Vide → matrix.org.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour ne provisionner que l'infrastructure.
container_image_sourcecustomConstruit l'image Element légère via Cloud Build.
container_image""Remplacez-la par l'URI d'une image préconstruite ou mise en miroir.
cpu_limit1000mCPU par instance.
memory_limit512MiMémoire par instance (le plancher gen2 est de 512 MiB).
container_port80nginx écoute sur le port 80.
min_instance_count0Codé en dur, non ajustable. element.tf fixe cette valeur à 0 dans l'appel au module socle et dans la fusion de configuration ; var.min_instance_count n'est jamais transmise, de sorte que l'augmenter (par ex. pour éliminer les démarrages à froid) est ignoré sans avertissement. La mise à l'échelle jusqu'à zéro s'applique toujours — un serveur statique ne coûte rien au repos, quelle que soit la valeur saisie.
max_instance_count3Limite supérieure de la mise à l'échelle automatique — réellement ajustable ; transmise via var.max_instance_count.
cpu_always_allocatedfalseFacturation à la requête (moins chère) — Element n'effectue aucun travail en arrière-plan.
execution_environmentgen2Environnement d'exécution Cloud Run.
enable_cloudsql_volumefalseAucune base de données — l'Auth Proxy n'est pas monté.
enable_image_mirroringtrueMet l'image en miroir dans Artifact Registry.

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

VariableValeur par défautDescription
ingress_settingsallInterface publique. Définissez internal pour la restreindre au VPC.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine via le VPC que le trafic RFC 1918.
enable_iapfalseExige une connexion Google pour charger l'interface du client.
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{}Paramètres supplémentaires fusionnés avec les valeurs injectées HOMESERVER_URL / HOMESERVER_NAME.
secret_environment_variables{}Références Secret Manager. Element n'en a besoin d'aucune.
secret_propagation_delay30Secondes d'attente après la création d'un secret.
secret_rotation_period2592000sFréquence des notifications de rotation.

Groupe 7 — Sauvegarde et restauration​

Hérité d'App_CloudRun et sans effet pour Element (il n'y a rien à sauvegarder). backup_schedule, backup_retention_days, enable_backup_import, backup_source, backup_uri, backup_format.

Groupe 8 — CI/CD et Binary Authorization​

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

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

VariableValeur par défautDescription
enable_cloud_armorfalseProvisionne un équilibreur de charge HTTPS global + le WAF Cloud Armor.
admin_ip_ranges[]Plages CIDR exemptées des règles WAF.
application_domains[]Noms de domaine personnalisés pour l'équilibreur de charge HTTPS.
enable_cdnfalseActive Cloud CDN — intéressant pour les assets statiques d'Element.
max_images_to_retain / delete_untagged_images / image_retention_days(défini)Règle de nettoyage d'Artifact Registry.

Groupe 11 — Stockage et système de fichiers​

Hérité et non utilisé par Element (sans état). create_cloud_storage, storage_buckets (vide), enable_nfs (false), gcs_volumes (vide), manage_storage_kms_iam, enable_artifact_registry_cmek.

Groupe 12 — Base de données​

Hérité d'App_CloudRun et sans effet — Element_Common définit database_type = "NONE". Aucune instance Cloud SQL, aucun utilisateur ni mot de passe n'est créé.

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

VariableValeur par défautDescription
initialization_jobs[]Element ne déclare aucun job d'initialisation.
cron_jobs[]Aucune tâche récurrente planifiée par la plateforme.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP / délai de 10 s, 6 échecsSonde de démarrage.
liveness_probeHTTP / délai de 15 sSonde de vivacité.
uptime_check_config{ enabled = false, path = "/" }Test de disponibilité Cloud Monitoring facultatif (le point de terminaison est public).
alert_policies[]Règles d'alerte sur les métriques.

Groupe 21 — Cache et file d'attente Redis​

Hérité d'App_CloudRun et sans effet — une SPA statique n'a ni cache ni file d'attente côté serveur. enable_redis, redis_host, redis_port, redis_auth.

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

VariableValeur par défautDescription
enable_vpc_scfalseImpose un périmètre VPC-SC (nécessite organization_id).
vpc_cidr_ranges / vpc_sc_dry_run(défini)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 s'exécute le service.
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é).
storage_bucketsBuckets Cloud Storage créés (vide pour Element).
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 (aucun pour Element).
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 du 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).

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 — IAP sans identités autorisées, un environnement d'exécution gen1 avec des montages NFS/GCS, un timeout_seconds hors plage. 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
homeserver_url / homeserver_nameVotre véritable serveur d'accueil, ou vide pour matrix.orgÉlevéUn serveur d'accueil erroné ou injoignable empêche les utilisateurs de se connecter — l'interface se charge mais l'authentification échoue.
application_versionÉpinglez un véritable tag element-webÉlevélatest n'est pas un tag element-web valide ; le module épingle v1.11.86, mais un latest défini à la main dans un ARG de build brut échouerait avec MANIFEST_UNKNOWN.
ingress_settingsall pour une interface publiqueÉlevéinternal rend l'interface du client inaccessible depuis les navigateurs situés hors du VPC.
container_image_sourcecustomÉlevéPasser à prebuilt avec une image dépourvue du point d'entrée config.json livre un Element pointant vers le mauvais serveur d'accueil (ou vers aucun).
memory_limit512MiMoyenL'environnement d'exécution gen2 rejette toute valeur inférieure à 512 MiB au moment du plan, quel que soit le mode de facturation.
enable_iapÀ activer pour protéger l'interfaceMoyenSans IAP, toute personne disposant de l'URL peut charger le client (il lui faut toutefois des identifiants du serveur d'accueil pour se connecter).
enable_cdnÀ activer pour les déploiements publicsFaibleServir les assets statiques directement depuis Cloud Run fait passer à côté d'un gain facile en latence et en trafic sortant.
Entrées Base de données / Redis / SauvegardeLaisser la valeur par défautFaibleSans effet pour Element ; les définir n'a aucune incidence.

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 et mise en miroir des images — consultez App_CloudRun. La configuration applicative propre à Element, partagée avec la variante GKE, est décrite dans Element_Common.

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