Aller au contenu principal

Stirling-PDF sur GKE Autopilot

Stirling-PDF sur GKE Autopilot

Stirling-PDF est une boîte à outils PDF web open source (cœur sous licence MIT) et auto-hébergée — fusion, découpage, conversion, OCR, compression, filigrane, signature, caviardage et plus de 50 autres opérations PDF, toutes traitées sur votre propre infrastructure, de sorte que les documents ne transitent jamais par un service tiers. Ce module déploie Stirling-PDF 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 Stirling-PDF et sur la manière de les explorer et de les exploiter depuis la console Google Cloud et en ligne de commande. Pour les mécanismes communs à toutes les applications GKE — Workload Identity, entrée, autoscaling, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls 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​

Stirling-PDF s'exécute sous la forme d'une charge de travail web Java / Spring Boot (avec un LibreOffice intégré pour les conversions de documents). Le déploiement assemble un ensemble volontairement restreint de services Google Cloud — Stirling-PDF est sans état ; il n'y a donc ni base de données, ni stockage persistant, ni secrets à gérer :

FonctionnalitéService Google CloudRemarques
CalculGKE AutopilotPods Java, 1 vCPU / 2 GiB par défaut, autoscaling horizontal
Image de conteneurArtifact RegistryImage officielle stirlingtools/stirling-pdf, dupliquée par défaut
EntréeCloud Load BalancingLoadBalancer externe, domaine personnalisé et certificat géré facultatifs
Redis (inerte)RedisDésactivé par défaut. enable_redis amène seulement le socle à injecter les variables d'environnement REDIS_* — Stirling-PDF ne les lit jamais, cela n'apporte donc ni limitation de débit ni détection de bots
ObservabilitéCloud Logging / Cloud MonitoringJournaux des pods, métriques, test de disponibilité et alertes facultatifs

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

  • Sans état — ni base de données, ni stockage, ni secrets. database_type = "NONE", aucun bucket GCS, pas de NFS, workload_type = Deployment et une map de secrets vide. Chaque opération PDF s'exécute dans un répertoire de travail éphémère propre à la requête, supprimé à la fin du traitement.
  • Image préconstruite. container_image_source = "prebuilt" déploie directement l'image officielle stirlingtools/stirling-pdf ; enable_image_mirroring = true la met en miroir dans Artifact Registry pour éviter les limites de débit de Docker Hub.
  • La connexion est désactivée par défaut. enable_login = false (SECURITY_ENABLELOGIN=false) livre une instance ouverte. Activez-la et placez la charge de travail derrière IAP ou Cloud Armor pour un déploiement privé.
  • Au moins 1 réplica. GKE ne prend pas en charge la mise à l'échelle jusqu'à zéro ; min_instance_count = 1 maintient la boîte à outils accessible. Comme il n'y a aucun état partagé, passer à max_instance_count > 1 ne nécessite aucun mécanisme de coordination — Redis ou autre.
  • Plancher mémoire de 2 GiB. La JVM et LibreOffice ont besoin d'au moins 2Gi ; augmentez container_resources.memory_limit pour les charges de travail lourdes d'OCR / de conversion.
  • LoadBalancer externe avec une adresse IP stable. service_type = "LoadBalancer", reserve_static_ip = true et enable_custom_domain = true par défaut.
  • Les sondes de santé interrogent /api/v1/info/status — un point de terminaison public et non authentifié qui renvoie 200 une fois la JVM et LibreOffice initialisés. L'image complète peut mettre 2 à 4 minutes à ouvrir son port sur un nœud Autopilot provisionné à froid ; la sonde de démarrage accorde donc une fenêtre d'environ 5 minutes (délai initial de 20s, 30 échecs × 10s).

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éfinies. L'espace de noms et les autres identifiants figurent dans les sorties du déploiement.

A. GKE Autopilot — la charge de travail Stirling-PDF​

Les pods Stirling-PDF 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 les nombres minimal et maximal de réplicas.

  • Console : Kubernetes Engine → Workloads → sélectionnez la charge de travail Stirling-PDF pour consulter les pods 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"

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

B. Artifact Registry — l'image de conteneur​

