Aller au contenu principal

Maybe Finance sur Google Cloud Run

Maybe Finance sur Google Cloud Run

Maybe (Maybe Finance) est une alternative open source et auto-hébergée à Mint/Monarch pour la gestion des finances personnelles et du patrimoine — budgétisation, suivi de la valeur nette, catégorisation des transactions et agrégation de plusieurs comptes, construite sur Ruby on Rails. Ce module déploie Maybe 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 Maybe 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​

Maybe s'exécute sous forme d'un unique conteneur Rails/Puma sur Cloud Run v2, avec un processus de jobs d'arrière-plan Sidekiq démarré à ses côtés dans le même conteneur par le point d'entrée cloud. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Rails/Puma sur le port 3000, 2 vCPU / 4 GiB par défaut ; Sidekiq s'exécute comme processus d'arrière-plan dans le même conteneur
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — une garde au moment du plan n'accepte que POSTGRES_13/14/15 (ou NONE) ; MySQL est rejeté
Jobs d'arrière-plan et interface temps réelRedis (via la VM NFS partagée, ou un hôte explicite)Obligatoire — une précondition fait échouer le plan si enable_redis = false ; alimente Sidekiq (synchronisation des comptes, traitement des imports, notifications)
Persistance des fichiersCloud Filestore (NFS)Les pièces jointes persistent sous /opt/maybefinance/storage ; c'est aussi la source par défaut de l'adresse IP de l'hôte Redis
Stockage d'objetsCloud StorageUn bucket storage est provisionné automatiquement par MaybeFinance_Common ; la variable storage_buckets par défaut ajoute un bucket data
SecretsSecret ManagerSECRET_KEY_BASE généré automatiquement (clé de session/chiffrement Rails) ; 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 par défaut POSTGRES_15 et une précondition au moment du plan (validation.tf) rejette toute valeur autre que POSTGRES_13/14/15/NONE — MySQL n'est pas pris en charge.
  • Redis est obligatoire, pas facultatif. Une précondition fait échouer le plan purement et simplement si enable_redis = false. Lorsque redis_host est laissé vide, enable_nfs doit rester à true afin que l'adresse IP du serveur NFS partagé serve d'hôte Redis.
  • Cloud SQL est joint par défaut en TCP sur IP privée, et non par un socket. Contrairement à la plupart des applications à module Common, enable_cloudsql_volume vaut ici par défaut false : le pilote pg de Rails ne sait pas analyser le DSN de socket Unix de Cloud SQL, si bien que le module se passe du sidecar Auth Proxy et se connecte plutôt via l'adresse IP privée de l'instance. Le point d'entrée cloud fait correspondre les variables DB_HOST/DB_PORT/DB_NAME/DB_USER/DB_PASSWORD du socle aux variables d'environnement distinctes de Maybe DB_HOST/DB_PORT/POSTGRES_DB/POSTGRES_USER/POSTGRES_PASSWORD et définit PGSSLMODE=require (Cloud SQL refuse le TCP non chiffré sur IP privée) ; si enable_cloudsql_volume est activé, DB_HOST devient un répertoire de socket et le point d'entrée se rabat sur DB_IP en TCP au lieu de tenter d'utiliser directement le chemin du socket.
  • La mise à l'échelle à zéro est la valeur par défaut (min_instance_count = 0, cpu_always_allocated = false). C'est un choix privilégiant le coût, mais cela signifie que le worker Sidekiq co-localisé ne s'exécute que lorsqu'une instance se trouve être active — définissez min_instance_count = 1 et cpu_always_allocated = true pour que les jobs d'arrière-plan (synchronisation des comptes, traitement des imports, notifications) s'exécutent en continu, comme avec les valeurs par défaut de la variante GKE.
  • Conteneur web + worker combiné, et non un sidecar. Le point d'entrée cloud lance bundle exec sidekiq en arrière-plan puis fait un exec du serveur web Rails au premier plan du même conteneur — Maybe n'est pas déployé avec un worker distinct dans additional_services. Si REDIS_URL se résout en valeur vide, le point d'entrée renonce entièrement à démarrer Sidekiq plutôt que de planter.
  • SECRET_KEY_BASE est généré une seule fois par MaybeFinance_Common et stocké dans Secret Manager, partagé à l'identique par les processus web et Sidekiq. Rails l'utilise pour signer les sessions/cookies et pour dériver la clé qui chiffre les colonnes chiffrées par ActiveRecord.
  • Le schéma est créé par un job d'initialisation, pas au démarrage. Le job maybefinance-migrate exécute rails db:prepare pendant l'apply ; le point d'entrée d'exécution n'exécute jamais les migrations.
  • container_image_source = "custom". Cloud Build construit une image d'enveloppe légère FROM ghcr.io/maybe-finance/maybe:<version>. application_version vaut par défaut "stable" ; une demande "latest" est associée au canal épinglé stable via l'ARG de build propre à l'application MAYBE_VERSION (l'argument de build générique APP_VERSION du socle n'est volontairement pas utilisé).

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 Maybe (web + Sidekiq)​

