Aller au contenu principal

Memos sur Google Cloud Run

Memos sur Google Cloud Run

Memos est un service de prise de notes open source, sous licence MIT et auto-hébergé, conçu pour la saisie rapide en markdown — un unique binaire Go d'environ 20MB avec un frontend React. Ce module déploie Memos 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 Memos 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​

Memos s'exécute sous forme de conteneur Go unique sur Cloud Run v2. Le déploiement assemble un ensemble volontairement restreint de services Google Cloud — Memos n'a ni file d'attente, ni cache, ni workers en arrière-plan :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service Go, 1 vCPU / 512 MiB par défaut, mise à l'échelle automatique serverless, mise à l'échelle à zéro par défaut
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — ce module standardise sur Postgres via une URL de connexion unique MEMOS_DSN
Stockage d'objetsaucunNon provisionné par ce module — voir la remarque sur les pièces jointes ci-dessous
Cache et file d'attenteaucunMemos ne dépend d'aucune file d'attente ni d'aucun cache
SecretsSecret ManagerUniquement le mot de passe de la base de données (géré par le socle) ; Memos lui-même n'a pas de secret applicatif
EntréeURL Cloud RunURL 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 le moteur standardisé. Memos_Common impose database_type = "POSTGRES_15". Memos prend aussi en charge MySQL et SQLite en amont, mais ce module ne raccorde pas ces options.
  • Il n'existe aucun secret d'amorçage administrateur. Le premier compte créé via l'interface web devient l'hôte/administrateur — il n'y a pas de variable d'environnement de type DEFAULTUSER ni rien à récupérer dans Secret Manager pour la première connexion.
  • La mise à l'échelle à zéro est activée par défaut (min_instance_count = 0, cpu_always_allocated = false). Memos n'effectue aucun travail sans requête entrante ; la facturation à la requête est donc la bonne valeur par défaut — contrairement aux applications dotées de planificateurs en arrière-plan ou de push WebSocket, rien ne justifie ici de forcer un CPU toujours alloué.
  • Le DSN de la base de données est calculé au démarrage du conteneur, et non intégré à l'image. memos-entrypoint.sh lit les variables DB_* injectées par la plateforme et construit l'URL de connexion unique MEMOS_DSN attendue par Memos, selon que Cloud Run lui a transmis un répertoire de socket Unix ou un hôte TCP, et en encodant le mot de passe pour l'URL.
  • Aucun stockage d'objets n'est provisionné. Ce module ne déclare ni bucket GCS ni volume pour les pièces jointes téléversées. Les notes textuelles sont entièrement persistées dans PostgreSQL, mais les pièces jointes binaires résideraient sur le système de fichiers éphémère du conteneur Cloud Run et ne survivraient pas à un redémarrage de révision. Cela convient à une prise de notes purement textuelle ; ajoutez une entrée gcs_volumes si la persistance des pièces jointes est requise.
  • L'inscription publique est ouverte par défaut, comme pour toute installation neuve de Memos. Désactivez l'auto-inscription depuis l'interface de Memos après avoir créé le premier compte (administrateur), si le déploiement ne doit plus accepter d'inscriptions publiques.

2. Services Google Cloud et comment les explorer​

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

A. Cloud Run — le service Memos​

Memos s'exécute sous forme de 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.

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

Memos stocke toutes les données applicatives (notes, tags, utilisateurs, métadonnées des ressources) dans une instance gérée Cloud SQL for PostgreSQL 15. Le service se connecte de façon privée via le Cloud SQL Auth Proxy sur un socket Unix ; aucune adresse IP publique n'est exposée. Lors du premier déploiement, un job d'initialisation crée la base de données et l'utilisateur applicatifs.

  • 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> --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. Secret Manager​

Seul le secret du mot de passe de la base de données existe pour ce module — entièrement géré par le socle, et non par Memos_Common. Memos génère sa propre clé interne de signature des sessions et la stocke dans sa propre base de données au premier démarrage ; il n'existe aucune entrée Secret Manager correspondante à inspecter.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT" --filter="name~memos"
    gcloud secrets versions access latest --secret=<db-password-secret-name> --project "$PROJECT"

D. 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é par-dessus ; 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.

E. Cloud Logging et Monitoring​

Les journaux des conteneurs sont envoyés à Cloud Logging ; les métriques Cloud Run et Cloud SQL à Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte facultatifs.

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