L'image officielle stirlingtools/stirling-pdf est mise en miroir dans Artifact Registry (enable_image_mirroring = true) et le cluster la récupère depuis cet emplacement. Aucune étape Cloud Build n'est exécutée — l'image est préconstruite en amont.

  • Console : Artifact Registry → Repositories.
  • CLI :
    gcloud artifacts repositories list --project "$PROJECT" --location "$REGION"

Consultez App_GKE pour le mécanisme de duplication et la conservation des images.

C. Réseau et entrée​

Par défaut, la charge de travail est exposée via une adresse IP externe Cloud Load Balancing. Un domaine personnalisé avec un certificat géré par Google peut être activé, et une adresse IP statique est réservée par défaut 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 domaines personnalisés, Cloud CDN et les détails relatifs à l'adresse IP statique.

D. Redis (inerte — enable_redis n'a aucun effet sur l'application)​

Redis est désactivé par défaut (enable_redis = false). Définir enable_redis = true amène seulement le socle App_GKE à injecter les variables d'environnement REDIS_HOST/REDIS_PORT/REDIS_AUTH dans le pod — Stirling-PDF ne les lit jamais. Le commentaire de stirlingpdf.tf lui-même confirme « no DB or Redis », et ni StirlingPDF_Common ni ce module ne font correspondre ces variables d'environnement à un paramètre reconnu par Stirling-PDF. Activer Redis n'implémente pas de limitation de débit ni de détection de bots pour cette application. Utilisez enable_cloud_armor pour une véritable protection contre les abus sur une instance publique.

  • CLI (pour confirmer que les variables d'environnement sont présentes mais inutilisées) :
    kubectl exec -n "$NAMESPACE" deploy/<service-name> -- env | grep -i redis

E. Identity-Aware Proxy (facultatif)​

Comme Stirling-PDF traite des documents potentiellement sensibles, un déploiement privé doit contrôler l'Ingress avec IAP. Activer enable_iap exige une identité Google authentifiée et autorisée avant qu'une requête n'atteigne la charge de travail.

  • Console : Security → Identity-Aware Proxy.
  • CLI :
    gcloud iap web get-iam-policy --resource-type=backend-services --project "$PROJECT"

Consultez App_GKE pour le câblage OAuth d'IAP.

F. Cloud Logging et Monitoring​

Les sorties stdout/stderr des pods sont envoyées vers Cloud Logging ; les métriques de GKE 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 Stirling-PDF​

  • Rien n'est persisté. Les fichiers envoyés sont écrits dans un répertoire de travail éphémère propre à la requête et supprimés au retour de la réponse. Il n'y a ni base de données, ni PVC, ni bucket — une mise à jour progressive ou une replanification de pod ne fait rien perdre.
  • Premier démarrage lent. L'image complète intègre LibreOffice et l'OCR, et peut mettre 2 à 4 minutes à ouvrir son port sur un nœud Autopilot provisionné à froid. La sonde de démarrage cible /api/v1/info/status avec un délai initial de 20s et 30 échecs à intervalles de 10s (environ 5 minutes au total) avant qu'un pod ne soit marqué comme non sain ; la sonde de vivacité attend un délai initial de 120s afin de ne pas entrer en concurrence avec la sonde de démarrage en plein préchauffage.
  • La connexion est facultative et désactivée par défaut. enable_login = false livre une instance ouverte. Définissez enable_login = true pour exiger l'authentification intégrée de Stirling-PDF ; combinez avec IAP pour une défense en profondeur.
  • Mise à l'échelle horizontale sûre. En l'absence d'état partagé, max_instance_count > 1 ne nécessite aucun mécanisme de coordination. enable_redis n'a aucun rapport avec cela — il s'agit d'une transmission inerte au socle que Stirling-PDF ne lit jamais (voir §2.D). Le HPA ajuste le nombre de réplicas en fonction de la charge CPU/mémoire.
  • Les mises à niveau de version se font par changement d'étiquette d'image. Modifier application_version déclenche une mise à jour progressive sans étape de migration ; la stratégie RollingUpdate par défaut convient, car l'application est sans état.
  • Confirmer la configuration en cours d'exécution :
    kubectl exec -n "$NAMESPACE" deploy/<service-name> -- env | grep -iE 'SECURITY_|SYSTEM_'

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Stirling-PDF ou notables pour lui sont listés ; toutes les autres entrées sont héritées de 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 pour chaque 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_namestirlingpdfNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameStirling-PDFNom lisible affiché dans la console.
application_versionlatestÉtiquette de l'image Stirling-PDF ; épinglez une version précise en production.
enable_loginfalseActive l'authentification intégrée de Stirling-PDF (SECURITY_ENABLELOGIN).
default_localeen-USLangue par défaut de l'interface (SYSTEM_DEFAULTLOCALE).

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour ne provisionner que l'infrastructure.
container_image_sourceprebuiltDéploie l'image officielle (prebuilt) ou construit une image personnalisée.
container_resources{ cpu_limit="1000m", memory_limit="2Gi" }Limites de CPU/mémoire ; plancher de 2Gi pour la JVM et LibreOffice.
min_instance_count1Nombre minimal de réplicas ; GKE exige ≥ 1.
max_instance_count3Nombre maximal de réplicas. Peut être augmenté sans risque — aucun état partagé.
container_port8080Stirling-PDF écoute sur le port 8080.
enable_image_mirroringtrueMet en miroir l'image dans Artifact Registry.
timeout_seconds60Durée maximale d'une requête ; augmentez-la pour les conversions volumineuses.

Groupe 5 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres Stirling-PDF supplémentaires (par exemple SYSTEM_MAXFILESIZE). La connexion et la langue sont définies via enable_login / default_locale.
secret_environment_variables{}Références Secret Manager. Stirling-PDF n'en a besoin d'aucune par défaut.
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 6 — Backend GKE et cluster​

VariableValeur par défautDescription
service_typeLoadBalancerMode d'exposition du Service Kubernetes.
workload_typenullSe résout automatiquement en un Deployment sans état. Un StatefulSet est inutile.
session_affinityNoneStirling-PDF est sans état — aucun routage persistant n'est requis.
network_tags["nfsserver"]Tags réseau des nœuds/pods.
termination_grace_period_seconds30Nombre de secondes d'attente après SIGTERM avant SIGKILL.
enable_network_segmentationfalseCrée des ressources Kubernetes NetworkPolicy.
enable_cloudsql_volumefalseNon utilisé — Stirling-PDF n'a pas de base de données.

Groupe 7 — StatefulSet​

VariableValeur par défautDescription
stateful_pvc_enablednullÀ laisser désactivé — Stirling-PDF ne stocke aucun état.
stateful_pvc_size / stateful_pvc_mount_path / stateful_pvc_storage_class10Gi / /data / standard-rwoPertinent uniquement si un StatefulSet est imposé.

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_available1Nombre minimal de pods disponibles lors des interruptions volontaires.
enable_resource_quotafalseApplique un ResourceQuota à l'espace de noms.
quota_memory_requests / quota_memory_limits""Doivent utiliser des unités binaires (4Gi) — des entiers nus sont des octets et bloquent la planification.

Groupe 10 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /api/v1/info/status, délai de 20s, 30 × 10s tentativesSonde de démarrage. Fenêtre d'environ 5 minutes au premier démarrage pour la JVM et LibreOffice.
liveness_probeHTTP /api/v1/info/status, délai de 120sSonde de vivacité ; retardée pour laisser passer le premier démarrage lent.
uptime_check_configdésactivéTest de disponibilité Cloud Monitoring facultatif.
alert_policies[]Règles d'alerte facultatives sur les métriques.

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

VariableValeur par défautDescription
initialization_jobs[]Aucun n'est requis — Stirling-PDF est sans état.
cron_jobs[]CronJobs Kubernetes planifiés.
additional_services[]Services sidecar ou auxiliaires.

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_nfsfalseNFS est désactivé par défaut. Activez-le uniquement si vous hébergez Redis sur la VM du serveur NFS.
nfs_mount_path/mnt/nfsChemin de montage dans le conteneur.

Groupe 14 — Cloud Storage et Artifact Registry​

VariableValeur par défautDescription
create_cloud_storagefalseStirling-PDF est sans état — aucun bucket par défaut.
storage_buckets[]Buckets supplémentaires facultatifs.
gcs_volumes[]Montages de volumes GCS Fuse via le pilote CSI.
max_images_to_retain7Nombre maximal d'images récentes d'Artifact Registry à conserver.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 15 — Redis (transmission inerte au socle)​

VariableValeur par défautDescription
enable_redisfalseInerte pour Stirling-PDF : amène seulement App_GKE à injecter les variables d'environnement REDIS_HOST/REDIS_PORT/REDIS_AUTH, que l'application ne lit jamais. L'activer n'apporte ni limitation de débit ni détection de bots.
redis_host""Point de terminaison Redis. Laissez vide pour utiliser l'adresse IP interne du serveur NFS. Inutilisé par Stirling-PDF, quelle que soit la valeur.
redis_port6379Port Redis. Inutilisé par Stirling-PDF, quelle que soit la valeur.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible). Inutilisé par Stirling-PDF, quelle que soit la valeur.

