Aller au contenu principal

Wallabag sur Google Cloud Run

Wallabag sur Google Cloud Run

Wallabag est une application gratuite, open source et auto-hébergée d'archivage d'articles à « lire plus tard » — une alternative à Pocket. Enregistrez des articles depuis une extension de navigateur, un bookmarklet, une application mobile ou l'API REST, puis lisez-les plus tard dans une vue épurée et sans distraction, avec recherche plein texte, étiquettes, annotations et flux RSS de vos éléments enregistrés. Ce module déploie Wallabag 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 Wallabag et sur la manière de les explorer et de les exploiter depuis la Google Cloud Console et la ligne de commande. Pour les mécanismes communs à toutes les applications Cloud Run — identité du service, entrée et équilibrage de charge, mise à l'échelle et concurrence, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls, sauvegardes et cycle de vie du déploiement — reportez-vous au guide du socle App_CloudRun plutôt que de les répéter ici.


1. Vue d'ensemble​

Wallabag s'exécute sous la forme d'un conteneur PHP/Symfony (nginx + php-fpm sous s6-overlay) sur Cloud Run v2. Le déploiement relie un ensemble ciblé de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service PHP/Symfony, 1 vCPU / 2 GiB par défaut, autoscaling serverless ; mise à zéro par défaut
Base de donnéesCloud SQL for MySQL 8.0Obligatoire — Wallabag_Common fixe le moteur ; PostgreSQL n'est pas pris en charge
Stockage d'objetsCloud StorageUn bucket générique data est provisionné, mais Wallabag ne le lit ni ne l'écrit — tout le contenu réside dans MySQL
SecretsSecret ManagerAPP_SECRET généré automatiquement (jeton de sécurité Symfony) ; mot de passe de la base de données
EntréeURL Cloud Run / Cloud Load BalancingURL run.app par défaut ; équilibreur de charge HTTPS externe + domaine personnalisé en option

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

  • MySQL 8.0 est obligatoire. Le moteur de base de données est fixé par Wallabag_Common ; choisir un autre moteur fait échouer le déploiement.
  • enable_cloudsql_volume = false. Cloud Run se connecte à Cloud SQL en TCP via l'IP privée, et non via le socket Unix de l'Auth Proxy. La variante GKE utilise au contraire le sidecar Auth Proxy sur 127.0.0.1.
  • Un seul secret Secret Manager. APP_SECRET (un jeton de sécurité Symfony) est généré automatiquement et remplace la valeur par défaut intégrée de Wallabag, connue publiquement. Il n'existe pas de secret distinct pour un mot de passe administrateur généré.
  • La mise à zéro est activée par défaut (min_instance_count = 0, max_instance_count = 1). Les démarrages à froid ajoutent de la latence à la première requête après une période d'inactivité ; définissez min_instance_count = 1 pour l'éviter.
  • enable_nfs vaut true par défaut mais n'a aucune utilité fonctionnelle. Il monte le NFS Cloud Filestore dans /var/lib/wallabag, mais le WORKDIR de l'image de Wallabag est /var/www/wallabag — rien n'écrit dans le chemin monté. Vous pouvez le désactiver sans risque.
  • Pas de job de migration distinct. La commande bin/console wallabag:install de Wallabag gère à la fois la création du schéma et la configuration initiale en une seule étape idempotente.
  • L'auto-inscription est désactivée. SYMFONY__ENV__FOSUSER_REGISTRATION = "false" — seul le compte administrateur initial existe jusqu'à ce qu'un opérateur active explicitement l'inscription ou crée d'autres comptes.

2. Services Google Cloud et comment les explorer​

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

A. Cloud Run — le service Wallabag​

Wallabag s'exécute en tant que service Cloud Run v2 qui s'adapte automatiquement à la charge des requêtes entre le nombre minimal et le nombre maximal d'instances. Chaque déploiement crée une révision immuable ; le trafic peut être réparti entre 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 la mise à l'échelle, la concurrence, l'environnement d'exécution et la répartition du trafic.

B. Cloud SQL for MySQL 8.0​

