Aller au contenu principal

Gotify sur Google Cloud Run

Gotify sur Google Cloud Run

Gotify est un serveur open source (sous licence MIT) auto-hébergé permettant d'envoyer et de recevoir des notifications push en temps réel. Les applications publient des messages via une API REST simple et les clients les reçoivent instantanément via des flux WebSocket. Ce module déploie Gotify sur Cloud Run v2 au-dessus du socle App_CloudRun, qui provisionne et gère l'infrastructure Google Cloud partagée.

Ce guide se concentre sur les services cloud qu'utilise Gotify 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​

Gotify s'exécute sous la forme d'un conteneur Go à binaire unique sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service Go, 1 vCPU / 512 MiB par défaut, CPU toujours alloué pour les flux WebSocket
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — ce module n'utilise jamais le SQLite intégré de Gotify
SecretsSecret ManagerMot de passe administrateur généré automatiquement (GOTIFY_DEFAULTUSER_PASS) ; mot de passe de la base de données
Build du conteneurCloud Build + Artifact RegistryEncapsule ghcr.io/gotify/server avec un point d'entrée de mappage de la base de données
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut ; équilibreur de charge HTTPS externe et domaine personnalisé facultatifs

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

  • PostgreSQL 15 est obligatoire. database_type = "POSTGRES_15" est fixé par la couche applicative partagée ; le mode SQLite de Gotify n'est pas utilisé, aucun disque persistant n'est donc nécessaire.
  • Le conteneur écoute sur le port 80. container_port = 80 et le point d'entrée définit GOTIFY_SERVER_PORT = 80.
  • Le CPU est toujours alloué (cpu_always_allocated = true) avec min = max = 1. Gotify maintient des flux WebSocket de longue durée et un bus de messages interne au processus ; le CPU ne doit donc pas être bridé entre les requêtes. Cela empêche la mise à l'échelle à zéro ; une instance à faible trafic peut passer cpu_always_allocated = false, en acceptant que la diffusion des flux soit suspendue pendant les périodes d'inactivité.
  • Une seule instance est la valeur par défaut sûre. Le bus de messages de Gotify est interne au processus : un flux client ne reçoit que les messages remis à l'instance à laquelle il est connecté. Dépasser une instance sans couche de diffusion externe fait perdre des messages à certains abonnés.
  • Le mot de passe administrateur est généré automatiquement et stocké dans Secret Manager, puis injecté sous la forme GOTIFY_DEFAULTUSER_PASS. L'administrateur initial (admin) n'est créé que lors de la première initialisation de la base de données.
  • Aucun stockage objet n'est provisionné (storage_buckets = [], enable_nfs = false). Les messages, applications et jetons résident dans PostgreSQL.
  • L'image est construite sur mesure. container_image_source = "custom" construit une image qui encapsule ghcr.io/gotify/server et mappe les variables DB_* de la plateforme vers la configuration GOTIFY_DATABASE_* (GORM) de Gotify ; latest est épinglé sur la base 2.9.1.
  • L'entrée publique est la valeur par défaut. ingress_settings = "all" afin que les applications émettrices et les clients récepteurs puissent atteindre l'API REST et le WebSocket.

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

Gotify s'exécute en tant que service Cloud Run v2. 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. Comme le CPU est toujours alloué et qu'une instance unique est maintenue, les flux WebSocket restent connectés entre deux envois de messages.

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

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​

Gotify stocke toutes les données de l'application (messages, applications, clients, utilisateurs) dans une instance gérée Cloud SQL for PostgreSQL 15. Le service s'y connecte de manière privée via le Cloud SQL Auth Proxy sur un socket Unix ; 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 ; Gotify applique ensuite son propre schéma par auto-migration GORM au premier démarrage.

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

C. Secret Manager​

Le mot de passe administrateur (GOTIFY_DEFAULTUSER_PASS) est généré automatiquement et stocké dans Secret Manager. 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~gotify"
    gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"

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

D. Build du conteneur et Artifact Registry​

L'image personnalisée encapsule ghcr.io/gotify/server avec un point d'entrée de mappage de la base de données. Cloud Build la construit et la pousse vers Artifact Registry ; enable_image_mirroring = true met en miroir l'image de base amont dans Artifact Registry afin d'éviter les limites de débit des registres.

  • Console : Cloud Build → History ; Artifact Registry → Repositories.
  • CLI :
    gcloud builds list --project "$PROJECT" --limit 5
    gcloud artifacts repositories list --project "$PROJECT"

E. Réseau et entrée​

