Aller au contenu principal

Memos sur GKE Autopilot

Memos sur GKE Autopilot

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 doté d'un frontend React. Ce module déploie Memos sur GKE Autopilot au-dessus du socle App_GKE, qui provisionne et gère l'infrastructure Google Cloud et Kubernetes partagée.

Ce guide se concentre sur les services cloud qu'utilise 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 GKE — Workload Identity, ingress, mise à l'échelle automatique, 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_GKE plutôt que de les répéter ici.


1. Vue d'ensemble​

Memos s'exécute comme une unique charge de travail web Go. Le déploiement assemble un ensemble volontairement restreint de services Google Cloud — Memos n'a ni file d'attente, ni cache, ni workers d'arrière-plan :

FonctionnalitéService Google CloudRemarques
CalculGKE AutopilotPod Go, 1 vCPU / 512 MiB par défaut, mise à l'échelle horizontale automatique
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — ce module standardise sur Postgres via une unique URL de connexion 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 aucun secret applicatif
IngressCloud Load BalancingLoadBalancer externe, domaine personnalisé + certificat géré en option

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

  • PostgreSQL est le moteur standardisé. Memos_Common fixe database_type = "POSTGRES_15".
  • 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 aucune variable d'environnement de type DEFAULTUSER et rien à récupérer dans Secret Manager pour la première connexion.
  • workload_type = "Deployment", et non StatefulSet. Memos ne conserve aucun état local devant survivre au redémarrage d'un pod au-delà de ce qui se trouve déjà dans Cloud SQL — aucun PVC ni montage NFS n'est requis.
  • L'affinité de session n'est pas requise. Memos n'a aucun état WebSocket en processus lié à un pod précis (contrairement aux schémas de push en direct d'Activepieces ou de Gotify), donc la valeur par défaut session_affinity = "None" est correcte.
  • min_instance_count = 0 / max_instance_count = 1. GKE Autopilot facture par pod en cours d'exécution ; le HPA peut réduire à zéro réplica en période d'inactivité.
  • 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 — sur GKE, DB_HOST arrive sous la forme 127.0.0.1 (le sidecar cloud-sql-proxy) — et construit l'unique URL de connexion MEMOS_DSN qu'attend Memos.
  • Aucun stockage d'objets n'est provisionné. Ce module ne déclare ni bucket GCS, ni volume, ni PVC pour les pièces jointes téléversées. Les notes texte sont entièrement conservées dans PostgreSQL, mais les pièces jointes binaires résideraient sur le système de fichiers éphémère du pod et ne survivraient pas à un redémarrage du pod.

2. Services Google Cloud et comment les explorer​

Toutes les commandes supposent que vous avez exécuté gcloud container clusters get-credentials <cluster> --region <region> --project <project> et que PROJECT, REGION et NAMESPACE sont définis. L'espace de noms et les autres identifiants figurent dans les sorties du déploiement.

A. GKE Autopilot — la charge de travail Memos​

Les pods Memos sont planifiés sur Autopilot, qui facture le processeur et la mémoire réellement demandés par les pods. L'autoscaling horizontal des pods dimensionne le déploiement entre le nombre minimal et le nombre maximal de réplicas.

  • Console : Kubernetes Engine → Workloads → sélectionnez la charge de travail Memos pour voir les pods, les révisions et les événements. Kubernetes Engine → Services & Ingress affiche l'adresse IP externe.
  • CLI :
    kubectl get pods,svc,hpa -n "$NAMESPACE"
    kubectl logs -n "$NAMESPACE" deploy/<service-name> --tail=100
    kubectl describe hpa -n "$NAMESPACE" # current vs target utilisation

Consultez App_GKE pour la gestion d'Autopilot, de la mise à l'échelle et du type de charge de travail (Deployment ou StatefulSet).

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. Les pods y accèdent de manière privée via le sidecar Cloud SQL Auth Proxy sur 127.0.0.1 ; 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 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_GKE 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 — il est entièrement géré par le socle, et non par Memos_Common. Memos génère sa propre clé interne de signature de session et la stocke dans sa propre base de données au premier démarrage.

  • 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 exposé via un Service Kubernetes (LoadBalancer par défaut) doté d'une adresse IP externe. Une Gateway/un Ingress avec un domaine personnalisé et un certificat TLS géré peut y être ajouté.

  • Console : Kubernetes Engine → Services & Ingress ; Network services → Load balancing.
  • CLI :
    kubectl get svc -n "$NAMESPACE" -o wide
    gcloud compute addresses list --project "$PROJECT"

Consultez App_GKE.

E. Cloud Logging et Monitoring​

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

  • Console : Logging → Logs Explorer ; Monitoring → Dashboards / Alerting.
  • CLI :
    kubectl logs -n "$NAMESPACE" deploy/<service-name> --tail=100 -f

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 avec postgres:15-alpine. Il se connecte via le sidecar cloud-sql-proxy et crée de manière idempotente le rôle et la base de données de l'application. Le job peut être relancé sans risque.
  • Migrations de schéma au démarrage. Memos applique sa propre mise en place du schéma par auto-migration GORM à chaque démarrage de pod — aucun job de migration distinct n'est nécessaire.
  • 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.
  • 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 — la branche de boucle locale (DB_HOST=127.0.0.1, sslmode=disable) est retenue sur GKE, puisque le sidecar cloud-sql-proxy termine déjà le TLS. Consultez Memos_Common pour la logique d'embranchement complète.
  • Chemin de santé. Les sondes de démarrage et de vivacité ciblent / — la page publique de connexion/d'accueil de Memos, accessible sans authentification.
  • Inspecter l'exécution des jobs :
    kubectl get jobs -n "$NAMESPACE"
    kubectl logs -n "$NAMESPACE" job/<job-name>

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 d'App_GKE avec leur comportement standard.