3. Comportement de l'application Memos​

  • Configuration de la base de données au premier déploiement. Un job d'initialisation exécute create-db-and-user.sh à l'aide de postgres:15-alpine. Il se connecte via le Cloud SQL Auth Proxy et crée de manière idempotente le rôle et la base de données applicatifs. Le job peut être réexécuté sans risque.
  • Migrations de schéma au démarrage. Memos applique sa propre configuration de schéma interne par auto-migration GORM à chaque démarrage — aucun job de migration distinct n'est nécessaire, et la mise à niveau de application_version applique automatiquement les modifications de schéma.
  • Aucun identifiant d'amorçage administrateur à récupérer. Le premier compte créé via le formulaire d'inscription de l'interface web devient l'hôte/administrateur. Il n'y a rien à récupérer dans Secret Manager avant la première connexion — contrairement à la plupart des applications de ce catalogue.
  • Le DSN de la base de données est calculé, et non statique. memos-entrypoint.sh construit MEMOS_DSN à partir de DB_HOST/DB_PORT/DB_USER/DB_NAME/DB_PASSWORD au démarrage du conteneur (voir Memos_Common pour la logique de branchement exacte), puis enchaîne sur le point d'entrée propre de l'image amont, qui abandonne les privilèges au profit d'un utilisateur non root avant de lancer le binaire compilé.
  • Chemin de santé. Les sondes de démarrage et de vivacité ciblent / — la page publique de connexion/d'accueil de Memos, accessible sans authentification. Aucun point de terminaison /health ou /healthz dédié n'est documenté en amont.
  • Inspecter l'exécution des jobs :
    gcloud run jobs list --project "$PROJECT" --region "$REGION"
    gcloud run jobs executions list --job <job-name> --project "$PROJECT" --region "$REGION"

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Memos ou notables pour lui sont listés ; toutes les autres entrées sont héritées de App_CloudRun avec leur comportement standard.

Groupe 1 — Projet et identité​

VariableValeur par défautDescription
project_id(obligatoire)Projet Google Cloud cible.
regionus-central1Région du service et des ressources régionales.

Groupe 2 — Environnement de déploiement​

VariableValeur par défautDescription
tenant_iddemoSuffixe court qui rend les noms de ressources uniques par environnement.
support_users[]E-mails disposant d'un accès au projet et recevant les alertes de surveillance.
resource_labels{}Libellés appliqués à toutes les ressources.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namememosNom de base des ressources. Ne pas modifier après le premier déploiement.
application_display_nameMemosNom lisible affiché dans la console.
application_descriptionMemos note-taking service on Cloud RunDescription du service.
application_versionlatestÉtiquette de suivi du déploiement. Memos_Common convertit "latest" en l'argument de build Dockerfile figé MEMOS_VERSION = "0.28.0", de sorte qu'un nouveau build ne résout jamais une étiquette amont latest inexistante.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinir false pour ne provisionner que l'infrastructure.
container_image_sourcecustomConstruit l'image d'encapsulation avec le point d'entrée qui calcule le DSN. "prebuilt" déploie directement l'image officielle mais impose alors de raccorder manuellement MEMOS_DRIVER/MEMOS_DSN via environment_variables.
container_imageghcr.io/usememos/memosRéférence de l'image de base utilisée par le build personnalisé.
cpu_limit1000mCPU par instance.
memory_limit512MiMémoire par instance — suffisante pour la faible empreinte de Memos.
min_instance_count0Mise à l'échelle à zéro — Memos n'a aucun travail en arrière-plan justifiant de rester actif.
max_instance_count1Instance unique par défaut ; à augmenter pour une charge concurrente plus élevée.
container_port5230Port par défaut natif de Memos — aucun remappage effectué.
execution_environmentgen2Gen2 requis pour les montages NFS/GCS Fuse (non utilisés par ce module, mais valeur par défaut de la plateforme).
timeout_seconds300Durée maximale d'une requête (0 à 3600 secondes).
cpu_always_allocatedfalseFacturation à la requête — Memos n'effectue aucun travail entre les requêtes.
enable_cloudsql_volumetrueCloud SQL Auth Proxy pour les connexions par socket.
enable_image_mirroringtrueMet en miroir l'image Memos dans Artifact Registry.

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

VariableValeur par défautDescription
ingress_settingsallEntrée publique ; Memos n'a pas de chemin d'ingestion non authentifié distinct à protéger.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine via le VPC que le trafic RFC 1918.
enable_iapfalseExige une connexion Google devant l'ensemble du service.
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 non secrets supplémentaires. Toute valeur MEMOS_* documentée par Memos peut être définie ici (par exemple MEMOS_INSTANCE_URL). La connexion à la base de données (MEMOS_DSN, MEMOS_DRIVER) est calculée automatiquement — ne les définissez pas ici.
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 * * *Planification cron des sauvegardes automatiques (UTC).
backup_retention_days7Rétention ; à augmenter en production.
enable_backup_import / backup_source / backup_file / backup_formatoptions de restaurationRestauration depuis une sauvegarde au déploiement.

