Aller au contenu principal

Mautic sur GKE Autopilot

Mautic sur GKE Autopilot

Mautic est une plateforme open source d'automatisation marketing pour les campagnes d'e-mailing, la gestion des contacts, les pages d'atterrissage et la notation des prospects. Ce module déploie Mautic sur GKE Autopilot au-dessus du socle App_GKE, qui provisionne et gère l'infrastructure Google Cloud et Kubernetes partagée.

Ce guide se concentre sur les services cloud qu'utilise Mautic 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 à toute application GKE — Workload Identity, entrée, autoscaling, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls, sauvegardes et cycle de vie du déploiement — reportez-vous au guide du socle App_GKE : ils ne sont pas répétés ici.


1. Vue d'ensemble​

Mautic s'exécute sous forme de charge de travail web PHP/Apache. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculGKE AutopilotPods PHP/Apache, 2 vCPU / 4 GiB par défaut, autoscaling horizontal
Base de donnéesCloud SQL for MySQL 8.0Obligatoire — Mautic ne prend pas en charge PostgreSQL
Fichiers partagésFilestore (NFS)Médias et ressources téléversés partagés entre tous les réplicas
Stockage objetCloud StorageUn bucket dédié aux médias
Cache et sessionsRedisActivé par défaut ; se rabat sur l'IP de l'hôte NFS lorsqu'aucun hôte Redis n'est indiqué
SecretsSecret ManagerMot de passe administrateur et mot de passe de la base de données générés automatiquement
EntréeCloud Load BalancingLoadBalancer externe, domaine personnalisé facultatif + certificat géré

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

  • MySQL 8.0 est obligatoire. Le moteur de base de données est fixe ; choisir PostgreSQL ou NONE empêche le démarrage.
  • Redis est activé par défaut. Avec plus d'un réplica, un cache partagé est nécessaire pour garder la cohérence de l'état des sessions et des campagnes.
  • L'affinité de session est ClientIP. Mautic s'appuie sur les sessions PHP ; les requêtes d'un même navigateur sont donc dirigées vers un seul pod.
  • Les migrations de la base de données s'exécutent à chaque démarrage de pod (de façon idempotente), de sorte que les montées de version s'appliquent automatiquement. La sonde de démarrage accorde environ 90 secondes à la configuration du premier démarrage.
  • Le mot de passe administrateur de Mautic est généré automatiquement et stocké dans Secret Manager ; vous ne le définissez jamais en clair.

2. Services Google Cloud et comment les explorer​

Toutes les commandes supposent que vous avez exécuté gcloud container clusters get-credentials <cluster> --region <region> --project <project> et que PROJECT, REGION et NAMESPACE sont définis. L'espace de noms et les autres identifiants sont indiqués dans les sorties du déploiement.

A. GKE Autopilot — la charge de travail Mautic​

Les pods Mautic sont planifiés sur Autopilot, qui facture le CPU et la mémoire réellement demandés par les pods. L'Horizontal Pod Autoscaling dimensionne le déploiement entre les nombres minimal et maximal de réplicas.

  • Console : Kubernetes Engine → Workloads → sélectionnez la charge de travail Mautic pour voir les pods, les révisions et les événements. Kubernetes Engine → Services & Ingress affiche l'IP externe.
  • CLI :
    kubectl get pods,svc,hpa -n "$NAMESPACE"
    kubectl logs -n "$NAMESPACE" deploy/<service-name> --tail=100
    kubectl describe hpa -n "$NAMESPACE" # current vs target utilisation

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

B. Cloud SQL for MySQL 8.0​

Mautic stocke toutes les données de l'application (contacts, campagnes, segments) dans une instance gérée Cloud SQL for MySQL 8.0. Les pods y accèdent de manière privée via le sidecar Cloud SQL Auth Proxy sur un socket Unix ; aucune IP publique n'est donc exposée. Lors du premier déploiement, un Job d'initialisation crée 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"
    # Open an interactive shell to inspect schema/data:
    gcloud sql connect <instance-name> --user=<db-user> --project "$PROJECT"

