Aller au contenu principal

Listmonk sur Google Cloud Run

Listmonk sur Google Cloud Run

Ce document constitue une référence complète du module modules/Listmonk_CloudRun. Il couvre l'architecture, IAM, les variables de configuration, les comportements propres à Listmonk et les modes d'exploitation pour déployer Listmonk sur Google Cloud Run (v2).


1. Vue d'ensemble du module​

Listmonk est un gestionnaire de newsletters et de listes de diffusion auto-hébergé et très performant, écrit en Go. Listmonk CloudRun est un module wrapper construit au-dessus de App CloudRun. Il s'appuie sur App CloudRun pour tout le provisionnement de l'infrastructure GCP et injecte, via Listmonk Common, la configuration applicative propre à Listmonk, l'initialisation de la base de données et la configuration du stockage.

Fonctionnalités clés :

  • Calcul : Cloud Run v2 (Gen2), conteneur exécutant un binaire Go, 1 vCPU / 512Mi par défaut. Mise à l'échelle à zéro par défaut (min_instance_count = 0) avec max_instance_count = 1 ; cpu_always_allocated = true maintient le CPU alloué sur une instance réveillée afin que l'expéditeur de campagnes asynchrone puisse terminer avant le retour à zéro.
  • Persistance des données : Cloud SQL PostgreSQL 15. Volume GCS Fuse facultatif pour les fichiers téléversés, monté sur /listmonk/uploads. NFS facultatif pour un stockage partagé supplémentaire.
  • Sécurité : hérite de Cloud Armor WAF, IAP, Binary Authorization et VPC Service Controls depuis App CloudRun. Le mot de passe administrateur est généré automatiquement et stocké dans Secret Manager.
  • Mise en cache : Redis désactivé par défaut (enable_redis = false). Listmonk est un binaire Go sans état et n'a pas besoin de Redis en fonctionnement normal.
  • CI/CD : pipeline Cloud Build d'image personnalisée par défaut ; livraison progressive Cloud Deploy en option.
  • Fiabilité : la sonde de démarrage est une vérification de port TCP (délai initial de 30 secondes, 30 tentatives) — /api/health exige une session authentifiée et renvoie 403 à une sonde HTTP ; Cloud Run vérifie donc plutôt que le conteneur est à l'écoute. La sonde de vivacité est désactivée par défaut (Cloud Run n'offre pas de sonde de vivacité TCP, et /api/health renvoie également 403). Listmonk exécute automatiquement les migrations de schéma PostgreSQL au premier démarrage.

Identité du projet et de l'application

VariableGroupeTypeValeur par défautDescription
project_id1string—ID du projet GCP. Obligatoire.
tenant_id2string'demo'Suffixe court ajouté au nom de toutes les ressources.
support_users2list(string)[]Destinataires e-mail des alertes de surveillance.
resource_labels2map(string){}Libellés appliqués à toutes les ressources provisionnées.
application_name3string'listmonk'Nom de base des ressources. À ne pas modifier après le déploiement initial.
display_name3string'Listmonk'Nom lisible affiché dans la console GCP.
description3string'Listmonk is a high-performance, self-hosted newsletter and mailing list manager'Description du service Cloud Run.
application_version3string'latest'Tag de version de l'image Listmonk. Incrémentez-le pour déployer une nouvelle version.

Architecture du wrapper : Listmonk CloudRun appelle Listmonk Common pour construire un objet application_config contenant les variables d'environnement propres à Listmonk, la configuration des sondes et la définition du job db-init. module_storage_buckets transporte le bucket de téléversements éventuellement provisionné par Listmonk Common. scripts_dir est résolu vers le répertoire Listmonk_Common/scripts au moment de l'apply.

Remarque sur PostgreSQL : Listmonk exige PostgreSQL 15. database_type = "POSTGRES_15" est la valeur par défaut, et Listmonk ne démarre avec aucun autre moteur de base de données.


2. IAM et contrôle d'accès​

Listmonk_CloudRun délègue tout le provisionnement IAM à App_CloudRun. Le compte de service Cloud Run, le compte de service Cloud Build, l'agent de service IAP et les ensembles de rôles de rotation des mots de passe sont identiques à ceux de App_CloudRun.

Secrets applicatifs : Listmonk Common génère automatiquement un secret au niveau de l'application :

  • LISTMONK_ADMIN_PASSWORD — le mot de passe de l'utilisateur administrateur Listmonk, stocké dans Secret Manager et injecté à l'exécution (l'ancien nom de style configuration à double tiret bas LISTMONK_app__admin_password, déprécié, a été supprimé — __ n'est pas une clé de Secret k8s valide).

Le mot de passe de la base de données est stocké dans un secret distinct (database_password_secret) provisionné automatiquement par App CloudRun. Aucune de ces valeurs n'est écrite dans l'état Terraform.

Nom de la variable d'environnement du mot de passe de base de données : Listmonk lit directement LISTMONK_db__password. La variable db_password_env_var_name est préréglée sur cette valeur afin que App CloudRun injecte le secret sous le bon nom.

Délai de propagation IAM de 120 secondes : hérité de App CloudRun — le service Listmonk n'est déployé qu'une fois ce délai écoulé, ce qui évite les échecs de lecture de secrets au démarrage de la première révision.

Interface d'administration : l'interface complète de Listmonk, y compris la gestion des abonnés, les campagnes, les modèles et les paramètres, est disponible à la racine /. Le nom d'utilisateur administrateur et le mot de passe généré automatiquement sont les seuls identifiants requis.


3. Configuration du service principal​

A. Calcul (Cloud Run)​

Listmonk est un binaire Go compilé. Il est économe en mémoire et démarre rapidement par rapport aux applications écrites dans des langages interprétés. L'allocation de ressources par défaut (1 vCPU / 512Mi) suffit pour des listes de taille modérée et des charges de travail de campagnes courantes.

Mise à l'échelle à zéro par défaut (min_instance_count = 0) — l'ancienne valeur par défaut min = 1 n'existait que pour garder chaud le cache en mémoire, propre à chaque instance, de l'utilisateur d'API. Cette raison a disparu : le point d'entrée de Listmonk_Common effectue un UPSERT, à chaque démarrage, d'un utilisateur d'API déterministe adossé à un secret dans la base de données, de sorte qu'une instance démarrée à froid recharge toujours un identifiant valide. cpu_always_allocated = true (valeur par défaut) garantit qu'une instance réveillée conserve le CPU alloué assez longtemps pour que l'expéditeur de campagnes asynchrone termine avant le retour à zéro. Passez min_instance_count à 1 uniquement si Listmonk doit rester chaud pour une utilisation intensive et interactive de l'administration.

Startup CPU Boost est toujours activé (codé en dur dans App CloudRun).

