Aller au contenu principal

Saleor sur Google Cloud Run

Saleor sur Google Cloud Run

Saleor est une plateforme d'e-commerce headless open source, pensée d'abord pour GraphQL et construite sur Python/Django (catalogue de produits, paiement de commande, commandes et plugins de paiement, le tout exposé via une API GraphQL plutôt qu'une vitrine intégrée). Ce module déploie Saleor 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 Saleor 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é de service, entrée et équilibrage de charge, mise à l'échelle et concurrence, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls, sauvegardes et cycle de vie du déploiement — reportez-vous au guide du socle App_CloudRun plutôt que de les répéter ici.


1. Vue d'ensemble​

Saleor s'exécute dans un conteneur construit sur mesure (ghcr.io/saleor/saleor:3.23 encapsulé avec un point d'entrée cloud) sur Cloud Run v2. Le déploiement assemble un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Deux services Cloud Run : l'API Saleor principale (uvicorn, 2 workers + worker/beat Celery colocalisé) et un service Dashboard précompilé distinct ; 2 vCPU / 3 GiB par défaut pour le service principal
Base de donnéesCloud SQL for PostgreSQL 15Obligatoire — fixé par Saleor_Common quelle que soit la valeur de database_type
Stockage d'objetsCloud StorageUn bucket media dédié provisionné automatiquement
Cache et brokerRedis (facultatif)Supporte CACHE_URL/CELERY_BROKER_URL pour le worker Celery colocalisé
SecretsSecret ManagerSECRET_KEY, RSA_PRIVATE_KEY, DJANGO_SUPERUSER_PASSWORD générés automatiquement ; mot de passe de la base de données
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut, entièrement publique ; équilibreur de charge HTTPS externe + domaine personnalisé facultatifs

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

  • PostgreSQL 15 est obligatoire. Saleor_Common fixe le moteur de base de données ; choisir une autre valeur dans database_type n'a aucun effet.
  • Le worker Celery (traitement des commandes, webhooks, e-mails, tâches planifiées) s'exécute en colocalisation dans le conteneur principal, lancé comme processus d'arrière-plan par le point d'entrée cloud — et non comme sidecar additional_services distinct. Il a besoin de la même image construite sur mesure, dont le socle ne connaît le chemin Artifact Registry qu'après l'appel de ce module ; la colocalisation évite donc un cycle au moment du plan.
  • cpu_always_allocated = true par défaut. Le worker Celery colocalisé a besoin de CPU en continu entre les requêtes, et pas seulement pendant le traitement d'une requête — il a été confirmé en conditions réelles que la facturation à la requête sous-dimensionne la charge de travail combinée.
  • Le dimensionnement des ressources est préréglé : 2000m de CPU / 3Gi de mémoire. Il a été confirmé en conditions réelles que des tailles inférieures provoquent des OOMKill sous la charge combinée de 2 workers uvicorn + Django + worker/beat Celery, le tout dans un seul conteneur.
  • Trois secrets sont générés automatiquement : SECRET_KEY, RSA_PRIVATE_KEY (la paire de clés de signature JWT de Saleor — ne jamais en effectuer la rotation à la légère) et DJANGO_SUPERUSER_PASSWORD.
  • Un service Dashboard distinct et réellement précompilé (ghcr.io/saleor/saleor-dashboard:3.23) est déployé aux côtés de l'API en tant qu'entrée additional_services. Son API_URL est intégrée à l'interface servie au démarrage du conteneur, calculée à partir de l'URL de service prévue de l'API principale + /graphql/.
  • Redis est facultatif et désactivé par défaut (enable_redis = false). Lorsqu'il est activé, redis_host doit être défini explicitement — Cloud Run ne dispose d'aucun repli automatique sur l'IP NFS.
  • Les sondes de santé ciblent /health/, sans authentification, avec un 200 confirmé en local comme en conditions réelles.
  • min_instance_count = 0 par défaut — l'API principale est mise à l'échelle à zéro lorsqu'elle est inactive ; définissez 1 en production pour éviter les démarrages à froid.

2. Services Google Cloud et comment les explorer​

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

A. Cloud Run — les services API et Dashboard de Saleor​

L'API de Saleor s'exécute comme un service Cloud Run v2 qui s'adapte automatiquement à la charge des requêtes. Le Dashboard s'exécute comme un second service Cloud Run indépendant (une entrée additional_services) qui sert le bundle statique de l'interface d'administration.

  • Console : Cloud Run → sélectionnez l'un ou l'autre service pour les révisions, le trafic, les journaux et les métriques.
  • CLI :
    gcloud run services list --project "$PROJECT" --region "$REGION"
    gcloud run services describe <service-name> --project "$PROJECT" --region "$REGION"
    gcloud run revisions list --service <service-name> --project "$PROJECT" --region "$REGION"

