Aller au contenu principal

LubeLogger sur Google Cloud Run

LubeLogger sur Google Cloud Run

LubeLogger est un outil gratuit et open source de suivi de l'entretien des véhicules et de la consommation de carburant, construit sur ASP.NET Core (.NET) et livré sous la forme d'une image de conteneur unique avec une base de données LiteDB intégrée. Ce module déploie LubeLogger sur Cloud Run v2 en s'appuyant sur le socle App_CloudRun, qui provisionne et gère l'infrastructure Google Cloud partagée.

Ce guide se concentre sur les services cloud qu'utilise LubeLogger 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, 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​

LubeLogger s'exécute sous la forme d'un conteneur ASP.NET Core sur Cloud Run v2. Le déploiement assemble un ensemble minimal de services Google Cloud — la configuration par défaut ne comporte aucune base de données gérée :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Service ASP.NET Core, 1 vCPU / 1 GiB par défaut, autoscaling serverless ; fixé à une seule instance
Base de donnéesAucune (par défaut)Le mode par défaut de LubeLogger utilise un fichier de base de données LiteDB intégré — aucune instance Cloud SQL n'est créée
Stockage objetCloud StorageDeux buckets : storage (fichier de base de données LiteDB + photos/reçus/documents téléversés) et dpkeys (clés ASP.NET Core Data Protection)
Cache et file d'attenteAucunLubeLogger n'utilise pas Redis et n'a ni worker en arrière-plan ni file d'attente
SecretsAucunAucun secret n'est généré — le premier compte est créé par inscription en libre-service
IngressURL Cloud Run / Cloud Load BalancingURL run.app par défaut (ingress_settings = "all") ; équilibreur de charge HTTPS externe + domaine personnalisé en option

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

  • Aucune base de données externe par défaut. database_type = "NONE" — le fichier de base de données LiteDB intégré de LubeLogger fait foi et est conservé via un volume GCS FUSE. LubeLogger prend aussi en charge un backend Postgres externe facultatif via une unique variable d'environnement DSN POSTGRES_CONNECTION, mais ce module ne câble pas Cloud SQL pour cela.
  • Une seule instance. min_instance_count = 1 et max_instance_count = 1 — le mode par défaut de LubeLogger sert un unique fichier de base de données partagé depuis un seul volume ; exécuter plusieurs instances sur le même fichier le corrompt.
  • Sécurisé par défaut. EnableAuth = "true" remplace la valeur par défaut de appsettings.json de LubeLogger, qui laisse l'accès entièrement ouvert. Aucun compte administrateur n'est pré-créé — la première personne qui remplit le formulaire d'inscription sur /Login obtient l'accès.
  • Clés Data Protection persistantes. Un petit bucket dpkeys dédié est toujours monté sur /root/.aspnet/DataProtection-Keys afin que les sessions de connexion survivent aux redémarrages du conteneur ; il est distinct du bucket principal storage.
  • Image préconstruite, sans étape de build. Le module déploie directement l'image officielle ghcr.io/hargata/lubelogger (mise en miroir dans Artifact Registry par défaut) — aucun Dockerfile ni Cloud Build n'intervient.
  • Les sondes de santé utilisent /Login, et non / — la racine de l'application est protégée par [Authorize] et ferait échouer une sonde non authentifiée de la plateforme, même sur un conteneur en bonne santé.

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 figurent dans les sorties du déploiement.

A. Cloud Run — le service LubeLogger​

LubeLogger s'exécute sous la forme d'un unique service Cloud Run v2 (fixé à une instance). 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"

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

B. Cloud Storage​

Deux buckets Cloud Storage dédiés sont provisionnés automatiquement :

  • storage — monté sur /App/data via GCS FUSE ; contient le fichier de base de données LiteDB intégré et les photos/reçus/documents téléversés.
  • dpkeys — monté sur /root/.aspnet/DataProtection-Keys ; contient les clés de signature des cookies et des sessions d'ASP.NET Core.
gcloud storage buckets list --project "$PROJECT" --filter="name~lubelogger"
gcloud storage ls gs://<storage-bucket>/ # bucket names are in the Outputs

