Aller au contenu principal

Windmill sur Google Cloud Run

Windmill sur Google Cloud Run

Windmill est une plateforme de développement open source permettant de créer des outils internes, des scripts, des flux et des automatisations. Ce module déploie Windmill sur Cloud Run v2 en s'appuyant sur le socle App_CloudRun, qui provisionne et gère l'infrastructure Google Cloud partagée.

Ce guide se concentre sur les services cloud utilisés par Windmill 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​

Windmill s'exécute sous forme de conteneur combiné serveur+worker sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service combiné serveur+worker, 2 vCPU / 2 GiB par défaut, mise à l'échelle automatique selon les requêtes
Base de donnéesCloud SQL for PostgreSQL 16Obligatoire — Windmill nécessite PostgreSQL 16 ou une version ultérieure
Stockage d'objetsCloud StorageUn bucket data (gcs-<app><tenant-prefix>-data) pour les sorties de workflows et les artefacts
SecretsSecret ManagerMot de passe de la base de données généré automatiquement et secret SMTP provisoire
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut, équilibreur de charge HTTPS externe + domaine personnalisé en option

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

  • PostgreSQL 16 est obligatoire. Windmill utilise des fonctionnalités propres à PostgreSQL ; le moteur de base de données est fixe. Utiliser une version plus ancienne ou NONE fait échouer le job d'initialisation.
  • Mode combiné serveur+worker. MODE=server,worker et NUM_WORKERS=3 exécutent le serveur d'API et les workers d'exécution de scripts dans la même instance de conteneur. Pour une mise à l'échelle indépendante des workers à haut débit, utilisez Windmill_GKE.
  • DISABLE_NSJAIL=true est injecté automatiquement. Cloud Run n'accorde pas CAP_SYS_ADMIN ; l'isolation par espaces de noms Linux de Windmill est donc désactivée.
  • Les sondes de santé utilisent HTTP GET /api/version. Ce point de terminaison léger renvoie la chaîne de version de Windmill lorsque le service est prêt. Cloud Run n'émet pas de redirection HTTP→HTTPS sur ce chemin, si bien qu'une sonde HTTP fonctionne correctement.
  • BASE_URL et BASE_INTERNAL_URL sont construites au démarrage à partir de variables injectées par la plateforme, afin que les callbacks OAuth et les URL de webhook soient résolus correctement.
  • Redis est désactivé par défaut. Windmill fonctionne sans Redis pour les déploiements à instance unique. Activez Redis pour un comportement de file d'attente distribuée avec plusieurs instances.
  • Un secret SMTP provisoire est provisionné automatiquement. Remplacez la valeur {prefix}-smtp-password dans Secret Manager avant d'activer les notifications par e-mail.
  • min_instance_count vaut 0 par défaut (mise à l'échelle à zéro). Définissez-la à 1 pour garder une instance active, afin que les déclencheurs de webhook et les flux planifiés ne nécessitent pas de démarrage à froid.
  • cpu_always_allocated vaut false par défaut — Windmill fait partie des 12 applications délibérément basculées vers une facturation avec démarrage à froid lors de la passe « coût d'abord » du 2026-07-09 (facturation à la requête, associée à min_instance_count=0). Les flux planifiés et les exécutions en file d'attente sont différés jusqu'à ce qu'une requête réveille le worker ; externalisez les planifications avec Cloud Scheduler, ou définissez cpu_always_allocated = true et min_instance_count >= 1 pour rétablir un fonctionnement continu et toujours actif.

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

Windmill s'exécute sous forme de service Cloud Run v2 qui se met à l'échelle automatiquement selon la charge de requêtes, entre le nombre minimal et le nombre maximal d'instances. 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.

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

Windmill stocke toutes les données applicatives — scripts, flux, variables, ressources, planifications et historique des jobs — dans une instance gérée Cloud SQL for PostgreSQL 16. Le service s'y connecte de manière privée via le Cloud SQL Auth Proxy sur un socket Unix (sans IP publique). Lors du premier déploiement, un job d'initialisation crée de manière idempotente 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"
    gcloud sql connect <instance-name> --user=<db-user> --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. Cloud Storage​

Un bucket Cloud Storage dédié (suffixe de nom data, c'est-à-dire gcs-<app><tenant-prefix>-data) est provisionné pour les sorties de workflows, les artefacts et les dépendances des scripts. L'accès est accordé automatiquement au compte de service de la charge de travail.

  • Console : Cloud Storage → Buckets.
  • CLI :
    gcloud storage buckets list --project "$PROJECT"
    gcloud storage ls gs://<data-bucket>/ # bucket name is in the Outputs

Consultez App_CloudRun pour les options de buckets supplémentaires, les montages GCS Fuse et CMEK.

D. Secret Manager​

Le mot de passe de la base de données et le mot de passe SMTP provisoire sont stockés dans Secret Manager et injectés dans le service à l'exécution.

  • Console : Security → Secret Manager.
  • CLI :
    gcloud secrets list --project "$PROJECT"
    gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"
    # Replace the SMTP placeholder before enabling email features:
    echo -n "your-smtp-password" | gcloud secrets versions add \
    <smtp-secret-name> --data-file=- --project "$PROJECT"

Consultez App_CloudRun pour les détails sur l'injection et la rotation.

E. Réseau et entrée​

Le service est accessible par défaut à son URL run.app. Un équilibreur de charge HTTPS externe avec un domaine personnalisé, Cloud CDN et Cloud Armor peut être ajouté ; les paramètres d'entrée et la sortie VPC contrôlent la connectivité.

  • 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 à Cloud Logging au format JSON structuré (JSON_FMT=true). Les métriques Cloud Run et Cloud SQL sont envoyées à Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte en option. Un point de terminaison de métriques Prometheus est exposé sur :9001 pour une collecte au sein du VPC.

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

  • Configuration de la base de données au premier déploiement. Un job d'initialisation (db-init) s'exécute au premier déploiement avec postgres:16-alpine. Il crée de manière idempotente les rôles windmill_admin et windmill_user, l'utilisateur de l'application et la base de données de l'application, puis accorde tous les privilèges. Le job peut être relancé sans risque.
  • Migrations de schéma automatiques. Windmill exécute ses propres migrations de base de données au démarrage ; la mise à niveau de application_version applique donc automatiquement les modifications de schéma.
  • Mode combiné serveur+worker. Chaque instance exécute à la fois l'API/le planificateur Windmill et NUM_WORKERS=3 workers d'exécution de scripts. Les workers exécutent des scripts Python, TypeScript, Bash, Go et SQL dans des sous-processus isolés. L'affectation WORKER_GROUP=default signifie que tous les flux et scripts sont acheminés par défaut vers ces instances.
  • Construction de BASE_URL et DATABASE_URL. Le shim entrypoint.sh construit DATABASE_URL au démarrage à partir des variables DB_* injectées par la plateforme, en gérant à la fois les connexions par socket Unix (Auth Proxy) et TCP. BASE_URL et BASE_INTERNAL_URL sont définies à partir de l'URL prévue du service, afin que les callbacks OAuth et les webhooks soient résolus correctement.
  • Métriques Prometheus. METRICS_ADDR=:9001 expose les métriques Windmill sur http://<instance-ip>:9001/metrics pour une collecte depuis le VPC.
  • Chemin de santé. Les sondes de démarrage et d'activité utilisent toutes deux GET /api/version. Ce point de terminaison renvoie HTTP 200 avec la chaîne de version lorsque Windmill est prêt à servir du trafic.
  • Notifications par e-mail SMTP. Le secret WINDMILL_SMTP_PASS est initialisé avec une valeur provisoire de 16 caractères. Remplacez-la et fournissez WINDMILL_SMTP_HOST, WINDMILL_SMTP_PORT et WINDMILL_SMTP_FROM via environment_variables pour activer les notifications par e-mail depuis les flux et les scripts.
  • Inspecter les jobs et leurs exécutions :
    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 à Windmill ou notables pour celui-ci sont listés ; toutes les autres entrées sont héritées de 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 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.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namewindmillNom de base des ressources. Ne le modifiez pas après le premier déploiement.
display_nameWindmillNom convivial affiché dans la console.
description(défini)Description du service.
application_versionlatestTag de version de l'image Windmill ; définissez une version précise (par ex. 1.400.0) pour la 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 avec le Dockerfile fourni ; prebuilt déploie une URI d'image existante.
container_image""URI d'image de remplacement. Laissez vide pour que Cloud Build la gère.
cpu_limit2000mCPU par instance. 2 vCPU est le minimum recommandé pour le mode combiné serveur+worker.
memory_limit2GiMémoire par instance. 4 GiB recommandés pour les charges de travail Python/TypeScript en production.
min_instance_count0Nombre minimal d'instances. Définissez ≥ 1 pour que les webhooks et les flux planifiés soient toujours disponibles sans démarrage à froid.
max_instance_count3Nombre maximal d'instances. Utilisez Redis au-delà de 1 pour coordonner les files d'attente de jobs.
container_port8000Windmill écoute sur le port 8000.
execution_environmentgen2Gen2 est requis pour les montages GCS Fuse et une compatibilité Linux complète.
timeout_seconds300Durée maximale d'une requête. Augmentez-la (jusqu'à 3600) pour les scripts de longue durée.
enable_cloudsql_volumetrueSidecar Cloud SQL Auth Proxy — requis pour la connexion par socket Unix.
enable_image_mirroringtrueMet en miroir l'image Windmill dans Artifact Registry pour éviter les limites de débit de ghcr.io.
traffic_split[]Répartition du trafic canary/blue-green entre les révisions.

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

VariableValeur par défautDescription
ingress_settingsallRéseaux autorisés à atteindre le service (all / internal / internal-and-cloud-load-balancing).
vpc_egress_settingPRIVATE_RANGES_ONLYMode d'acheminement du trafic sortant via le connecteur VPC.
enable_iapfalseExige une connexion Google via Identity-Aware Proxy.
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 non secrets supplémentaires fusionnés avec les valeurs par défaut de Windmill. Permet de définir WINDMILL_SMTP_HOST, des remplacements de NUM_WORKERS, etc.
secret_environment_variables{}Correspondance variable d'environnement → nom de secret Secret Manager. WINDMILL_SMTP_PASS est injecté automatiquement.
secret_propagation_delay / secret_rotation_period(défini)Délai d'attente de réplication / cadence de rotation.

Groupe 7 — Sauvegarde et restauration​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron de sauvegarde automatique (UTC).
backup_retention_days7Durée de conservation ; augmentez-la pour la production ou la conformité.
enable_backup_import / backup_source / backup_uri / 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 — voir App_CloudRun. Entrées clés : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy, enable_binary_authorization.

Groupe 9 — SQL personnalisé et NFS​

VariableValeur par défautDescription
nfs_instance_name / nfs_instance_base_name(défini)Instance NFS existante / nom de base pour une instance intégrée.
enable_custom_sql_scripts / custom_sql_scripts_bucket / custom_sql_scripts_path / custom_sql_scripts_use_rootdésactivéExécute du SQL depuis un bucket GCS après le provisionnement.

Groupe 10 — Domaine, CDN, Cloud Armor et rétention des images​

VariableValeur par défautDescription
application_domains[]Noms d'hôte personnalisés pour l'équilibreur de charge externe.
enable_cdnfalseActive Cloud CDN sur le backend de l'équilibreur de charge (seuls les assets statiques en bénéficient).
enable_cloud_armor / admin_ip_rangesdésactivéAssocie une règle WAF / restreint l'accès privilégié.
max_images_to_retain / delete_untagged_images / image_retention_days(défini)Règle de nettoyage d'Artifact Registry.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueProvisionne le bucket data et les éventuels buckets supplémentaires.
storage_buckets[]Buckets GCS supplémentaires au-delà du bucket de données provisionné automatiquement.
enable_nfsfalseNFS est désactivé par défaut — Windmill ne nécessite pas de stockage de fichiers partagé.
gcs_volumes[]Montages GCS Fuse via la fonctionnalité de volume de stockage de Cloud Run.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_16Fixe — Windmill nécessite PostgreSQL 16. Ne la modifiez pas.
db_namewindmillNom de la base de données. Immuable après le premier déploiement.
db_userwindmillUtilisateur de l'application. Immuable après le premier déploiement.
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.
db_host_env_var_name / db_name_env_var_name / db_user_env_var_name / db_port_env_var_name / service_url_env_var_name""Noms de variables d'environnement supplémentaires sous lesquels les détails de connexion sont injectés.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job PostgreSQL db-init intégré.
cron_jobs[]Jobs Cloud Run récurrents déclenchés par Cloud Scheduler.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /api/version, délai initial de 60s, 10 échecsSonde de démarrage.
liveness_probeHTTP /api/version, délai initial de 60s, 3 échecsSonde de vivacité.
uptime_check_configdésactivé, /api/versionVérification de disponibilité Cloud Monitoring.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 21 — Cache Redis​

VariableValeur par défautDescription
enable_redisfalseActive Redis pour un comportement de file d'attente distribuée (facultatif).
redis_host""Point de terminaison Redis.
redis_port6379Port Redis.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible).

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_loggingfalseJournaux Cloud Audit Logs détaillés.

