Aller au contenu principal

Node-RED sur Google Cloud Run

Node-RED sur Google Cloud Run

Node-RED est un outil open source de programmation par flux qui permet de relier des appareils IoT, des API et des services en ligne au moyen d'un éditeur visuel dans le navigateur. Ce module déploie Node-RED 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 Node-RED 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​

Node-RED s'exécute sous forme de conteneur Node.js sur Cloud Run v2 (gen2) et écoute sur le port 1880. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service Node.js, 1 vCPU / 1 GiB par défaut, mise à l'échelle automatique selon les requêtes
Stockage persistant des fluxFilestore (NFS)Flux, identifiants et nœuds installés dans /data (nécessite gen2)
Stockage d'objetsCloud StorageUn bucket dédié aux données de l'application
Stockage du contexteRedis (facultatif)Désactivé par défaut ; permet de conserver le contexte entre les redémarrages et de le partager entre les instances
Secret des identifiantsSecret ManagerNODE_RED_CREDENTIAL_SECRET, généré automatiquement, chiffre les identifiants des flux
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 :

  • Aucune base de données n'est requise. Node-RED stocke tout son état dans son répertoire /data ; database_type vaut "NONE" par défaut.
  • NFS est activé par défaut. Le répertoire /data est monté depuis un partage Filestore (nécessite execution_environment = "gen2") afin que les flux, les identifiants et les nœuds installés survivent aux redémarrages du conteneur et aux nouveaux déploiements.
  • La mise à l'échelle à zéro est prise en charge (min_instance_count = 0). Définissez la valeur 1 pour les charges de travail de webhooks en production, afin d'éviter les délais de démarrage à froid et les webhooks manqués pendant la fenêtre de remontage NFS.
  • max_instance_count = 1 par défaut. Node-RED n'est pas conçu pour une mise à l'échelle horizontale active-active ; chaque instance possède son propre contexte en mémoire. N'augmentez cette valeur qu'en cas de stockage de contexte externe adossé à Redis.
  • NODE_RED_CREDENTIAL_SECRET est généré automatiquement. Il chiffre tous les identifiants de flux stockés et est conservé dans Secret Manager. Sa rotation après le déploiement des flux rend les identifiants existants illisibles.
  • Les sondes de santé utilisent HTTP GET /, qui renvoie l'interface de l'éditeur une fois Node-RED prêt (un délai initial de 30 secondes suffit).

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 Node-RED​

Node-RED s'exécute en tant que 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. Filestore (NFS) — stockage persistant des flux​

Node-RED stocke toutes ses données persistantes — flux (flows.json), identifiants chiffrés (flows_cred.json), nœuds de palette installés et fichier de paramètres — dans son répertoire /data. Un partage NFS Filestore est monté sur /data (gen2 requis) afin que les données survivent aux redémarrages du conteneur et aux nouvelles révisions du service.

  • Console : Filestore → Instances pour le partage NFS.
  • CLI :
    gcloud filestore instances list --project "$PROJECT"
    # Inspect the mounted volume from an active instance:
    gcloud run services describe <service-name> --project "$PROJECT" --region "$REGION" \
    --format='value(spec.template.spec.volumes)'

Consultez App_CloudRun pour le montage NFS, GCS Fuse et CMEK.

C. Cloud Storage​

Un bucket GCS dédié est provisionné pour les données applicatives de Node-RED (exports de flux, archives de sauvegarde). L'accès est accordé automatiquement au compte de service.

  • 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 CMEK.

D. Secret Manager — chiffrement des identifiants des flux​

NODE_RED_CREDENTIAL_SECRET est généré automatiquement lors du déploiement et stocké sous forme de secret Secret Manager. Node-RED utilise cette clé pour chiffrer tous les identifiants stockés dans les flux. Ce module ne génère aucun autre secret propre à l'application.

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

Consultez App_CloudRun pour les détails d'injection et de rotation.