Consultez App_CloudRun pour la mise à l'échelle, la concurrence, l'environnement d'exécution et la répartition du trafic.

B. Cloud SQL for PostgreSQL 15​

Saleor stocke toutes les données applicatives (produits, commandes, paniers, utilisateurs, enregistrements de paiement) dans une instance gérée Cloud SQL for PostgreSQL 15. Le service s'y connecte en privé via le Cloud SQL Auth Proxy (socket Unix ou IP privée TCP selon enable_cloudsql_volume) ; aucune IP publique n'est exposée. Au premier déploiement, db-init crée la base de données et le rôle de l'application, puis db-migrate (qui dépend de db-init) applique les migrations de schéma de Django.

  • Console : SQL → sélectionnez l'instance pour les connexions, sauvegardes, flags et 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 des mots de passe.

C. Cloud Storage​

Un bucket Cloud Storage media dédié est provisionné automatiquement pour les ressources produits/médias téléversées dans Saleor. Des buckets supplémentaires peuvent être déclarés via storage_buckets.

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

Consultez App_CloudRun pour les options GCS Fuse et CMEK.

D. Redis (cache et broker Celery)​

Redis est désactivé par défaut. Lorsque enable_redis = true est défini, redis_host et redis_port sont injectés sous la forme REDIS_HOST/REDIS_PORT, et le point d'entrée cloud en compose CACHE_URL (base Redis /0) et CELERY_BROKER_URL (base Redis /1).

  • Console : Memorystore → Redis (si vous utilisez une instance gérée).
  • CLI :
    redis-cli -h <redis-host> ping
    # Confirm the composed URLs in the running revision's logs (entrypoint echoes on start):
    gcloud run services logs read <service-name> --project "$PROJECT" --region "$REGION" --limit 50

E. Secret Manager​

Trois secrets sont générés automatiquement et stockés dans Secret Manager : SECRET_KEY (la clé de signature cryptographique de Django), RSA_PRIVATE_KEY (la paire de clés de signature JWT pour tous les jetons d'accès/d'actualisation émis) et DJANGO_SUPERUSER_PASSWORD (mot de passe du compte administrateur d'amorçage). 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"
    gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"

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

F. Réseau et entrée​

Le service API principal est accessible par défaut à son URL run.app (entièrement public — ingress_settings = "all"). Le service Dashboard est déployé avec ingress = INGRESS_TRAFFIC_ALL afin que l'interface d'administration soit elle aussi directement accessible. Un équilibreur de charge HTTPS externe avec domaine personnalisé, Cloud CDN et Cloud Armor peut être ajouté par-dessus.

  • 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 des deux services sont envoyés à Cloud Logging ; les métriques Cloud Run et 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

3. Comportement de l'application Saleor​

  • Configuration de la base de données au premier déploiement. db-init (postgres:15-alpine) crée de manière idempotente la base de données et le rôle de l'application. db-migrate (l'image de l'application, depends_on_jobs = ["db-init"]) exécute ensuite python3 manage.py migrate --noinput. Les deux jobs peuvent être relancés sans risque.
  • Extensions toujours installées. pg_trgm, unaccent, hstore et citext sont installées sans condition par la configuration assemblée de Saleor_Common — les variables enable_postgres_extensions/postgres_extensions du module appelant n'ont aucun effet supplémentaire sur cet ensemble de base.
  • Le worker + beat Celery s'exécute en colocalisation, pas comme service distinct. Le traitement des commandes, les webhooks, les e-mails et les tâches planifiées s'exécutent tous dans le processus worker d'arrière-plan du conteneur principal. C'est pourquoi cpu_always_allocated vaut true par défaut — sans allocation continue de CPU, le worker manque de ressources entre les requêtes d'API.
  • SECRET_KEY, RSA_PRIVATE_KEY et DJANGO_SUPERUSER_PASSWORD sont immuables après le premier démarrage. RSA_PRIVATE_KEY en particulier signe chaque JWT émis par Saleor — sa rotation invalide toutes les sessions actives. N'effectuez de rotation que pendant une fenêtre de maintenance planifiée.
  • Amorçage du superutilisateur. Le point d'entrée cloud exécute manage.py createsuperuser --email $SALEOR_SUPERUSER_EMAIL --noinput à chaque démarrage lorsque DJANGO_SUPERUSER_PASSWORD est défini (de manière idempotente — sans effet une fois l'utilisateur créé). SALEOR_SUPERUSER_EMAIL vaut par défaut admin@example.com et n'est pas exposée comme variable de ce module — c'est la valeur par défaut fixe propre à Saleor_Common.
  • Chemin de santé. Les sondes de démarrage et d'activité ciblent /health/ — le point de terminaison de santé non authentifié de Saleor, dont il a été confirmé qu'il renvoie 200 dès que le serveur ASGI accepte les connexions.
  • L'API_URL du Dashboard est intégrée au démarrage du conteneur, et non lue dynamiquement — ce qui a été confirmé via le script /docker-entrypoint.d/50-replace-env-vars.sh de l'image Dashboard officielle, qui remplace API_URL par sed dans le fichier index.html compilé. Sur Cloud Run, il s'agit d'une chaîne calculée (l'URL de service prévue de l'API principale + /graphql/), sûre pour la planification for_each puisqu'elle n'est pas connue seulement après l'apply.
  • 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 sur la plateforme de déploiement. Seuls les paramètres propres à Saleor ou notables pour lui sont listés ; toutes les autres entrées sont héritées d'App_CloudRun avec leur comportement standard.