Le nom de l'instance, le nom de la base de données, l'utilisateur et le secret Secret Manager contenant le mot de passe figurent tous dans les sorties. Pour le modèle de connexion, les sauvegardes automatisées et la rotation des mots de passe, voir App_GKE.

C. Filestore (NFS) et Cloud Storage​

Les médias téléversés sont écrits sur un partage Filestore (NFS) monté dans chaque pod, de sorte que tous les réplicas voient les mêmes fichiers. Un bucket Cloud Storage dédié est également provisionné pour les médias ; l'accès est accordé automatiquement au compte de service de la charge de travail.

  • Console : Filestore → Instances pour le partage NFS ; Cloud Storage → Buckets pour le bucket des médias.
  • CLI :
    gcloud filestore instances list --project "$PROJECT"
    gcloud storage buckets list --project "$PROJECT"
    gcloud storage ls gs://<media-bucket>/ # bucket name is in the Outputs
    # Confirm the share is mounted inside a pod:
    kubectl exec -n "$NAMESPACE" deploy/<service-name> -- df -h | grep -i nfs

Voir App_GKE pour le provisionnement NFS, GCS Fuse et les options CMEK.

D. Cache Redis​

Redis prend en charge la mise en cache de Mautic et, dans les déploiements multi-réplica, maintient la cohérence du cache et des verrous. Lorsqu'aucun hôte Redis externe n'est configuré et que NFS est activé, l'IP de l'hôte NFS sert de point de terminaison Redis.

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

E. Secret Manager​

Le mot de passe administrateur de Mautic et le mot de passe de la base de données sont stockés sous forme de secrets Secret Manager et injectés dans les pods à l'exécution ; aucune valeur en clair n'apparaît dans la configuration.

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

Le nom du secret du mot de passe de la base de données figure dans les sorties. Voir App_GKE pour l'intégration Secret Store CSI et la rotation.

F. Réseau et entrée​

Par défaut, la charge de travail est exposée via une IP externe de Cloud Load Balancing. Un domaine personnalisé avec un certificat géré par Google peut être activé, et une IP statique peut être réservée afin que l'adresse survive aux redéploiements.

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

Voir App_GKE pour les détails sur les domaines personnalisés, Cloud CDN et l'IP statique.

G. Cloud Logging et Monitoring​

Les sorties stdout/stderr des pods sont envoyées à Cloud Logging ; les métriques de GKE et de Cloud SQL sont envoyées à Cloud Monitoring. Des tests de disponibilité et des règles d'alerte facultatifs sont disponibles.

  • Console : Logging → Logs Explorer ; Monitoring → Dashboards / Alerting.
  • CLI :
    gcloud logging read 'resource.type="k8s_container" AND resource.labels.namespace_name="'"$NAMESPACE"'"' \
    --project "$PROJECT" --limit 50

3. Comportement de l'application Mautic​

  • Configuration de la base de données au premier déploiement. Un Job d'initialisation crée la base de données et l'utilisateur de Mautic et accorde les privilèges avant le démarrage de l'application. Il est idempotent et peut être relancé sans risque.

  • Migrations au démarrage. Chaque pod exécute les migrations de base de données de Mautic pendant son démarrage, de sorte qu'une montée de version de l'application applique automatiquement les modifications de schéma.

  • Commandes planifiées (essentielles). Les campagnes, la file d'envoi des e-mails et la mise à jour des segments de Mautic reposent sur des commandes planifiées. Sans elles, aucune campagne ne se déclenche et aucun e-mail n'est envoyé. Configurez-les comme tâches planifiées ; les commandes attendues par Mautic :

    CommandeRôleFréquence type
    mautic:segments:updateActualise l'appartenance aux segmentstoutes les 15 min
    mautic:campaigns:triggerDéclenche les événements de campagne planifiéstoutes les 15 min
    mautic:campaigns:messagesEnvoie les messages de campagne en file d'attentetoutes les 15 min
    mautic:queue:processTraite la file d'envoi des e-mailstoutes les 5 min
    mautic:maintenance:cleanupPurge les anciennes donnéeschaque semaine

    Inspectez les tâches planifiées et leurs exécutions :

    kubectl get cronjobs -n "$NAMESPACE"
    kubectl get jobs -n "$NAMESPACE" --sort-by=.metadata.creationTimestamp
  • Chemin de santé. Les sondes de disponibilité (readiness) et de vivacité utilisent la page de connexion de Mautic, qui ne renvoie HTTP 200 que lorsque l'application est entièrement initialisée.

  • Connexion administrateur. Le nom d'utilisateur et l'adresse e-mail de l'administrateur initial sont configurables ; le mot de passe se récupère dans Secret Manager (voir §2.E).