Maybe 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. Le serveur web Rails/Puma et le worker Sidekiq s'exécutent comme deux processus dans le même conteneur, partageant SECRET_KEY_BASE et la connexion Redis. Chaque déploiement crée une révision immuable ; le trafic peut être réparti entre révisions pour des déploiements progressifs sûrs.

  • 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 PostgreSQL 15​

Maybe stocke toutes les données applicatives (comptes, transactions, budgets, utilisateurs) dans une instance Cloud SQL for PostgreSQL 15 gérée. Contrairement à la variante GKE (qui joint Cloud SQL via un sidecar Auth Proxy en loopback), le service Cloud Run se connecte via l'IP privée de l'instance avec sslmode=require — enable_cloudsql_volume vaut par défaut false parce que Rails ne sait pas analyser le DSN de type socket que le proxy présenterait sinon. Au premier déploiement, le job db-init crée la base de données et l'utilisateur de l'application, accorde au rôle applicatif cloudsqlsuperuser (afin que la propre migration de Maybe puisse créer des extensions Postgres sans accès superutilisateur) et crée au préalable l'extension pgcrypto ; maybefinance-migrate exécute ensuite rails db:prepare.

  • 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. Voir App_CloudRun pour le modèle de connexion, les sauvegardes et la rotation des mots de passe.

C. Cloud Filestore (NFS) et Redis​

Cloud Filestore (NFS) est monté sur /opt/maybefinance/storage (enable_nfs = true par défaut) afin que les pièces jointes téléversées persistent d'une révision à l'autre. Maybe requiert aussi Redis, qui est obligatoire — une précondition au moment du plan bloque enable_redis = false. Lorsque redis_host est laissé vide, la variable injectée REDIS_HOST se résout en l'adresse IP du serveur NFS partagé (la VM NFS héberge aussi Redis selon la convention de plateforme de ce dépôt), c'est pourquoi enable_nfs doit rester à true sauf si un redis_host explicite est fourni.

  • Console : Filestore → Instances ; Compute Engine → Instances de VM (la VM NFS, si elle exécute aussi Redis).
  • CLI :
    gcloud filestore instances list --project "$PROJECT"
    redis-cli -h <redis-host> ping
    gcloud run services describe <service-name> --region "$REGION" \
    --format='value(spec.template.spec.containers[0].env)'

Voir App_CloudRun pour les mécanismes de découverte et de provisionnement NFS et d'injection de Redis.

D. Cloud Storage​

Un bucket storage est provisionné automatiquement par MaybeFinance_Common, et la variable storage_buckets par défaut ajoute un second bucket data. Aucun des deux n'est monté par défaut dans le système de fichiers du conteneur — gcs_volumes est vide d'origine — ils existent donc en tant que stockage provisionné mais restent inertes tant qu'ils ne sont pas explicitement raccordés.

  • Console : Cloud Storage → Buckets.
  • CLI :
    gcloud storage buckets list --project "$PROJECT" --filter="name~maybefinance"