E. Redis (stockage facultatif du contexte)​

Lorsque enable_redis = true, Node-RED est configuré pour stocker le contexte des flux à l'extérieur, dans Redis, ce qui permet aux données de contexte de persister entre les redémarrages d'instance et d'être partagées entre plusieurs instances. Redis est désactivé par défaut.

  • Console : Memorystore → Redis (si vous utilisez une instance gérée).
  • CLI :
    redis-cli -h <redis-host> ping
    redis-cli -h <redis-host> info keyspace

Lorsque enable_redis = true et que redis_host est vide mais que enable_nfs = true, l'IP du serveur NFS est utilisée comme hôte Redis ; sinon, redis_host doit être défini explicitement.

F. Réseau et entrée​

Le service est accessible par défaut à son URL run.app. Un équilibreur de charge HTTPS externe avec domaine personnalisé, Cloud CDN et Cloud Armor peut y ê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.

G. Cloud Logging et Monitoring​

Les journaux des conteneurs sont envoyés à Cloud Logging ; les métriques de Cloud Run sont envoyées à Cloud Monitoring, avec en option des tests de disponibilité et des règles d'alerte.

  • 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 Node-RED​

  • Ni base de données, ni job d'initialisation. Node-RED stocke tout son état dans /data. Aucune instance Cloud SQL n'est provisionnée et aucun job d'initialisation de schéma n'est requis. Le premier démarrage crée automatiquement les fichiers de flux par défaut si /data est vide.
  • Chiffrement des identifiants des flux. NODE_RED_CREDENTIAL_SECRET est injecté à l'exécution depuis Secret Manager. Cette clé chiffre le fichier flows_cred.json sur le partage NFS. Modifier la clé ou effectuer sa rotation après le déploiement des flux rend illisibles tous les identifiants stockés (clés d'API, mots de passe, jetons).
  • Mode sans échec. NODE_RED_ENABLE_SAFE_MODE est toujours défini sur "false", ce qui garantit que les flux s'exécutent au démarrage. Surchargez-le avec "true" via environment_variables pour démarrer Node-RED avec les flux désactivés à des fins de débogage.
  • Mise à l'échelle à zéro et démarrages à froid. Avec min_instance_count = 0, Node-RED se met à l'échelle à zéro lorsqu'il est inactif. Lors d'une remontée en charge, le volume NFS doit être remonté avant que le contrôle de santé ne réussisse (environ 10–20 secondes). Les webhooks déclenchés pendant cette fenêtre peuvent être perdus. Définissez min_instance_count = 1 pour les charges de travail de webhooks en production.
  • Sonde de santé. Les sondes de démarrage et d'activité envoient toutes deux un HTTP GET à /, qui renvoie l'interface de l'éditeur une fois Node-RED prêt. Un délai initial de 30 secondes suffit.
  • Tâches planifiées. Node-RED ne dispose d'aucune commande planifiée intégrée. Utilisez cron_jobs pour provisionner des jobs Cloud Run déclenchés par Cloud Scheduler pour les opérations de maintenance périodiques, comme les exports de flux ou les vidages de cache :
    gcloud run jobs list --project "$PROJECT" --region "$REGION"
    gcloud run jobs executions list --job <job-name> --project "$PROJECT" --region "$REGION"
  • Accès à l'éditeur. Rendez-vous à l'URL indiquée par la sortie service_url et connectez-vous. Pour les déploiements de production, activez IAP (enable_iap = true) pour contrôler l'accès par une authentification d'identité Google — l'éditeur donne accès à l'édition complète des flux et à la gestion des identifiants.

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Node-RED ou notables pour lui 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_namenoderedNom de base des ressources. Ne pas modifier après le premier déploiement.
display_nameNode-REDNom convivial affiché dans la console.
application_versionlatestTag d'image pour nodered/node-red. Épinglez une version précise (par ex. 4.0.9) pour des déploiements reproductibles.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
cpu_limit1000mCPU par instance ; 1 vCPU suffit pour la plupart des déploiements.
memory_limit1GiMémoire par instance ; passez à 2Gi pour les flux qui traitent des charges utiles volumineuses.
min_instance_count0Nombre minimal d'instances. 0 active la mise à l'échelle à zéro ; définissez 1 pour les charges de travail de webhooks en production.
max_instance_count1Nombre maximal d'instances. Conservez 1, sauf si les flux sont sans état ou adossés à Redis.
execution_environmentgen2Doit valoir gen2 pour que les montages de volumes NFS fonctionnent.
timeout_seconds300Durée maximale d'une requête avant le renvoi d'une erreur 504.
cpu_always_allocatedfalseLorsque false, le CPU est bridé au repos. Définissez true uniquement si des tâches en arrière-plan nécessitent un CPU en continu.
enable_image_mirroringtrueCopier l'image depuis Docker Hub vers Artifact Registry pour éviter les limites de débit.
traffic_split[]Répartit le trafic entre les révisions pour des déploiements canary/blue-green.
max_revisions_to_retain7Révisions Cloud Run à conserver après chaque déploiement.

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

