Aller au contenu principal

EspoCRM sur Google Cloud Run

EspoCRM sur Google Cloud Run

EspoCRM est une plateforme open source de gestion de la relation client (CRM), sous licence GPLv3, construite sur PHP et Apache. Ce module déploie EspoCRM sur Cloud Run v2 au-dessus du socle App_CloudRun, qui provisionne et gère l'infrastructure Google Cloud partagée.

Ce guide se concentre sur les services cloud qu'utilise EspoCRM 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, ingress et équilibrage de charge, scaling 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​

EspoCRM s'exécute comme un conteneur PHP/Apache sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service Apache/PHP, 1 vCPU / 2 GiB par défaut, autoscaling serverless ; mise à l'échelle à zéro prise en charge
Base de donnéesCloud SQL for MySQL 8.0Obligatoire — EspoCRM ne prend pas en charge PostgreSQL ; connexion via TCP sur IP privée
Stockage d'objetsCloud Storage + Filestore (NFS)Un bucket GCS dédié gcs-espocrm<tenant-prefix>-espocrm-data est provisionné mais n'est pas monté par défaut ; un volume NFS partagé est monté sur /var/www/html/data pour les fichiers envoyés (enable_nfs = true par défaut)
CacheRedis (facultatif)Cache d'objets facultatif ; désactivé par défaut
SecretsSecret ManagerESPOCRM_ADMIN_PASSWORD généré automatiquement ; mot de passe de la base de données
IngressURL Cloud Run / Cloud Load BalancingURL run.app par défaut ; équilibreur de charge HTTPS externe + domaine personnalisé facultatifs

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

  • MySQL 8.0 est obligatoire. Le moteur de base de données est fixé par la couche applicative partagée (database_type = "MYSQL_8_0") ; EspoCRM ne prend pas en charge PostgreSQL.
  • La base de données est atteinte via TCP sur IP privée, et non via un socket. enable_cloudsql_volume vaut false par défaut sur Cloud Run. La connexion PDO MySQL d'EspoCRM nécessite un véritable hôte TCP ; cloud-entrypoint.sh se connecte donc à l'IP privée de Cloud SQL (DB_IP). Cloud SQL MySQL n'impose pas SSL sur le TCP en IP privée ; aucun câblage TLS supplémentaire n'est donc nécessaire.
  • Le compte administrateur est amorcé automatiquement. L'installateur amont crée l'utilisateur admin avec le ESPOCRM_ADMIN_PASSWORD généré automatiquement au premier démarrage — récupérez-le dans Secret Manager pour vous connecter.
  • Le schéma est créé au premier démarrage, et non par un job de migration. db-init crée la base de données et l'utilisateur ; le docker-entrypoint.sh amont exécute ensuite automatiquement l'action d'installation/migration au démarrage du conteneur.
  • La mise à l'échelle à zéro est activée par défaut (min_instance_count = 0, max_instance_count = 1). Les démarrages à froid ajoutent plusieurs secondes de latence à la première requête après une période d'inactivité. Définissez min_instance_count = 1 pour éviter les démarrages à froid.
  • NFS est activé par défaut. enable_nfs = true monte un volume Filestore partagé sur /var/www/html/data, de sorte que les pièces jointes envoyées et les données d'exécution d'EspoCRM persistent d'un redémarrage de conteneur à l'autre et sont partagées entre les instances — contrairement à un déploiement Cloud Run nu ne disposant que d'un disque éphémère. Le bucket GCS gcs-espocrm<tenant-prefix>-espocrm-data provisionné automatiquement n'est monté nulle part par défaut.
  • Instance unique par défaut. max_instance_count = 1 — Cloud Run n'a pas d'affinité de session intégrée ; conservez donc le service en instance unique, sauf si vous avez vérifié le comportement d'EspoCRM avec des sessions PHP concurrentes réparties sur plusieurs réplicas.
  • ESPOCRM_SITE_URL est dérivé de l'URL de service prévue au moment du plan et résolu par le point d'entrée, de sorte que les liens absolus et les vérifications de l'installateur d'EspoCRM utilisent le véritable hôte Cloud Run plutôt que localhost.
  • Ingress public par défaut. ingress_settings = "all" afin que l'interface du CRM soit accessible ; l'activation d'IAP place une connexion Google devant elle.

2. Services Google Cloud et comment les explorer​

Toutes les commandes supposent que PROJECT et REGION sont définis. Les noms du service et des ressources sont indiqués dans les Sorties du déploiement.

A. Cloud Run — le service EspoCRM​

EspoCRM s'exécute comme un service Cloud Run v2 qui s'adapte automatiquement à la charge des requêtes entre le nombre minimal et 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 voir 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 le scaling, la concurrence, l'environnement d'exécution et la répartition du trafic.

B. Cloud SQL for MySQL 8.0​