Voir App_CloudRun pour les options GCS Fuse et CMEK.

C. Réseau et entrée​

Le service est accessible par défaut à son URL run.app (ingress_settings = "all"). Un équilibreur de charge HTTPS externe avec 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"

Voir App_CloudRun.

D. Cloud Logging et Monitoring​

Les journaux du conteneur sont acheminés vers Cloud Logging ; les métriques Cloud Run 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 LubeLogger​

  • Aucune initialisation de base de données au premier déploiement. Il n'y a pas de job db-init — LubeLogger initialise lui-même son fichier de base de données LiteDB et son arborescence (config/, documents/, images/, temp/, themes/, translations/ sous /App/data) au premier démarrage.
  • Aucun identifiant administrateur fixe. Ouvrez le service, allez sur /Login et soumettez le formulaire Register (inscription) — il devient le compte utilisable. Faites-le immédiatement après le premier déploiement : EnableAuth = "true" restreint le reste de l'application, mais l'inscription elle-même reste ouverte à quiconque peut atteindre l'URL tant qu'aucun premier compte n'existe.
  • Chemin de santé. Les sondes de démarrage et de vivacité ciblent /Login — la page publique et non authentifiée de LubeLogger. La racine de l'application / est protégée par [Authorize] et renverrait une 401/une redirection à une sonde non authentifiée, même sur un conteneur en bonne santé.
  • Postgres externe facultatif. LubeLogger prend en charge une unique variable d'environnement DSN POSTGRES_CONNECTION (Host=<host>;Port=5432;Username=<user>;Password=<pass>;Database=<db>;) pour utiliser une base de données Postgres externe à la place du fichier LiteDB intégré. Ce module ne provisionne pas Cloud SQL pour cette option — un opérateur qui fournit sa propre instance Postgres peut définir la variable via secret_environment_variables.
  • Une seule instance, toujours. max_instance_count est fixé à 1 — le mode par défaut de LubeLogger ne prend en charge ni le verrouillage distribué ni l'écriture multiple pour sa base de données intégrée.
  • Inspecter la révision en cours d'exécution :
    gcloud run services describe <service-name> \
    --region "$REGION" --project "$PROJECT" \
    --format='value(status.url)'

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à LubeLogger ou notables pour lui sont listés ; toutes les autres entrées sont héritées de 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_iddemoCourt suffixe qui rend les noms de ressources uniques par environnement.
support_users[]Adresses e-mail recevant l'accès au projet et les alertes de surveillance.
resource_labels{}Labels appliqués à toutes les ressources.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namelubeloggerNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_nameLubeLoggerNom lisible affiché dans la console.
description(défini)Description du service.
application_versionlatestTag d'image sur ghcr.io/hargata/lubelogger. Comme l'image est préconstruite (et non construite sur mesure), cette valeur sélectionne directement la version publiée.

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

VariableValeur par défautDescription
deploy_applicationtrueDéfinissez false pour ne provisionner que l'infrastructure.
cpu_limit1000mCPU par instance.
memory_limit1GiMémoire par instance.
min_instance_count1Maintenu à 1 pour éviter les démarrages à froid.
max_instance_count1Doit rester à 1 — le mode par défaut de LubeLogger sert un unique fichier de base de données partagé.
container_port8080LubeLogger écoute sur le port 8080.
execution_environmentgen2Gen2 est requis pour les montages GCS Fuse.
timeout_seconds300Durée maximale d'une requête (0–3600 secondes).
enable_cloudsql_volumefalseLe mode par défaut de LubeLogger n'utilise pas Cloud SQL.
enable_image_mirroringtrueMet en miroir l'image LubeLogger dans Artifact Registry.
traffic_split[]Répartit le trafic entre les révisions pour des déploiements par étapes.
max_revisions_to_retain7Déclarée par cohérence avec la convention ; non utilisée par le déploiement de ce module.

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