Le service est accessible par défaut à son URL run.app, ce qui offre l'accès public nécessaire aux applications émettrices et aux clients récepteurs. Un équilibreur de charge HTTPS externe avec domaine personnalisé, Cloud CDN et Cloud Armor peut être ajouté par-dessus.

  • 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 vers Cloud Logging ; les métriques de Cloud Run et de Cloud SQL sont envoyées vers Cloud Monitoring, avec un test de disponibilité facultatif sur /health (désactivé par défaut) et des règles d'alerte facultatives.

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

  • 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 Cloud SQL Auth Proxy et crée de manière idempotente la base de données et le rôle de l'application, puis accorde les privilèges. Le job peut être relancé sans risque.
  • Schéma par auto-migration GORM. Gotify crée et migre ses propres tables à chaque démarrage — il n'existe pas de job de migration distinct. La mise à niveau de la version de l'application applique automatiquement les modifications de schéma.
  • Le compte administrateur n'est initialisé qu'une fois. GOTIFY_DEFAULTUSER_NAME = admin et le secret GOTIFY_DEFAULTUSER_PASS créent l'administrateur initial uniquement lors de la première initialisation de la base de données. Récupérez le mot de passe dans Secret Manager et modifiez-le après la première connexion. Modifier le secret par la suite ne réinitialise pas le mot de passe administrateur.
  • L'envoi et la réception sont authentifiés par jeton. Après vous être connecté, créez une application (qui fournit un jeton d'application) pour envoyer des messages via POST /message?token=<apptoken>, et utilisez un jeton client pour vous abonner via le WebSocket à /stream?token=<clienttoken>. Vérifiez l'état de santé sans jeton :
    curl -s "$(gcloud run services describe <service-name> --region "$REGION" \
    --project "$PROJECT" --format='value(status.url)')/health"
  • Diffusion WebSocket sur une instance unique. Le bus de messages étant interne au processus, conservez max_instance_count = 1 sauf si vous ajoutez une couche de diffusion externe — sinon un message envoyé à une instance n'est pas remis aux clients connectés en flux à une autre.
  • Chemin de santé. Les sondes de démarrage et de vivacité ciblent /health — le point de terminaison public qui renvoie {"health":"green","database":"green"} dès que PostgreSQL est joignable. La sonde de démarrage par défaut accorde environ 5 minutes au premier démarrage.
  • 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 à Gotify 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 pour chaque environnement.
support_users[]Adresses e-mail recevant un 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_namegotifyNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameGotifyNom lisible affiché dans la console.
application_descriptionGotify push notification server on Cloud RunDescription du service.
application_versionlatestTag de l'image ; latest correspond à la base épinglée 2.9.1. Épinglez une version en production.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
container_image_sourcecustomcustom construit l'image d'encapsulation qui mappe la base de données ; prebuilt déploie une URI d'image que vous configurez.
cpu_limit1000mCPU par instance ; 1 vCPU convient à la plupart des instances.
memory_limit512MiMémoire par instance ; 512 MiB est le minimum en gen2.
min_instance_count1Conservez 1 pour que les flux WebSocket restent connectés.
max_instance_count1Conservez 1 — le bus de messages interne au processus ne diffuse pas entre les instances.
cpu_always_allocatedtrueRequis pour les flux WebSocket ; ne passez à false que pour des instances à faible trafic.
container_port80Gotify écoute sur le port 80.
execution_environmentgen2Environnement d'exécution de deuxième génération.
timeout_seconds300Durée maximale d'une requête ; augmentez-la pour les flux de longue durée.
enable_cloudsql_volumetrueCloud SQL Auth Proxy pour les connexions par socket.
enable_image_mirroringtrueDuplique ghcr.io/gotify/server dans Artifact Registry.
traffic_split[]Répartit le trafic entre les révisions pour des déploiements progressifs.
max_revisions_to_retain7Nombre d'anciennes révisions à conserver.

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

VariableValeur par défautDescription
ingress_settingsallall permet aux applications émettrices et aux clients récepteurs d'atteindre le service.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine que le trafic RFC 1918 via le VPC.
enable_iapfalseExige une connexion Google. Bloque les appelants de l'API authentifiés uniquement par jeton, sauf s'ils présentent aussi une identité.
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 GOTIFY_* supplémentaires. La connexion à la base de données et GOTIFY_DEFAULTUSER_PASS sont injectés automatiquement — ne les définissez pas ici.
secret_environment_variables{}Correspondance variable d'environnement → nom du secret Secret Manager.
secret_propagation_delay30Nombre de secondes 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 de sauvegarde automatique (UTC).
backup_retention_days7Rétention ; augmentez-la pour la production ou 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 — consultez App_CloudRun. Entrées principales : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy, enable_binary_authorization.