Groupe 1 — Projet et identité​

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

Groupe 2 — Environnement de déploiement​

VariableValeur par défautDescription
tenant_iddemoSuffixe court qui rend les noms de ressources uniques par environnement.
support_users[]Adresses e-mail auxquelles sont accordés l'accès au projet et les alertes de surveillance.
resource_labels{}Libellés appliqués à toutes les ressources.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namesaleorNom de base des ressources. Ne pas modifier après le premier déploiement.
application_display_nameSaleor ApplicationNom lisible affiché dans la console.
application_versionlatestCorrespond à l'ARG de build SALEOR_VERSION (3.23 lorsque latest) et au tag propre à l'image Dashboard.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
container_resources{ cpu_limit = "2000m", memory_limit = "3Gi" }Dimensionné pour la charge de travail combinée uvicorn + Celery — voir la Vue d'ensemble.
cpu_always_allocatedtrueNécessaire pour que le worker Celery colocalisé continue son traitement entre les requêtes.
min_instance_count00 active la mise à l'échelle à zéro ; définissez 1 pour éviter les démarrages à froid.
max_instance_count1Plafond de coût.
container_port8000Port d'écoute d'uvicorn — doit correspondre au CMD de l'image de base.
execution_environmentgen2Gen2 nécessaire pour les montages NFS/GCS Fuse, le cas échéant.
timeout_seconds300Durée maximale d'une requête (0–3600 secondes).
enable_cloudsql_volumetrueCloud SQL Auth Proxy pour les connexions par socket.
enable_image_mirroringtrueMet en miroir l'image construite dans Artifact Registry.

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

VariableValeur par défautDescription
ingress_settingsallEntièrement public par défaut.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine que le trafic RFC 1918 via le VPC.
enable_iapfalseExige une connexion Google.
iap_authorized_users / iap_authorized_groups[]Personnes autorisées à accéder via IAP.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres supplémentaires non secrets, fusionnés par-dessus les valeurs par défaut propres à Saleor_Common (ALLOWED_HOSTS, SALEOR_SUPERUSER_EMAIL). Ne définissez pas SECRET_KEY, RSA_PRIVATE_KEY ni DJANGO_SUPERUSER_PASSWORD ici.
secret_environment_variables{}Map variable d'environnement → nom de secret Secret Manager.
secret_propagation_delay30Nombre de secondes d'attente après la création d'un secret avant de poursuivre.
secret_rotation_period2592000sFréquence des notifications de rotation de Secret Manager.

Groupe 7 — Sauvegarde et restauration​

backup_schedule, backup_retention_days, enable_backup_import, backup_source, backup_file, backup_format standard — consultez App_CloudRun.

Groupe 8 — CI/CD et Binary Authorization​

Intégration Cloud Build / Cloud Deploy standard d'App_CloudRun — consultez App_CloudRun.

Groupe 9 — 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. Consultez App_CloudRun.

Groupe 10 — Équilibreur de charge, CDN et rétention des images​

Options standard d'App_CloudRun pour l'équilibreur de charge, le CDN et le nettoyage d'Artifact Registry — consultez App_CloudRun.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueCrée les buckets GCS définis dans storage_buckets.
storage_buckets[{ name_suffix = "data" }]Buckets supplémentaires, en plus du bucket media déclaré par Saleor_Common.
enable_nfstrueDéclaré mais non utilisé par le chemin de stockage propre à Saleor — les médias sont servis depuis le bucket GCS media.
gcs_volumes[]Montages de volumes GCS Fuse.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typePOSTGRES_15Déclarée par souci de cohérence avec la convention ; Saleor_Common fixe toujours PostgreSQL 15, quelle que soit cette valeur.
application_database_namesaleor_dbNom de la base de données PostgreSQL. Immuable après le premier déploiement.
application_database_usersaleor_userUtilisateur de base de données de l'application. Mot de passe généré automatiquement dans Secret Manager.
database_password_length32Longueur du mot de passe généré (16–64).

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser la paire intégrée db-init → db-migrate.
cron_jobs[]Jobs récurrents (par exemple, commandes de gestion Saleor) via Cloud Scheduler.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /health/, délai 20sSonde de démarrage transmise à Saleor_Common.
liveness_probeHTTP /health/, délai 30sSonde de vivacité transmise à Saleor_Common.
uptime_check_config{ enabled=false, path="/" }Test de disponibilité Cloud Monitoring facultatif.
alert_policies[]Règles d'alerte sur métriques.