Voir App_CloudRun pour les options GCS Fuse et CMEK.

E. Secret Manager​

Un secret propre à Maybe est généré automatiquement et stocké dans Secret Manager : SECRET_KEY_BASE (secret-<prefix>-maybefinance-secret-key-base), une valeur aléatoire de 64 caractères partagée par le processus web Rails et le worker Sidekiq. 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~maybefinance"
    gcloud secrets versions access latest --secret=<secret-key-base-name> --project "$PROJECT"

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

F. Réseau et entrée​

Le service est joignable par défaut via son URL run.app (ingress_settings = "all"). 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"

Voir App_CloudRun.

G. Cloud Logging et Monitoring​

Les journaux du conteneur (RAILS_LOG_TO_STDOUT = "true") sont acheminés vers Cloud Logging ; les métriques Cloud Run et Cloud SQL sont acheminées vers Cloud Monitoring, avec en option des tests de disponibilité et des règles d'alerte.

  • 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 Maybe Finance​

  • Configuration de la base de données au premier déploiement. Le job db-init exécute db-init.sh avec postgres:15-alpine. Il se connecte en TCP sur IP privée (sslmode=require), crée de manière idempotente la base de données et l'utilisateur de l'application, accorde les privilèges, accorde au rôle applicatif cloudsqlsuperuser (les utilisateurs applicatifs de Cloud SQL ne sont pas de vrais superutilisateurs, ce qui permet donc à la propre migration de Maybe de créer des extensions Postgres) et crée au préalable pgcrypto par mesure de précaution supplémentaire. Le job peut être réexécuté sans risque.
  • La migration du schéma est un job d'initialisation distinct. maybefinance-migrate exécute bundle exec rails db:prepare sur l'image Maybe construite (image = null dans la spécification du job, elle réutilise donc l'image et la chaîne d'outils construites pour l'application), dépend de l'achèvement préalable de db-init et effectue jusqu'à 3 nouvelles tentatives (max_retries = 3, timeout_seconds = 1200, memory_limit = 2Gi).
  • Inscription de l'administrateur au premier lancement, et non un secret créé automatiquement. SELF_HOSTED = "true" active l'interface d'auto-hébergement de Maybe, qui permet au premier visiteur d'inscrire le compte administrateur initial via l'interface web — il n'existe aucun secret de mot de passe administrateur généré automatiquement à récupérer.
  • SECRET_KEY_BASE est immuable en pratique. Il est généré une seule fois par MaybeFinance_Common et partagé par les processus web et Sidekiq. Le faire tourner après le premier démarrage invalide les sessions existantes et rend illisibles les colonnes chiffrées par ActiveRecord.
  • La correspondance des variables d'environnement de la base de données se fait dans le point d'entrée cloud, pas via un DSN sous forme d'URL. La plateforme injecte DB_HOST (l'IP privée de l'instance sur Cloud Run, puisque enable_cloudsql_volume vaut par défaut false), DB_PORT, DB_NAME, DB_USER, DB_PASSWORD et DB_IP ; le point d'entrée les fait correspondre à POSTGRES_DB/POSTGRES_USER/POSTGRES_PASSWORD (la convention config/database.yml de Rails pour Maybe) et définit PGSSLMODE=require car l'hôte résolu est une véritable IP privée, et non le loopback.
  • Raccordement de Redis. REDIS_URL est construit à partir des variables injectées REDIS_HOST/REDIS_PORT/REDIS_AUTH s'il n'est pas déjà défini. Si REDIS_URL finit vide (Redis injoignable), le point d'entrée renonce entièrement à démarrer Sidekiq — les jobs d'arrière-plan cessent silencieusement de s'exécuter au lieu de faire planter le conteneur.
  • Les jobs d'arrière-plan nécessitent une instance toujours active. Comme Sidekiq est démarré dans le processus par le point d'entrée, il ne s'exécute que tant qu'une instance de conteneur est active. Avec les valeurs par défaut CloudRun (min_instance_count = 0, cpu_always_allocated = false), les périodes de mise à l'échelle à zéro et la limitation du CPU entre les requêtes interrompent toutes deux le traitement des jobs d'arrière-plan.
  • Chemin de santé. La sonde de démarrage est une sonde HTTP GET /up avec une marge généreuse pour un premier démarrage lent (initial_delay_seconds = 60, period_seconds = 15, failure_threshold = 30 — environ 8 minutes de marge). La sonde de vivacité est également une sonde HTTP GET /up (initial_delay_seconds = 60, period_seconds = 30, failure_threshold = 3).
  • Inspecter l'exécution des jobs :
    gcloud run jobs list --project "$PROJECT" --region "$REGION"
    gcloud run jobs executions list --job <db-init-job-name> --project "$PROJECT" --region "$REGION"
    gcloud run jobs executions list --job <maybefinance-migrate-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 (la balise {{UIMeta group=N}} dans la description de chaque variable de variables.tf). Seuls les paramètres propres à Maybe ou notables pour lui sont listés ; toutes les autres entrées sont héritées d'App_CloudRun avec leur comportement et leurs valeurs par défaut 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 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_namemaybefinanceNom de base des ressources. Ne pas modifier après le premier déploiement.
display_nameMaybeNom lisible affiché dans la console.
description(défini)Description du service.
application_versionstableTag d'image ghcr.io/maybe-finance/maybe utilisé comme base du build personnalisé ; latest est associé au canal de version épinglé stable via MAYBE_VERSION.

application_display_name/application_description sont des déclarations miroir inertes du socle (jamais transmises à l'appel du socle) — l'identité effective provient de display_name/description ci-dessus.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour ne provisionner que l'infrastructure.
container_image_sourcecustomImage d'enveloppe légère construite FROM l'image GHCR amont.
cpu_limit2000mCPU par instance.
memory_limit4GiMémoire par instance ; Maybe recommande au moins 2Gi.
cpu_always_allocatedfalseValeur par défaut privilégiant le coût, avec démarrage à froid. Définissez true (avec min_instance_count >= 1) pour que Sidekiq traite les tâches en continu.
container_resources(null)Remplace cpu_limit/memory_limit lorsqu'il est défini.
min_instance_count0Mise à l'échelle à zéro par défaut — diffère du min=1 de la variante GKE ; arrête le worker Sidekiq co-localisé entre les requêtes.
max_instance_count5Plafond de coût.
container_port3000Port natif Rails/Puma de Maybe.
execution_environmentgen2Gen2 requis pour les montages NFS et GCS Fuse.
timeout_seconds300Durée maximale d'une requête (0–3600 secondes).
enable_cloudsql_volumefalseDésactivé par défaut pour Maybe — Rails ne sait pas analyser le DSN de socket Cloud SQL, l'application se connecte donc plutôt en TCP sur IP privée.
cloudsql_volume_mount_path/cloudsqlPertinent uniquement si enable_cloudsql_volume est activé.
container_protocolhttp1Version du protocole HTTP.
traffic_split[]Répartit le trafic entre révisions pour des déploiements par étapes.
max_revisions_to_retain7Déclaré par souci de cohérence avec la convention ; non référencé par le déploiement de ce module.
enable_image_mirroringtrueToujours vrai — l'image de base GHCR est mise en miroir dans Artifact Registry avant le build de l'enveloppe.
container_build_config{ enabled = true }Paramètres de build ; l'ARG de build MAYBE_VERSION est défini à partir de application_version dans MaybeFinance_Common, et n'est pas exposé comme variable de premier niveau.
additional_services / additional_containers[]Non utilisés par Maybe (Sidekiq s'exécute dans le processus, ni comme sidecar ni comme service distinct).

Groupe 5 — Accès et réseau​

VariableValeur par défautDescription
ingress_settingsallAccessibilité publique de l'interface web.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine que le trafic RFC 1918 via le VPC.
enable_iapfalseExige une connexion Google.
iap_authorized_users / iap_authorized_groups[]Qui peut accéder via IAP.
network_name""Découvre automatiquement le réseau VPC géré par Services_GCP.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres non secrets supplémentaires. Les valeurs essentielles Rails/Maybe (RAILS_ENV, SELF_HOSTED, RAILS_LOG_TO_STDOUT, etc.) sont définies automatiquement par MaybeFinance_Common.
secret_environment_variables{}Correspondance variable d'environnement → nom du secret Secret Manager.
secret_propagation_delay30Secondes 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 * * *Cron des sauvegardes automatiques (UTC).
backup_retention_days7Rétention ; à augmenter pour la production/la conformité.
enable_backup_import / backup_source / backup_file / backup_formatoptions de restaurationRestaure à 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 — voir App_CloudRun. Entrées principales : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy, enable_binary_authorization.

Groupe 9 — Initialisation personnalisée et SQL​

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. Voir App_CloudRun.

Groupe 10 — É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 sur le backend de l'équilibreur de charge HTTPS.
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​

VariableValeur par défautDescription
create_cloud_storagetrueCrée les buckets GCS définis dans storage_buckets.
storage_buckets[{ name_suffix = "data" }]Bucket GCS supplémentaire en plus du bucket storage provisionné automatiquement.
enable_nfstrueLes pièces jointes persistent et sont partagées entre révisions ; c'est aussi la source par défaut de l'adresse IP de l'hôte Redis.
nfs_mount_path/opt/maybefinance/storageEmplacement où Maybe stocke les pièces jointes téléversées.
nfs_instance_name / nfs_instance_base_name(découverte automatique)Nommage de la VM NFS existante/intégrée (inline).
gcs_volumes[]Montages de volumes GCS Fuse (requiert gen2) ; non utilisés d'origine.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Une précondition au moment du plan restreint cette valeur à POSTGRES_13/14/15/NONE ; MySQL est rejeté.
db_namemaybefinanceNom effectif de la base de données PostgreSQL. Immuable après le premier déploiement.
db_usermaybefinanceUtilisateur effectif de la base de données de l'application ; mot de passe généré automatiquement dans Secret Manager.
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.
enable_postgres_extensions / postgres_extensionsfalse / []Laissé désactivé — db-init.sh crée déjà au préalable pgcrypto grâce à l'octroi de cloudsqlsuperuser.
enable_mysql_plugins / mysql_pluginsfalse / []Inutilisés — Maybe fonctionne uniquement avec PostgreSQL.
application_database_name / application_database_usercrappdb / crappuserDéclarations miroir du socle inertes (jamais transmises à main.tf) — le nom et l'utilisateur réels de la base de données proviennent de db_name/db_user ci-dessus via MaybeFinance_Common.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser les jobs intégrés db-init + maybefinance-migrate.
cron_jobs[]Non transmis — Maybe n'a aucune tâche récurrente planifiée par la plateforme ; son propre travail d'arrière-plan s'exécute dans le processus via Sidekiq.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /up, délai de 60s, 30 tentativesSonde de démarrage. Prévoyez environ 8 minutes au premier démarrage.
liveness_probeHTTP /up, délai de 60sSonde de vivacité.
startup_probe_config / health_check_configHTTP /upSondes structurées alternatives.
uptime_check_config{ enabled=false, path="/" }Test de disponibilité Cloud Monitoring ; désactivé par défaut, à activer explicitement.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 21 — Cache et file d'attente Redis​

VariableValeur par défautDescription
enable_redistrueObligatoire — une précondition fait échouer le plan s'il est défini à false.
redis_host""Laissez vide pour utiliser l'adresse IP du serveur NFS (requiert enable_nfs = true).
redis_port6379Port Redis.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible).

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

VariableValeur par défautDescription
enable_vpc_scfalseApplique un périmètre VPC-SC (requiert organization_id).
vpc_cidr_ranges / vpc_sc_dry_run(défini)CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseCloud Audit Logs détaillés.

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.
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 de la base de données (IP privée sur Cloud Run) / port.
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 (db-init, maybefinance-migrate).
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 fait passer sa configuration par le moteur du socle App_CloudRun, ainsi que par ses propres gardes validation.tf (min ≤ max, Redis obligatoire, un hôte Redis doit pouvoir être résolu, database_type limité à PostgreSQL, pas d'Auth Proxy sans véritable base de données). Une configuration invalide fait échouer le plan avec une erreur claire et nommée avant la création de toute ressource, si bien que la plupart des erreurs ci-dessous sont détectées en amont plutôt qu'à l'apply ou à l'exécution.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
database_typePOSTGRES_15 (ou 13/14)CritiqueUn moteur autre que PostgreSQL est rejeté au moment du plan ; en forcer un en contournant la garde casse l'installateur et toutes les requêtes.
enable_redistrueCritiqueLa précondition au moment du plan bloque purement et simplement false — sans Redis, Maybe n'a aucune file de jobs d'arrière-plan fonctionnelle.
db_name / db_userÀ définir une foisCritiqueImmuables après le premier déploiement ; les renommer recrée la base de données/l'utilisateur et détruit toutes les données.
SECRET_KEY_BASE (généré automatiquement)Ne jamais le faire tourner après le premier démarrageCritiqueLe faire tourner invalide toutes les sessions et rend illisibles les colonnes chiffrées par ActiveRecord.
enable_cloudsql_volumefalse (Cloud Run)CritiqueL'activer transforme DB_HOST en un répertoire de socket que Rails ne sait pas analyser directement ; le point d'entrée se rabat sur DB_IP, mais une valeur erronée database_type = "NONE" combinée à enable_cloudsql_volume = true est bloquée au moment du plan, car le sidecar proxy n'aurait aucune instance à laquelle se connecter.
redis_host"" (NFS) ou expliciteÉlevéLorsque Redis est activé mais que enable_nfs est désactivé et qu'aucun hôte n'est défini, la précondition au moment du plan échoue ; si enable_nfs est désactivé après un déploiement fonctionnel, les pièces jointes téléversées deviennent éphémères et l'hôte Redis peut devenir obsolète.
min_instance_count / cpu_always_allocated1 / true en productionÉlevéAvec les valeurs par défaut privilégiant le coût (0 / false), le worker Sidekiq co-localisé ne s'exécute que lorsqu'une instance se trouve être active — la synchronisation des comptes, le traitement des imports et les notifications cessent silencieusement entre les requêtes et pendant les fenêtres de mise à l'échelle à zéro.
memory_limit4Gi (par défaut)ÉlevéLe processus combiné Rails + Sidekiq est gourmand en mémoire sous les charges de travail d'import/de synchronisation ; Maybe recommande au moins 2Gi.
SELF_HOSTED (injecté automatiquement à "true")Inscrire rapidement le premier administrateurÉlevéLaisser le déploiement joignable avant qu'un administrateur ne s'inscrive permet à quiconque dispose de l'URL de s'approprier le compte administrateur initial.
ingress_settingsallMoyenLa définir à internal bloque l'accès à l'interface web pour toute personne extérieure au VPC.
backup_retention_days7 (à augmenter en prod)MoyenTrop court pour une rétention de conformité.
enable_cloud_armorà activer en productionMoyenL'interface d'administration est publiquement accessible sans protection WAF.

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 à Maybe, partagée avec la variante GKE, se trouve dans le module MaybeFinance_Common — voir MaybeFinance_Common pour les secrets, l'amorçage de la base de données, le comportement du point d'entrée, les sondes de santé et le stockage.

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