VariableValeur par défautDescription
ingress_settingsallAccès public — LubeLogger est une application web destinée aux utilisateurs.
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[]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 avec la valeur par défaut du module EnableAuth = "true".
secret_environment_variables{}Correspondance variable d'environnement → nom de secret Secret Manager. Utilisez-la pour POSTGRES_CONNECTION si vous câblez le backend Postgres externe facultatif.
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​

VariableValeur par défautDescription
backup_schedule0 2 * * *Cron de sauvegarde automatique (UTC).
backup_retention_days7Rétention ; augmentez-la pour la production ou la conformité.
enable_backup_import / backup_source / backup_uri / backup_formatoptions de restaurationRestaure à partir d'une sauvegarde lors du déploiement.

Groupe 8 — CI/CD et Binary Authorization​

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

Groupe 10 — Stockage et système de fichiers​

VariableValeur par défautDescription
create_cloud_storagetrueCrée les buckets GCS définis dans storage_buckets.
storage_buckets[]Buckets GCS supplémentaires, en plus des buckets storage/dpkeys provisionnés automatiquement.
enable_nfsfalseNon utilisé par LubeLogger par défaut.
gcs_volumes[]Montages de volumes GCS Fuse supplémentaires (gen2 requis).
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typeNONEFixe — le mode par défaut de LubeLogger n'a pas de base de données Cloud SQL.
database_password_length32Non utilisée dans la configuration par défaut.

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

VariableValeur par défautDescription
initialization_jobs[]Le mode par défaut de LubeLogger n'a besoin d'aucun job d'initialisation.
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_probeHTTP /Login, délai de 15sSonde de démarrage.
liveness_probeHTTP /Login, délai de 30sSonde de vivacité.
startup_probe_configHTTP /LoginSonde structurée alternative.
health_check_configHTTP /LoginSonde de vivacité structurée alternative.
uptime_check_config{ enabled=false, path="/Login" }Test de disponibilité Cloud Monitoring ; désactivé par défaut.
alert_policies[]Règles d'alerte sur les métriques.

Groupe 23 — 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éfini)CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseJournaux Cloud 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.
lubelogger_urlURL VPC interne de l'interface web de LubeLogger.
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é).
storage_bucketsBuckets Cloud Storage créés (storage, dpkeys).
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é.
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_idDépôt 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 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
max_instance_count1CritiqueLe mode par défaut de LubeLogger sert un unique fichier de base de données intégré et partagé depuis un seul volume ; plus d'une instance expose à une corruption de la base par des écritures concurrentes.
Buckets storage/dpkeysNe jamais les supprimerCritiquePerdre storage fait perdre tous les dossiers de véhicules ; perdre dpkeys invalide toutes les sessions de connexion existantes (récupérable — impose seulement une nouvelle connexion).
EnableAuthtrue (par défaut)CritiqueLe passer à false rétablit le mode d'accès entièrement ouvert de LubeLogger — toute personne disposant de l'URL peut consulter et modifier toutes les données sans aucune connexion.
Inscription au premier lancementÀ effectuer immédiatement après le déploiementÉlevéTant qu'aucun premier compte n'est inscrit, le formulaire d'inscription est accessible à quiconque peut atteindre l'URL.
Chemin de startup_probe/liveness_probe/LoginCritiquePointer les sondes sur / (ou sur tout chemin protégé par [Authorize]) fait échouer la sonde sur un conteneur par ailleurs en bonne santé — la révision ne devient jamais Ready.
database_typeNONE (par défaut)ÉlevéLe mode par défaut de LubeLogger ignore entièrement ce paramètre ; le modifier ne connecte pas LubeLogger à une instance Cloud SQL — utilisez plutôt POSTGRES_CONNECTION pour l'option Postgres externe facultative.
min_instance_count1MoyenLa valeur 0 autorise les démarrages à froid ; comme max_instance_count est fixé à 1, il n'y a aucun risque lié à la répartition du trafic, seulement une latence accrue sur la première requête après une période d'inactivité.
backup_retention_days7 (à augmenter en production)MoyenTrop court pour une rétention de conformité.
enable_cloud_armorà activer en productionMoyenSinon, l'interface web publique et l'API REST sont accessibles sans protection WAF.

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

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