VariableValeur par défautDescription
ingress_settingsallRéseaux autorisés à joindre le service. Utilisez "internal-and-cloud-load-balancing" avec Cloud Armor pour les webhooks de production.
vpc_egress_settingPRIVATE_RANGES_ONLYAcheminement du trafic sortant via le connecteur VPC.
enable_iapfalseExiger une connexion Google. Fortement recommandé en production.
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 supplémentaires non secrets. Ne définissez pas NODE_RED_CREDENTIAL_SECRET ici.
secret_environment_variables{}Correspondance variable d'environnement → nom du secret Secret Manager.
secret_rotation_period2592000sPériode de notification de rotation de Secret Manager.
secret_propagation_delay30Nombre de secondes d'attente après la création d'un secret avant de poursuivre.

Groupe 7 — Sauvegarde et restauration​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron des sauvegardes NFS automatiques (UTC). Laissez vide pour désactiver.
backup_retention_days7Rétention ; augmentez-la pour la production/la conformité.
enable_backup_import / backup_source / backup_urioptions de restaurationRestaurer à partir d'une sauvegarde lors du déploiement.

Groupe 8 — CI/CD et Binary Authorization​

Intégration Cloud Build / Cloud Deploy standard 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 — Instance NFS et SQL personnalisé​

VariableValeur par défautDescription
nfs_instance_name / nfs_instance_base_name(auto)Instance NFS existante / nom de base d'une instance créée à la volée.
enable_custom_sql_scripts / custom_sql_scripts_*désactivéSans objet pour Node-RED ; conservé pour la compatibilité de l'API.

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

VariableValeur par défautDescription
enable_cloud_armorfalseProvisionner un équilibreur de charge HTTPS global + le WAF Cloud Armor. application_domains est facultatif — un certificat nip.io est dérivé s'il n'est pas défini.
application_domains[]Noms d'hôte personnalisés avec SSL géré par Google.
enable_cdnfalseActiver Cloud CDN sur le backend de l'équilibreur de charge. Nécessite enable_cloud_armor = true.
admin_ip_ranges[]Plages CIDR exemptées des règles WAF.
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
enable_nfstrueVolume Filestore partagé pour le répertoire /data de Node-RED. Fortement recommandé. Nécessite gen2.
nfs_mount_path/dataDoit correspondre au répertoire de données natif de Node-RED.
create_cloud_storage / storage_buckets / gcs_volumes(défini)Bucket de données / buckets supplémentaires / montages GCS Fuse.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Secret des identifiants​

VariableValeur par défautDescription
database_password_length32Longueur du NODE_RED_CREDENTIAL_SECRET généré automatiquement (16–64).
enable_auto_password_rotationfalseRotation automatique du secret des identifiants. La rotation de la clé rend illisibles les identifiants de flux existants.
rotation_propagation_delay_sec90Nombre de secondes d'attente après la rotation avant de redémarrer le service.

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

