Aller au contenu principal

Ghost sur GKE Autopilot

Ghost sur GKE Autopilot

Ghost est une plateforme de publication open source moderne qui alimente plus de 2M de publications, avec adhésions, abonnements et newsletters intégrés. Ce module déploie Ghost 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 Ghost 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, autoscaling, 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​

Ghost s'exécute sous la forme d'une charge de travail web Node.js. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculGKE AutopilotPods Node.js, 2 vCPU / 4 GiB par défaut, mise à l'échelle horizontale automatique
Base de donnéesCloud SQL for MySQL 8.0Obligatoire — Ghost 6.x ne prend pas en charge PostgreSQL
Fichiers partagésFilestore (NFS)Contenus téléversés et thèmes partagés entre tous les réplicas
Stockage objetCloud StorageUn bucket de contenu dédié (ghost-content) provisionné automatiquement
CacheRedisActivé par défaut ; se rabat sur l'IP de l'hôte NFS lorsqu'aucun hôte Redis n'est indiqué
SecretsSecret ManagerMot de passe de la base de données géré automatiquement
IngressCloud Load BalancingLoadBalancer externe, domaine personnalisé et certificat géré facultatifs

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

  • MySQL 8.0 est obligatoire. Ghost 6.x nécessite MySQL ; PostgreSQL n'est pas pris en charge et ne démarrera pas.
  • database__client = "mysql" est injecté automatiquement. Sans cela, Ghost se rabat silencieusement sur SQLite — le module s'en charge, vous n'avez donc jamais à le définir manuellement.
  • Redis est activé par défaut. Ghost utilise Redis pour la mise en cache des pages afin de réduire la charge sur la base de données et d'améliorer les temps de réponse.
  • L'affinité de session est ClientIP. Le panneau d'administration et le portail d'adhésion de Ghost utilisent des sessions côté serveur ; les requêtes d'un navigateur sont épinglées à un même pod.
  • Un bucket GCS ghost-content est provisionné automatiquement par Ghost_Common et n'a pas besoin d'être ajouté à storage_buckets.
  • Un job db-init s'exécute à chaque apply pour créer de manière idempotente la base de données MySQL et l'utilisateur de Ghost.
  • Les sondes de santé ciblent / avec un délai initial de 90 secondes, pour permettre à Ghost d'exécuter les migrations de base de données et de compiler les thèmes au premier démarrage.
  • Le mot de passe de la base de données est généré automatiquement et stocké dans Secret Manager.

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 sont indiqués dans les Sorties du déploiement.

A. GKE Autopilot — la charge de travail Ghost​

Les pods Ghost sont planifiés sur Autopilot, qui facture le CPU et la mémoire effectivement demandés par les pods. Le Horizontal Pod Autoscaling 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 Ghost pour voir les pods, les révisions et les événements. Kubernetes Engine → Services & Ingress affiche l'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 MySQL 8.0​

Ghost stocke toutes les données de l'application (articles, membres, paramètres) dans une instance gérée Cloud SQL for MySQL 8.0. Les pods y accèdent de manière privée via le sidecar Cloud SQL Auth Proxy sur un socket Unix, si bien qu'aucune IP publique n'est exposée. Au premier déploiement, un Job db-init crée la base de données et l'utilisateur de l'application.

  • 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"
    # Open an interactive shell to inspect schema/data:
    gcloud sql connect <instance-name> --user=<db-user> --project "$PROJECT"

Le nom de l'instance, le nom de la base de données, l'utilisateur et le secret Secret Manager contenant le mot de passe figurent tous dans les Sorties. Pour le modèle de connexion, les sauvegardes automatiques et la rotation des mots de passe, consultez App_GKE.

C. Filestore (NFS) et Cloud Storage​

