Chibisafe sur GKE Autopilot — Guide de lab
Vue d'ensemble
Durée estimée : 45–90 minutes
Chibisafe est un outil auto-hébergé de téléversement de fichiers et d'images,
avec téléversement par glisser-déposer, albums et API publique. Ce module
déploie la pile Chibisafe complète — le backend chibisafe-server, l'interface
web Next.js et un proxy inverse Caddy, réunis dans une image construite sur
mesure et à l'écoute sur le port 8000 — sous la forme d'une seule charge de
travail sur GKE Autopilot, par défaut un StatefulSet adossé à un
PersistentVolumeClaim en mode bloc de 20Gi monté sur /data — plus adapté
que GCS Fuse à une application SQLite à écrivain unique. Ce lab vous fait
parcourir tout le cycle de vie opérationnel du module Chibisafe on GKE
Autopilot : le déployer, y accéder et le vérifier, l'exploiter au quotidien,
l'observer, diagnostiquer les problèmes courants et le supprimer.
Le lab porte sur l'exploitation du module GKE et de la plateforme Google Cloud, et non sur les fonctionnalités de Chibisafe. Pour la liste complète des services provisionnés et de chaque paramètre de configuration (organisés par groupe), consultez le Guide de configuration — ce lab ne reprend volontairement pas ce détail afin de rester exact dans le temps.
Objectifs
À la fin de ce lab, vous saurez :
- Déployer le module depuis la plateforme RAD et repérer les ressources qu'il provisionne.
- Vous connecter au cluster GKE et accéder à l'interface web de Chibisafe.
- Comprendre pourquoi les sondes de santé ciblent
/api/healthplutôt que/, et quelles variables de sonde contrôlent réellement le pod déployé. - Effectuer les opérations du jour 2 — inspecter le StatefulSet, gérer le secret administrateur facultatif et comprendre les contraintes de stockage et de mise à l'échelle.
- Observer la charge de travail avec Cloud Logging et Cloud Monitoring.
- Diagnostiquer et résoudre les problèmes de déploiement et d'exécution les plus courants.
- Démanteler proprement le déploiement.
Prérequis
- Services_GCP (fournit le VPC, le cluster GKE Autopilot, Artifact Registry et les comptes de service partagés dont dépend ce module). Vous n'avez pas besoin de le déployer vous-même au préalable — la plateforme détecte automatiquement s'il existe déjà dans le projet cible et, sinon, le provisionne avant ce module (voir la tâche 1).
- Un projet Google Cloud avec la facturation activée.
- gcloud CLI et kubectl installés ;
gcloud auth loginetgcloud auth application-default loginexécutés. - Le rôle IAM Project Owner (ou équivalent) sur le projet.
- Vous utilisez votre propre projet ? Avant le premier déploiement dans ce projet, la boîte de dialogue de confirmation du déploiement vous demande de prouver que vous le contrôlez (Get verification code, exécutez les commandes affichées en tant que propriétaire (Owner) du projet, puis Verify) et d'attribuer le rôle Owner au compte de service de déploiement RAD. Un projet que RAD crée pour vous ne requiert ni l'un ni l'autre.
- Le mode avancé pour les modifications ultérieures. Le formulaire de création ne demande que la première page de paramètres (et, dans un projet que RAD crée pour vous, guère plus que le nom du tenant et la région). Tous les autres paramètres du Guide de configuration — y compris les paramètres de mise à l'échelle et de version des tâches du jour 2 — se modifient ensuite avec Update sur la page du déploiement après avoir coché Enable advanced mode, ce qui exige un solde de crédits couvrant le coût de build estimé de la mise à jour (les mises à jour n'entraînent jamais de frais de module). Sur un environnement de lab, seul un administrateur peut utiliser le mode avancé.
- Un accès à la plateforme RAD avec l'autorisation de déployer des modules dans le projet.
Définissez une fois ces variables shell ; chaque tâche ci-dessous les réutilise :
export PROJECT="<your-gcp-project-id>"
export REGION="us-central1" # the region you deploy into
Tâche 1 — Déployer le module [Automatisé]
-
Dans la plateforme RAD, ouvrez Solutions → Solution Catalog → RAD modules, puis ouvrez Chibisafe (GKE) dans la liste Platform Modules, choisissez Configuration Form sous How would you like to configure this deployment? (le formulaire s'ouvre sur le Conversational Assistant si vous détenez des crédits achetés ou êtes partenaire ou administrateur), définissez
project_idet passez en revue les paramètres. Ne configurez que ce dont vous avez besoin — le Guide de configuration documente chaque paramètre par groupe, avec ses valeurs par défaut. Cliquez sur Deploy Module, vérifiez le coût estimé dans la boîte de dialogue Deployment Confirmation lorsqu'elle apparaît et cliquez sur Submit (si la boîte de dialogue ajoute ensuite une étape de confirmation, comme la vérification d'un projet que vous apportez, effectuez-la et cliquez sur Confirm), ce qui ouvre la page d'état du déploiement avec les journaux en temps réel. -
La plateforme construit et pousse l'image personnalisée chibisafe-server (épinglée à
v6.5.5sauf si vous définissez une version précise), puis la déploie dans le cluster GKE Autopilot. Commestateful_pvc_enabled = truepar défaut, le type de charge de travail se résout automatiquement en StatefulSet avec un PVC en mode blocstandard-rwode 20Gi monté sur/data. Un bucket Cloud Storagestorageest toujours provisionné lui aussi, mais reste non monté tant que le PVC par défaut est actif (il n'est monté sur/dataque si vous désactivez le PVC). Sienable_api_key = true, un secret de mot de passe administrateur est également créé dans Secret Manager et fourni sous forme de Secret Kubernetes natif.enable_custom_domain = truepar défaut, si bien qu'une Gateway Kubernetes est provisionnée avant même que vous ne définissiez un domaine. Aucune instance Cloud SQL n'est créée —database_typeest fixé àNONE. Un premier déploiement prend généralement 10 à 20 minutes (le build de l'image personnalisée domine ; il n'y a aucune instance Cloud SQL à provisionner). -
Connectez-vous au cluster et identifiez l'espace de noms avec des filtres indépendants des noms :
CLUSTER=$(gcloud container clusters list --project="$PROJECT" --format="value(name)" --limit=1)
gcloud container clusters get-credentials "$CLUSTER" --region="$REGION" --project="$PROJECT"
NS=$(kubectl get ns -o name | grep chibisafe | head -1 | cut -d/ -f2)
echo "Cluster: $CLUSTER Namespace: $NS"
kubectl get all -n "$NS"
Tâche 2 — Accéder et vérifier [Manuel]
-
Vérifiez que la charge de travail s'exécute. Notez qu'il s'agit d'un StatefulSet, et non d'un Deployment :
kubectl get pods,svc,statefulset,pvc -n "$NS" -
Chemin des sondes de santé — corrigé, mais connaissez la structure. Les variables
startup_probe/liveness_probedeChibisafe_GKE(groupe 10) valent par défaut/api/health, comme pour la variante CloudRun : ce chemin traverse le proxy Caddy du conteneur jusqu'au backend et renvoie littéralement un 200{"status":"yes"}, alors que/est servi par l'interface web et ne sollicite pas le backend. Un nouveau déploiement sur une version actuelle du module doit atteindreReadysans aucune surcharge. Deux points à connaître :- Il s'agissait bien d'un bogue latent — une version antérieure de
Chibisafe_GKElaissaitstartup_probe/liveness_probesur la valeur par défaut héritée/et, lorsque l'image ne livrait que le backend (aucune route sur/), les pods restaient indéfiniment non prêts, dans une boucle de plantages et de redémarrages. Le problème a depuis été corrigé au niveau des valeurs par défaut des variables ; vous ne devriez avoir besoin d'aucun contournement. health_check_config/startup_probe_config(également dans le groupe 10) valent toujours/par défaut et le resteront — elles ne sont déclarées que pour refléter la fondation et ne sont jamais transmises àApp_GKE. Les surcharger n'a aucun effet sur la sonde déployée ; les variables qui comptent réellement sontstartup_probe/liveness_probe.
Si vous observez malgré tout le symptôme ci-dessous sur un nouveau déploiement, traitez-le comme une véritable régression et non comme le problème connu historique — vérifiez les valeurs réelles de
startup_probe/liveness_probedu pod aveckubectl describe:kubectl describe pod -n "$NS" <pod-name>
# Events will show: Readiness probe failed / Liveness probe failed:
# HTTP probe failed with statuscode: <non-200>
# -> compare against the pod spec's actual probe path:
kubectl get pod -n "$NS" <pod-name> -o jsonpath='{.spec.containers[0].livenessProbe.httpGet.path}' - Il s'agissait bien d'un bogue latent — une version antérieure de
-
Une fois le pod
Ready, trouvez l'adresse externe de la charge de travail. Avec la valeur par défautenable_custom_domain = true(Gateway), vous devez renseignerapplication_domainspour que le certificat géré s'y rattache ; vous pouvez aussi passerservice_typeàLoadBalancerpour obtenir une IP externe directe :kubectl get svc,gateway,httproute -n "$NS"
EXTERNAL_IP=$(kubectl get svc -n "$NS" \
-o jsonpath='{.items[?(@.spec.type=="LoadBalancer")].status.loadBalancer.ingress[0].ip}')
echo "External IP: $EXTERNAL_IP" -
Vérifiez le point de terminaison de santé (le port 8000 est celui de Caddy, qui relaie
/api/*vers le backend) et l'interface web, depuis l'intérieur du cluster ou une fois accessible de l'extérieur :kubectl exec -n "$NS" <pod-name> -- wget -qO- http://localhost:8000/api/health
# or, once externally reachable:
curl -s "http://${EXTERNAL_IP}/api/health" # expect HTTP 200, {"status":"yes"}
curl -s -o /dev/null -w '%{http_code}\n' "http://${EXTERNAL_IP}/" # expect 200 — the Chibisafe web UI -
Ouvrez l'adresse de la charge de travail dans un navigateur — l'interface web de Chibisafe se charge (tableau de bord, connexion, téléversements, albums). L'API REST se trouve sous
/api(la sortieapi_urldu module) et les fichiers téléversés sont servis par leur nom. Connectez-vous en tant qu'admin: par défaut (enable_api_key = false), le mot de passe initial est la valeur par défaut amont de Chibisafe (admin) — changez-le dès la première connexion. Redéployez avecenable_api_key = truepour que le module génère plutôt unADMIN_PASSWORDaléatoire dans Secret Manager.
Tâche 3 — Exploiter et maintenir en service (jour 2) [Manuel]
-
Inspectez la charge de travail — StatefulSet, pods et PVC :
kubectl get statefulset,pods,pvc -n "$NS"
kubectl describe statefulset -n "$NS" -
Ne dépassez pas un réplica.
min_instance_count = max_instance_count = 1par défaut, et c'est une exigence stricte : Chibisafe est une application SQLite à écrivain unique et, même si chaque réplica du StatefulSet reçoit son propre PVC, la mise à l'échelle risque de créer des écrivains concurrents et un état incohérent. -
Mettez à jour la version de l'application en modifiant le paramètre
application_versiondans la plateforme RAD et en l'appliquant via Update ; l'image est reconstruite avec l'argument de build épingléCHIBISAFE_VERSIONet le pod du StatefulSet est remplacé. -
Gérez le secret administrateur facultatif et inspectez l'état stocké — SQLite, les fichiers téléversés et les journaux résident directement sur le PVC du pod (il n'existe aucun client de base de données auquel se connecter) :
kubectl get secrets -n "$NS"
gcloud secrets list --project="$PROJECT" --filter="name~chibisafe"
kubectl exec -n "$NS" <pod-name> -- ls -la /data/database /data/uploads /data/logs
kubectl exec -n "$NS" <pod-name> -- df -h /data -
Notez le bucket de stockage non monté. Un bucket Cloud Storage
storageest toujours provisionné à côté du PVC, mais reste non monté tant questateful_pvc_enabled = true(la valeur par défaut) — c'est le comportement attendu, pas une erreur :gcloud storage buckets list --project="$PROJECT" --filter="name~chibisafe"
Tâche 4 — Observer : journalisation et surveillance [Manuel]
-
Journaux — depuis
kubectlou l'explorateur de journaux (Logs Explorer) (notez le nommage propre au StatefulSet, différent de celui d'un Deployment) :kubectl logs -n "$NS" statefulset/"$(kubectl get statefulset -n "$NS" -o jsonpath='{.items[0].metadata.name}')" --tail=50Filtre du Logs Explorer :
resource.type="k8s_container" AND resource.labels.namespace_name="<namespace>". -
Surveillance — ouvrez les tableaux de bord GKE / Kubernetes et examinez l'utilisation CPU et mémoire des pods, le nombre de redémarrages (surveillez le problème de sonde de santé décrit plus haut, qui se manifeste par des redémarrages répétés) et l'utilisation disque du PVC. Gardez un œil sur le quota régional
SSD_TOTAL_GBsi vous exécutez d'autres modules avec état à côté de Chibisafe —standard-rworepose par défaut sur du SSD. Un test de disponibilité (uptime check) est disponible mais désactivé par défaut (uptime_check_config.enabled = false).
Tâche 5 — Dépanner et déboguer [Manuel]
Des techniques durables pour les modes de défaillance que vous rencontrerez le plus probablement. Ce sont des diagnostics au niveau de la plateforme, qui ne changent pas avec les versions de Chibisafe.
- Pod bloqué non prêt / boucle de plantages et redémarrages :
startup_probe/liveness_probevalent par défaut/api/health(voir la tâche 2), cela ne devrait donc pas se produire sur un nouveau déploiement. Sikubectl describe podmontre des échecs de sonde sur le chemin/, quelque chose a surchargéstartup_probe/liveness_probe— rétablissez-les à/api/health, qui sollicite le proxy et le backend. Vérifiez les surcharges deenvironment_variables/des sondes dans la configuration de votre déploiement ; ne prenez pas la peine de surchargerhealth_check_config/startup_probe_config, elles sont inertes et n'atteignent jamais la spécification du pod.kubectl describe pod -n "$NS" <pod> # Events section shows probe failures
kubectl logs -n "$NS" <pod> --previous # confirm the process actually started
kubectl get pod -n "$NS" <pod> -o jsonpath='{.spec.containers[0].livenessProbe.httpGet.path}' - PVC bloqué en
Pending/Quota 'SSD_TOTAL_GB' exceeded: la StorageClass par défautstandard-rworepose sur du SSD et consomme un quota régional restreint. Surchargezstateful_pvc_storage_class = "standard"(HDD) — le profil d'écriture SQLite/médias de Chibisafe n'a pas besoin des IOPS d'un SSD. Récupérer du quota impose de supprimer le PVC ou l'espace de noms ; réduire à zéro ne le libère pas. - La Gateway / le certificat géré ne se rattache jamais : vérifiez que
application_domainsest renseigné —enable_custom_domain = trueest actif par défaut, mais la Gateway n'a aucun nom d'hôte auquel lier un certificat tant que vous n'en avez pas défini un. - Les données semblent réinitialisées après un redéploiement : vérifiez que
stateful_pvc_enabledvaut toujourstrueet questateful_pvc_mount_pathvaut toujours/data— les liens symboliques de relocalisation du point d'entrée sont codés en dur sur ce chemin. - Erreurs de récupération d'image : vérifiez que l'image existe dans Artifact Registry et que le compte de service des nœuds peut la récupérer.
Consultez la section Configuration Pitfalls du Guide de configuration pour
les pièges propres à chaque paramètre (notamment la structure des variables de
sonde de santé décrite plus haut, le compromis lié au quota SSD et les
variables inertes enable_redis / container_port).
Tâche 6 — Démanteler [Automatisé]
Sur la page Deployments, ouvrez le déploiement et cliquez sur l'icône Trash (Delete). La suppression exécute terraform destroy et est irréversible (l'enregistrement du déploiement est conservé pour l'historique). Si un déploiement est bloqué et que la plateforme RAD ne peut plus le gérer (par exemple après des modifications manuelles en conflit avec l'état Terraform), utilisez plutôt Purge (depuis la même boîte de dialogue Delete) — elle retire le déploiement des enregistrements de RAD sans détruire les ressources cloud (RAD oublie simplement le déploiement). La suppression retire tout ce que le module a créé — la charge de travail StatefulSet
et son espace de noms, son PVC, le bucket Cloud Storage et le secret de mot de passe
administrateur facultatif. Il n'y a aucune base de données Cloud SQL à
supprimer — aucune n'a jamais été créée. Les ressources appartenant à
Services_GCP (le VPC, le cluster GKE, Artifact Registry) sont gérées
séparément et ne sont pas supprimées ici.
Récapitulatif
| Tâche | Type | Résultat |
|---|---|---|
| 1 — Déployer | Automatisé | Le module construit l'image personnalisée et déploie un StatefulSet avec un PVC en mode bloc de 20Gi sur /data, un bucket GCS non monté et un secret administrateur facultatif — sans Cloud SQL |
| 2 — Accéder et vérifier | Manuel | Se connecter au cluster ; confirmer que les sondes /api/health permettent au pod d'atteindre l'état Ready ; l'interface web de Chibisafe se charge sur / ; se connecter en tant qu'admin et changer le mot de passe |
| 3 — Exploiter | Manuel | Inspecter le StatefulSet/PVC, mettre à jour la version, gérer le secret administrateur, inspecter SQLite/fichiers téléversés/journaux sur le PVC ; ne jamais dépasser 1 réplica |
| 4 — Observer | Manuel | Interroger Cloud Logging ; examiner les métriques des pods/du PVC et le test de disponibilité facultatif |
| 5 — Dépanner | Manuel | Diagnostiquer les régressions de chemin de sonde, le quota PVC/SSD, la Gateway/le certificat et les problèmes de récupération d'image |
| 6 — Démanteler | Automatisé | Delete (Trash) supprime le StatefulSet, le PVC, le bucket et le secret facultatif |
Need RAD to do something it does not do yet? Request it on the roadmap, or vote on what is already there.