Aller au contenu principal

Calibre-Web sur GKE Autopilot

Calibre-Web sur GKE Autopilot

Calibre-Web est une application web auto-hébergée et épurée permettant de parcourir, lire et télécharger des livres numériques depuis une bibliothèque Calibre existante — elle fournit une liseuse dans le navigateur, un flux OPDS, la gestion des utilisateurs et la synchronisation Kobo, au-dessus de l'image calibre-web amont de LinuxServer.io. Ce module déploie Calibre-Web sur GKE Autopilot au-dessus du socle App_GKE, qui provisionne et gère l'infrastructure Google Cloud et Kubernetes partagée ; CalibreWeb_GKE est une fine surcouche qui fournit la configuration propre à Calibre-Web (image, ports, sondes, raccordement du stockage) et transmet tout le reste tel quel.

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

Calibre-Web s'exécute comme une charge de travail unique avec état. Il n'a aucune base de données externe — tout son état (la base de données de l'application, la base de métadonnées de la bibliothèque Calibre, la configuration, le cache et les journaux) réside dans des fichiers SQLite internes sous /config. Le déploiement assemble un ensemble restreint de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculGKE AutopilotPods Calibre-Web sur le port 8083, 1 vCPU / 1 GiB par défaut
Type de charge de travailStatefulSet KubernetesSélectionné automatiquement parce que stateful_pvc_enabled = true par défaut
Persistance de la configuration et de la bibliothèquePersistent Volume bloc GKE (standard-rwo, sur SSD)Monté sur /config ; contient app.db, le metadata.db de Calibre, la configuration, le cache et les journaux
Stockage d'objetsCloud StorageUn bucket suffixé storage est toujours provisionné, mais il n'est pas monté tant que le PVC du StatefulSet est utilisé (voir §2.C)
SecretsSecret ManagerCALIBRE_ADMIN_PASSWORD généré automatiquement — provisionné, mais ce n'est pas l'identifiant avec lequel Calibre-Web authentifie réellement la première connexion (voir §3)
Base de donnéesAucunedatabase_type = "NONE" ; aucune instance, aucun utilisateur Cloud SQL ni job db-init
IngressKubernetes Gateway API (si un domaine personnalisé est configuré) ou ClusterIP interne au clusterservice_type vaut par défaut ClusterIP, et non LoadBalancer (voir §2.E)

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

  • Avec état, adossé à un PVC par défaut. stateful_pvc_enabled = true et workload_type est laissé à null, ce qui se résout automatiquement en StatefulSet (selon le comportement de « sélection automatique du StatefulSet » d'App_GKE). Un vrai PVC bloc est utilisé à la place de gcsfuse précisément parce que les fichiers SQLite de Calibre-Web (app.db, metadata.db) seraient corrompus par le modèle de cohérence relâchée de GCS FUSE.
  • La classe de stockage du PVC est par défaut SSD (standard-rwo). Elle consomme le quota régional SSD_TOTAL_GB, qui est faible sur les projets limités en quota. Calibre-Web n'a pas besoin des IOPS d'un SSD pour sa charge SQLite — envisagez de remplacer par stateful_pvc_storage_class = "standard" (HDD pd-standard) pour préserver le quota SSD pour d'autres applications, tout en conservant l'intégrité du verrouillage en écriture d'un périphérique bloc dont SQLite a besoin.
  • Réplica unique par défaut. min_instance_count = 1, max_instance_count = 1. Comme le StatefulSet utilise des volumeClaimTemplates, chaque réplica obtient son propre PVC indépendant — passer au-delà de 1 ne partage pas /config entre les pods ; cela scinde silencieusement la bibliothèque et la configuration en copies séparées et non synchronisées par pod. N'augmentez pas max_instance_count sans stratégie de synchronisation externe.
  • Aucune base de données. database_type = "NONE" ; il n'y a pas de job db-init et aucune des variables liées à la base de données de ce module n'est référencée.
  • Pas de Redis. enable_redis est déclaré pour refléter les variables du socle, mais il n'est pas transmis — main.tf impose en dur enable_redis = false dans l'appel au socle, quelle que soit la valeur de la variable.
  • service_type vaut par défaut ClusterIP, et non LoadBalancer. Combiné à la valeur par défaut application_domains = [], le déploiement n'a aucun accès externe configuré d'emblée, même si enable_custom_domain = true par défaut — la Gateway est provisionnée mais n'a aucun nom d'hôte à router tant que vous ne fournissez pas application_domains ou ne passez pas service_type à LoadBalancer.
  • Le mot de passe administrateur généré n'est pas l'identifiant fonctionnel. L'image LinuxServer amont est livrée avec un identifiant par défaut intégré (admin / admin123) ; le secret Secret Manager CALIBRE_ADMIN_PASSWORD est provisionné pour disposer d'un identifiant plus robuste, mais il n'est pas raccordé automatiquement au conteneur. Changez le mot de passe dans l'interface de Calibre-Web lors de la première connexion.
  • Un bucket Cloud Storage est créé mais inutilisé par défaut. create_cloud_storage = true provisionne toujours le bucket suffixé storage, mais celui-ci n'est monté sur /config que lorsque stateful_pvc_enabled = false (mode Deployment). Avec le chemin StatefulSet/PVC par défaut, le bucket existe mais n'est pas rattaché à la charge de travail.
  • La version de l'image est épinglée via un ARG de build propre à l'application. Le Dockerfile lit CALIBREWEB_VERSION (et non le APP_VERSION générique qu'injecte le socle) ; lorsque application_version = "latest", le build est épinglé sur une version connue pour fonctionner, 0.6.24.

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 — le StatefulSet Calibre-Web​

Les pods Calibre-Web sont planifiés sur Autopilot, qui facture le CPU et la mémoire réellement demandés par les pods. La charge de travail s'exécute comme un StatefulSet (et non un Deployment), ce qui lui donne une identité de pod stable et une séquence de redémarrage ordonnée (stateful_pod_management_policy vaut par défaut OrderedReady lorsqu'il est laissé à null).

  • Console : Kubernetes Engine → Workloads → sélectionnez la charge de travail Calibre-Web pour voir les pods, les révisions et les événements.
  • CLI :
    kubectl get statefulset,pods,svc -n "$NAMESPACE"
    kubectl logs -n "$NAMESPACE" statefulset/<service-name> --tail=100
    kubectl describe pod -n "$NAMESPACE" -l app=<service-name>

Consultez App_GKE pour savoir comment sont gérés Autopilot, la mise à l'échelle et la sélection du type de charge de travail.

B. Stockage bloc — le Persistent Volume Claim /config​

Les fichiers SQLite de Calibre-Web (app.db, le metadata.db de Calibre), la configuration, le cache et les journaux résident sur un PVC bloc par pod monté sur /config (stateful_pvc_mount_path), d'une taille de 20Gi par défaut (stateful_pvc_size), sur la StorageClass standard-rwo (SSD pd-balanced) (stateful_pvc_storage_class).

  • Console : Kubernetes Engine → Storage → Persistent Volume Claims ; Compute Engine → Storage → Disks.
  • CLI :
    kubectl get pvc -n "$NAMESPACE"
    kubectl describe pvc -n "$NAMESPACE" -l app=<service-name>
    gcloud compute disks list --project "$PROJECT" --filter="name~<service-name>"

Comme les PVC SSD consomment le quota serré SSD_TOTAL_GB et que la mise à zéro d'une application avec état conserve son PVC (seule la suppression du PVC ou de l'espace de noms libère le quota), vérifiez l'utilisation actuelle avant une large campagne d'applications GKE avec état. Consultez App_GKE pour le cycle de vie des StatefulSet et des PVC en général.

C. Cloud Storage​

Un bucket Cloud Storage (suffixe storage) est toujours provisionné lorsque create_cloud_storage = true (la valeur par défaut) et le compte de service de la charge de travail y reçoit un accès — mais il n'est monté dans le pod sur /config via GCS FUSE que lorsque stateful_pvc_enabled = false (c'est-à-dire lors d'une exécution en tant que Deployment au lieu du StatefulSet par défaut). Avec la configuration par défaut, le bucket existe mais n'est pas rattaché à la charge de travail en cours d'exécution.

  • Console : Cloud Storage → Buckets.
  • CLI :
    gcloud storage buckets list --project "$PROJECT" --filter="name~storage"

Consultez App_GKE pour les montages GCS FUSE et les options CMEK.

D. Secret Manager​

Un secret Calibre-Web est généré automatiquement et stocké dans Secret Manager : CALIBRE_ADMIN_PASSWORD (une valeur aléatoire de 24 caractères, secret-<prefix>-<app>-admin-password), injecté dans le conteneur en tant que variable d'environnement secrète. Sur GKE, les secrets sont projetés via le pilote Secret Store CSI / SecretSync ; la clé ne contient pas __, c'est donc un targetKey valide.

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

Remarque : le secret injecté n'est pas appliqué automatiquement comme identifiant de Calibre-Web — voir §3 pour les identifiants réels de la première connexion. Consultez App_GKE pour l'intégration Secret Store CSI et la rotation.

E. Réseau et entrée​

service_type vaut par défaut ClusterIP (interne uniquement), et enable_custom_domain = true par défaut provisionne une ressource Kubernetes Gateway API — mais avec la valeur par défaut vide application_domains = [], la Gateway n'a aucun nom d'hôte à router ; le déploiement n'a donc aucun accès externe configuré d'emblée. Pour exposer Calibre-Web à l'extérieur, définissez application_domains avec un vrai nom d'hôte, ou passez service_type à LoadBalancer (qui récupère en outre le nom d'hôte <reserved-ip>.nip.io par défaut d'App_GKE lorsque reserve_static_ip = true).

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

Consultez App_GKE pour les domaines personnalisés, Cloud CDN et les adresses IP statiques.

F. Cloud Logging et Monitoring​

Les sorties stdout/stderr des pods sont envoyées vers Cloud Logging ; les métriques GKE vers Cloud Monitoring. Les tests de disponibilité sont désactivés par défaut (uptime_check_config.enabled = false).

  • 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 Calibre-Web​

  • Aucun job d'initialisation par défaut. initialization_jobs vaut [] par défaut ; Calibre-Web gère son propre stockage SQLite et n'a besoin d'aucun amorçage de base de données (il n'y a pas de job db-init puisque database_type = "NONE"). Seuls les jobs fournis par l'utilisateur s'exécutent.
  • Image de type fine surcouche, sans point d'entrée personnalisé. Le Dockerfile est FROM lscr.io/linuxserver/calibre-web:${CALIBREWEB_VERSION} sans script de point d'entrée ajouté — l'initialisation amont de LinuxServer, fondée sur s6, s'exécute telle quelle. image_source = "custom" est défini uniquement pour que le socle construise ou mette en miroir l'image dans Artifact Registry.
  • Organisation du stockage au premier démarrage. L'image LinuxServer abandonne ses privilèges au profit de PUID=1000/PGID=1000 et conserve tout son état sous /config (app.db, le metadata.db de Calibre, la configuration, le cache, les journaux) ; la bibliothèque de livres elle-même réside sous /books (vide au premier lancement — l'assistant de configuration intégré à l'application y fait pointer Calibre-Web). stateful_fs_group vaut 3000 par défaut (convention du chart Helm CalibreWeb) afin que le PVC soit accessible en écriture au groupe.
  • Identifiants de connexion. Les identifiants de première connexion intégrés à l'image amont sont admin / admin123. Le CALIBRE_ADMIN_PASSWORD généré par Secret Manager n'est pas appliqué automatiquement — il existe pour qu'un mot de passe robuste soit disponible dans Secret Manager et pour qu'une future image ou un futur point d'entrée puisse l'utiliser. Changez le mot de passe administrateur dans l'interface de Calibre-Web immédiatement après la première connexion.
  • Sondes de santé. Les sondes de démarrage et de vivacité émettent toutes deux un HTTP GET / (la page de connexion de Calibre-Web), qui renvoie 200 sans authentification — les sondes réussissent donc dès que le serveur répond, indépendamment de tout état de connexion. Démarrage : initial_delay=15s, timeout=5s, period=10s, failure_threshold=10. Vivacité : initial_delay=30s, timeout=5s, period=30s, failure_threshold=3.
  • Contrainte de mise à l'échelle. min_instance_count = 1 / max_instance_count = 1 par défaut. Comme le StatefulSet provisionne un PVC distinct par réplica (volumeClaimTemplates), augmenter max_instance_count ne donne pas aux pods une bibliothèque partagée — chaque pod obtient son propre /config indépendant et non synchronisé.
  • Vérifier le déploiement :
    kubectl get statefulset,pods,pvc -n "$NAMESPACE"
    kubectl logs -n "$NAMESPACE" statefulset/<service-name> --tail=100
    kubectl exec -n "$NAMESPACE" <pod-name> -- ls -la /config

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Calibre-Web 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 3 — Identité de l'application​