Les contenus téléversés (images, thèmes, fichiers) sont écrits sur un partage Filestore (NFS) monté dans chaque pod, de sorte que tous les réplicas voient les mêmes fichiers. Un bucket Cloud Storage dédié (ghost-content) est également provisionné automatiquement pour le contenu ; l'accès est accordé automatiquement au compte de service de la charge de travail.

  • Console : Filestore → Instances pour le partage NFS ; Cloud Storage → Buckets pour le bucket de contenu.
  • CLI :
    gcloud filestore instances list --project "$PROJECT"
    gcloud storage buckets list --project "$PROJECT"
    gcloud storage ls gs://<content-bucket>/ # bucket name is in the Outputs
    # Confirm the share is mounted inside a pod:
    kubectl exec -n "$NAMESPACE" deploy/<service-name> -- df -h | grep -i nfs

Consultez App_GKE pour le provisionnement NFS, GCS Fuse et les options CMEK.

D. Cache Redis​

Redis sert de support à la mise en cache des pages de Ghost. Lorsqu'aucun hôte Redis externe n'est configuré et que NFS est activé, l'IP de l'hôte NFS est utilisée comme point de terminaison Redis.

  • Console : Memorystore → Redis (si vous utilisez une instance gérée).
  • CLI :
    redis-cli -h <redis-host> ping        # from a host with network access
    redis-cli -h <redis-host> info keyspace
    # Confirm Redis env vars are set in the Ghost pod:
    kubectl exec -n "$NAMESPACE" deploy/<service-name> -- env | grep -i redis

E. Secret Manager​

Le mot de passe de la base de données est stocké sous forme de secret Secret Manager et injecté dans les pods à l'exécution ; il n'apparaît jamais en clair dans la configuration.

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

Le nom du secret du mot de passe de la base de données figure dans les Sorties. Consultez App_GKE pour l'intégration Secret Store CSI et la rotation.

F. Réseau et entrée​

La charge de travail est exposée via une IP Cloud Load Balancing externe. enable_custom_domain vaut true par défaut, ce qui provisionne un Ingress Kubernetes avec un certificat géré par Google pour les noms d'hôte de application_domains ; une IP statique est réservée par défaut (reserve_static_ip = true) afin que l'adresse survive aux redéploiements.

  • Console : Network services → Load balancing ; VPC network → IP addresses.
  • CLI :
    kubectl get ingress,svc -n "$NAMESPACE"
    gcloud compute addresses list --project "$PROJECT"

Consultez App_GKE pour les détails sur les domaines personnalisés, Cloud CDN et l'IP statique.

G. Cloud Logging et Monitoring​

La sortie stdout/stderr des pods est envoyée vers Cloud Logging ; les métriques GKE et Cloud SQL sont envoyées vers Cloud Monitoring. Des tests de disponibilité et des règles d'alerte facultatifs sont disponibles.

  • Console : Logging → Logs Explorer ; Monitoring → Dashboards / Alerting.
  • CLI :
    gcloud logging read 'resource.type="k8s_container" AND resource.labels.namespace_name="'"$NAMESPACE"'"' \
    --project "$PROJECT" --limit 50