Groupe 8 — CI/CD et Binary Authorization​

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

Groupe 9 — SQL personnalisé et NFS​

enable_custom_sql_scripts, custom_sql_scripts_bucket, custom_sql_scripts_path exécutent du SQL depuis un bucket GCS après le provisionnement. nfs_instance_name / nfs_instance_base_name sont déclarés par cohérence avec la convention mais ne sont pas utilisés — Memos n'utilise pas NFS. Consultez 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 du 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éfinis)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 — vide par défaut, puisque les pièces jointes de Memos ne reposent pas sur GCS dans ce module.
storage_buckets[]Aucun bucket provisionné par défaut.
enable_nfsfalseNon utilisé — Memos ne conserve aucun état en dehors de PostgreSQL dans le raccordement de ce module.
gcs_volumes[]Ajoutez une entrée ici (montée sur le répertoire de données de Memos) si la persistance des pièces jointes entre révisions est requise.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Imposé par Memos_Common.
application_database_namememosNom de la base de données PostgreSQL. Immuable après le premier déploiement.
application_database_usermemosUtilisateur applicatif de la base de données. 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.

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

VariableValeur par défautDescription
initialization_jobs[]Laisser vide pour utiliser le job db-init intégré.
cron_jobs[]Non utilisé — Memos n'a aucune tâche récurrente planifiée par la plateforme.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /, délai de 30sSonde de démarrage — cible la page de connexion publique.
liveness_probeHTTP /, délai de 30sSonde de vivacité.
uptime_check_config{ enabled=false }Test de disponibilité Cloud Monitoring ; à activer explicitement.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 16 — Redis​

VariableValeur par défautDescription
enable_redisfalseMemos ne dépend d'aucun cache ni d'aucune file d'attente ; laissez false, sauf pour intégrer une instance Redis externe à des fins personnalisées.

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

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

5. Sorties​

Renvoyées à l'issue 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 applicative.
database_password_secretSecret Secret Manager contenant le mot de passe de la base de données.
database_host / database_portPoint de terminaison / port de la base de données.
storage_bucketsBuckets Cloud Storage créés — vide par défaut.
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 (inclut 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 de la journalisation 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 invalide fait échouer le plan avec une erreur claire et nommée avant la création de toute ressource ; la plupart des erreurs ci-dessous sont donc détectées en amont plutôt qu'à l'apply ou à l'exécution.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
application_database_name / application_database_userDéfinis une seule 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.
Premier compte créé par inscriptionLe créer immédiatement après le déploiementCritiqueLe premier compte inscrit devient l'hôte/administrateur — si l'inscription reste ouverte, le premier visiteur qui atteint l'URL s'approprie ce rôle.
Auto-inscription publiqueLa désactiver après le premier administrateurÉlevéMemos est livré avec l'inscription ouverte par défaut ; la laisser activée permet à quiconque dispose de l'URL de créer un compte.
container_image_sourcecustom (défaut)Élevé"prebuilt" déploie directement l'image officielle, mais cette image ne contient aucune logique pour calculer MEMOS_DSN à partir des variables DB_* de la plateforme — elle doit être raccordée manuellement via environment_variables, sinon l'application ne parvient pas à se connecter à la base de données.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans backup_file valide fait échouer le job d'import.
memory_limit512Mi (la valeur par défaut suffit)MoyenL'empreinte de Memos est faible ; l'augmenter affecte surtout le coût, pas le bon fonctionnement.
min_instance_count0 (défaut)FaibleLa mise à l'échelle à zéro ajoute un bref démarrage à froid (binaire Go, démarrage rapide) à la première requête après une période d'inactivité — bien plus court que pour les applications JVM/Node.js de ce catalogue.
gcs_volumes pour les pièces jointesÀ ajouter explicitement si nécessaireMoyenSans lui, les pièces jointes binaires téléversées résident sur le système de fichiers éphémère de Cloud Run et ne survivent pas à un redémarrage de révision — les notes textuelles dans PostgreSQL ne sont pas affectées.
enable_cloud_armorà activer en productionMoyenLe formulaire de connexion/d'inscription est accessible publiquement sans protection WAF par défaut.

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 — consultez App_CloudRun. La configuration applicative propre à Memos partagée avec la variante GKE est décrite dans Memos_Common.

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