EspoCRM stocke toutes les données de l'application (contacts, prospects, opportunités, activités, utilisateurs) dans une instance gérée Cloud SQL for MySQL 8.0. Comme enable_cloudsql_volume vaut par défaut false, le service se connecte via l'IP privée (DB_IP) par la sortie VPC sur le port 3306 ; aucune IP publique n'est 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 voir les connexions, les sauvegardes, les flags et les métriques.
  • CLI :
    gcloud sql instances list --project "$PROJECT"
    gcloud sql instances describe <instance-name> --project "$PROJECT"
    gcloud sql connect <instance-name> --user=<db-user> --database=<db-name> --project "$PROJECT"

Le nom de l'instance, la base de données, l'utilisateur et le secret du mot de passe figurent dans les Sorties. Consultez App_CloudRun pour le modèle de connexion, les sauvegardes et la rotation du mot de passe.

C. Cloud Storage et NFS​

Un bucket Cloud Storage dédié (gcs-espocrm<tenant-prefix>-espocrm-data) est provisionné automatiquement, mais il n'est monté nulle part par défaut (gcs_volumes vaut [] par défaut). Le véritable stockage persistant des pièces jointes envoyées et des données d'exécution d'EspoCRM est un volume NFS (Filestore) partagé, monté sur /var/www/html/data puisque enable_nfs = true par défaut. Des buckets GCS supplémentaires peuvent être déclarés via storage_buckets, puis montés via gcs_volumes (nécessite l'environnement d'exécution gen2) si vous souhaitez utiliser le bucket.

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

Consultez App_CloudRun pour les options GCS Fuse, NFS et CMEK.