Image de conteneur : container_image_source vaut 'custom' par défaut, ce qui signifie que Cloud Build compile une image personnalisée à partir du Dockerfile de Listmonk_Common. Définissez container_image_source = 'prebuilt' et fournissez une URI container_image pour ignorer le build et déployer directement.

VariableGroupeValeur par défautDescription
deploy_application4trueDéfinissez false pour un déploiement d'infrastructure uniquement (SQL, stockage, secrets).
cpu_limit4'1000m'CPU par instance. 1 vCPU suffit pour le binaire Go de Listmonk.
memory_limit4'512Mi'Mémoire par instance. Augmentez à 1–2 Gi pour de grandes listes d'abonnés ou un traitement intensif de campagnes.
min_instance_count40Nombre minimal d'instances en cours d'exécution. Mise à l'échelle à zéro ; l'utilisateur d'API auto-réparé, injecté en base, rend les démarrages à froid sûrs.
max_instance_count41Nombre maximal d'instances en cours d'exécution. Maintenu à 1 — Listmonk ne coordonne pas plusieurs processeurs de campagnes concurrents.
cpu_always_allocated4trueMaintient le CPU alloué pendant toute la durée de vie d'une instance active afin que l'expéditeur de campagnes asynchrone, exécuté dans le processus, puisse terminer après le retour de la requête HTTP déclenchante.
container_port49000Port HTTP natif de Listmonk. À modifier uniquement si votre Dockerfile personnalisé écoute sur un autre port.
execution_environment4'gen2'Gen2 requis pour les montages GCS Fuse.
timeout_seconds4300Durée maximale d'une requête. Les points de terminaison d'API de Listmonk répondent généralement en quelques secondes.
enable_cloudsql_volume4trueInjecte le sidecar Cloud SQL Auth Proxy pour les connexions par socket Unix à PostgreSQL.
container_protocol4'http1''http1' ou 'h2c'.
enable_image_mirroring4trueMet en miroir l'image Listmonk dans Artifact Registry.
traffic_split4[]Répartition du trafic en pourcentage pour les déploiements canary/blue-green.
max_revisions_to_retain47Nombre maximal de révisions Cloud Run à conserver. Définissez 0 pour désactiver.
service_annotations4{}Annotations Cloud Run avancées.
service_labels4{}Libellés appliqués au service Cloud Run.

Différences par rapport aux valeurs par défaut de App CloudRun :

VariableApp CloudRunListmonk CloudRunRaison
container_port80809000Port natif de Listmonk.
cpu_always_allocatedfalsetrueL'expéditeur de campagnes exécuté dans le processus tourne après le retour de la requête HTTP déclenchante ; une facturation à la requête le briderait en plein lot.
enable_image_mirroringfalsetrueListmonk met par défaut son image de base en miroir dans Artifact Registry pour éviter les limites de débit de Docker Hub.

B. Base de données (Cloud SQL — PostgreSQL 15)​

Listmonk exige PostgreSQL 15. database_type = "POSTGRES_15" est la valeur par défaut et ne doit pas être modifiée. Listmonk gère lui-même la création de son schéma et ses migrations au premier démarrage — le job Cloud Run db-init crée uniquement la base de données et l'utilisateur ; l'application remplit le schéma.

VariableGroupeValeur par défautDescription
database_type12'POSTGRES_15'Moteur Cloud SQL. Listmonk exige PostgreSQL. À ne pas modifier.
db_name12'listmonk'Nom de la base de données PostgreSQL. À ne pas modifier après le déploiement initial.
db_user12'listmonk'Utilisateur applicatif PostgreSQL. Mot de passe généré automatiquement et stocké dans Secret Manager.
db_password_env_var_name12'LISTMONK_db__password'Nom de la variable d'environnement sous laquelle le mot de passe de la base est injecté. Préréglé pour Listmonk ; à ne pas modifier.
database_password_length1232Longueur du mot de passe généré automatiquement. Plage : 16–64.
enable_auto_password_rotation12falseRotation automatisée des mots de passe sans interruption de service.
rotation_propagation_delay_sec1290Secondes d'attente après la rotation avant le redémarrage du service.

sql_instance_name et sql_instance_base_name ne sont pas exposées ; la découverte ou le provisionnement intégré (inline) de Cloud SQL est géré de manière transparente par App CloudRun.

C. Stockage (GCS Fuse et NFS)​

NFS est désactivé par défaut (enable_nfs = false). Listmonk est un binaire Go sans état et n'a pas besoin d'un système de fichiers partagé. Plusieurs instances Cloud Run partagent une même base de données PostgreSQL ; les données des abonnés et le contenu des campagnes sont stockés en base.

Volume de téléversements GCS Fuse : pour un stockage persistant des fichiers et médias téléversés, montez un bucket GCS sur /listmonk/uploads à l'aide de gcs_volumes. Listmonk Common définit LISTMONK_upload__provider=filesystem et LISTMONK_upload__filesystem__upload_path=/listmonk/uploads — le bucket GCS monté sur ce chemin satisfait ces paramètres. Sans volume persistant, les pièces jointes téléversées sont éphémères et perdues au redémarrage d'une révision.

VariableGroupeValeur par défautDescription
gcs_volumes11[]Buckets GCS à monter via GCS Fuse (nécessite gen2). Chaque entrée : name, bucket_name, mount_path, readonly, mount_options. Montez le bucket de téléversements sur /listmonk/uploads.
enable_nfs11falseProvisionne un volume NFS partagé. Non requis pour les déploiements Listmonk standard.
nfs_mount_path11'/mnt/nfs'Chemin dans le conteneur où le partage NFS est monté. Pertinent uniquement lorsque enable_nfs = true.
create_cloud_storage11trueDéfinissez false pour ne pas créer les buckets GCS définis dans storage_buckets.
storage_buckets11[]Buckets GCS supplémentaires à provisionner.
manage_storage_kms_iam11falseCrée un trousseau et une clé KMS CMEK et active CMEK sur tous les buckets de stockage.
enable_artifact_registry_cmek11falseCrée une clé KMS Artifact Registry pour le chiffrement CMEK des images au repos.

D. Réseau​

Cloud Run utilise la sortie VPC directe (Direct VPC Egress) pour atteindre l'IP interne de Cloud SQL. Comme enable_cloudsql_volume = true est la valeur par défaut, le sidecar Auth Proxy gère la connexion à Cloud SQL via un socket Unix, et la connexion à la base de données ne nécessite pas de routage VPC.

Listmonk se connecte à des fournisseurs externes SMTP/Mailgun/SES/Postmark pour l'envoi des campagnes. Conservez vpc_egress_setting = 'PRIVATE_RANGES_ONLY' (valeur par défaut) afin que la sortie publique directe soit disponible pour les ports SMTP 587/465/25.

