Aller au contenu principal

code-server sur Google Cloud Run

code-server sur Google Cloud Run

code-server est la version open source (MIT) de Visual Studio Code proposée par Coder, qui s'exécute sur un serveur distant et s'utilise entièrement depuis le navigateur — un IDE complet avec la place de marché des extensions VS Code, un terminal intégré et des serveurs de langage, adossé à un espace de travail persistant. Ce module déploie code-server 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 code-server 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 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​

code-server s'exécute comme un unique conteneur autonome sur Cloud Run v2. Contrairement aux applications adossées à une base de données, il assemble un ensemble volontairement minimal de services Google Cloud :

FonctionnalitéService Google CloudRemarques
CalculCloud Run v2Un seul conteneur à l'écoute sur le port 8080 ; 1 vCPU / 1 GiB par défaut
Espace de travail persistantCloud Storage (GCS FUSE)Bucket de l'espace de travail monté sur /home/coder ; provisionné automatiquement
Base de donnéesAucunedatabase_type = NONE — code-server n'a pas de base SQL
Cache et file d'attenteAucunRedis est explicitement désactivé (enable_redis = false)
SecretsSecret ManagerPASSWORD de l'éditeur généré automatiquement (lorsque enable_password = true)
EntréeURL Cloud Run / Cloud Load BalancingL'entrée par défaut est all — accessible publiquement par défaut ; le PASSWORD généré automatiquement protège la page de connexion

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

  • Pas de base de données ni de Redis. code-server est un conteneur unique ; tout l'état réside dans le volume de l'espace de travail. database_type est fixé à NONE par la couche applicative partagée et Redis est désactivé.
  • L'entrée est all (publique) par défaut. Le service est accessible depuis l'internet public dès l'installation, protégé par le PASSWORD généré automatiquement. Conservez enable_password = true dès que ingress_settings = "all", ou passez à ingress_settings = "internal" pour restreindre l'accès au VPC.
  • Un PASSWORD d'éditeur aléatoire est généré automatiquement et stocké dans Secret Manager. Il protège la page de connexion. Désactiver enable_password sert l'éditeur sans aucune authentification — ce n'est sûr que derrière une entrée internal.
  • L'espace de travail est sur GCS FUSE à /home/coder. Les paramètres, les extensions et les projets ouverts y sont conservés. Nécessite l'environnement d'exécution gen2 (la valeur par défaut).
  • Instance unique par conception. min_instance_count = max_instance_count = 1. code-server conserve en mémoire l'état des sessions de l'éditeur et possède un seul volume d'espace de travail ; dépasser une instance scinderait les sessions et exposerait à des écritures concurrentes sur le même volume.
  • Les sondes de santé interrogent /healthz, et non /health. /healthz n'est pas authentifié et renvoie 200 dès que le serveur écoute ; /health renvoie 401 lorsqu'un mot de passe est défini et ferait échouer la sonde.
  • L'image est une fine surcouche de codercom/code-server, construite et répliquée dans Artifact Registry via Cloud Build ; latest est épinglé à 4.99.1 au moment du build.

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 code-server​

code-server s'exécute comme un service Cloud Run v2 à l'écoute sur le port 8080. Chaque déploiement crée une révision immuable ; l'application étant à instance unique et stateful, conservez min = max = 1 et évitez de répartir le trafic entre des révisions simultanées.

  • 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" --filter="metadata.name~codeserver"
    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 Storage — le volume de l'espace de travail​

La seule ressource stateful. Un bucket Cloud Storage dédié est provisionné automatiquement et monté comme volume GCS FUSE sur /home/coder ; il contient l'espace de travail de l'utilisateur, les paramètres VS Code et les extensions installées. Il survit aux redéploiements de révisions et aux événements de mise à l'échelle.

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

GCS FUSE nécessite l'environnement d'exécution gen2 (la valeur par défaut). Consultez App_CloudRun pour les options GCS FUSE et CMEK.

C. Secret Manager — le mot de passe de l'éditeur​

Lorsque enable_password = true (valeur par défaut), un PASSWORD aléatoire de 24 caractères est généré et stocké dans Secret Manager, puis injecté comme variable d'environnement PASSWORD du conteneur pour protéger la page de connexion. Il n'y a pas de mot de passe de base de données (pas de base de données).

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

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

D. Réseau et entrée​

