Aller au contenu

Déployer une nouvelle application

Déployer une nouvelle application sur le VPS Levell se fait en 6 étapes :

  1. Préparer le code et le Dockerfile
  2. Créer le docker-compose.yml avec les labels Traefik
  3. Pointer le DNS vers le VPS
  4. Démarrer le container
  5. Initialiser le repo GitHub
  6. Vérifier que tout fonctionne

Crée un dossier dans /docker/ :

Fenêtre de terminal
mkdir /docker/<nom-projet>
cd /docker/<nom-projet>
# Stage 1 — Build
FROM node:lts-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2 — Production
FROM node:lts-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production PORT=3000 HOSTNAME="0.0.0.0"
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]
FROM nginx:alpine
COPY html /usr/share/nginx/html
EXPOSE 80

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: true

Si l’application a besoin de volumes persistants :

volumes:
- nom_volume:/chemin/dans/container
volumes:
nom_volume:

Dans ton panneau DNS (Hostinger, OVH, etc.), ajoute un enregistrement A :

DOMAINE.levell.cloud → IP_DU_VPS

Vérifier la propagation (peut prendre jusqu’à 5 minutes) :

Fenêtre de terminal
dig +short DOMAINE.levell.cloud

Fenêtre de terminal
cd /docker/<nom-projet>
docker compose up -d --build
# Vérifier que le container tourne
docker ps | grep <nom>
# Voir les logs de démarrage
docker logs <container> --tail 30

Traefik détecte automatiquement le nouveau container et génère le certificat SSL. Attendre 30 secondes, puis :

Fenêtre de terminal
curl -sI https://DOMAINE.levell.cloud | head -3

Fenêtre de terminal
cd /docker/<nom-projet>
# Initialiser Git
git init
git branch -M main
# Créer le .gitignore
echo ".env
node_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 push
git add -A
git 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/sh
git push origin $(git branch --show-current) &
HOOK
chmod +x .git/hooks/post-commit

Inviter Sidking01 comme collaborateur :

Fenêtre de terminal
gh api repos/sidy-coder/<nom-repo>/collaborators/Sidking01 \
-X PUT -f permission=push

Fenêtre de terminal
# 1. Container tourne
docker ps | grep <nom>
# 2. HTTPS fonctionne
curl -sI https://DOMAINE.levell.cloud | head -3
# Attendre : HTTP/2 200
# 3. Logs propres
docker logs <container> --tail 10
# 4. Repo GitHub synchronisé
git log --oneline -3

  • Container en statut Up dans docker 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