Aller au contenu principal

Focalboard sur Google Cloud Run

Focalboard sur Google Cloud Run

Focalboard est un serveur open source et auto-hébergé de tableaux Kanban et de projets issu du projet Mattermost — un backend Go qui sert un frontend React compilé pour gérer les tâches, les tableaux et les workflows. Ce module déploie Focalboard 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 qu'utilise Focalboard 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​

Focalboard s'exécute dans un unique conteneur Go sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service Go sur le port 8000, 2 vCPU / 4 GiB par défaut ; autoscaling serverless avec mise à l'échelle jusqu'à zéro
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — le moteur est fixe (database_type = POSTGRES_15)
Stockage des pièces jointesCloud Storage (GCS FUSE)Un bucket dédié monté sur /data via gcsfuse afin que les pièces jointes téléversées survivent aux redémarrages
SecretsSecret ManagerFOCALBOARD_ADMIN_PASSWORD généré automatiquement ; mot de passe de la base de données géré par le socle
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut ; équilibreur de charge HTTPS externe + domaine personnalisé facultatifs

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

  • PostgreSQL 15 est obligatoire. Le moteur de base de données est fixé par la couche applicative partagée ; Focalboard n'a aucune voie MySQL ou SQLite dans ce module.
  • Focalboard lit config.json, et non des variables d'environnement, pour la connexion à la base de données. Un point d'entrée personnalisé régénère /opt/focalboard/config.json à partir des valeurs DB_* injectées par le socle à chaque démarrage, de sorte qu'aucun DSN n'est figé dans l'image.
  • Les pièces jointes résident sur un bucket GCS monté via gcsfuse sur /data. Cloud Run n'offre pas d'option de PVC en mode bloc ; enable_gcs_storage_volume = true monte donc le bucket de stockage sur le filespath de Focalboard. Les données des tableaux (cartes, tableaux, utilisateurs) résident dans PostgreSQL ; seuls les fichiers téléversés aboutissent dans le bucket.
  • Aucun Redis n'est utilisé. enable_redis = false — Focalboard conserve tout l'état des tableaux dans PostgreSQL et n'a besoin d'aucun cache ni d'aucune file d'attente externe.
  • La mise à l'échelle jusqu'à zéro est activée (min_instance_count = 0, max_instance_count = 5). Les démarrages à froid ajoutent quelques secondes de latence à la première requête après une période d'inactivité ; définissez min_instance_count = 1 pour garder une instance active.
  • L'image est une build personnalisée mise en miroir. L'image officielle mattermost/focalboard est légèrement encapsulée et mise en miroir dans Artifact Registry ; application_version vaut 7.11.4 par défaut, et latest correspond à ce tag figé au moment du build (latest n'est pas un tag Focalboard publié).
  • Authentification native, le premier utilisateur est propriétaire. authMode = native et les tableaux partagés publics sont activés ; le premier compte enregistré via l'interface devient le propriétaire de l'espace de travail. Aucun administrateur n'est créé à l'avance.

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

Focalboard s'exécute comme un service Cloud Run v2 qui écoute sur le port 8000 et s'adapte automatiquement à la charge des 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 les révisions pour des déploiements progressifs sûrs.

  • Console : Cloud Run → sélectionnez le service pour les révisions, le trafic, les journaux et les métriques.
  • CLI :
    gcloud run services list --project "$PROJECT" --region "$REGION" \
    --filter="metadata.name~focalboard"
    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​

Focalboard stocke toutes les données des tableaux (tableaux, cartes, blocs, utilisateurs, sessions) dans une instance gérée Cloud SQL for PostgreSQL 15. Le service s'y connecte de façon privée — sur Cloud Run via l'IP privée du VPC avec sslmode=require, ou via le socket Unix du Cloud SQL Auth Proxy lorsque enable_cloudsql_volume = true ; aucune IP publique n'est exposée. Lors du premier déploiement, un Job d'initialisation crée la base de données et le rôle de l'application.

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

C. Cloud Storage — bucket des pièces jointes​

Un bucket Cloud Storage dédié (suffixe storage) est provisionné automatiquement et monté sur /data via gcsfuse afin que les pièces jointes téléversées dans les tableaux persistent malgré les redémarrages d'instances et la mise à l'échelle jusqu'à zéro. Des buckets supplémentaires peuvent être déclarés via storage_buckets.

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

Consultez App_CloudRun pour les options GCS Fuse et CMEK.

D. Secret Manager​

Un secret applicatif est généré automatiquement et stocké dans Secret Manager : FOCALBOARD_ADMIN_PASSWORD (une chaîne aléatoire de 24 caractères, injectée en tant que variable d'environnement secrète du SERVICE). Un second secret dédié — secret-<resource_prefix>-focalboard-safe-db-password (alphanumérique uniquement, sans caractères spéciaux) — remplace le DB_PASSWORD du SERVICE et c'est la valeur que db-init attribue réellement comme mot de passe au rôle Postgres (sous FOCALBOARD_SAFE_DB_PASSWORD) ; la sortie database_password_secret, commune à toute la flotte, ne permet pas de s'authentifier auprès de ce rôle. Consultez la section 3.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT" --filter="name~focalboard"
    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​

Par défaut, le service est accessible à son URL run.app. Un équilibreur de charge HTTPS externe avec domaine personnalisé, Cloud CDN et Cloud Armor peut y ê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)'
    gcloud compute addresses list --project "$PROJECT"

Consultez App_CloudRun.

F. Cloud Logging et Monitoring​

Les journaux des conteneurs sont envoyés à Cloud Logging ; les métriques de Cloud Run et de Cloud SQL sont envoyées à Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte facultatifs. Le point d'entrée affiche au démarrage l'hôte, le nom, l'utilisateur et le sslmode de base de données résolus — utile pour vérifier le raccordement de la connexion.

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

  • Configuration de la base de données au premier déploiement. Un Job d'initialisation exécute db-init.sh avec postgres:15-alpine. Il crée de manière idempotente le rôle applicatif (LOGIN CREATEDB) et la base de données, accorde les privilèges et transfère la propriété du schéma public au rôle applicatif afin que Focalboard puisse exécuter ses migrations. Aucune extension Postgres n'est installée. Le job peut être relancé sans risque.
  • Le véritable mot de passe du rôle est un secret dédié, uniquement alphanumérique, et non database_password_secret. Le mot de passe de base de données standard du socle, commun à toute la flotte (jeu de caractères _%@), peut contenir un % qui fait planter le pilote postgres Go de Focalboard — sa validation de DSN basée sur url.Parse et son connecteur lib/pq effectif ne décodent pas les pourcentages de la même façon, si bien qu'aucun encodage unique de ce mot de passe ne satisfait les deux. Focalboard_Common génère un mot de passe distinct (secret-<resource_prefix>-focalboard-safe-db-password), remplace par celui-ci le DB_PASSWORD du SERVICE et le transmet à db-init sous FOCALBOARD_SAFE_DB_PASSWORD, qui est la valeur réellement attribuée comme mot de passe du rôle. La sortie database_password_secret (§5) indique le nom du secret commun à la flotte, qui ne permet pas de s'authentifier auprès de ce rôle.
  • Les migrations s'exécutent au démarrage. Focalboard applique ses propres migrations de schéma à chaque démarrage en tant qu'utilisateur applicatif ; la mise à jour de application_version applique donc les modifications de schéma sans étape de migration distincte.
  • config.json est généré à l'exécution. Focalboard n'offre aucune substitution par variable d'environnement pour la connexion à la base de données ; le point d'entrée écrit /opt/focalboard/config.json à partir des variables DB_* injectées à chaque démarrage. Sur Cloud Run, il se connecte via l'IP privée avec sslmode=require (en privilégiant DB_IP, car le socket Cloud SQL n'apparaît pas toujours).
  • Chemin de santé. Les sondes de démarrage, de vivacité et de disponibilité (readiness) ciblent / — l'interface web, qui renvoie 200 dès que le serveur s'est lié à son port et a terminé les migrations. Prévoyez jusqu'à ~7–8 minutes au premier démarrage (délai initial de démarrage de 60 secondes + une fenêtre de 15 s×30 tentatives).
  • Configuration au premier lancement. Focalboard s'exécute en authMode = native ; ouvrez l'URL du service et enregistrez le premier compte, qui devient le propriétaire de l'espace de travail. enablePublicSharedBoards est activé, de sorte que les tableaux peuvent être partagés par des liens publics.
  • Pièces jointes et données. Le contenu des tableaux réside dans PostgreSQL ; seuls les fichiers téléversés sont écrits dans le bucket monté via gcsfuse sur /data. Si le montage du bucket est absent, les téléversements échouent mais l'édition des tableaux continue de fonctionner.
  • Inspecter la configuration et les jobs en cours d'exécution :
    gcloud run services describe <service-name> --region "$REGION" \
    --format='value(spec.template.spec.containers[0].env)'
    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 elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Focalboard ou notables pour lui sont listés ; toutes les autres entrées sont héritées d'App_CloudRun avec leur comportement standard.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namefocalboardNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_version7.11.4Tag de l'image Focalboard ; latest correspond au tag figé 7.11.4 au moment du build.
