Service — composant exécutable
ServiceDefinition (architecture) vs ServiceInstance (environnement) : le pattern 2 niveaux.
Service — composant exécutable
📍 Où trouver ça dans l'UI
- ServiceDefinitions : Infra → onglet Architecture → Services
- ServiceInstances : Infra → Environments → {env} → Services
C'est quoi ? Un service est un bout de code qui tourne en permanence (backend, frontend, worker, API…).
Dans Wakastart, un service se définit en 2 niveaux.
ServiceDefinition (niveau Architecture)
C'est la définition générique du service. Tu décris :
| Champ | Exemple | Explication |
|---|---|---|
| Rôle | BACK | Backend, frontend, API, worker… |
| Protocol | HTTP / GRPC / TCP | Comment on parle au service |
| Port | 3000 | Port d'écoute du service |
| Repository | ws-back-wakastart | Le dépôt Git source du code (voir Repository) |
| rootDirectory / dockerfilePath / buildContext | (voir section dédiée ci-dessous) | Comment Wakastart trouve et build le Dockerfile |
| CPU / Mémoire requests/limits | 100m CPU, 128Mi RAM | Ressources allouées |
| Replicas | 1, 2, … | Combien d'instances en parallèle |
| Variables requises | JWT_SECRET, MONGO_URL | Liste des vars nécessaires (voir Variables et secrets) |
→ La ServiceDefinition est le schéma, pas la chose qui tourne réellement.
Configurer le build : rootDirectory, dockerfilePath, buildContext
Trois paramètres ServiceDefinition pilotent l'étape docker build :
| Champ | Rôle | Relatif à |
|---|---|---|
| rootDirectory | Répertoire de base utilisé comme "racine virtuelle" pour ce service dans le repo. Tous les chemins ci-dessous y sont relatifs. | La racine du repo |
| dockerfilePath | Chemin vers le Dockerfile à utiliser pour builder l'image. | rootDirectory |
| buildContext | Le contexte envoyé au docker build (l'ensemble des fichiers accessibles via COPY / ADD dans le Dockerfile). | rootDirectory |
Le docker build exécuté est équivalent à :
bashcd <repo>/<rootDirectory> docker build -f <dockerfilePath> <buildContext>
Cas 1 — Repo simple, Dockerfile à la racine
textws-back-wakastart/ ├── Dockerfile ├── package.json └── src/
| Champ | Valeur |
|---|---|
rootDirectory | ./ |
dockerfilePath | Dockerfile |
buildContext | . |
Équivaut à : docker build -f Dockerfile . exécuté à la racine du repo.
Cas 2 — Monorepo, projet dans un sous-dossier
textws-back-wakastart/ ├── apps/ │ ├── backend/ │ │ ├── Dockerfile │ │ ├── package.json │ │ └── src/ │ └── worker/ └── packages/
Tu veux builder uniquement apps/backend et limiter l'accès Docker aux fichiers de ce dossier :
| Champ | Valeur |
|---|---|
rootDirectory | apps/backend/ |
dockerfilePath | Dockerfile |
buildContext | . |
Équivaut à : cd apps/backend && docker build -f Dockerfile ..
Le build ne voit que apps/backend/ — ni apps/worker/, ni packages/.
Cas 3 — Monorepo avec lockfile partagé (pnpm/yarn workspaces, turbo…)
Ton service est dans apps/backend/ mais a besoin du pnpm-lock.yaml racine et des packages partagés packages/* pour s'installer :
textws-back-wakastart/ ├── pnpm-lock.yaml ← lockfile racine ├── pnpm-workspace.yaml ├── apps/ │ └── backend/ │ └── Dockerfile ← Dockerfile dédié, mais a besoin du contexte racine └── packages/ └── shared/
| Champ | Valeur |
|---|---|
rootDirectory | ./ |
dockerfilePath | apps/backend/Dockerfile |
buildContext | . |
Équivaut à : docker build -f apps/backend/Dockerfile . à la racine du repo.
Le Dockerfile peut maintenant faire COPY pnpm-lock.yaml ./ et COPY packages/shared ./packages/shared car il a accès à tout le repo.
Règles pratiques
- Plus le
buildContextest petit, plus le build est rapide (Docker envoie moins de fichiers au daemon). Si ton service est autonome dans un sous-dossier, choisis le Cas 2. - Si ton Dockerfile a besoin de fichiers situés au-dessus de son dossier (lockfile racine, packages frères), choisis le Cas 3 — un
buildContextplus large mais undockerfilePathciblé. - Un
.dockerignoreà la racine dubuildContextexclut les fichiers indésirables (node_modules,.git,.next/cache…) du contexte envoyé au daemon.
ServiceInstance (niveau Environnement)
C'est l'instance réelle d'un service dans un environnement précis (ex: backend en dev, backend en prod). Elle hérite des valeurs par défaut de la Definition mais peut les overrider :
textServiceDefinition "backend" ServiceInstance backend (env prod) ├── role: BACK ├── definitionId → lien ├── defaultReplicas: 1 ├── replicas: 5 ← override prod ├── defaultPort: 3000 ├── port: null ← utilise 3000 └── defaultMemoryLimit: 512Mi └── memoryLimit: 2Gi ← override prod
C'est dans la ServiceInstance que :
- on choisit quelle image Docker est déployée (donc quel build est utilisé)
- on bind les variables à leurs valeurs réelles
- on voit les deployments, les logs, les metrics