VariableGroupeValeur par défautDescription
ingress_settings5'all''all' — internet public ; 'internal' — VPC uniquement ; 'internal-and-cloud-load-balancing' — force le trafic à passer par l'équilibreur de charge HTTPS.
vpc_egress_setting5'PRIVATE_RANGES_ONLY''PRIVATE_RANGES_ONLY' achemine via le VPC uniquement le trafic RFC 1918. Définissez 'ALL_TRAFFIC' uniquement si tout le trafic sortant (SMTP compris) doit transiter par le VPC.

E. Initialisation et amorçage​

Un job Cloud Run db-init est provisionné automatiquement par Listmonk Common lorsque initialization_jobs conserve sa valeur par défaut de liste vide ([]). Il utilise l'image postgres:15-alpine et exécute Listmonk_Common/scripts/db-init.sh, qui réalise les opérations idempotentes suivantes :

  1. Se connecte à Cloud SQL PostgreSQL via le socket Unix de l'Auth Proxy.
  2. Crée l'utilisateur de base de données listmonk avec le mot de passe issu de Secret Manager.
  3. Crée la base de données listmonk si elle n'existe pas.
  4. Accorde à l'utilisateur listmonk tous les privilèges sur la base de données.

Listmonk exécute lui-même --install au premier démarrage pour remplir le schéma et créer l'utilisateur administrateur à partir de LISTMONK_ADMIN_USER (codé en dur à "admin" dans main.tf) et de LISTMONK_ADMIN_PASSWORD provenant de l'environnement — les anciens noms de style configuration à double tiret bas LISTMONK_app__admin_username/LISTMONK_app__admin_password ont été supprimés (dépréciés en v6 ; __ n'est pas une clé de Secret k8s valide).

VariableGroupeValeur par défautDescription
initialization_jobs13[]Jobs Cloud Run ponctuels. Laissez vide pour que Listmonk Common fournisse le job db-init par défaut. Une liste non vide le remplace entièrement.
cron_jobs13[]Jobs récurrents déclenchés par Cloud Scheduler. Chaque entrée : name, schedule (cron UTC), image, command, args, env_vars, secret_env_vars, cpu_limit, memory_limit, timeout_seconds, max_retries, task_count, parallelism, mount_nfs, mount_gcs_volumes, script_path, paused.

4. Sécurité avancée​

A. Cloud Armor WAF​

Lorsque enable_cloud_armor = true, un équilibreur de charge HTTPS global doté d'une politique Cloud Armor WAF (OWASP Top 10, protection DDoS adaptative, limitation de débit) est provisionné devant Cloud Run.

Pour les déploiements Listmonk de production qui traitent des données d'abonnés et envoient des campagnes, Cloud Armor est fortement recommandé pour se protéger contre le bourrage d'identifiants sur la connexion administrateur et les abus de l'API.

VariableGroupeValeur par défautDescription
enable_cloud_armor10falseProvisionne un équilibreur de charge HTTPS global + Cloud Armor WAF. Requis pour les domaines personnalisés, le CDN et la protection DDoS.
admin_ip_ranges10[]Plages CIDR exemptées des règles WAF (par ex. VPN de bureau, IP de sortie CI/CD).

B. Identity-Aware Proxy (IAP)​

Lorsque enable_iap = true, l'intégration IAP native de Cloud Run est activée directement sur le service. Une authentification par identité Google est exigée avant que les requêtes n'atteignent Listmonk. Recommandé pour les déploiements de newsletters internes dont l'accès doit être limité aux comptes Google de l'organisation.

VariableGroupeValeur par défautDescription
enable_iap5falseActive IAP nativement sur le service Cloud Run.
iap_authorized_users5[]Utilisateurs/comptes de service autorisés. Format : 'user:email' ou 'serviceAccount:sa@...'.
iap_authorized_groups5[]Groupes Google autorisés. Format : 'group:name@example.com'.

C. Binary Authorization​

Lorsque enable_binary_authorization = true, Cloud Run exige que les images déployées portent une attestation cryptographique valide.

VariableGroupeValeur par défautDescription
enable_binary_authorization8falseImpose l'attestation des images. Nécessite une politique Binary Authorization et un attesteur préconfigurés dans le projet.

D. VPC Service Controls​

Lorsque enable_vpc_sc = true, tous les appels d'API GCP de ce module sont confinés dans un périmètre VPC-SC existant.

VariableGroupeValeur par défautDescription
enable_vpc_sc22falseInscrit les appels d'API du module dans le périmètre VPC-SC du projet. Un périmètre doit exister avant l'activation.
vpc_sc_dry_run22trueJournalise les violations VPC-SC sans les bloquer. Définissez false pour les appliquer.
enable_audit_logging22falseActive les journaux d'audit Cloud détaillés (DATA_READ, DATA_WRITE, ADMIN_READ).

E. Intégration de Secret Manager​

Les secrets applicatifs de Listmonk sont stockés dans Secret Manager et injectés nativement par Cloud Run au démarrage de la révision — le texte en clair n'est jamais écrit dans l'état Terraform.

Listmonk Common génère automatiquement le secret du mot de passe administrateur, injecté dans le conteneur sous LISTMONK_ADMIN_PASSWORD. Le mot de passe de la base de données (LISTMONK_db__password) est provisionné automatiquement par App CloudRun. Des secrets supplémentaires peuvent être ajoutés via secret_environment_variables.

VariableGroupeValeur par défautDescription
secret_environment_variables6{}Table associant un nom de variable d'environnement → un ID de secret Secret Manager. Résolue à l'exécution ; jamais stockée dans l'état.
secret_rotation_period6'2592000s'Fréquence à laquelle Secret Manager émet des notifications de rotation. Par défaut : 30 jours.
secret_propagation_delay630Secondes d'attente après la création d'un secret avant que les ressources dépendantes ne poursuivent.

5. Trafic et entrée​

A. Équilibreur de charge HTTPS​

Lorsque enable_cloud_armor = true, un équilibreur de charge HTTPS global adossé à un NEG serverless est provisionné. Le trafic suit le chemin : Internet → Cloud Armor → équilibreur de charge HTTPS global → NEG serverless → Cloud Run.

Définir ingress_settings = 'internal-and-cloud-load-balancing' force tout le trafic Listmonk à passer par l'équilibreur de charge et empêche l'accès direct via l'URL *.run.app.

B. Cloud CDN​

Lorsque enable_cdn = true (nécessite enable_cloud_armor = true), Cloud CDN est rattaché au backend de l'équilibreur de charge HTTPS.

Point d'attention pour Listmonk : Listmonk sert à la fois des points de terminaison d'API et des ressources statiques. Le CDN est surtout utile pour les ressources statiques de l'interface (HTML, JS, CSS). Les réponses de l'API Listmonk (/api/*) ne peuvent pas être mises en cache et doivent être exclues de la mise en cache CDN au moyen d'en-têtes Cache-Control ou de règles de motifs d'URL.

VariableGroupeValeur par défautDescription
enable_cdn10falseActive Cloud CDN sur le backend de l'équilibreur de charge HTTPS. Effectif uniquement lorsque enable_cloud_armor = true.
max_images_to_retain107Nombre maximal d'images de conteneur récentes à conserver dans Artifact Registry. Définissez 0 pour désactiver.
delete_untagged_images10trueSupprime automatiquement les images sans tag (orphelines) d'Artifact Registry.
image_retention_days1030Nombre de jours après lequel les images peuvent être supprimées. Définissez 0 pour désactiver la suppression basée sur l'âge.

C. Domaines personnalisés​

Les domaines personnalisés sont rattachés à l'équilibreur de charge HTTPS global via application_domains. Des certificats SSL gérés par Google sont provisionnés automatiquement. Le DNS doit pointer vers l'IP de l'équilibreur de charge après l'apply.

VariableGroupeValeur par défautDescription
application_domains10[]Noms de domaine personnalisés pour l'équilibreur de charge HTTPS. Un certificat SSL géré par Google est provisionné par domaine. (par ex. ['newsletters.example.com'])

6. CI/CD et livraison​

A. Déclencheurs Cloud Build​

Lorsque enable_cicd_trigger = true, une connexion GitHub Cloud Build et un déclencheur sur push sont provisionnés. Le déclencheur construit et déploie une image Listmonk personnalisée lorsque du code est poussé sur la branche configurée.

VariableGroupeValeur par défautDescription
enable_cicd_trigger8falseProvisionne un déclencheur Cloud Build GitHub. Nécessite github_repository_url et des identifiants.
github_repository_url8""URL HTTPS complète du dépôt GitHub.
github_token8""PAT GitHub (portées repo, admin:repo_hook). Requis lors du premier apply. Sensible.
github_app_installation_id8""ID d'installation de l'application GitHub (à privilégier pour les dépôts d'organisation).
cicd_trigger_config8{ branch_pattern = "^main$" }Configuration avancée du déclencheur : branch_pattern, included_files, ignored_files, trigger_name, substitutions.

B. Pipeline Cloud Deploy​

Lorsque enable_cloud_deploy = true (nécessite enable_cicd_trigger = true), le pipeline CI/CD est remplacé par un pipeline de livraison Cloud Deploy géré, avec des étapes de promotion séquentielles.

VariableGroupeValeur par défautDescription
enable_cloud_deploy8falseProvisionne un pipeline Cloud Deploy. Nécessite enable_cicd_trigger = true.
cloud_deploy_stages8[dev, staging, prod(approval)]Étapes de promotion ordonnées. Chacune : name, target_name, service_name, require_approval, auto_promote.

7. Fiabilité et planification​

A. Mise à l'échelle et concurrence​

Listmonk est un binaire Go sans état — plusieurs instances Cloud Run peuvent servir des requêtes simultanément sans problème d'état de session partagé. La valeur par défaut min_instance_count = 0 ramène le service à zéro entre deux envois ; l'utilisateur d'API auto-réparé, injecté en base, rend une instance démarrée à froid immédiatement utilisable. max_instance_count vaut 1 par défaut, car Listmonk ne coordonne pas plusieurs processeurs de campagnes concurrents — augmentez-le uniquement si la charge de lecture interactive ou via l'API l'exige.

B. Répartition du trafic​

La répartition du trafic est prise en charge. La conception sans état de Listmonk rend les déploiements canary sûrs — toutes les requêtes partagent le même backend PostgreSQL, quelle que soit l'instance qui les traite.

VariableGroupeValeur par défautDescription
traffic_split4[]Répartition du trafic en pourcentage entre des révisions nommées. La somme des entrées doit être égale à 100. Vide : 100 % vers la dernière révision.

C. Sondes de santé et surveillance de la disponibilité​

Listmonk expose un point de terminaison dédié /api/health, mais depuis Listmonk v6.1.0 celui-ci se trouve derrière l'authentification par session et renvoie 403 {"message":"invalid session"} à un appelant non authentifié — une sonde HTTP qui l'interroge n'aboutit donc jamais. La sonde de démarrage utilise donc par défaut une vérification TCP d'écoute du port (elle confirme que le serveur est lié au port du conteneur), et la sonde de vivacité est désactivée par défaut (Cloud Run n'offre pas de sonde de vivacité TCP, et la forme HTTP renverrait 403 de la même façon). La sonde de démarrage TCP conditionne la disponibilité, et Cloud Run redémarre le conteneur s'il s'arrête.

VariableGroupeValeur par défautDescription
startup_probe14{ enabled=true, type="TCP", path="/api/health", initial_delay_seconds=30, timeout_seconds=5, period_seconds=10, failure_threshold=30 }Sonde de disponibilité (readiness) au démarrage (TCP). Le conteneur ne reçoit aucun trafic tant qu'elle n'a pas réussi.
liveness_probe14{ enabled=false, type="HTTP", path="/api/health", initial_delay_seconds=30, timeout_seconds=5, period_seconds=30, failure_threshold=3 }Sonde de vivacité. Désactivée par défaut ; la sonde de démarrage TCP couvre la disponibilité.
uptime_check_config14{ enabled=false, path="/api/health" }Test de disponibilité Cloud Monitoring. Désactivé par défaut — activez-le pour que les alertes notifient support_users en cas d'indisponibilité.
alert_policies14[]Règles d'alerte sur les métriques Cloud Monitoring.

Comportement de la sonde de démarrage : failure_threshold=30 combiné à period_seconds=10 laisse à Listmonk jusqu'à 300 secondes (plus le délai initial de 30 secondes) pour terminer l'installation du schéma au premier démarrage. C'est généreux — l'installation du schéma Listmonk se termine généralement en moins de 30 secondes sur une instance PostgreSQL neuve.

D. Rotation automatique des mots de passe​

Lorsque enable_auto_password_rotation = true, un pipeline de rotation des mots de passe sans interruption de service est provisionné :

  1. Secret Manager émet une notification de rotation à chaque intervalle secret_rotation_period.
  2. Eventarc déclenche un job Cloud Run de rotation.
  3. Le job génère un nouveau mot de passe, met à jour l'utilisateur PostgreSQL de Cloud SQL et écrit une nouvelle version du secret.
  4. Après rotation_propagation_delay_sec secondes, le job redémarre le service Listmonk.

Au redémarrage, Listmonk rétablit sa connexion à la base de données et lit le mot de passe mis à jour dans Secret Manager.

VariableGroupeValeur par défautDescription
enable_auto_password_rotation12falseActive la rotation automatisée des mots de passe.
rotation_propagation_delay_sec1290Secondes d'attente après l'écriture du nouveau secret avant le redémarrage du service.

8. Intégrations​

A. Envoi d'e-mails (SMTP / API)​

Listmonk se connecte à des fournisseurs de messagerie externes pour envoyer les campagnes et les messages transactionnels. Configurez le fournisseur de messagerie dans l'interface d'administration de Listmonk, sous Settings → SMTP, après le déploiement. Les fournisseurs courants sont Mailgun, Amazon SES, Postmark et SendGrid.

Listmonk prend en charge à la fois SMTP et des intégrations API natives (Mailgun, SES, Postmark, Sparkpost). Pour les envois à fort volume, les intégrations API sont préférables à SMTP.

Méthode de configuration : les identifiants du fournisseur de messagerie ne sont pas définis via les variables du module. Après le déploiement, accédez à l'interface d'administration de Listmonk et configurez :

  1. Settings → SMTP pour l'envoi via SMTP.
  2. Settings → Sending settings pour la limitation de débit (messages par minute), la concurrence et les paramètres de nouvelle tentative.

Pour conserver ces paramètres d'un redéploiement à l'autre, exportez les paramètres Listmonk sous forme de dump SQL et importez-le lors de la restauration.

B. Import de sauvegarde et restauration​

Lorsque enable_backup_import = true, un job Cloud Run dédié restaure une sauvegarde PostgreSQL existante dans l'instance Cloud SQL provisionnée. Il s'exécute après le job db-init et avant le déploiement du service Listmonk.

VariableGroupeValeur par défautDescription
backup_schedule7'0 2 * * *'Expression cron (UTC) des sauvegardes quotidiennes automatisées.
backup_retention_days77Nombre de jours de conservation des fichiers de sauvegarde dans GCS.
enable_backup_import7falseDéclenche une restauration ponctuelle lors de l'apply. Repassez à false après un import réussi.
backup_source7'gcs''gcs' (URI GCS complète) ou 'gdrive' (ID de fichier Drive).
backup_uri7""URI GCS complète (par ex. 'gs://my-bucket/listmonk-backup.sql') ou ID de fichier Google Drive.
backup_format7'sql'Format du fichier de sauvegarde. Options : sql, tar, gz, tgz, tar.gz, zip.

C. Observabilité et alertes​

Un test de disponibilité Cloud Monitoring peut interroger le point de terminaison /api/health depuis plusieurs emplacements dans le monde ; il est désactivé par défaut. Des règles d'alerte personnalisées peuvent surveiller les métriques Cloud Run et notifier support_users.

VariableGroupeValeur par défautDescription
uptime_check_config14{ enabled=false, path="/api/health" }Test de disponibilité : enabled, path, check_interval, timeout. Désactivé par défaut.
alert_policies14[]Règles d'alerte sur les métriques. Chacune : name, metric_type, comparison, threshold_value, duration_seconds, aggregation_period.
support_users2[]Adresses e-mail notifiées lors du déclenchement des tests de disponibilité et des règles d'alerte.

9. Explorer avec la console GCP​

Après un déploiement réussi, utilisez la console GCP pour vérifier et explorer le déploiement Listmonk.

Service Cloud Run

Accédez à Cloud Run dans la console et sélectionnez le service listmonk (nommé app<listmonk><tenant><id>). Points clés à examiner :

  • Onglet Revisions : affiche toutes les révisions de conteneur déployées, les pourcentages de répartition du trafic et les condensés (digests) des images. La révision active doit afficher le tag latest ou une version précise.
  • Onglet Logs : diffuse en temps réel les journaux du conteneur Cloud Run. Filtrez sur severity=ERROR pour faire ressortir les problèmes de démarrage de Listmonk ou de connexion à la base. Au premier démarrage, repérez les lignes de journal d'installation du schéma de Listmonk (Running install..., Admin user created).
  • Onglet Metrics : affiche le nombre de requêtes, la latence des requêtes (P50/P95/P99), le nombre d'instances et la latence de démarrage des conteneurs. Un pic du nombre d'instances lors de l'envoi d'une grande campagne est normal.
  • Onglet YAML : affiche la spécification complète du service Cloud Run, y compris les noms des variables d'environnement (pas leurs valeurs), les montages de volumes, la configuration des sondes de santé et les limites de ressources.

Secret Manager

Accédez à Secret Manager et filtrez sur le nom du déploiement. Deux secrets sont pertinents :

  • app<listmonk><tenant><id>-admin-password ou similaire — le secret qui alimente la variable d'environnement de conteneur LISTMONK_ADMIN_PASSWORD. Cliquez sur View secret versions pour confirmer qu'une version existe. Ne cliquez pas sur View secret value en production.
  • app<listmonk><tenant><id>-db-password — le secret du mot de passe PostgreSQL. Utilisé à la fois par le service Cloud Run et par le job db-init.

Sélectionnez l'un ou l'autre secret et consultez l'onglet Replication pour confirmer que le secret est répliqué dans la région du déploiement.

Cloud SQL

Accédez à SQL et ouvrez l'instance Cloud SQL de Listmonk. Points clés :

  • Overview : confirme le moteur PostgreSQL 15, le niveau de l'instance et la taille du stockage.
  • Onglet Databases : la base de données listmonk doit figurer dans la liste. Après le premier déploiement, les tables du schéma Listmonk sont présentes.
  • Onglet Users : l'utilisateur applicatif listmonk doit figurer dans la liste.
  • Onglet Connections : examinez Authorized networks et confirmez que seul le Cloud SQL Auth Proxy (via le compte de service Cloud Run) dispose d'un accès. Aucune IP publique ne devrait être nécessaire.
  • Onglet Backups : confirme la planification des sauvegardes automatisées et liste les fichiers de sauvegarde récents.
  • Onglet Operations : affiche les opérations récentes, y compris l'historique des connexions du job db-init.

Cloud Build

Accédez à Cloud Build → History pour examiner les exécutions de build récentes. Le déploiement initial déclenche un build qui empaquette l'image de conteneur Listmonk. Chaque entrée de build indique le tag de l'image, la durée du build et les journaux de chaque étape. Cliquez sur un build pour voir les étapes du Dockerfile et le docker push final vers Artifact Registry.

Artifact Registry

Accédez à Artifact Registry et ouvrez le dépôt listmonk. Le dépôt liste tous les tags d'image poussés, avec leurs condensés, leurs horodatages de push et leurs tailles. Vérifiez que l'image la plus récente est présente.

Cloud Monitoring

Accédez à Monitoring → Uptime checks et trouvez le test de disponibilité de Listmonk. Le test interroge /api/health depuis plusieurs emplacements dans le monde. Un statut vert confirme que le service est joignable et en bonne santé depuis le réseau mondial de GCP.

Accédez à Monitoring → Alerting pour voir les règles d'alerte actives créées par le module. Les support_users sont automatiquement ajoutés comme destinataires des canaux de notification.


10. Explorer avec gcloud​

Les commandes gcloud suivantes offrent une visibilité opérationnelle sur le déploiement Cloud Run de Listmonk. Remplacez PROJECT_ID, REGION et SERVICE_NAME par les valeurs de votre déploiement. Le nom du service suit le modèle app<listmonk><tenant><id> — récupérez-le depuis la sortie Terraform service_name.

Récupérer l'URL et la configuration du service :

# Get the Cloud Run service URL
gcloud run services describe SERVICE_NAME \
--region=REGION \
--project=PROJECT_ID \
--format="value(status.url)"

# Describe the full service configuration
gcloud run services describe SERVICE_NAME \
--region=REGION \
--project=PROJECT_ID \
--format=yaml

Vérifier la santé du service et ses révisions :

# List all revisions and their traffic allocations
gcloud run revisions list \
--service=SERVICE_NAME \
--region=REGION \
--project=PROJECT_ID \
--format="table(metadata.name,status.conditions[0].status,spec.containers[0].image,status.observedGeneration)"

# Check revision traffic split
gcloud run services describe SERVICE_NAME \
--region=REGION \
--project=PROJECT_ID \
--format="value(spec.traffic[].percent,spec.traffic[].revisionName)"

Diffuser et filtrer les journaux :

# Tail live logs from the Listmonk service
gcloud logging read \
"resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME" \
--project=PROJECT_ID \
--limit=50 \
--freshness=10m \
--format="table(timestamp,severity,textPayload)"

# Filter for errors only
gcloud logging read \
"resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND severity>=ERROR" \
--project=PROJECT_ID \
--limit=20

# View db-init job logs
gcloud logging read \
"resource.type=cloud_run_job AND resource.labels.job_name~db-init" \
--project=PROJECT_ID \
--limit=30 \
--format="table(timestamp,severity,textPayload)"

Inspecter les secrets :

# List all Secret Manager secrets in the project (filter by deployment)
gcloud secrets list \
--project=PROJECT_ID \
--filter="name~listmonk" \
--format="table(name,replication.automatic,createTime)"

# Check secret versions for the admin password
gcloud secrets versions list LISTMONK_ADMIN_PASSWORD_SECRET_NAME \
--project=PROJECT_ID \
--format="table(name,state,createTime)"

# Access the admin password (use with caution — only in break-glass scenarios)
gcloud secrets versions access latest \
--secret=LISTMONK_ADMIN_PASSWORD_SECRET_NAME \
--project=PROJECT_ID

Inspection de Cloud SQL :

# List Cloud SQL instances
gcloud sql instances list \
--project=PROJECT_ID \
--format="table(name,databaseVersion,settings.tier,region,state)"

# Describe the Listmonk instance
gcloud sql instances describe SQL_INSTANCE_NAME \
--project=PROJECT_ID \
--format="yaml(databaseVersion,settings.tier,settings.ipConfiguration,state)"

# List databases on the instance
gcloud sql databases list \
--instance=SQL_INSTANCE_NAME \
--project=PROJECT_ID

# List users on the instance
gcloud sql users list \
--instance=SQL_INSTANCE_NAME \
--project=PROJECT_ID

Jobs Cloud Run (db-init) :

# List all Cloud Run Jobs in the region
gcloud run jobs list \
--region=REGION \
--project=PROJECT_ID \
--format="table(metadata.name,status.conditions[0].status,metadata.creationTimestamp)"

# Describe the db-init job
gcloud run jobs describe JOB_NAME \
--region=REGION \
--project=PROJECT_ID

# Manually execute the db-init job (e.g., after a database recreation)
gcloud run jobs execute JOB_NAME \
--region=REGION \
--project=PROJECT_ID \
--wait

Disponibilité et surveillance :

# List uptime checks
gcloud monitoring uptime list-configs \
--project=PROJECT_ID \
--format="table(displayName,httpCheck.path,period,checkerType)"

# List Cloud Monitoring alert policies
gcloud alpha monitoring policies list \
--project=PROJECT_ID \
--format="table(displayName,enabled,conditions[0].displayName)"

Artifact Registry :

# List images in the Listmonk repository
gcloud artifacts docker images list REGION-docker.pkg.dev/PROJECT_ID/listmonk \
--project=PROJECT_ID \
--format="table(image,tags,createTime)" \
--include-tags

# List all tags for the Listmonk image
gcloud artifacts docker tags list REGION-docker.pkg.dev/PROJECT_ID/listmonk/listmonk \
--project=PROJECT_ID

11. Comportements gérés par la plateforme​

Les comportements suivants sont appliqués automatiquement par Listmonk CloudRun, quelles que soient les valeurs des variables.

ComportementDétail
PostgreSQL 15 obligatoiredatabase_type = "POSTGRES_15" par défaut. Listmonk ne prend pas en charge MySQL ni d'autres moteurs.
Mot de passe administrateur généré automatiquementGénéré par Listmonk Common et injecté dans le conteneur sous LISTMONK_ADMIN_PASSWORD (tiret bas simple ; l'ancien nom de style configuration LISTMONK_app__admin_password, déprécié, a été supprimé). Stocké dans Secret Manager, jamais dans l'état.
Variable d'environnement du mot de passe de base prérégléedb_password_env_var_name = "LISTMONK_db__password" est préconfiguré afin que App CloudRun injecte le mot de passe de la base de données sous le nom attendu par la configuration de Listmonk.
Chemin de téléversement GCS FuseLISTMONK_upload__provider=filesystem et LISTMONK_upload__filesystem__upload_path=/listmonk/uploads sont injectés automatiquement. Montez un bucket GCS sur /listmonk/uploads via gcs_volumes pour des téléversements persistants.
Job db-init par défautFourni par Listmonk Common lorsque initialization_jobs = []. La base de données et l'utilisateur PostgreSQL sont créés automatiquement.
Mise en miroir des images activéeenable_image_mirroring = true par défaut. L'image de base Listmonk est mise en miroir dans Artifact Registry avant le déploiement.
Redis désactivé par défautenable_redis = false. Listmonk n'a pas besoin de Redis en fonctionnement standard.
Répertoire des scriptsscripts_dir est résolu vers Listmonk_Common/scripts au moment de l'apply.

12. Référence des variables​

Toutes les variables configurables par l'utilisateur exposées par Listmonk CloudRun, triées par groupe d'interface puis par ordre.

VariableGroupeValeur par défautDescription
project_id1—ID du projet GCP. Obligatoire.
region1'us-central1'Région GCP de toutes les ressources.
tenant_id2'demo'Suffixe court ajouté au nom de toutes les ressources.
support_users2[]Adresses e-mail destinataires des alertes de surveillance.
resource_labels2{}Libellés appliqués à toutes les ressources provisionnées.
application_name3'listmonk'Nom de base des ressources. À ne pas modifier après le déploiement initial.
display_name3'Listmonk'Nom lisible.
description3(description de Listmonk)Description du service.
application_version3'latest'Tag de l'image de conteneur Listmonk.
admin_username3'listmonk'Déclarée mais actuellement inutilisée par main.tf — le nom d'utilisateur administrateur injecté est codé en dur à "admin" via LISTMONK_ADMIN_USER, quelle que soit la valeur de cette variable.
deploy_application4trueDéfinissez false pour un déploiement d'infrastructure uniquement.
cpu_limit4'1000m'CPU par instance.
memory_limit4'512Mi'Mémoire par instance.
min_instance_count40Nombre minimal d'instances en cours d'exécution. Mise à l'échelle à zéro par défaut.
max_instance_count41Nombre maximal d'instances en cours d'exécution.
cpu_always_allocated4trueMaintient le CPU alloué sur une instance active afin que l'expéditeur de campagnes asynchrone puisse terminer après le retour de la requête déclenchante.
execution_environment4'gen2'Gen2 requis pour les montages GCS Fuse.
timeout_seconds4300Durée maximale d'une requête, en secondes.
enable_cloudsql_volume4trueSidecar Auth Proxy pour les connexions par socket Unix à PostgreSQL.
cloudsql_volume_mount_path4'/cloudsql'Chemin dans le conteneur du socket Unix de l'Auth Proxy.
container_port49000Port HTTP natif de Listmonk.
container_protocol4'http1''http1' ou 'h2c'.
enable_image_mirroring4trueMet en miroir l'image Listmonk dans Artifact Registry.
traffic_split4[]Répartition du trafic canary/blue-green.
max_revisions_to_retain47Nombre maximal de révisions Cloud Run à conserver.
service_annotations4{}Annotations Cloud Run avancées.
service_labels4{}Libellés appliqués au service Cloud Run.
ingress_settings5'all''all', 'internal' ou 'internal-and-cloud-load-balancing'.
vpc_egress_setting5'PRIVATE_RANGES_ONLY''PRIVATE_RANGES_ONLY' ou 'ALL_TRAFFIC'.
enable_iap5falseActive IAP nativement sur le service Cloud Run.
iap_authorized_users5[]Utilisateurs/comptes de service ayant accès via IAP.
iap_authorized_groups5[]Groupes Google ayant accès via IAP.
environment_variables6{}Variables d'environnement en texte clair.
secret_environment_variables6{}Références Secret Manager.
secret_propagation_delay630Secondes d'attente après la création d'un secret.
secret_rotation_period6'2592000s'Fréquence des notifications de rotation de Secret Manager.
backup_schedule7'0 2 * * *'Expression cron (UTC) des sauvegardes automatisées.
backup_retention_days77Nombre de jours de conservation des fichiers de sauvegarde dans GCS.
enable_backup_import7falseDéclenche une restauration ponctuelle lors de l'apply.
backup_source7'gcs''gcs' (URI complète) ou 'gdrive' (ID de fichier).
backup_uri7""URI GCS complète ou ID de fichier Google Drive.
backup_format7'sql'Format de sauvegarde. Options : sql, tar, gz, tgz, tar.gz, zip.
enable_cicd_trigger8falseProvisionne un déclencheur Cloud Build GitHub.
github_repository_url8""URL HTTPS complète du dépôt GitHub.
github_token8""PAT GitHub. Requis lors du premier apply. Sensible.
github_app_installation_id8""ID d'installation de l'application GitHub.
cicd_trigger_config8{ branch_pattern = "^main$" }Configuration avancée du déclencheur Cloud Build.
enable_cloud_deploy8falseProvisionne un pipeline de livraison progressive Cloud Deploy.
cloud_deploy_stages8[dev, staging, prod(approval)]Étapes de promotion Cloud Deploy ordonnées.
enable_binary_authorization8falseImpose l'attestation des images au déploiement.
enable_custom_sql_scripts9falseExécute des scripts SQL depuis GCS après le provisionnement.
custom_sql_scripts_bucket9""Bucket GCS contenant les scripts SQL.
custom_sql_scripts_path9""Préfixe de chemin dans le bucket.
custom_sql_scripts_use_root9falseExécute les scripts avec l'utilisateur root de la base.
nfs_instance_name9""Nom d'une VM NFS GCE existante. Laissez vide pour la découverte automatique.
nfs_instance_base_name9'app-nfs'Nom de base de la VM NFS créée en mode intégré. L'ID de déploiement y est ajouté.
enable_cloud_armor10falseProvisionne un équilibreur de charge HTTPS global + Cloud Armor WAF.
admin_ip_ranges10[]Plages CIDR exemptées des règles WAF.
application_domains10[]Domaines personnalisés avec certificats SSL gérés par Google.
enable_cdn10falseActive Cloud CDN sur le backend de l'équilibreur de charge HTTPS.
max_images_to_retain107Nombre maximal d'images de conteneur à conserver dans Artifact Registry.
delete_untagged_images10trueSupprime automatiquement les images sans tag d'Artifact Registry.
image_retention_days1030Nombre de jours après lequel les images peuvent être supprimées.
create_cloud_storage11trueDéfinissez false pour ne pas créer de buckets GCS.
storage_buckets11[]Buckets GCS supplémentaires à provisionner.
enable_nfs11falseProvisionne un stockage partagé NFS. Non requis pour les déploiements Listmonk standard.
nfs_mount_path11'/mnt/nfs'Chemin dans le conteneur où NFS est monté.
gcs_volumes11[]Buckets GCS à monter via GCS Fuse. Montez le bucket de téléversements sur /listmonk/uploads.
manage_storage_kms_iam11falseCrée une clé KMS CMEK et active CMEK sur tous les buckets de stockage.
enable_artifact_registry_cmek11falseCrée une clé KMS Artifact Registry pour le chiffrement des images au repos.
database_type12'POSTGRES_15'Moteur Cloud SQL. À ne pas modifier — Listmonk exige PostgreSQL.
db_name12'listmonk'Nom de la base de données PostgreSQL. À ne pas modifier après le déploiement initial.
db_user12'listmonk'Utilisateur applicatif PostgreSQL.
db_password_env_var_name12'LISTMONK_db__password'Nom de la variable d'environnement d'injection du mot de passe de la base. À ne pas modifier.
database_password_length1232Longueur du mot de passe généré automatiquement. Plage : 16–64.
enable_auto_password_rotation12falseRotation automatisée des mots de passe sans interruption de service.
rotation_propagation_delay_sec1290Secondes d'attente après la rotation avant le redémarrage du service.
initialization_jobs13[]Jobs Cloud Run ponctuels. Laissez vide pour le job db-init par défaut.
cron_jobs13[]Jobs Cloud Run planifiés récurrents.
startup_probe14{ enabled=true, type="TCP", path="/api/health", initial_delay_seconds=30, failure_threshold=30, ... }Sonde de démarrage. TCP — /api/health exige une session authentifiée.
liveness_probe14{ enabled=false, type="HTTP", path="/api/health", initial_delay_seconds=30, failure_threshold=3, ... }Sonde de vivacité. Désactivée par défaut.
uptime_check_config14{ enabled=false, path="/api/health" }Test de disponibilité Cloud Monitoring. Désactivé par défaut.
alert_policies14[]Règles d'alerte sur les métriques Cloud Monitoring.
enable_redis21falseIntégration Redis. Non requise pour Listmonk.
redis_host21""Nom d'hôte/IP de Redis.
redis_port21'6379'Port TCP de Redis (chaîne).
redis_auth21""Mot de passe Redis AUTH. Sensible.
enable_vpc_sc22falseInscrit les appels d'API dans le périmètre VPC-SC du projet.
vpc_cidr_ranges22[]Plages CIDR des sous-réseaux VPC pour le niveau d'accès réseau VPC-SC.
vpc_sc_dry_run22trueJournalise les violations VPC-SC sans les bloquer. Définissez false pour les appliquer.
organization_id22""ID de l'organisation GCP pour VPC-SC. Découvert automatiquement à partir du projet s'il est vide.
enable_audit_logging22falseActive les journaux d'audit Cloud détaillés.

13. Sorties​

SortieDescription
service_nameNom du service Cloud Run.
service_urlURL publique du service Cloud Run.
service_locationRégion GCP dans laquelle le service Cloud Run est déployé.
project_idID du projet GCP.
deployment_idSuffixe d'ID de déploiement utilisé dans les noms de ressources.
database_instance_nameNom de l'instance Cloud SQL PostgreSQL.
database_nameNom de la base de données applicative.
database_userNom de l'utilisateur de la base de données applicative.
database_password_secretNom du secret Secret Manager contenant le mot de passe de la base de données.
storage_bucketsBuckets de stockage GCS créés.
container_imageImage de conteneur utilisée pour le déploiement.
cicd_enabledIndique si le pipeline CI/CD est activé.
github_repository_urlURL du dépôt GitHub connecté pour le CI/CD.

14. Pièges de configuration et valeurs par défaut judicieuses​

Niveaux de risque : Critique (perte de données, panne complète, faille de sécurité) — Élevé (service indisponible ou dégradation importante) — Moyen (fonctionnement dégradé ou coût accru) — Faible (impact mineur).

VariableValeur par défaut judicieuseRisqueConséquence d'une valeur incorrecte
project_id(obligatoire)CritiqueAucune valeur par défaut — le déploiement échoue immédiatement.
database_type"POSTGRES_15"CritiqueListmonk prend exclusivement en charge PostgreSQL. Passer à MySQL ou SQL Server fait échouer Listmonk au démarrage.
db_name"listmonk"CritiqueImmuable après le premier déploiement — la modifier pousse Terraform à recréer la base de données, ce qui détruit tous les abonnés, campagnes et paramètres.
db_user"listmonk"CritiqueImmuable après le premier déploiement — la modifier recrée l'utilisateur Cloud SQL et invalide tous les identifiants stockés.
db_password_env_var_name"LISTMONK_db__password"CritiqueListmonk lit exactement ce nom de variable d'environnement pour le mot de passe de sa base de données. Le modifier empêche Listmonk de se connecter à PostgreSQL au démarrage.
min_instance_count0FaibleLa mise à l'échelle à zéro est la valeur par défaut et elle est sûre : l'utilisateur d'API auto-réparé, injecté en base, garantit qu'une instance démarrée à froid recharge toujours un identifiant valide, et cpu_always_allocated = true permet à l'expéditeur de campagnes asynchrone de l'instance réveillée d'aller jusqu'au bout. Passez à 1 uniquement pour une utilisation interactive intensive de l'administration où les démarrages à froid sont indésirables.
memory_limit"512Mi"MoyenSuffisant pour de petites listes. Des listes de plusieurs millions d'abonnés ou un traitement concurrent de campagnes peuvent épuiser 512Mi sous charge. Augmentez à 1–2 Gi pour les déploiements de production comptant de nombreux abonnés.
enable_cloudsql_volumetrueCritiqueListmonk se connecte par défaut à PostgreSQL via le socket Unix de l'Auth Proxy. Désactiver le volume sans fournir de chemin de connexion TCP fait échouer toutes les opérations sur la base de données.
gcs_volumes[]MoyenSans volume GCS Fuse sur /listmonk/uploads, les fichiers médias téléversés sont stockés de manière éphémère sur le système de fichiers du conteneur et perdus lors du remplacement de la révision. À configurer pour tout déploiement qui accepte des pièces jointes ou des téléversements de médias.
ingress_settings"all"Moyen"all" expose l'interface d'administration de Listmonk sur l'internet public. Pour les déploiements de newsletters internes, envisagez enable_iap = true ou ingress_settings = "internal".
enable_cloud_armorfalseMoyenSans Cloud Armor, l'API et l'interface d'administration de Listmonk sont exposées sans protection WAF. Les grandes listes d'abonnés sont des cibles de choix pour le moissonnage de données. Recommandé pour tout déploiement de production.
backup_retention_days7MoyenSept jours sont insuffisants pour des bases d'abonnés de production. Perdre les données des abonnés, l'historique des campagnes et les enregistrements de désabonnement représente un risque de conformité sérieux. Augmentez à 30 jours ou plus pour tout déploiement de production.
enable_backup_importfalseCritiqueExige que backup_uri soit un chemin GCS ou Drive valide et accessible. L'activer avec un backup_uri vide fait échouer le job Cloud Run de restauration pendant l'apply.
vpc_egress_setting"PRIVATE_RANGES_ONLY"MoyenListmonk doit joindre des fournisseurs SMTP/API externes pour envoyer les campagnes. PRIVATE_RANGES_ONLY autorise la sortie publique directe. Passer à "ALL_TRAFFIC" avec un pare-feu VPC restrictif bloquera les connexions SMTP/API sortantes et empêchera silencieusement la distribution des campagnes.
secret_propagation_delay30FaibleParfois insuffisant dans les configurations multirégionales. Augmentez à 60–90 s si des secrets sont introuvables pendant l'apply.

15. Destruction des ressources​

Problème de suppression connu : libération des adresses IPv4 sans serveur​

Lors de la destruction d'un déploiement Cloud Run, vous pouvez rencontrer une erreur semblable à celle-ci :

Error: Error waiting for Subnetwork to be deleted: The following serverless IPv4 address(es) on subnet ... are still in use.

Cause : GCP conserve de manière asynchrone les adresses IPv4 serverless sur le sous-réseau VPC après la suppression d'un service Cloud Run. Ces adresses sont libérées par GCP environ 20–30 minutes après la suppression du service Cloud Run.

Résolution : attendez 20–30 minutes après la première tentative de destruction, puis relancez la commande de destruction :

tofu destroy

La seconde exécution réussit dès que GCP a libéré les adresses réservées.

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