Groupe 9 — Scripts SQL personnalisés​

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. 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 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 (nécessite Cloud Armor).
max_images_to_retain / delete_untagged_images / image_retention_days(définies)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[]Vide — Gotify n'a besoin d'aucun stockage de fichiers. N'ajoutez des buckets que pour des besoins spécifiques.
enable_nfsfalseDésactivé par défaut ; ne l'activez que pour rendre persistant le stockage sur disque des images et plugins de Gotify.
gcs_volumes[]Montages de volumes GCS Fuse (nécessite gen2).
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Fixe — Gotify utilise PostgreSQL géré.
application_database_namegotifyNom de la base de données. Immuable après le premier déploiement.
application_database_usergotifyRôle 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_extensionsdésactivéExtensions PostgreSQL facultatives.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job intégré db-init.
cron_jobs[]Cloud Scheduler + Cloud Run Jobs facultatifs.
additional_services[]Services Cloud Run supplémentaires aux côtés de Gotify.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /health, délai de 30 s, 30 échecsSonde de démarrage. Accorde environ 5 minutes au premier démarrage.
liveness_probeHTTP /health, délai de 30 sSonde de vivacité.
startup_probe_config / health_check_configHTTP /healthSondes au niveau d'App_CloudRun.
uptime_check_config{ enabled=false, path="/health" }Test de disponibilité Cloud Monitoring ; désactivé par défaut.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 16 — Redis​

VariableValeur par défautDescription
enable_redisfalseGotify n'a pas besoin de Redis ; laissez désactivé sauf pour intégrer une instance externe.
redis_host""Point de terminaison Redis (utilisé uniquement lorsque enable_redis = true).
redis_port6379Port Redis.

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

VariableValeur par défautDescription
enable_vpc_scfalseApplique un périmètre VPC-SC (découvre automatiquement organization_id).
vpc_cidr_ranges / vpc_sc_dry_run(définies)CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseCloud 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 le service s'exécute.
project_id / deployment_idID du projet / suffixe du déploiement.
database_instance_nameNom de l'instance Cloud SQL.
database_name / database_userNom de la base de données / rôle de l'application.
database_password_secretSecret Secret Manager contenant le mot de passe de la base de données.
storage_bucketsBuckets Cloud Storage créés (vide pour Gotify).
container_imageImage déployée.
cicd_enabled / github_repository_urlÉtat du CI/CD et dépôt connecté.

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 redis_port/backup_retention_days hors plage, un database_type qui ne correspond pas à une extension activée. 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
max_instance_count1CritiqueDépasser 1 sans diffusion externe fait perdre des messages aux clients connectés en flux à d'autres instances (bus de messages interne au processus).
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/le rôle et détruit tous les messages.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans sauvegarde valide fait échouer le job d'import.
cpu_always_allocatedtrueÉlevéAvec une facturation à la requête, le CPU est bridé entre les requêtes et la diffusion des flux WebSocket se bloque pendant l'inactivité.
container_port80ÉlevéGotify écoute sur le port 80 ; un port différent fait échouer la sonde de démarrage et la révision ne sert jamais de trafic.
memory_limit512MiÉlevéEn dessous du minimum gen2 de 512 MiB, le plan est rejeté.
min_instance_count1ÉlevéLa mise à l'échelle à zéro interrompt tous les flux WebSocket actifs chaque fois que l'instance est récupérée.
ingress_settingsallÉlevéLa valeur internal empêche les émetteurs et récepteurs externes d'atteindre le service.
enable_iapuniquement lorsque les appelants de l'API présentent une identitéÉlevéIAP exige une identité Google sur chaque requête, ce qui bloque les appelants qui envoient ou reçoivent uniquement par jeton.
GOTIFY_DEFAULTUSER_PASS (généré automatiquement)Modifier le mot de passe administrateur après la première connexionÉlevéLe mot de passe d'initialisation ne s'applique qu'à la première initialisation ; laisser le mot de passe administrateur par défaut inchangé constitue une exposition permanente d'identifiants.
backup_retention_days7 (à augmenter en production)MoyenTrop court pour une rétention réglementaire.
enable_cloud_armorà activer en productionMoyenL'API et l'interface sont accessibles publiquement sans protection WAF.

Pour le comportement du socle évoqué tout au long de cette page — 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 à Gotify partagée avec la variante GKE est décrite dans Gotify_Common.

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