Déployer une nouvelle application
Vue d’ensemble
Section intitulée « Vue d’ensemble »Déployer une nouvelle application sur le VPS Levell se fait en 6 étapes :
- Préparer le code et le Dockerfile
- Créer le
docker-compose.ymlavec les labels Traefik - Pointer le DNS vers le VPS
- Démarrer le container
- Initialiser le repo GitHub
- Vérifier que tout fonctionne
Étape 1 — Préparer le code
Section intitulée « Étape 1 — Préparer le code »Crée un dossier dans /docker/ :
mkdir /docker/<nom-projet>cd /docker/<nom-projet>Dockerfile type (app Node.js/Next.js)
Section intitulée « Dockerfile type (app Node.js/Next.js) »# Stage 1 — BuildFROM node:lts-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
# Stage 2 — ProductionFROM node:lts-alpine AS runnerWORKDIR /appENV NODE_ENV=production PORT=3000 HOSTNAME="0.0.0.0"COPY --from=builder /app/.next/standalone ./COPY --from=builder /app/.next/static ./.next/staticCOPY --from=builder /app/public ./publicEXPOSE 3000CMD ["node", "server.js"]Dockerfile type (site statique)
Section intitulée « Dockerfile type (site statique) »FROM nginx:alpineCOPY html /usr/share/nginx/htmlEXPOSE 80Étape 2 — docker-compose.yml
Section intitulée « Étape 2 — docker-compose.yml »Remplace NOMSERVICE et DOMAINE avec les valeurs réelles. NOMSERVICE doit être unique sur tout le serveur.
services: NOMSERVICE: build: . restart: unless-stopped networks: - traefik-public labels: - "traefik.enable=true" - "traefik.http.routers.NOMSERVICE.rule=Host(`DOMAINE.levell.cloud`)" - "traefik.http.routers.NOMSERVICE.entrypoints=websecure" - "traefik.http.routers.NOMSERVICE.tls.certresolver=letsencrypt" - "traefik.http.services.NOMSERVICE.loadbalancer.server.port=PORT_INTERNE" - "traefik.docker.network=traefik-public"
networks: traefik-public: external: trueSi l’application a besoin de volumes persistants :
volumes: - nom_volume:/chemin/dans/container
volumes: nom_volume:Étape 3 — Pointer le DNS
Section intitulée « Étape 3 — Pointer le DNS »Dans ton panneau DNS (Hostinger, OVH, etc.), ajoute un enregistrement A :
DOMAINE.levell.cloud → IP_DU_VPSVérifier la propagation (peut prendre jusqu’à 5 minutes) :
dig +short DOMAINE.levell.cloudÉtape 4 — Démarrer le container
Section intitulée « Étape 4 — Démarrer le container »cd /docker/<nom-projet>docker compose up -d --build
# Vérifier que le container tournedocker ps | grep <nom>
# Voir les logs de démarragedocker logs <container> --tail 30Traefik détecte automatiquement le nouveau container et génère le certificat SSL. Attendre 30 secondes, puis :
curl -sI https://DOMAINE.levell.cloud | head -3Étape 5 — Initialiser le repo GitHub
Section intitulée « Étape 5 — Initialiser le repo GitHub »cd /docker/<nom-projet>
# Initialiser Gitgit initgit branch -M main
# Créer le .gitignoreecho ".envnode_modules/.next/vendor/*.sqlite" > .gitignore
# Créer le repo sur GitHub (sidy-coder, privé)gh repo create sidy-coder/<nom-repo> --private --source=. --remote=origin
# Premier commit et pushgit add -Agit commit -m "init: déploiement initial"git push -u origin main
# Installer le post-commit hook (push auto)cat > .git/hooks/post-commit << 'HOOK'#!/bin/shgit push origin $(git branch --show-current) &HOOKchmod +x .git/hooks/post-commitInviter Sidking01 comme collaborateur :
gh api repos/sidy-coder/<nom-repo>/collaborators/Sidking01 \ -X PUT -f permission=pushÉtape 6 — Vérifier
Section intitulée « Étape 6 — Vérifier »# 1. Container tournedocker ps | grep <nom>
# 2. HTTPS fonctionnecurl -sI https://DOMAINE.levell.cloud | head -3# Attendre : HTTP/2 200
# 3. Logs propresdocker logs <container> --tail 10
# 4. Repo GitHub synchroniségit log --oneline -3Checklist finale
Section intitulée « Checklist finale »- Container en statut
Updansdocker ps -
https://DOMAINE.levell.cloud→ HTTP/2 200 - Certificat SSL valide (cadenas vert dans le navigateur)
- Repo GitHub créé et premier commit pushé
- Post-commit hook installé
- Sidking01 invité comme collaborateur
- Entrée ajoutée dans
.lab_tracking/context.md - Entrée dans le journal
.lab_tracking/journal.md