Wallabag stocke toutes les données de l'application (articles enregistrés, étiquettes, utilisateurs, annotations) dans une instance gérée Cloud SQL for MySQL 8.0. Le service se connecte via l'IP privée de l'instance en TCP (et non via le socket de l'Auth Proxy — enable_cloudsql_volume de Cloud Run vaut false par défaut pour ce module). Lors du premier déploiement, un job db-init crée la base de données et l'utilisateur de l'application, suivi de wallabag-install, qui exécute le programme d'installation de Wallabag pour créer le schéma.

  • 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 le renouvellement du mot de passe.

C. Cloud Storage​

Un bucket générique data est provisionné par défaut (via l'entrée storage_buckets du socle), mais Wallabag lui-même ne le lit ni ne l'écrit jamais — tout le contenu réside dans MySQL, et gcs_volumes (qui monterait un bucket via Fuse dans le conteneur) est vide par défaut.

  • Console : Cloud Storage → Buckets.
  • CLI :
    gcloud storage buckets list --project "$PROJECT"

D. Secret Manager​

Un secret est généré automatiquement et stocké dans Secret Manager : APP_SECRET (matérialisé sous cette clé simple ; associé au véritable nom SYMFONY__ENV__SECRET par le point d'entrée d'enveloppe). 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~app-secret"
    gcloud secrets versions access latest --secret=<secret-name> --project "$PROJECT"

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

E. 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 y être ajouté.

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

F. Cloud Logging et Monitoring​

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

  • 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 Wallabag​

  • Chaîne d'initialisation en deux étapes, et non une étape de migration séparée à la Laravel. db-init (mysql:8.0-debian) crée la base de données vide et l'utilisateur de l'application et accorde les privilèges. wallabag-install dépend ensuite de db-init et réutilise la même image applicative personnalisée (afin que l'association des variables d'environnement par le point d'entrée d'enveloppe s'exécute toujours) avec sa commande remplacée par bin/console wallabag:install --env=prod -n. Cette commande unique effectue à la fois la création du schéma et la configuration initiale (y compris la création du compte administrateur par défaut) — il n'y a pas de job de migration distinct à exécuter lors des mises à niveau ; relancer wallabag:install sur une base de données déjà installée est sûr et idempotent.
  • Comportement des contrôles de santé. La sonde de démarrage est en TCP sur le port 80 — elle n'a besoin que de la liaison de nginx, indépendamment de l'avancement du programme d'installation. La sonde de vivacité est en HTTP GET / : une requête non authentifiée vers le chemin racine renvoie une redirection HTTP 302 vers /login, que les sémantiques de contrôle de santé de Cloud Run comme de Kubernetes considèrent comme une réponse valide (tout code 2xx–3xx). N'attendez pas un simple 200 sur / — une redirection 302 vers /login est le résultat attendu et sain.
    curl -s -o /dev/null -w "%{http_code}\n" "$SERVICE_URL/"   # expect 302
  • Compte administrateur initial. wallabag:install --env=prod -n crée le compte administrateur par défaut de Wallabag à l'aide des valeurs d'installation par défaut documentées de Wallabag (nom d'utilisateur et mot de passe tous deux wallabag) — aucun secret Secret Manager ne contient de mot de passe administrateur généré. Modifiez ce mot de passe immédiatement après la première connexion (Settings → votre compte → modification du mot de passe, ou bin/console fos:user:change-password wallabag dans le conteneur). Les nouveaux comptes ne peuvent pas s'inscrire eux-mêmes (SYMFONY__ENV__FOSUSER_REGISTRATION = "false") — créez des utilisateurs supplémentaires depuis l'interface d'administration ou avec bin/console fos:user:create.
  • 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 à Wallabag 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 du service et des ressources régionales.

Groupe 2 — Environnement de déploiement​

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

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namewallabagNom de base des ressources. Ne le modifiez pas après le premier déploiement.
display_nameWallabagNom lisible affiché dans la Console.
application_versionlatestTag de l'image de base wallabag/wallabag. "latest" correspond à un tag épinglé (2.6.14) au moment du build, via l'ARG de build propre à l'application WALLABAG_VERSION.
php_memory_limit, upload_max_filesize, post_max_size512M / 64M / 64MDéclarées par souci de cohérence avec la convention mais transmises nulle part — les définir n'a aucun effet sur le conteneur déployé.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour provisionner uniquement l'infrastructure.
container_image_sourcecustomConstruit l'image d'enveloppe via Cloud Build. "prebuilt" contourne entièrement l'enveloppe d'association base de données/secrets — ne l'utilisez pas sans votre propre transposition.
cpu_limit1000mCPU par instance.
memory_limit2GiMémoire par instance.
min_instance_count00 active la mise à zéro.
max_instance_count1Limite supérieure de l'autoscaling.
container_port80Le nginx de Wallabag écoute sur le port 80.
execution_environmentgen2Gen2 est requis pour les montages GCS Fuse.
enable_cloudsql_volumefalseCloud Run se connecte en TCP via l'IP privée au lieu du socket de l'Auth Proxy.
enable_image_mirroringtrueMet en miroir l'image dans Artifact Registry.
container_protocolhttp1HTTP/1.1.

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

VariableValeur par défautDescription
ingress_settingsallEntrée publique par défaut.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine via le VPC que le trafic RFC 1918.
enable_iapfalseExige une connexion Google.
iap_authorized_users / iap_authorized_groups[]Qui peut accéder via IAP.

Groupe 6 — Variables d'environnement et secrets​

VariableValeur par défautDescription
environment_variables{}Paramètres supplémentaires non secrets. Ne remplacez pas SYMFONY__ENV__DATABASE_* ici — elles sont calculées par le point d'entrée d'enveloppe au démarrage du conteneur.
secret_environment_variables{}Correspondance variable d'environnement → nom du secret Secret Manager.
secret_propagation_delay30Secondes d'attente après la création d'un secret avant de poursuivre.
secret_rotation_period2592000sFréquence des notifications de renouvellement de Secret Manager.

Groupe 7 — Sauvegarde et restauration​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron des sauvegardes automatiques (UTC).
backup_retention_days7Rétention ; augmentez-la pour la production.
enable_backup_import / backup_source / backup_uri / backup_formatoptions de restaurationRestaure depuis une sauvegarde lors du déploiement.

Groupe 8 — CI/CD et Binary Authorization​

Intégration Cloud Build / Cloud Deploy standard d'App_CloudRun — consultez App_CloudRun. Entrées principales : enable_cicd_trigger, github_repository_url, github_token, enable_cloud_deploy, enable_binary_authorization.

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​

VariableValeur par défautDescription
enable_cloud_armorfalseProvisionne un équilibreur de charge HTTPS global + le WAF Cloud Armor.
application_domains[]Noms de domaine personnalisés pour l'équilibreur de charge HTTPS.
enable_cdnfalseActive Cloud CDN sur le backend de l'équilibreur de charge HTTPS.
max_images_to_retain / delete_untagged_images / image_retention_days(défini)Règle de nettoyage d'Artifact Registry.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueCrée le bucket GCS générique data. Ni lu ni écrit par Wallabag.
enable_nfsfalseSans utilité fonctionnelle — monté dans /var/lib/wallabag, mais l'image de Wallabag n'y écrit rien. Vous pouvez le désactiver sans risque.
gcs_volumes[]Montages de volumes GCS Fuse (nécessite gen2). Vide par défaut — rien n'est monté.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typeMYSQL_8_0Fixé par Wallabag_Common.
db_name / db_userwallabagPréfixés par le tenant au moment du déploiement. Immuables après le premier déploiement.
database_password_length32Longueur du mot de passe généré (16–64).
db_host_env_var_name / db_user_env_var_name / db_name_env_var_name / db_port_env_var_name / db_password_env_var_name"" (toutes vides)Inutilisées par Wallabag — le point d'entrée d'enveloppe lit directement les variables standard DB_* et les associe lui-même à SYMFONY__ENV__DATABASE_*.

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

VariableValeur par défautDescription
initialization_jobs[]Laissez vide pour utiliser la chaîne intégrée db-init → wallabag-install.
cron_jobs[]Aucune tâche récurrente planifiée par la plateforme par défaut.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeTCP, port 80, délai de 30s, 20 tentativesN'a besoin que de la liaison de nginx.
liveness_probeHTTP GET /, délai de 300s, 3 tentativesWallabag renvoie une redirection 302 vers /login — une réponse valide.
uptime_check_config{ enabled = true }Test de disponibilité Cloud Monitoring.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 21 — Redis​

VariableValeur par défautDescription
enable_redisfalseEntièrement facultatif — utilisé uniquement par la fonction d'import en masse asynchrone de Wallabag (import Pocket/Instapaper). L'enregistrement, la lecture et l'utilisation de l'API normaux ne sollicitent jamais Redis.
redis_host""Point de terminaison Redis.
redis_port6379Port Redis.

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).
enable_audit_loggingfalseCloud Audit Logs détaillés.