Groupe 16 — Backend de base de données​

VariableValeur par défautDescription
database_typeNONEFixe — Stirling-PDF n'utilise aucune base de données.
database_password_length32Non utilisé.

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.
reserve_static_iptrueAdresse IP externe stable d'un redéploiement à l'autre.

Groupe 20 — Identity-Aware Proxy (IAP)​

Remarque : activer IAP exige une authentification par identité Google pour toutes les requêtes entrantes. Recommandé pour les instances privées traitant des documents sensibles.

VariableValeur par défautDescription
enable_iapfalseExige une connexion Google devant Stirling-PDF.
iap_authorized_users / iap_authorized_groups[]Qui peut accéder.
iap_oauth_client_id / iap_oauth_client_secret""Obligatoires lorsqu'IAP est activé (sensibles).

Groupe 21 — Cloud Armor​

VariableValeur par défautDescription
enable_cloud_armorfalseAssocie une règle Cloud Armor (WAF) au backend de l'Ingress. Recommandé pour les instances publiques.
admin_ip_ranges[]Plages CIDR autorisées pour un accès privilégié.
enable_cdnfalseActive Cloud CDN sur le backend de l'Ingress GKE.

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éfinies)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_ipAdresse IP externe du LoadBalancer (lorsqu'une adresse IP statique est réservée).
service_urlURL permettant d'accéder à Stirling-PDF.
storage_bucketsBuckets Cloud Storage créés (vide — Stirling-PDF est sans état).
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_channelsStatut de la surveillance et canaux.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / cicd_configurationStatut et détails du CI/CD.
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/la charge de travail est prêt.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeStatut VPC-SC.
audit_logging_enabled / artifact_registry_cmek_enabledStatut 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 transmet sa configuration au moteur du socle App_GKE, qui valide les valeurs et leurs combinaisons au moment du plan — IAP sans identité autorisée, un StatefulSet imposé avec un type de charge de travail Deployment, des quota_memory_* exprimés dans des unités non binaires, un redis_port/timeout_seconds hors limites. Une configuration invalide fait échouer le plan avec une erreur claire et nommée avant la création de toute 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
enable_login + entréeenable_login = true ou IAP pour un usage privéÉlevéLa valeur par défaut enable_login = false associée à un LoadBalancer externe laisse une boîte à outils PDF ouverte, utilisable par quiconque connaît l'adresse IP.
enable_iapÀ activer pour les instances traitant des documents sensiblesÉlevéSans IAP (et avec la connexion désactivée), la charge de travail n'est pas authentifiée ; les utilisateurs peuvent envoyer des documents confidentiels vers un point de terminaison ouvert.
container_resources.memory_limit2GiÉlevéEn dessous d'environ 2Gi, la JVM et LibreOffice sont arrêtés pour manque de mémoire (OOM) pendant les conversions.
quota_memory_requests / _limitsunités binaires (4Gi, 8192Mi)CritiqueDes entiers nus sont interprétés comme des octets et bloquent toute planification de pods dans l'espace de noms.
timeout_seconds60, à augmenter pour les gros fichiersÉlevéLes traitements volumineux d'OCR/de conversion qui dépassent le délai renvoient une erreur 504 en cours d'opération.
min_instance_count1ÉlevéGKE exige un minimum ≥ 1 ; la garde de validation rejette 0.
Fenêtre de startup_probeConserver la valeur par défaut d'environ 5 minutesMoyenLa raccourcir marque les pods comme non sains avant que LibreOffice n'ait terminé son préchauffage, ce qui bloque le déploiement progressif.
enable_cloud_armorÀ activer pour les instances publiquesMoyenUne boîte à outils publique sans WAF est exposée aux abus et aux analyses.
enable_pod_disruption_budgettrueMoyenLe désactiver permet à GKE d'évincer tous les pods simultanément pendant la maintenance.

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

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