5. Sorties​

Renvoyées lors d'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.
stage_servicesURL des services propres à chaque étape (Cloud Deploy).
load_balancer_ip / load_balancer_urlIP / URL de l'équilibreur de charge HTTPS externe (lorsqu'il est activé).
database_instance_nameNom de l'instance Cloud SQL.
database_name / database_userNom / utilisateur 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 / port de la base de données.
storage_bucketsBuckets Cloud Storage créés.
network_name / network_exists / regionsRéseau VPC, présence, régions.
container_image / container_registryImage déployée et dépôt Artifact Registry.
monitoring_enabled / monitoring_notification_channels / uptime_check_namesÉtat de la surveillance, canaux, tests de disponibilité.
initialization_jobsNoms des jobs de configuration.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / github_repository_url / github_repository_owner / github_repository_name / cicd_configurationÉtat et détails du CI/CD.
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_idRegistre et déclencheur de build.
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_typePOSTGRES_16CritiqueWindmill nécessite PostgreSQL 16 ; une version plus ancienne fait échouer le job d'initialisation et la base de données reste non initialisée.
db_name / db_userdéfini une foisCritiqueImmuables après le premier déploiement ; les renommer recrée la base de données et l'utilisateur et détruit tous les scripts, flux et l'historique des jobs.
enable_cloudsql_volumetrueCritiqueWindmill se connecte via le socket Unix de l'Auth Proxy ; le désactiver provoque une défaillance immédiate de la base de données et le plantage des conteneurs au démarrage.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans backup_uri valide fait échouer le job d'import.
cpu_limit2000mÉlevéLe mode combiné exécute 3 workers dans le processus ; un CPU insuffisant ralentit toute l'exécution des scripts. Chaque worker nécessite environ 500m.
memory_limit2GiÉlevéLes workers Windmill exécutent des scripts utilisateur arbitraires ; les arrêts pour manque de mémoire (OOM) en cours d'exécution produisent des échecs silencieux dans l'interface.
min_instance_count0 (par défaut, mise à l'échelle à zéro)MoyenPassez-la à 1 pour garder une instance active et éviter les démarrages à froid pour les webhooks et les flux planifiés ; augmente le coût de base.
cpu_always_allocatedfalse (par défaut, démarrage à froid « coût d'abord »)MoyenLes jobs planifiés et les exécutions en file d'attente sont différés jusqu'à ce qu'une requête réveille le worker ; externalisez-les avec Cloud Scheduler, ou définissez true + min_instance_count >= 1 pour un fonctionnement continu.
service_url / BASE_URLURL Cloud Run ou domaine personnaliséÉlevéUne valeur vide ou incorrecte casse les callbacks OAuth, les points de terminaison de webhook et les liens profonds de l'interface Windmill.
execution_environmentgen2ÉlevéGen1 ne prend pas en charge les montages GCS Fuse ; requis lorsque gcs_volumes est utilisé.
enable_vpc_scfalse sauf si nécessaireÉlevéNécessite un organization_id explicite ; sans lui, VPC-SC est ignoré silencieusement, ce qui donne une fausse impression de sécurité périmétrique.
enable_redisfalse pour une instance unique, true pour plusieursMoyenSans Redis, chaque instance ne traite que sa propre file d'attente, ce qui peut entraîner des duplications ou des famines de jobs.
max_instance_count3MoyenAu-delà d'une instance sans coordination Redis, un même job peut être pris en charge simultanément par plusieurs workers.
timeout_seconds300 (à augmenter pour les jobs longs)MoyenLes jobs Windmill qui dépassent le délai d'expiration des requêtes Cloud Run sont interrompus en cours d'exécution sans erreur explicite.
backup_schedule0 2 * * *MoyenUne chaîne vide désactive les sauvegardes ; Windmill stocke toutes les définitions d'automatisation dans PostgreSQL.
enable_iap / enable_cloud_armorà activer en productionMoyenSans ces options, l'interface et l'API Windmill sont accessibles publiquement.
WINDMILL_SMTP_* (via les variables d'environnement)tous les champs définis ensembleMoyenUne configuration SMTP partielle provoque des échecs silencieux de remise des e-mails, sans erreur à l'exécution.
enable_auto_password_rotationfalseMoyenLorsqu'elle est activée, la révision Cloud Run doit être redéployée après la rotation ; sinon elle utilise un mot de passe expiré jusqu'à ce que les connexions échouent.

Pour le comportement du socle référencé tout au long de ce guide — 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 à Windmill, partagée avec la variante GKE, est décrite dans Windmill_Common.

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