Le service utilise par défaut une entrée all — accessible depuis l'internet public, avec le PASSWORD généré automatiquement qui protège la page de connexion. Pour restreindre l'accès au VPC, définissez ingress_settings = "internal", ou ajoutez un équilibreur de charge HTTPS externe avec domaine personnalisé, Cloud CDN et Cloud Armor.

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

E. Cloud Logging et Monitoring​

Les journaux du conteneur sont envoyés à Cloud Logging ; les métriques Cloud Run sont envoyées à Cloud Monitoring, avec des tests de disponibilité et des règles d'alerte facultatifs. Un point de terminaison public est nécessaire pour qu'un test de disponibilité puisse atteindre le service.

  • 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 code-server​

  • Aucune configuration de base de données au premier déploiement. code-server n'a ni base SQL ni job d'initialisation. Le service est disponible dès que le conteneur démarre et se lie à 0.0.0.0:8080 (défini via BIND_ADDR).
  • Aucune migration. Mettre à niveau application_version déploie simplement une nouvelle révision sur l'image plus récente ; il n'y a aucun schéma à migrer.
  • L'espace de travail est le seul état durable. Tout ce qui se trouve sous /home/coder — dossiers ouverts, settings.json, raccourcis clavier et chaque extension installée — est conservé dans le bucket GCS FUSE. Supprimer le bucket efface l'espace de travail.
  • La connexion est protégée par le secret PASSWORD. Avec enable_password = true, l'éditeur demande le mot de passe généré. Récupérez-le dans Secret Manager (§2C). S'il est désactivé, quiconque atteint l'URL obtient un IDE sans authentification — ne l'exécutez ainsi que derrière une entrée internal.
  • Chemin de santé. Les sondes de démarrage et de vivacité ciblent le point de terminaison non authentifié /healthz (qui renvoie 200 dès que le serveur HTTP écoute). Ne pointez pas les sondes vers /health lorsqu'un mot de passe est défini — il renvoie 401 et la révision ne devient jamais Ready. Vérifiez l'environnement et le port de la révision en cours d'exécution :
    gcloud run services describe <service-name> \
    --region "$REGION" --project "$PROJECT" \
    --format='value(spec.template.spec.containers[0].env)'
  • Mise à l'échelle à instance unique. Conservez min = max = 1. Les sessions de l'éditeur sont conservées en mémoire et le volume de l'espace de travail n'a qu'un seul écrivain.

4. Variables de configuration​

Les variables sont regroupées exactement comme elles apparaissent sur la plateforme de déploiement. Seuls les paramètres propres à code-server 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_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{}Libellés appliqués à toutes les ressources.

Groupe 3 — Identité de l'application​