VariableValeur par défautDescription
application_namecalibrewebNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_versionlatestTag lscr.io/linuxserver/calibre-web utilisé comme base du build personnalisé ; latest est épinglé sur un tag connu pour fonctionner (0.6.24) au moment du build via l'ARG de build propre à l'application CALIBREWEB_VERSION.
application_display_nameCalibre-WebNom lisible utilisé à des fins d'affichage.
descriptionCalibre-Web — a web app for browsing, reading and downloading ebooks from a Calibre library.Renseigne la description de la charge de travail GKE.

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

VariableValeur par défautDescription
cpu_limit1000m1 vCPU.
memory_limit1GiLimite de mémoire du conteneur Calibre-Web.
min_instance_count / max_instance_count1 / 1Conservez 1 — voir la contrainte de mise à l'échelle au §3 (scission des PVC par réplica).
container_port8083Fixé par CalibreWeb_Common ; la variable du module n'est pas transmise à App_GKE et n'a aucun effet.
enable_cloudsql_volumefalseLaissé désactivé à juste titre — Calibre-Web n'utilise pas Cloud SQL.
enable_image_mirroringtrueMet en miroir l'image dans Artifact Registry pour éviter les limites de débit de Docker Hub.

Groupe 6 — Backend GKE et cluster​

VariableValeur par défautDescription
service_typeLoadBalancerAccessible depuis l'extérieur par défaut. Définissez ClusterIP pour un accès interne uniquement — voir au §2.E le piège d'ingress que cela crée en combinaison avec application_domains = [].
workload_typenull → StatefulSetRésolu automatiquement parce que stateful_pvc_enabled = true.
session_affinityNonePas de routage persistant par défaut (le réplica unique rend ce point sans objet à l'échelle par défaut).

Groupe 7 — Configuration du StatefulSet​

VariableValeur par défautDescription
stateful_pvc_enabledtrueProvisionne un PVC bloc par pod — requis, car gcsfuse corromprait les fichiers SQLite de Calibre-Web.
stateful_pvc_size20GiTaille de /config et de la bibliothèque Calibre.
stateful_pvc_mount_path/configEmplacement où Calibre-Web stocke ses bases SQLite, sa configuration, son cache et ses journaux.
stateful_pvc_storage_classstandard-rwo (SSD)Consomme le quota régional SSD_TOTAL_GB. La charge SQLite de Calibre-Web n'a pas besoin des IOPS d'un SSD — envisagez standard (HDD pd-standard) pour économiser le quota SSD.
stateful_fs_group3000Correspond à la convention du chart Helm CalibreWeb, afin que le PVC soit accessible en écriture au groupe pour PUID:PGID=1000:1000.

Groupe 9 — PodDisruptionBudget​

VariableValeur par défautDescription
enable_pod_disruption_budgettrueActivé par défaut (contrairement à la plupart des modules).
pdb_min_available1Avec max_instance_count = 1, un PDB de 1 bloque de fait l'éviction volontaire de l'unique pod tant qu'il ne peut pas être replanifié.

Groupe 10 — Observabilité et santé​

VariableValeur par défautDescription
startup_probe / liveness_probe (depuis CalibreWeb_Common)HTTP /Page de connexion, 200, sans authentification — réussit dès que le serveur répond.
uptime_check_config.enabledfalseLes tests de disponibilité sont désactivés par défaut.

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

VariableValeur par défautDescription
enable_nfsfalseNFS n'est pas utilisé par Calibre-Web — la persistance passe par le PVC du StatefulSet (ou GCS FUSE en mode Deployment).
network_tags["nfsserver"]Inclut par défaut le tag nfsserver bien que NFS soit désactivé par défaut ; sans conséquence, mais pertinent uniquement si vous activez NFS séparément.

Groupe 14 — Cloud Storage​

VariableValeur par défautDescription
create_cloud_storagetrueProvisionne toujours le bucket suffixé storage, mais voir §2.C — il n'est pas monté tant que stateful_pvc_enabled = true (la valeur par défaut).

Groupe 15 — Redis​

VariableValeur par défautDescription
enable_redistrue (déclaré)Inerte — main.tf impose en dur enable_redis = false dans l'appel au socle, quelle que soit la valeur de cette variable. Calibre-Web n'utilise pas Redis.
redis_host / redis_port"" / 6379Déclarés pour refléter les variables du socle, mais pas du tout transmis à App_GKE.

Groupe 16 — Base de données​

VariableValeur par défautDescription
database_typeNONEFixé par CalibreWeb_Common ; aucune instance, base ni utilisateur Cloud SQL n'est créé. Toutes les autres variables database_*/sql_* de ce groupe sont explicitement « Not referenced. »

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

VariableValeur par défautDescription
enable_custom_domaintrueProvisionne la ressource Gateway API, mais ne sert à rien en externe sans application_domains défini (voir §2.E).
application_domains[]Vide par défaut — définissez-le pour obtenir un nom d'hôte externe fonctionnel tant que service_type = ClusterIP.
reserve_static_iptrueSe raccorde au nom d'hôte <reserved-ip>.nip.io par défaut d'App_GKE uniquement lorsque service_type = LoadBalancer ; le comportement combiné au ClusterIP par défaut n'est pas explicitement documenté par le socle.

Toutes les autres entrées suivent le comportement standard d'App_GKE.


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.
stage_service_cluster_ipsTable des ClusterIP des services propres à chaque étape.
service_external_ipIP externe du LoadBalancer (lorsqu'une IP statique est réservée et que service_type = LoadBalancer).
service_urlURL permettant d'accéder à Calibre-Web.
calibreweb_admin_password_secret_idID du secret Secret Manager contenant le CALIBRE_ADMIN_PASSWORD généré (voir au §3 pourquoi ce n'est pas l'identifiant initial).
storage_bucketsBuckets Cloud Storage créés.
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 de notification.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
initialization_jobsNoms des éventuels jobs d'initialisation fournis par l'utilisateur (aucun par défaut).
statefulset_nameNom du StatefulSet.
cicd_enabled / cicd_configurationÉtat et détails du CI/CD (dépôt, déclencheur, registre).
github_repository_url / github_repository_owner / github_repository_nameDétails GitHub du CI/CD.
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_idRegistre et déclencheur de build.
kubernetes_readyIndique si le cluster et la charge de travail sont prêts.
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 fait passer sa configuration par le moteur du socle App_GKE, qui valide les valeurs et leurs combinaisons au moment du plan — un StatefulSet imposé avec un paramètre sans état, IAP sans identités autorisées, des quota_memory_* fournis sous forme d'entiers bruts, un container_port/backup_retention_days hors plage. Une configuration invalide fait échouer le plan avec une erreur claire et nommée avant toute création de ressource ; la plupart des erreurs ci-dessous sont donc détectées en amont plutôt qu'à l'application ou à l'exécution.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
max_instance_count1CritiqueChaque réplica du StatefulSet obtient son propre PVC (volumeClaimTemplates) — augmenter le nombre de réplicas scinde /config en copies indépendantes et non synchronisées par pod, et non en une bibliothèque partagée.
stateful_pvc_enabledtrue (à conserver)CritiquePasser à false/mode Deployment déplace /config sur GCS FUSE, ce qui peut corrompre les fichiers SQLite de Calibre-Web (app.db, metadata.db) avec ses schémas d'accès.
service_type + application_domainsDéfinir application_domains, ou utiliser LoadBalancerÉlevéAvec les valeurs par défaut (ClusterIP + application_domains vide), le déploiement n'a aucun accès externe configuré malgré enable_custom_domain = true.
stateful_pvc_storage_classstandard (HDD) pour les projets limités en quotaMoyenLa valeur par défaut standard-rwo (SSD) consomme le quota serré SSD_TOTAL_GB ; une campagne d'applications GKE avec état peut l'épuiser vers la 8e application. La mise à zéro ne libère pas le PVC — seule sa suppression le fait.
CALIBRE_ADMIN_PASSWORD (généré automatiquement)Changer l'identifiant dans l'interface lors de la première connexionÉlevéLe secret généré n'est pas appliqué automatiquement ; l'identifiant fonctionnel de première connexion est la valeur amont par défaut admin/admin123 jusqu'à ce qu'il soit modifié manuellement.
enable_resource_quotaBien comprendre avant d'activerMoyenLes variables quota_cpu_*/quota_memory_*/quota_max_* de ce module sont déclarées mais pas transmises à App_GKE — activer le quota utilise les valeurs par défaut propres au socle (4 CPU / 4Gi–8Gi de mémoire / 20 pods), et non une valeur définie sur ce module.
enable_redisÀ ignorer — inerteFaiblemain.tf impose en dur enable_redis = false quelle que soit cette variable ; Calibre-Web ne dépend pas de Redis.
create_cloud_storagefalse si vous n'avez pas besoin du bucket de repliFaibleAvec le chemin StatefulSet par défaut, le bucket storage est provisionné mais jamais monté — un coût faible et évitable si vous ne prévoyez pas de passer en mode Deployment.
memory_limit1Gi (à augmenter pour les grandes bibliothèques)MoyenCalibre-Web charge en mémoire les index de la bibliothèque et des collections ; une sous-dimension expose à un OOM avec une grande bibliothèque Calibre.
quota_memory_requests / _limits (au niveau du socle, si vous activez les quotas directement sur App_GKE)unités binaires (4Gi, 8192Mi)CritiqueLes entiers bruts sont interprétés comme des octets et bloquent toute planification de pods dans l'espace de noms.

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 à Calibre-Web, partagée entre les variantes de plateforme, est décrite dans CalibreWeb_Common.

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