display_nameFocalboardNom lisible affiché dans la console.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
cpu_limit2000mCPU par instance.
memory_limit4GiMémoire par instance.
min_instance_count00 active la mise à l'échelle jusqu'à zéro ; définissez 1 pour éviter les démarrages à froid.
max_instance_count5Nombre maximal d'instances. Peut être augmenté sans risque — l'état des tableaux réside dans PostgreSQL, pas dans chaque instance.
container_port8000Focalboard écoute sur le port 8000.
enable_cloudsql_volumetrueSocket Cloud SQL Auth Proxy ; le point d'entrée se rabat également sur une connexion TCP via l'IP privée.
enable_image_mirroringtrueMet en miroir l'image mattermost/focalboard dans Artifact Registry.
cpu_always_allocatedfalseFacturation à la requête (avec démarrage à froid). Focalboard n'a ni processus d'arrière-plan ni serveur WebSocket ; la mise à l'échelle jusqu'à zéro est donc sans risque.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Fixe — Focalboard nécessite PostgreSQL 15.
application_database_namecrappdbNom de la base de données Cloud SQL, injecté sous DB_NAME. Immuable après le premier déploiement.
application_database_usercrappuserUtilisateur de base de données de l'application, injecté sous DB_USER. Mot de passe généré automatiquement dans Secret Manager.
enable_auto_password_rotationfalseRotation facultative du mot de passe de la base de données.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job db-init intégré.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /, délai de 60 s, timeout de 10 s, période de 15 s, 30 tentativesSonde de démarrage. Prévoyez ~7–8 minutes au premier démarrage pour les migrations.
liveness_probeHTTP /, délai de 60 s, timeout de 5 s, période de 30 s, 3 tentativesSonde de vivacité.
uptime_check_config{ enabled=false, path="/" }Test de disponibilité Cloud Monitoring ; désactivé par défaut.