VariableValeur par défautDescription
application_namecodeserverNom de base des ressources. Ne le modifiez pas après le premier déploiement.
application_display_namecode-serverNom lisible affiché dans la console.
application_versionlatestTag de l'image code-server ; latest est épinglé à 4.99.1 au moment du build. Épinglez une version précise en production.
enable_passwordtrueGénère un PASSWORD d'éditeur aléatoire et l'exige à la connexion. Laissez-le activé pour tout déploiement accessible publiquement.

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 ; augmentez-le pour des serveurs de langage gourmands.
memory_limit1GiMémoire par instance ; dimensionnez-la selon les espaces de travail et les extensions que vous utilisez.
min_instance_count1Laissez à 1 — éditeur à instance unique ; évite les délais de démarrage à froid pendant le chargement de l'index.
max_instance_count1Laissez à 1 — un seul volume d'espace de travail, session en mémoire.
container_port8080code-server écoute sur le port 8080.
execution_environmentgen2Requis pour GCS FUSE (montage de l'espace de travail) et NFS.
timeout_seconds300Durée maximale d'une requête (0–3600 secondes).
enable_cloudsql_volumefalsecode-server n'a pas de Cloud SQL — laissez à false.
enable_image_mirroringtrueMet en miroir l'image code-server dans Artifact Registry.

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

VariableValeur par défautDescription
ingress_settingsallPublic par défaut (protégé par le secret PASSWORD). Définissez internal pour restreindre l'accès au VPC.
vpc_egress_settingPRIVATE_RANGES_ONLYN'achemine via le VPC que le trafic RFC 1918.
enable_iapfalseExige une connexion Google en amont de l'éditeur.
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 (par ex. { TZ = "UTC" }). BIND_ADDR est défini automatiquement.
secret_environment_variables{}Map variable d'environnement → nom du secret Secret Manager.
secret_propagation_delay30Secondes d'attente après la création d'un secret avant de poursuivre.

Groupe 11 — Stockage et système de fichiers​

VariableValeur par défautDescription
enable_nfsfalseNFS est désactivé par défaut ; l'espace de travail utilise GCS FUSE, et non NFS.
nfs_mount_path/mnt/nfsChemin de montage si NFS est activé.
gcs_volumes[]Montages GCS FUSE supplémentaires ; le bucket de l'espace de travail est ajouté automatiquement sur /home/coder.
manage_storage_kms_iam / enable_artifact_registry_cmekfalseOptions CMEK.

Groupe 12 — Backend de base de données​

VariableValeur par défautDescription
database_typeNONENon utilisée — code-server n'a pas de base SQL ; fixée à NONE par CodeServer_Common.
database_password_length32Non utilisée — transmise au socle pour compatibilité.

Groupe 14 — Observabilité et santé​

VariableValeur par défautDescription
startup_probeHTTP /healthz, délai de 15 sSonde de démarrage ; utilise le point de terminaison non authentifié.
liveness_probeHTTP /healthz, délai de 30 sSonde de vivacité ; utilise le point de terminaison non authentifié.
health_check_configHTTP /healthSonde structurée alternative (point de terminaison authentifié).
uptime_check_config{ enabled=false, path="/health" }Test de disponibilité Cloud Monitoring facultatif (nécessite un point de terminaison public).
alert_policies[]Règles d'alerte sur 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éfinies)CIDR du niveau d'accès / mode simulation (dry-run).
enable_audit_loggingfalseCloud Audit Logs détaillés.

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


5. Sorties​

Renvoyés 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.
codeserver_urlURL de l'éditeur code-server (port 8080). Accessible uniquement depuis le VPC lorsque l'entrée est internal.
service_locationRégion dans laquelle s'exécute le service.
stage_servicesDétails 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 (le bucket de l'espace de travail).
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 éventuels jobs d'initialisation fournis par l'utilisateur (aucun par défaut).
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 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 — un runtime gen1 avec des montages GCS FUSE/NFS, IAP sans identité autorisée, un timeout_seconds hors limites, etc. Une configuration invalide fait échouer le plan avec une erreur claire et nommée avant la création de toute ressource, de sorte que la plupart des erreurs ci-dessous sont détectées en amont plutôt qu'à l'apply ou à l'exécution.

ParamètreValeur judicieuseRisqueConséquence en cas d'erreur
enable_passwordtrue (à conserver pour une entrée publique)CritiqueLe désactiver avec ingress_settings = "all" expose à internet un IDE entièrement non authentifié — terminal compris.
Bucket de l'espace de travailNe jamais le supprimerCritiqueLe bucket GCS FUSE sur /home/coder est le seul état persistant ; le supprimer efface tous les paramètres, extensions et fichiers.
Chemin de startup_probe / liveness_probe/healthzÉlevéPointer les sondes vers /health alors qu'un mot de passe est défini renvoie 401 ; la révision ne devient jamais Ready.
max_instance_count1ÉlevéDépasser 1 répartit les sessions de l'éditeur entre instances et expose à des écritures concurrentes sur l'unique volume d'espace de travail.
min_instance_count1MoyenLa mise à zéro (0) ajoute une latence de démarrage à froid et remonte l'espace de travail à la requête suivante.
execution_environmentgen2Élevégen1 ne peut pas monter GCS FUSE — le volume de l'espace de travail échoue et l'état est perdu au redémarrage.
ingress_settingsall + mot de passe (ou internal)Élevéall sans mot de passe publie un IDE ouvert ; internal bloque tout accès par navigateur depuis l'extérieur du VPC.
enable_cloudsql_volumefalseFaiblecode-server n'a pas de base de données ; l'activer ajoute un sidecar Auth Proxy inutile.
memory_limit1Gi+MoyenDes serveurs de langage ou des extensions gourmands peuvent provoquer un OOM en dessous de 1 GiB.

Pour le comportement du socle évoqué 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 à code-server et partagée avec la variante GKE est décrite dans CodeServer_Common.

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