4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à Mautic ou notables pour lui sont listés ; toutes les autres entrées sont héritées d'App_GKE avec leur comportement et leurs valeurs par défaut standard.

Groupe 1 — Projet et identité​

VariableValeur par défautDescription
project_id(obligatoire)Projet Google Cloud cible.
regionus-central1Région de la charge de travail et des ressources régionales.

Groupe 2 — Environnement de déploiement​

VariableValeur par défautDescription
tenant_iddemoSuffixe court qui rend les noms de ressources uniques 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 pour le suivi des coûts et de la propriété.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namemauticNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameMauticNom convivial affiché dans la console.
application_descriptionMautic Marketing Automation on GKE AutopilotAnnotation de description de la charge de travail.
application_version5Tag de version de l'image Mautic ; incrémentez-le pour déployer une nouvelle version.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour ne provisionner que l'infrastructure.
cpu_limit2000mCPU par pod ; 2 vCPU recommandés pour Mautic.
memory_limit4GiMémoire par pod ; 4 GiB recommandés (évite les OOM PHP lors des imports).
min_instance_count1Nombre minimal de réplicas. Conservez ≥ 1 afin que les tâches planifiées disposent d'une cible.
max_instance_count5Nombre maximal de réplicas (plafond de l'autoscaler).
container_port80Mautic/Apache écoute sur le port 80.
enable_cloudsql_volumetrueSidecar Cloud SQL Auth Proxy pour les connexions par socket.
enable_vertical_pod_autoscalingfalseLaisse Autopilot ajuster automatiquement les demandes de ressources.

Groupe 5 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres non secrets supplémentaires. Les valeurs MAUTIC_* principales sont définies automatiquement.
secret_environment_variables{}Map variable d'environnement → nom du secret Secret Manager.

Groupe 6 — Backend GKE et cluster​

VariableValeur par défautDescription
service_typeLoadBalancerMode d'exposition du Service.
session_affinityClientIPRoutage persistant nécessaire aux sessions PHP de Mautic.
workload_typenullSe résout automatiquement en StatefulSet lorsque le stockage par pod est activé.
network_tags['nfsserver']Tags des nœuds/pods ; nfsserver est nécessaire à la connectivité NFS.

Groupe 7 — Quota de ressources​

VariableValeur par défautDescription
enable_resource_quotafalsePlafonne le CPU, la mémoire et le nombre d'objets de l'espace de noms.
quota_memory_requests / quota_memory_limits""Doivent utiliser des unités binaires (4Gi, 8192Mi) — les entiers sans suffixe sont lus comme des octets et bloquent la planification.

Groupe 8 — Règles de fiabilité​

VariableValeur par défautDescription
enable_pod_disruption_budgettrueProtège la disponibilité pendant les mises à niveau des nœuds.
pdb_min_available1Portez min_instance_count au-delà de 1 si vous avez besoin de marge pour les évictions.
enable_topology_spreadfalseRépartit les pods entre les zones.

Groupe 9 — Observabilité et santé​

VariableValeur par défautDescription
startup_probe / liveness_probeRemplacées par HTTP /healthzLe module détourne les deux sondes de la page de connexion de Mautic : /index.php/s/login renvoie HTTP 500 (redirection vers l'installateur) tant que la base de données n'est pas configurée ; les kube-probes ciblent donc plutôt le fichier statique /healthz, qui renvoie 200 quel que soit l'état de l'application.
uptime_check_configdésactivéTest de disponibilité Cloud Monitoring facultatif.
alert_policies[]Règles d'alerte sur les métriques facultatives.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser le job intégré de configuration de la base de données.
cron_jobs[]Configurez les commandes planifiées de Mautic décrites au §3 — indispensables aux campagnes et aux e-mails.

Groupe 11 — CI/CD et intégration GitHub​

Intégration standard Cloud Build / Cloud Deploy d'App_GKE — voir App_GKE. Entrées clés : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy.

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

VariableValeur par défautDescription
enable_nfstrueVolume Filestore partagé pour les médias de Mautic (à laisser activé en multi-réplica).
nfs_mount_path/mnt/nfsChemin de montage dans le conteneur.

Groupe 14 — Cloud Storage et Artifact Registry​

VariableValeur par défautDescription
create_cloud_storagetrueProvisionne le bucket des médias.
storage_buckets / gcs_volumes(définie)Buckets supplémentaires / montages GCS Fuse.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 15 — Cache Redis​

VariableValeur par défautDescription
enable_redistrueUtilise Redis pour le cache et les sessions.
redis_host""Laissez vide pour utiliser l'IP de l'hôte NFS ; définissez-le explicitement lorsque NFS est désactivé.
redis_port6379Port Redis.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible).

Groupe 16 — Backend de base de données​

VariableValeur par défautDescription
database_typeMYSQL_8_0Fixe — ne le modifiez pas.
application_database_namemauticNom de la base de données. Immuable après le premier déploiement.
application_database_usermauticUtilisateur applicatif. Immuable après le premier déploiement.
database_password_length32Longueur du mot de passe généré (16–64).
enable_auto_password_rotationfalseRotation du mot de passe de la base de données sans interruption de service.

Groupe 17 — Sauvegarde et maintenance​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron des sauvegardes automatisées (UTC).
backup_retention_days7Rétention ; portez-la à 30–90 pour la production ou la conformité.
enable_backup_import / backup_source / backup_urioptions de restaurationRestaure une sauvegarde lors du déploiement.

Groupe 18 — Scripts SQL personnalisés​

enable_custom_sql_scripts, custom_sql_scripts_bucket, custom_sql_scripts_path, custom_sql_scripts_use_root — exécutent du SQL depuis un bucket GCS après le provisionnement. Voir App_GKE.

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

VariableValeur par défautDescription
enable_custom_domaintrueProvisionne un Ingress pour les noms d'hôte personnalisés + un certificat géré.
application_domains[]Noms d'hôte à servir.
reserve_static_iptrueIP externe stable d'un redéploiement à l'autre.

Groupe 20 — Identity-Aware Proxy (IAP)​

VariableValeur par défautDescription
enable_iapfalseExige une connexion Google devant Mautic.
iap_authorized_users / iap_authorized_groups[]Personnes autorisées à accéder.
iap_oauth_client_id / iap_oauth_client_secret""Obligatoires lorsque IAP est activé (sensibles).
iap_support_email""Affichée sur l'écran de consentement OAuth.

Groupe 21 — Cloud Armor​

VariableValeur par défautDescription
enable_cloud_armorfalseAssocie une règle Cloud Armor (WAF) au backend de l'Ingress.
admin_ip_ranges[]CIDR autorisés à l'accès privilégié.
cloud_armor_policy_namedefault-waf-policyNom de la règle.

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éfinie)CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseCloud Audit Logs détaillés.