VariableValeur par défautDescription
initialization_jobs[]Node-RED ne nécessite aucun job d'initialisation. Fournissez des jobs personnalisés pour les imports de flux ou les installations de palette.
cron_jobs[]Jobs Cloud Run récurrents déclenchés par Cloud Scheduler.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /, délai de 30sSonde HTTP sur le chemin de l'éditeur Node-RED.
liveness_probeHTTP /, délai de 30sSonde de vivacité — redémarre le conteneur si l'éditeur ne répond pas.
uptime_check_configdésactivé, chemin /Test de disponibilité Cloud Monitoring.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 21 — Stockage du contexte dans Redis​

VariableValeur par défautDescription
enable_redisfalseActiver Redis pour le stockage du contexte de Node-RED.
redis_host""Point de terminaison Redis. Requis lorsque enable_redis = true (sauf si enable_nfs = true).
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_scfalseAppliquer un périmètre VPC-SC (nécessite organization_id).
vpc_cidr_ranges / vpc_sc_dry_run(défini)Plages 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 Node-RED.
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é).
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 éventuels 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 des journaux 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
enable_nfstrueCritiqueSans NFS, tous les flux, identifiants et nœuds installés sont perdus à chaque redémarrage d'instance ou nouveau déploiement.
NODE_RED_CREDENTIAL_SECRET (issu de database_password_length)généré automatiquementCritiqueChiffre tous les identifiants des flux. Effectuer la rotation de la clé ou la modifier après le déploiement des flux rend les identifiants existants définitivement illisibles.
enable_auto_password_rotationfalseCritiqueLa rotation automatique modifie la clé de chiffrement ; tous les identifiants de flux stockés deviennent inaccessibles. Ne l'activez qu'avec une procédure de rechiffrement en place.
application_namedéfini une seule foisCritiqueImmuable après le premier déploiement ; le renommer recrée toutes les ressources GCP et déconnecte le partage NFS.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans backup_uri valide fait échouer le job de restauration.
execution_environmentgen2ÉlevéLes montages NFS nécessitent gen2 ; utiliser gen1 provoque des échecs de montage et des erreurs au démarrage du conteneur.
max_instance_count1ÉlevéNode-RED n'est pas conçu pour une mise à l'échelle active-active. Plusieurs instances sans contexte partagé produisent des états contradictoires.
min_instance_count1 pour les webhooksÉlevéLa mise à l'échelle à zéro provoque des démarrages à froid de 10–20 secondes ; les webhooks déclenchés pendant le remontage NFS sont perdus.
nfs_mount_path/dataÉlevéDoit correspondre au répertoire de données natif de Node-RED. Le modifier redirige les écritures vers un stockage éphémère.
database_typeNONEÉlevéLa définir sur MYSQL ou POSTGRES provisionne un sidecar Cloud SQL inutile.
enable_redis sans redis_hostdéfinir redis_host explicitementÉlevéSans repli sur NFS, un hôte Redis vide provoque des échecs du stockage du contexte.
enable_iaptrue en productionÉlevéL'éditeur donne accès à l'édition complète des flux et à la gestion des identifiants ; il ne doit pas être accessible publiquement.
ingress_settingsinternal-and-cloud-load-balancing en productionMoyen"internal" bloque tous les webhooks externes ; "all" expose directement le service sans WAF.
memory_limit1GiMoyenLes flux qui traitent des charges utiles volumineuses ou utilisent des nœuds de traitement d'images peuvent nécessiter 2Gi.
backup_retention_days7 (à augmenter en production)MoyenTrop court pour une rétention de conformité.

Pour le comportement du socle évoqué 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 à Node-RED, partagée avec la variante GKE, est décrite dans NodeRED_Common.

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