Groupe 1 — Projet et identité​

VariableValeur par défautDescription
project_id(obligatoire)Projet Google Cloud cible.
regionus-central1Région du cluster 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_namememosNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameMemosNom lisible affiché dans la console.
application_descriptionMemos note-taking service on GKEDescription de la charge de travail.
application_versionlatestTag de suivi du déploiement. Memos_Common associe "latest" à l'argument de build Dockerfile épinglé MEMOS_VERSION = "0.28.0".

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
container_image_sourcecustomConstruit l'image wrapper avec le point d'entrée qui calcule le DSN.
cpu_limit1000mProcesseur par pod.
memory_limit512MiMémoire par pod — suffisante pour l'empreinte réduite de Memos.
min_instance_count0minReplicas du HPA.
max_instance_count1maxReplicas du HPA ; augmentez-le pour une charge simultanée plus élevée.
container_port5230Port natif par défaut de Memos — aucun remappage n'est effectué.
enable_cloudsql_volumetrueSidecar cloud-sql-proxy pour les connexions par socket.
enable_image_mirroringtrueMet en miroir l'image Memos dans Artifact Registry.
session_affinityNoneAucune session au niveau du pod n'est requise.

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

Paramètres standard d'exposition du service et d'IAP d'App_GKE — consultez App_GKE. Entrées clés : service_type (LoadBalancer par défaut), enable_iap, iap_authorized_users.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres supplémentaires non secrets. Toute valeur MEMOS_* documentée par Memos peut être définie ici. 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.

Groupe 7 — Sauvegarde et restauration​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron de sauvegarde automatisée (UTC).
backup_retention_days7Rétention ; augmentez-la pour la production.
enable_backup_importfalseRestaure à partir d'une sauvegarde lors du déploiement.

Groupe 8 — CI/CD et Binary Authorization​

Intégration Cloud Build standard d'App_GKE — consultez App_GKE.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
storage_buckets[]Aucun bucket provisionné par défaut.
enable_nfsfalseNon utilisé — Memos ne conserve aucun état hors de PostgreSQL dans le câblage de ce module.
stateful_pvc_enablednullNon défini, donc la logique de résolution propre à App_GKE s'applique (aucun PVC). Memos est sans état au niveau du pod ; aucun PVC bloc n'est nécessaire.
gcs_volumes[]Ajoutez ici une entrée (montée sur le répertoire de données de Memos) si la persistance des pièces jointes est requise.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Fixé par Memos_Common.
application_database_namememosNom de la base de données PostgreSQL. Immuable après le premier déploiement.
application_database_usermemosUtilisateur de la base de données de l'application. Mot de passe généré automatiquement dans Secret Manager.

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

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

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 ; nécessite un point de terminaison joignable publiquement.

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).
enable_audit_loggingfalseCloud Audit Logs détaillés.

5. Sorties​

Ces valeurs sont renvoyées lors d'un déploiement réussi et constituent le moyen le plus rapide de localiser et d'explorer les ressources en cours d'exécution.

SortieDescription
service_nameNom du Service Kubernetes.
namespaceEspace de noms Kubernetes.
service_cluster_ipClusterIP du Service.
service_external_ipAdresse IP externe du LoadBalancer (lorsque service_type = "LoadBalancer").
service_urlURL du service déployé.
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 — 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État de la surveillance et canaux.
initialization_jobsNoms des jobs de configuration (inclut db-init).
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
kubernetes_readyIndique si la charge de travail Kubernetes a atteint l'état Ready.
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).

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
application_database_name / application_database_userÀ définir 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éé via l'inscriptionCréez-le immédiatement après le déploiementCritiqueLe premier compte à s'inscrire devient hôte/administrateur — si l'inscription reste ouverte, le premier visiteur qui atteint l'adresse IP externe s'arroge ce rôle.
Inscription publique en libre-serviceDésactivez-la après la création du premier administrateurÉlevéMemos est livré avec l'inscription ouverte par défaut.
container_image_sourcecustom (par défaut)Élevé"prebuilt" déploie directement l'image officielle, qui ne contient aucune logique de calcul de MEMOS_DSN — celui-ci doit être câblé manuellement, sinon le pod passe en CrashLoopBackOff sur un échec de connexion à la base de données.
stateful_pvc_enabledfalse (par défaut)FaibleMemos n'a besoin d'aucun stockage bloc ; l'activer consomme inutilement du quota SSD.
gcs_volumes pour les pièces jointesAjoutez-le 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 du pod et ne survivent pas à un redémarrage du pod.
min_instance_count0 (par défaut)FaibleLa réduction à zéro retarde brièvement la première requête après une période d'inactivité, le temps qu'un nouveau pod soit planifié — démarrage à froid d'Autopilot, et non bogue de l'application.

Pour le comportement du socle évoqué tout au long de ce guide — Workload Identity, ingress, mise à l'échelle automatique, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC-SC, sauvegardes et mise en miroir des images — consultez App_GKE. La configuration applicative propre à Memos partagée avec la variante Cloud Run 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.