Groupe 23 — Paramètres de l'application Mautic​

VariableValeur par défautDescription
mautic_admin_usernameadminIdentifiant de l'administrateur initial.
mautic_admin_emailadmin@example.comAdresse e-mail de l'administrateur — indiquez une adresse réelle (les notifications système y sont envoyées).
mailer_from_nameMauticNom affiché sur les e-mails de campagne sortants.
mailer_from_emailmautic@example.comAdresse d'expédition — utilisez un domaine doté d'enregistrements SPF/DKIM valides, sinon les e-mails sont rejetés ou classés en spam.

5. Sorties​

Ces valeurs sont renvoyées lorsque le déploiement réussit ; c'est le moyen le plus rapide de localiser et d'explorer les ressources en cours d'exécution.

SortieDescription
service_nameNom du Service Kubernetes.
namespaceEspace de noms dans lequel s'exécute la charge de travail.
service_cluster_ipClusterIP interne au cluster.
service_external_ipIP externe du LoadBalancer (lorsqu'une IP statique est réservée).
service_urlURL permettant d'accéder à Mautic.
database_instance_nameNom de l'instance Cloud SQL.
database_nameNom de la base de données applicative.
database_userUtilisateur de la base de données applicative.
database_password_secretSecret Secret Manager contenant le mot de passe de la base de données.
database_host / database_portPoint de terminaison de la base de données (127.0.0.1 via l'Auth Proxy) / port.
storage_bucketsBuckets Cloud Storage créés.
network_name / network_exists / regionsRéseau VPC, présence, régions disponibles.
container_image / container_registryImage déployée et dépôt Artifact Registry.
monitoring_enabled / monitoring_notification_channelsÉtat de la surveillance et canaux.
initialization_jobs / db_import_jobNoms des jobs de configuration et (facultatif) d'import.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / cicd_configurationÉtat et détails de la CI/CD (dépôt, déclencheur, registre).
kubernetes_readyIndique si le cluster et la charge de travail sont prêts.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeÉtat de VPC-SC.
audit_logging_enabled / artifact_registry_cmek_enabledÉtat de la journalisation d'audit et de CMEK.

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

Risque : Critique (perte de données / panne / sécurité) — Élevé (service dégradé) — Moyen (coût ou dégradation partielle) — Faible (mineur).

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
database_typeMYSQL_8_0CritiqueMautic nécessite MySQL ; PostgreSQL/NONE empêche le démarrage.
cron_jobsconfigurés (§3)CritiqueSans les commandes planifiées, aucune campagne ne se déclenche et aucun e-mail n'est envoyé.
enable_nfstrueCritiqueSans stockage partagé, les fichiers téléversés sont perdus au redémarrage et ne sont pas partagés entre les réplicas.
application_database_name / _userdéfinis une seule foisCritiqueImmuables après le premier déploiement ; les renommer recrée la base de données/l'utilisateur et détruit les données.
enable_backup_importfalse sauf restaurationCritiqueL'activer sans backup_uri valide fait échouer le job d'import.
quota_memory_requests / _limitsunités binairesCritiqueLes entiers sans suffixe sont des octets et bloquent toute planification.
enable_redistrueÉlevéAvec plus d'un réplica, des caches isolés par pod provoquent des incohérences.
redis_host"" (NFS) ou expliciteÉlevéAucun point de terminaison valide si Redis est activé alors que NFS est désactivé et qu'aucun hôte n'est défini.
memory_limit4GiÉlevéUne mémoire insuffisante provoque des OOM PHP pendant les imports et les envois.
session_affinityClientIPÉlevéSans persistance, les connexions en multi-réplica perdent l'état de session.
mautic_admin_email / mailer_from_emailadresses réellesÉlevéLes valeurs d'exemple n'aboutissent nulle part et sont rejetées ou classées en spam.
min_instance_count1Élevé0 laisse les tâches planifiées sans pod sur lequel s'exécuter.
enable_iap / enable_cloud_armorà activer pour l'accès d'administrationMoyenSinon, l'interface d'administration est accessible publiquement.
backup_retention_days7 (à augmenter en production)MoyenTrop court pour les exigences de rétention liées à la conformité.
pdb_min_available vs min_instance_countprévoir de la margeMoyen1/1 peut bloquer les mises à niveau des nœuds (un pod unique ne peut pas être évincé).

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

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