D. Redis (cache d'objets)​

Redis est désactivé par défaut. Lorsque enable_redis = true est défini, REDIS_HOST et REDIS_PORT sont injectés et EspoCRM utilise Redis comme backend de cache d'objets afin de réduire la charge sur la base de données. Lorsque redis_host est laissé vide et que enable_nfs vaut true, l'IP de la VM du serveur NFS est utilisée comme point de terminaison Redis.

  • Console : Memorystore → Redis (en cas d'utilisation d'une instance gérée).
  • CLI :
    redis-cli -h <redis-host> ping
    # Confirm the Redis env injected into the running revision:
    gcloud run services describe <service-name> --region "$REGION" \
    --format='value(spec.template.spec.containers[0].env)'

E. Secret Manager​

Le mot de passe administrateur initial (ESPOCRM_ADMIN_PASSWORD) est généré automatiquement et stocké dans Secret Manager, puis injecté dans le service sous forme de variable d'environnement secrète. Le mot de passe de la base de données est géré séparément par le socle.

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

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

F. Réseau et entrée​

Le service est accessible par défaut à son URL run.app. Un équilibreur de charge HTTPS externe avec un domaine personnalisé, Cloud CDN et Cloud Armor peut être ajouté ; les paramètres d'ingress et la sortie VPC contrôlent la connectivité. EspoCRM se connecte à Cloud SQL via le VPC ; la sortie VPC doit donc pouvoir atteindre l'IP privée.

  • 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 et de Cloud SQL sont envoyées à Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte facultatifs.

  • Console : Logging → Logs Explorer ; Monitoring → Dashboards / Alerting.
  • CLI :
    gcloud run services logs read <service-name> --project "$PROJECT" --region "$REGION" --limit 50

Le cloud-entrypoint.sh affiche au démarrage les valeurs résolues de ESPOCRM_DATABASE_* et ESPOCRM_SITE_URL — un moyen rapide de vérifier l'hôte de base de données et l'URL du site qu'utilise le conteneur.


3. Comportement de l'application EspoCRM​

  • Configuration de la base de données au premier déploiement. Un job d'initialisation exécute db-init.sh avec mysql:8.0-debian. Il résout la connexion Cloud SQL (socket de l'Auth Proxy s'il est présent, sinon TCP sur IP privée), crée de manière idempotente la base de données et l'utilisateur de l'application, accorde les privilèges et vérifie que l'utilisateur de l'application peut se connecter (en préchauffant le cache d'authentification caching_sha2_password de MySQL 8). Le job s'exécute lors de l'application et peut être relancé sans risque.
  • Schéma créé au premier démarrage. Il n'y a pas de job de migration distinct. Une fois que db-init a provisionné la base de données, le docker-entrypoint.sh amont d'EspoCRM exécute automatiquement l'action d'installation/migration au démarrage du conteneur, créant le schéma et l'utilisateur admin.
  • L'identifiant administrateur est généré automatiquement. Le mot de passe de l'utilisateur admin provient du secret ESPOCRM_ADMIN_PASSWORD. Récupérez-le avant votre première connexion :
    gcloud secrets versions access latest \
    --secret="secret-<resource_prefix>-espocrm-admin-password" --project "$PROJECT"
    Modifiez-le dans l'interface d'EspoCRM (Administration → Users) une fois connecté.
  • L'URL du site doit correspondre à l'hôte accessible. EspoCRM construit les liens absolus à partir de ESPOCRM_SITE_URL ; le point d'entrée la définit à partir de l'URL run.app prévue (ou de CLOUDRUN_SERVICE_URL à l'exécution). Si vous placez un domaine personnalisé devant le service, définissez l'URL du site sur cet hôte afin que les liens et les redirections OAuth soient corrects.
  • Chemin de santé. Le démarrage utilise une sonde TCP sur le port 80 ; la sonde de vivacité est HTTP GET / — EspoCRM y sert sa page de connexion sans authentification (200). Prévoyez plusieurs minutes au premier démarrage pour l'étape d'installation/migration (la sonde de vivacité par défaut a un délai initial de 300 secondes).
  • Les fichiers envoyés persistent sur NFS. Avec enable_nfs = true (par défaut), les pièces jointes et les données d'exécution d'EspoCRM résident sous le montage Filestore partagé /var/www/html/data, survivent aux redémarrages de conteneur et sont partagées entre les instances. Le bucket GCS gcs-espocrm<tenant-prefix>-espocrm-data est provisionné mais n'est pas monté par défaut.
  • Inspecter l'exécution des jobs :
    gcloud run jobs list --project "$PROJECT" --region "$REGION"
    gcloud run jobs executions list --job <job-name> --project "$PROJECT" --region "$REGION"

4. Variables de configuration​

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

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_nameespocrmNom de base des ressources. Ne pas modifier après le premier déploiement.
display_nameEspoCRMNom lisible affiché dans la Console.
application_versionlatestTag de l'image espocrm/espocrm ; latest est figé en interne sur 10.0.2. Figez une version précise en production.
php_memory_limit512MLimite de mémoire PHP ; à augmenter pour les plugins lourds ou les médias volumineux.
upload_max_filesize64MTaille maximale d'un fichier envoyé (≤ post_max_size).
post_max_size64MTaille maximale d'une requête POST ; doit être ≥ upload_max_filesize.

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 ; minimum 1 vCPU pour EspoCRM + MySQL.
memory_limit2GiMémoire par instance ; minimum 512Mi (PHP 8.x).
min_instance_count00 active la mise à l'échelle à zéro ; définissez 1 pour éviter les démarrages à froid.
max_instance_count1À maintenir à 1, sauf si le stockage partagé et l'affinité de session sont confirmés.
container_port80Apache écoute sur le port 80.
execution_environmentgen2Gen2 est requis pour les montages NFS et GCS Fuse.
timeout_seconds300Durée maximale d'une requête (0–3600 secondes).
enable_cloudsql_volumefalseEspoCRM se connecte à MySQL via TCP sur IP privée, et non via le socket.

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

VariableValeur par défautDescription
ingress_settingsallAccès public à l'interface du CRM.
vpc_egress_settingPRIVATE_RANGES_ONLYAchemine le trafic RFC 1918 (y compris l'IP privée de Cloud SQL) via le VPC.
enable_iapfalseExige une connexion Google devant EspoCRM.
iap_authorized_users / iap_authorized_groups[]Personnes autorisées à accéder via IAP.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueCrée le bucket gcs-espocrm<tenant-prefix>-espocrm-data. Il n'est monté nulle part, sauf si vous ajoutez une entrée gcs_volumes correspondante.
storage_buckets[{ name_suffix = "data" }]Définitions des buckets provisionnés lorsque create_cloud_storage vaut true.
enable_nfstrueMonte un volume Filestore partagé pour les pièces jointes envoyées et les données d'exécution d'EspoCRM — persistant d'un redémarrage à l'autre par défaut.
nfs_mount_path/var/www/html/dataChemin de montage du volume NFS dans le conteneur.
gcs_volumes[]Aucun montage GCS Fuse par défaut ; le bucket gcs-espocrm<tenant-prefix>-espocrm-data reste non monté, sauf si vous ajoutez une entrée ici.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typeMYSQL_8_0Moteur Cloud SQL. EspoCRM nécessite MySQL — ne sélectionnez pas PostgreSQL.
db_nameespocrmNom de la base de données MySQL. Immuable après le premier déploiement.
db_userespocrmUtilisateur de la base de données de l'application. Mot de passe généré automatiquement dans Secret Manager.
database_password_length32Longueur du mot de passe de base de données généré (plage valide : 16–64).

Groupe 21 — Cache Redis​

VariableValeur par défautDescription
enable_redisfalseActive Redis comme backend de cache d'objets d'EspoCRM.
redis_host""Point de terminaison Redis. Laissez vide pour utiliser l'IP du serveur NFS (nécessite enable_nfs = true).
redis_port6379Port Redis.

Toutes les autres entrées suivent le comportement standard d'App_CloudRun.


5. Sorties​

Renvoyées lorsqu'un déploiement réussit — le moyen le plus rapide de localiser et d'explorer les ressources en cours d'exécution.

SortieDescription
service_nameNom du service Cloud Run.
service_urlURL run.app par défaut du service.
service_locationRégion dans laquelle s'exécute le service.
stage_servicesURL des services propres à chaque étape (Cloud Deploy).
load_balancer_ip / load_balancer_urlIP / URL de l'équilibreur de charge HTTPS externe (lorsqu'il est activé).
database_instance_nameNom de l'instance Cloud SQL.
database_name / database_userNom / utilisateur de la base de données de l'application.
database_password_secretSecret Secret Manager contenant le mot de passe de la base de données.
database_host / database_portPoint de terminaison / port de la base de données.
storage_bucketsBuckets Cloud Storage créés.
network_name / network_exists / regionsRéseau VPC, présence, régions.
container_image / container_registryImage déployée et dépôt Artifact Registry.
monitoring_enabled / monitoring_notification_channels / uptime_check_namesÉtat de la surveillance, canaux, tests de disponibilité.
initialization_jobsNoms des jobs de configuration (db-init).
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 de la CI/CD.
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_idRegistre et déclencheur de build.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeÉtat de VPC-SC.
audit_logging_enabled / artifact_registry_cmek_enabledÉtat de la journalisation d'audit et de CMEK.

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

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

Validation héritée au moment du plan. Ce module fait passer sa configuration par le moteur du socle App_CloudRun, qui valide les valeurs et leurs combinaisons au moment du plan — une valeur redis_port/backup_retention_days hors plage, un environnement d'exécution gen1 avec des montages NFS/GCS, IAP sans identité autorisée. Une configuration invalide fait échouer le plan avec une erreur claire et nommée avant la création de toute ressource ; la plupart des erreurs ci-dessous sont donc détectées en amont plutôt qu'à l'application ou à l'exécution.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
database_typeMYSQL_8_0CritiqueEspoCRM ne prend en charge que MySQL ; sélectionner PostgreSQL fait échouer le démarrage.
db_name / db_userÀ définir une seule foisCritiqueImmuables après le premier déploiement ; les renommer recrée la base/l'utilisateur et détruit toutes les données.
ESPOCRM_ADMIN_PASSWORD (généré automatiquement)Le récupérer dans Secret Manager ; le modifier dans l'interfaceCritiqueNe définit le mot de passe administrateur que lors de la première installation ; le perdre vous bloque l'accès jusqu'à une réinitialisation via la base de données.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans URI de sauvegarde valide fait échouer le job d'import.
enable_nfstrueÉlevéLe désactiver relègue le stockage des pièces jointes d'EspoCRM au disque éphémère du conteneur — les fichiers envoyés sont perdus lorsqu'une instance est réduite ou recyclée.
max_instance_count1 sauf si la sécurité a été vérifiéeMoyenLes fichiers envoyés sont stockés sur NFS par défaut, mais Cloud Run n'a pas d'affinité de session intégrée — vérifiez le comportement d'EspoCRM avec des sessions PHP concurrentes avant de dépasser 1 instance.
enable_cloudsql_volumefalse (TCP sur IP privée)ÉlevéForcer le socket sans chemin correspondant dans le point d'entrée peut casser la connexion MySQL ; EspoCRM se connecte à l'IP privée par conception.
ESPOCRM_SITE_URL (dérivé automatiquement)URL réelle du service / du domaine personnaliséÉlevéUne URL de site incorrecte casse les liens absolus, la vérification de l'installateur et les redirections OAuth.
memory_limit2GiÉlevéEn dessous de 512Mi, PHP 8.x est arrêté pour OOM pendant l'installation/la migration et sous charge.
cpu_limit1000mMoyenEn dessous de 1 vCPU, l'installation au premier démarrage et le traitement des plugins lourds sont ralentis.
enable_iapuniquement lorsque l'interface publique n'est pas nécessaireMoyenIAP exige une connexion Google pour chaque requête, y compris les intégrations d'API.
min_instance_count1 en productionMoyenLa mise à l'échelle à zéro (0) ajoute un délai de démarrage à froid et, sans volume partagé, perd les fichiers envoyés locaux lors de la réduction.
application_versionÀ figer en productionMoyenlatest correspond en interne à un tag figé, mais figer explicitement la version évite les mises à niveau inattendues lors d'un redéploiement.

Pour le comportement du socle évoqué tout au long de ce guide — identité du service, scaling et concurrence, ingress 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 à EspoCRM partagée avec la variante GKE est décrite dans EspoCRM_Common.

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