3. Comportement de l'application Ghost​

  • Configuration de la base de données au premier déploiement. Un Job db-init se connecte à Cloud SQL via l'Auth Proxy et crée de manière idempotente la base de données Ghost (avec le jeu de caractères utf8mb4 et la collation utf8mb4_0900_ai_ci), crée l'utilisateur de l'application et lui accorde tous les privilèges. Le job s'exécute à chaque apply et peut être relancé sans risque.
  • Premier démarrage lent. Ghost exécute les migrations de base de données et compile les thèmes au premier démarrage. La sonde de démarrage accorde un délai initial de 90 secondes (initial_delay_seconds = 90, failure_threshold = 10) — ne le réduisez pas en dessous de 60 secondes, sinon Ghost sera arrêté avant d'avoir fini de s'initialiser.
  • Détection dynamique de l'URL. Au démarrage, le script de point d'entrée personnalisé interroge le serveur de métadonnées Cloud Run/GKE pour découvrir l'URL du service et l'exporter en tant que url et admin__url pour Ghost. Une variable d'environnement url explicite est toujours prioritaire.
  • Connexion à la base de données. Le point d'entrée associe automatiquement les variables DB_HOST, DB_USER, DB_NAME, DB_PASSWORD et DB_PORT du socle aux paramètres database__connection__* de Ghost. Lorsque DB_HOST commence par /, il est traité comme un chemin de socket Unix.
  • SMTP pour les e-mails. Ghost nécessite SMTP pour les inscriptions des membres, les réinitialisations de mot de passe et l'envoi des newsletters. Les environment_variables sont pré-remplies (SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_SSL, EMAIL_FROM) — configurez-les avant d'inviter des membres.
  • Connexion administrateur. Le panneau d'administration de Ghost se trouve à <url>/ghost. Au premier démarrage, Ghost crée un utilisateur administrateur de manière interactive.
  • Chemin de santé. Les sondes de disponibilité (readiness) et de vivacité ciblent /, qui renvoie HTTP 200 lorsque Ghost est entièrement initialisé.

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Ghost ou notables pour lui sont listés ; toutes les autres entrées sont héritées d'App_GKE 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 de la charge de travail 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 pour le suivi des coûts et de la propriété.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_nameghostNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameGhost BlogNom convivial affiché dans la console.
application_descriptionGhost Publishing Platform on GKE AutopilotAnnotation de description de la charge de travail.
application_version6.14.0Tag de version de l'image Ghost ; incrémentez-le pour déployer une nouvelle version.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
cpu_limit2000mCPU par pod ; 2 vCPU minimum pour Ghost 6.x.
memory_limit4GiMémoire par pod ; 4 GiB recommandés (Ghost subit des OOM en dessous de 1 GiB).
min_instance_count1Nombre minimal de réplicas. Conservez une valeur ≥ 1 pour éviter les démarrages à froid et les délais de migration.
max_instance_count5Nombre maximal de réplicas (plafond de l'autoscaler).
container_port2368Port HTTP natif de Ghost. Ne le modifiez pas, sauf si votre Dockerfile écoute sur un autre port.
container_image_sourcecustomcustom construit l'image via Cloud Build (par défaut) ; prebuilt déploie une image existante.
enable_cloudsql_volumetrueSidecar Cloud SQL Auth Proxy pour les connexions par socket. Obligatoire pour Ghost.
enable_vertical_pod_autoscalingfalseLaisse Autopilot ajuster automatiquement les demandes de ressources.

Groupe 5 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{SMTP_HOST="", SMTP_PORT="587", SMTP_USER="", SMTP_PASSWORD="", SMTP_SSL="false", EMAIL_FROM="ghost@example.com"}Paramètres SMTP pré-remplis pour l'envoi d'e-mails par Ghost. database__client=mysql est injecté automatiquement — ne le définissez pas ici.
secret_environment_variables{}Map variable d'environnement → nom du secret Secret Manager.

Groupe 6 — Backend GKE et cluster​

VariableValeur par défautDescription
service_typeLoadBalancerMode d'exposition du Service.
session_affinityClientIPRoutage persistant requis pour les sessions d'administration et d'adhésion de Ghost.
workload_typenullSe résout automatiquement en StatefulSet lorsque le stockage par pod est activé.
network_tags['nfsserver']Tags des nœuds/pods ; nfsserver est requis pour la connectivité NFS.

Groupe 7 — StatefulSet​

VariableValeur par défautDescription
stateful_pvc_enablednullActive des PVC par pod pour les déploiements StatefulSet.
stateful_pvc_size10GiStockage par pod. Prévoyez davantage pour les publications actives riches en médias.
stateful_pvc_mount_path/dataChemin du PVC par pod dans le conteneur.
stateful_pvc_storage_classstandard-rwoStorageClass Kubernetes des PVC.

Groupe 8 — Quota de ressources​

VariableValeur par défautDescription
enable_resource_quotafalsePlafonne le CPU, la mémoire et le nombre d'objets de l'espace de noms.
quota_memory_requests / quota_memory_limits""Utilisez obligatoirement des unités binaires (4Gi, 8192Mi) — les entiers bruts sont interprétés comme des octets et bloquent la planification.

Groupe 9 — Règles de fiabilité​

VariableValeur par défautDescription
enable_pod_disruption_budgettrueProtège la disponibilité pendant les mises à niveau des nœuds.
pdb_min_available1Augmentez min_instance_count au-delà de 1 si vous avez besoin d'une marge pour les évictions.
enable_topology_spreadfalseRépartit les pods entre les zones.

Groupe 10 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /, délai initial de 90s, 10 échecsSonde HTTP sur le chemin racine de Ghost (200 lorsqu'il est prêt). Délai généreux pour les migrations du premier démarrage.
liveness_probeHTTP /, délai initial de 60sSonde de vivacité ciblant le chemin racine de Ghost.
uptime_check_configdésactivéTest de disponibilité Cloud Monitoring facultatif.
alert_policies[]Règles d'alerte sur métriques facultatives.

Groupe 11 — Automatisation des charges de travail​

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job db-init intégré (mysql:8.0-debian).
cron_jobs[]CronJobs Kubernetes planifiés pour les tâches de maintenance de Ghost.

Groupe 12 — CI/CD et intégration GitHub​

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

Groupe 13 — Système de fichiers (NFS)​

VariableValeur par défautDescription
enable_nfstrueVolume Filestore partagé pour le contenu Ghost (laissez-le activé en multi-réplicas).
nfs_mount_path/mnt/nfsChemin de montage dans le conteneur.

Groupe 14 — Cloud Storage et Artifact Registry​

VariableValeur par défautDescription
create_cloud_storagetrueProvisionne le bucket supplémentaire défini dans storage_buckets. Le bucket ghost-content est toujours provisionné automatiquement.
storage_buckets[{name_suffix="data"}]Buckets supplémentaires en plus du bucket de contenu provisionné automatiquement.
gcs_volumes[]Montages GCS Fuse.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 15 — Cache Redis​

VariableValeur par défautDescription
enable_redistrueUtilise Redis pour la mise en cache des pages de Ghost.
redis_host""Laissez vide pour utiliser l'IP de l'hôte NFS ; définissez-le explicitement lorsque NFS est désactivé.
redis_port6379Port Redis.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible).

Groupe 16 — Backend de base de données​

VariableValeur par défautDescription
database_typeMYSQL_8_0Ghost nécessite MySQL 8.0 — ne le modifiez pas.
db_nameghostNom de la base de données MySQL. Immuable après le premier déploiement.
db_userghostUtilisateur de l'application. Immuable après le premier déploiement.
application_database_namegkeappdbNom de la base de données Cloud SQL (variable d'App_GKE). Remplacez-le par ghost par souci de cohérence.
application_database_usergkeappuserUtilisateur Cloud SQL (variable d'App_GKE). Remplacez-le par ghost par souci de cohérence.
database_password_length32Longueur du mot de passe généré (16–64).
enable_auto_password_rotationfalseRotation du mot de passe de la base de données sans interruption de service.

Groupe 17 — Sauvegarde et maintenance​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron des sauvegardes automatiques (UTC).
backup_retention_days7Rétention ; passez à 30–90 pour la production ou la conformité.
enable_backup_import / backup_source / backup_uri / backup_formatoptions de restaurationRestaure une sauvegarde lors du déploiement.

Groupe 18 — 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_GKE.

Groupe 19 — Domaine personnalisé, IP statique et réseau​

VariableValeur par défautDescription
enable_custom_domaintrueProvisionne un Ingress pour les noms d'hôte personnalisés et un certificat géré.
application_domains[]Noms d'hôte à servir. Ghost doit connaître son URL publique au démarrage — assurez-vous que le domaine correspond.
reserve_static_iptrueIP externe stable d'un redéploiement à l'autre.

Groupe 20 — Identity-Aware Proxy (IAP)​

VariableValeur par défautDescription
enable_iapfalseExige une connexion Google devant Ghost.
iap_authorized_users / iap_authorized_groups[]Qui peut accéder.
iap_oauth_client_id / iap_oauth_client_secret""Obligatoires lorsque IAP est activé (sensibles).
iap_support_email""Affichée sur l'écran de consentement OAuth.

Groupe 21 — Cloud Armor​

VariableValeur par défautDescription
enable_cloud_armorfalseAssocie une règle Cloud Armor (WAF) au backend de l'Ingress.
admin_ip_ranges[]CIDR autorisés pour l'accès privilégié.
cloud_armor_policy_namedefault-waf-policyNom de la règle.

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éfini)CIDR du niveau d'accès / mode simulation (dry-run).
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 dans lequel s'exécute la charge de travail.
service_cluster_ipClusterIP interne au cluster.
service_external_ipIP du LoadBalancer externe (lorsqu'une IP statique est réservée).
service_urlURL permettant d'accéder à Ghost.
database_instance_nameNom de l'instance Cloud SQL.
database_nameNom de la base de données de l'application.
database_userUtilisateur 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 (127.0.0.1 via l'Auth Proxy) / port.
storage_bucketsBuckets Cloud Storage créés (y compris le bucket ghost-content).
network_name / network_exists / regionsRéseau VPC, présence, régions disponibles.
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_jobs / db_import_jobNoms des jobs de configuration et (facultatif) d'import.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / cicd_configurationÉtat et détails du CI/CD (dépôt, déclencheur, registre).
kubernetes_readyIndique si le cluster/la charge de travail est prêt.
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
database_typeMYSQL_8_0CritiqueGhost nécessite MySQL 8.0 ; tout autre moteur empêche le démarrage.
db_name / db_userdéfinis une seule foisCritiqueImmuables après le premier déploiement ; un renommage recrée la base de données/l'utilisateur et détruit toutes les données.
enable_nfstrueCritiqueSans stockage partagé, le contenu téléversé est perdu au redémarrage d'un pod et n'est pas partagé entre les réplicas.
container_port2368CritiquePort natif de Ghost ; une incohérence fait échouer toutes les sondes de santé.
enable_backup_importfalse, sauf en cas de restaurationCritiqueL'activer sans backup_uri valide fait échouer le job d'import.
quota_memory_requests / _limitsunités binairesCritiqueLes entiers bruts sont des octets et bloquent toute planification.
startup_probe initial_delay_seconds90ÉlevéUne valeur inférieure à 60 conduit Kubernetes à arrêter Ghost avant la fin de l'exécution des migrations.
enable_redistrueÉlevéSans Redis, Ghost sert toutes les pages sans cache, ce qui augmente la charge sur la base de données.
redis_host"" (NFS) ou expliciteÉlevéAucun point de terminaison valide si Redis est activé alors que NFS est désactivé et qu'aucun hôte n'est défini.
memory_limit4GiÉlevéUne mémoire insuffisante provoque un OOM de Node.js lors de l'envoi des newsletters ou de la compilation des thèmes.
session_affinityClientIPÉlevéSans persistance, les sessions d'administration de Ghost en multi-réplicas échouent par intermittence.
Paramètres SMTP de environment_variablesun vrai serveur SMTPÉlevéSans envoi d'e-mails, pas d'inscriptions de membres, pas de réinitialisations de mot de passe, pas de newsletters.
container_image_sourcecustomÉlevéL'image Ghost amont ne dispose pas du point d'entrée personnalisé qui mappe les identifiants de la base de données et détecte l'URL du service.
min_instance_count1Moyen0 provoque des démarrages à froid pendant lesquels Ghost exécute les migrations, ce qui fait expirer les premières requêtes.
enable_iap / enable_cloud_armorà activer pour l'administrationMoyenSinon, le panneau d'administration de Ghost (/ghost) est accessible publiquement.
backup_retention_days7 (à augmenter en production)MoyenTrop court pour une rétention de conformité.
pdb_min_available par rapport à min_instance_countlaisser de la margeMoyen1/1 peut bloquer les mises à niveau des nœuds (le pod unique ne peut pas être évincé).

Pour le comportement du socle évoqué tout au long de ce guide — IAM et Workload Identity, autoscaling, ingress et certificats, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC-SC, sauvegardes et mise en miroir des images — consultez App_GKE. La configuration applicative propre à Ghost, partagée avec la variante Cloud Run, est décrite dans Ghost_Common.

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