Groupe 21 — Redis​

VariableValeur par défautDescription
enable_redisfalseActive le cache/broker de Saleor sur Redis.
redis_host""Doit être défini explicitement lorsqu'il est activé — aucun repli automatique sur Cloud Run.
redis_port6379Port Redis.
redis_auth""Mot de passe d'authentification Redis facultatif (sensible).

Groupe 22 — VPC Service Controls et journalisation d'audit​

Options standard d'App_CloudRun pour VPC-SC et les journaux d'audit — consultez App_CloudRun.


5. Sorties​

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

SortieDescription
service_nameNom du service Cloud Run (API principale).
service_urlURL run.app par défaut du service API principal.
service_locationRégion dans laquelle s'exécutent les services.
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 (dont media).
network_name / network_exists / regionsRéseau VPC, présence, régions.
container_image / container_registryImage de l'API 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 db-init/db-migrate.
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / github_repository_url / github_repository_owner / github_repository_name / cicd_configurationÉtat et détails du CI/CD.
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_idRegistre et déclencheur de build.
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_modeÉtat de VPC-SC.
audit_logging_enabled / artifact_registry_cmek_enabledÉtat des journaux d'audit et de CMEK.

L'URL propre au service Dashboard est renvoyée dans l'environnement de l'API principale sous la forme SALEOR_DASHBOARD_URL, plutôt que comme sortie Terraform de premier niveau.


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 transmet sa configuration au moteur du socle App_CloudRun, qui valide les valeurs et leurs combinaisons au moment du plan. 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'apply ou à l'exécution.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
RSA_PRIVATE_KEY (généré automatiquement)Jamais de rotation hors d'une fenêtre de maintenanceCritiqueSa rotation invalide chaque JWT émis — toutes les sessions actives doivent se réauthentifier.
SECRET_KEY (généré automatiquement)Jamais de rotation à la légèreCritiqueLa rotation de la clé de signature de Django invalide les cookies/sessions signés.
application_database_name / application_database_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 toutes les données.
cpu_always_allocatedtrueÉlevéLe définir sur false prive le worker Celery colocalisé de ressources entre les requêtes — le traitement des commandes/webhooks/e-mails se dégrade ou se bloque.
container_resources{ cpu_limit="2000m", memory_limit="3Gi" }ÉlevéDes tailles inférieures provoquent des OOMKill sous la charge combinée uvicorn + Celery — confirmé en conditions réelles.
enable_redistrue avant de compter sur le débit des tâches asynchrones à grande échelleMoyenSans Redis, le cache et le broker Celery se replient sur un comportement inopérant/en mémoire lié à une seule instance.
redis_hostÀ définir explicitement lorsque enable_redis = trueÉlevéCloud Run n'a pas de repli automatique pour l'hôte Redis ; un hôte vide casse la composition de CACHE_URL/CELERY_BROKER_URL.
min_instance_count1 en productionMoyenLa mise à l'échelle à zéro (0) ajoute un délai de démarrage à froid à la première requête après une période d'inactivité, plus un bref intervalle avant la reprise du worker Celery.
SALEOR_SUPERUSER_EMAIL / DJANGO_SUPERUSER_PASSWORDRécupérer rapidement depuis Secret ManagerÉlevéLe compte administrateur d'amorçage est le seul moyen d'accès au premier déploiement ; perdre la trace du mot de passe généré impose une réinitialisation manuelle via le shell Django.
enable_iapuniquement lorsque le Dashboard/l'API n'ont pas besoin d'un accès publicÉlevéIAP bloque les requêtes non authentifiées vers les services API et Dashboard.
backup_retention_days7 (à augmenter en production)MoyenTrop court pour une conservation conforme aux exigences.

Pour le comportement du socle évoqué tout au long de ce guide — identité de service, mise à l'échelle et concurrence, entrée et équilibrage de charge, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC-SC, sauvegardes et mise en miroir des images — consultez App_CloudRun. La configuration applicative propre à Saleor partagée avec la variante GKE est décrite dans Saleor_Common.

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