Groupe 21 — Redis​

VariableValeur par défautDescription
enable_redisfalseFocalboard ne nécessite pas Redis ; laissez-le désactivé.

Toutes les autres entrées suivent le comportement et les valeurs par défaut standard d'App_CloudRun.


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_servicesDétails des services par é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 base de données standard commun à toute la flotte — pas l'identifiant avec lequel s'authentifie le rôle Postgres de Focalboard (voir la section 3) ; utilisez plutôt secret-<resource_prefix>-focalboard-safe-db-password.
database_host / database_portPoint de terminaison / port de la base de données.
storage_bucketsBuckets Cloud Storage créés (le bucket des pièces jointes).
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 (db-init).
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 — une configuration IAP sans identités autorisées, un environnement d'exécution gen1 avec des montages GCS, un database_type qui ne correspond pas à une extension activée, un backup_retention_days 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
application_database_name / application_database_userDéfinis une seule foisCritiqueInjectés sous DB_NAME/DB_USER et immuables après le premier déploiement ; les renommer recrée la base de données/l'utilisateur et rend orphelines toutes les données des tableaux.
Bucket des pièces jointes / enable_gcs_storage_volumeConserver le montage gcsfuse sur /dataCritiqueSans montage persistant sur filespath, les pièces jointes téléversées sont écrites sur le disque éphémère de l'instance et perdues au redémarrage / lors de la mise à l'échelle jusqu'à zéro.
database_typePOSTGRES_15CritiqueTout autre moteur empêche le démarrage de Focalboard — il n'existe ici aucune voie MySQL/SQLite.
application_versionFiger un tag réel (7.11.4)Élevémattermost/focalboard:latest n'est pas un tag publié ; le build fait correspondre latest au FOCALBOARD_VERSION figé, mais le figer explicitement évite les surprises.
container_port8000ÉlevéFocalboard se lie au port 8000 ; un port différent empêche la sonde de démarrage de réussir.
enable_redisfalseMoyenFocalboard n'a pas besoin de Redis ; l'activer raccorde une dépendance inutilisée.
min_instance_count1 pour un usage sensible à la latenceMoyenLa mise à l'échelle jusqu'à zéro (0) ajoute une latence de démarrage à froid à la première requête après une période d'inactivité.
enable_cloudsql_volumetrueMoyenLe point d'entrée se rabat sur une connexion TCP via l'IP privée avec sslmode=require, mais le socket de l'Auth Proxy est la voie principale.
Sortie database_password_secretNe pas l'utiliser pour se connecterÉlevéIndique le secret DB_PASSWORD commun à la flotte, qui ne permet pas de s'authentifier auprès du rôle Postgres de Focalboard. Récupérez secret-<resource_prefix>-focalboard-safe-db-password pour obtenir un identifiant fonctionnel.

Pour le comportement du socle mentionné 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 à Focalboard partagée avec la variante GKE est décrite dans Focalboard_Common.

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