5. Sorties​

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

SortieDescription
service_nameNom du service Cloud Run.
service_urlURL run.app par défaut du service.
service_locationRégion dans laquelle s'exécute le service.
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, wallabag-install).
deployment_id / tenant_id / resource_prefixIdentifiants de nommage.
project_id / project_numberIdentifiants du projet.
cicd_enabled / github_repository_url / 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 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 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
Variable d'environnement du pilote de base de données (SYMFONY__ENV__DATABASE_DRIVER, codée en dur dans entrypoint.sh)doit être définie explicitement (pdo_mysql ici)CritiqueLe parameters.yml livré avec Wallabag fixe database_driver à pdo_sqlite par défaut. Définir uniquement SYMFONY__ENV__DATABASE_HOST/_PORT/_NAME/_USER/_PASSWORD sans variable de pilote explicite installe quand même silencieusement l'application sur un fichier SQLite local jetable — l'installation « réussit », l'application semble fonctionner, mais toutes les données résident dans un fichier éphémère effacé à chaque redémarrage ou redéploiement, et MySQL n'est jamais sollicité. Aucune erreur n'est levée. Si ce module est un jour cloné comme modèle pour une autre application basée sur Symfony, vérifiez que la variable d'environnement du pilote de base de données est définie explicitement — cette catégorie de défaillance est indétectable de l'extérieur ; seule la comparaison des journaux de démarrage du conteneur ("Configuring the SQLite database..." par rapport à une ligne de connexion MySQL) la révèle. Consultez App_CloudRun et App_GKE pour savoir comment le socle injecte de manière générique les variables d'environnement de la base de données — la transposition propre à l'application et les éléments manquants relèvent toujours de la responsabilité du module appelant.
db_name / db_userÀ définir une seule foisCritiqueImmuables après le premier déploiement ; les renommer recrée la base de données/l'utilisateur et détruit tous les articles enregistrés.
APP_SECRET (généré automatiquement)Ne jamais le modifier à la main dans Secret Manager après le premier démarrageÉlevéWallabag l'utilise comme clé de signature de sécurité Symfony ; le modifier invalide les jetons CSRF et toutes les URL signées déjà émises.
Identifiants administrateur par défaut (wallabag / wallabag, créés par wallabag:install)À modifier immédiatement après la première connexionÉlevéLe programme d'installation crée les identifiants par défaut bien connus de Wallabag — toute personne connaissant l'URL du service et la valeur par défaut publique peut se connecter tant que le mot de passe n'a pas été modifié.
enable_backup_importfalse sauf en cas de restaurationCritiqueL'activer sans backup_uri valide fait échouer le job d'import.
container_image_sourcecustomCritiquePasser à prebuilt déploie l'image wallabag/wallabag standard sans point d'entrée d'enveloppe — l'association des variables d'environnement de base de données et de secrets ne s'exécute jamais, et l'application ne peut pas du tout atteindre MySQL.
min_instance_count1 en productionMoyenLa mise à zéro (0) ajoute une latence de démarrage à froid à la première requête après une période d'inactivité.
enable_nfsfalse sauf besoin pour un autre usageFaible / coûtVaut true par défaut et provisionne un partage Filestore que Wallabag n'utilise jamais — un coût récurrent inutile.
enable_cloud_armorà activer en productionMoyenLe service est accessible publiquement sans protection WAF par défaut.

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

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