OLYMPUS

Formations

Mini-formation · tiré de ~27 conversations

Ton VPS : Docker, Traefik, Forgejo et DNS

Comment ton serveur OVH est monté, comment on y déploie une application, et les pannes que tu as réellement rencontrées (DNS, certificats, port, droits) avec leur correctif.

~27 conversations7 modules12 mois~25 min de lecture
Cloudflare (DNS)VPS OVH · Debian · ports 80 et 443Traefikdesk.pix-up.comgit.pix-up.comaudit.pix-up.comn8nSupabase…
00

Ton architecture

ObjectifSavoir ce qui tourne où, pour savoir où regarder quand ça casse.

Un seul VPS OVH sous Debian héberge tout : n8n, Forgejo, tes applications et leurs bases. Un reverse proxy Traefik écoute les ports 80 et 443 et envoie chaque nom de domaine vers le bon conteneur. DNS et certificats passent par Cloudflare et Let's Encrypt.

Cloudflare (DNS)VPS OVH · Debian · ports 80 et 443Traefikdesk.pix-up.comgit.pix-up.comaudit.pix-up.comn8nSupabase…
Un domaine = une règle Traefik = un conteneur. Aucun autre port n'est exposé.
ÉlémentChez toi
ServeurVPS OVH, Debian ; offre VPS-3 évoquée en sept. 2026 : 6 vCores, 12 Go RAM, 100 Go NVMe, ~12,48 € TTC/mois
Dossiers des apps~/apps/<domaine>, par ex. ~/apps/desk.pix-up.com
OrchestrationUn docker-compose.yml global dans ~ qui déclare toutes les apps
GitForgejo sur git.pix-up.com (SSH sur le port 2222)
n8nConteneur debian-n8n-1, volume n8n_data

Pour vérifier

Combien de ports faut-il ouvrir sur le VPS pour toutes les applications web ?

01

Déployer une application

ObjectifPasser du code local à une application en ligne, toujours de la même façon.
Ton PCgit pushForgejogit.pix-up.comVPSgit pullDockerup -d --build
Tu développes en local, tu pousses sur Forgejo, le VPS tire et reconstruit.

Ajouter une application au compose global

docker-compose.yml (extrait)
  desk:
    build: ./apps/desk.pix-up.com
    restart: always
    labels:
      - traefik.enable=true
      - traefik.http.routers.desk.rule=Host(`desk.pix-up.com`)

Pas de port à publier : la règle Host(...) suffit. Ton domaine pointe sur le VPS, Traefik fait le reste.

Lancer ou relancer une app
cd ~
docker compose up -d --build desk
docker logs --tail=50 desk

Dockerfile d'une app Next.js

Le build a échoué avec « Cannot apply unknown utility class text-white » parce que le Dockerfile faisait npm ci --only=production : Tailwind et Next sont en devDependencies et manquaient au moment du build. Installe tout pour construire, puis ne garde que le nécessaire à l'exécution (build en plusieurs étapes).

Correct
EXPRESSION
RUN npm ci   (étape builder), puis copie du build dans l'image finale
Incorrect
EXPRESSION
RUN npm ci --only=production   puis   RUN npm run build

Pour vérifier

Ton build Docker de Next.js échoue sur une classe Tailwind inconnue. Cause la plus probable ?

02

Forgejo : relier le VPS à ton dépôt

ObjectifFaire un git pull sur le VPS sans mot de passe, pour chaque dépôt.
  • Crée une clé SSH sur le VPS (ssh-keygen -t ed25519).
  • Ajoute la clé publique comme clé de déploiement du dépôt Forgejo (lecture suffit, écriture si le VPS pousse).
  • Forgejo écoute en SSH sur le port 2222 : l'URL est ssh://git@git.pix-up.com:2222/pix-up/<repo>.git.
  • Pour ne pas retaper l'option, déclare un alias dans ~/.ssh/config (c'est le forgejo-pix utilisé dans git clone forgejo-pix:pix-up/logo.git).
Tester l'accès à un dépôt
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes -p 2222" \
  git ls-remote ssh://git@git.pix-up.com:2222/pix-up/pix-desk.git
« git@git.pix-up.com's password: » puis Permission denied
CauseLe serveur SSH ne reconnaît pas la clé (mauvais port ou clé non associée) et retombe sur le mot de passe.
SolutionVérifie le port 2222, IdentitiesOnly=yes et que la clé publique est bien ajoutée au dépôt.
« deploy-key-vps is not authorized to read pix-up/logo »
CauseUne clé de déploiement ne vaut que pour un dépôt.
SolutionAjoute la clé à chaque dépôt, ou utilise une clé d'utilisateur (Paramètres → Clés SSH) pour tous.
Mot de passe admin Forgejo oublié
CauseIl n'y a pas d'identifiant par défaut : le premier compte créé est administrateur.
Solutiondocker exec -u git -it forgejo forgejo admin user change-password --username <user> --password '<mdp>' (en root dans le conteneur, la commande est refusée).

Pour vérifier

Pourquoi `docker exec ... forgejo admin ...` est-il refusé ?

03

DNS et Cloudflare

ObjectifDiagnostiquer un nom de domaine qui ne répond pas, dans le bon ordre.

Premier réflexe : ping git.pix-up.com depuis le VPS. « Name or service not known » = le nom n'existe pas encore pour ce serveur. Un enregistrement A créé chez l'hébergeur de domaine ne compte pas si les serveurs de noms sont ceux de Cloudflare : c'est la zone Cloudflare qui fait foi.

Ce que tu voisSignification
ping renvoie une IP en 188.114.x / 104.xEnregistrement proxifié (nuage orange) : tu atteins Cloudflare, pas ton VPS
ping renvoie l'IP du VPSEnregistrement DNS seul : le trafic arrive directement
ENOTFOUND dans n8nLe conteneur n'arrive pas à résoudre le nom (cache ou DNS Docker)
Purger côté Docker / hôte
docker compose restart
sudo resolvectl flush-caches
nslookup pegasus.pix-up.com 1.1.1.1

# docker-compose.yml, service concerné :
#   dns:
#     - 1.1.1.1
#     - 8.8.8.8

Créer un enregistrement par l'API Cloudflare

POST /zones/ZONE_ID/dns_records
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" \
  -H "Authorization: Bearer TON_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"type":"A","name":"test.exemple.com","content":"1.2.3.4","ttl":1,"proxied":false}'
401/403 « Authentication error » (code 10000)
CauseEn-tête mal formé, token vide ou clé globale mélangée avec un token.
SolutionAuthorization: Bearer <token> ; teste GET /user/tokens/verify ; permission Zone → DNS → Edit sur la bonne zone.
400 « ttl must be a number » (code 9208)
Causettl envoyé en texte ("1").
SolutionEnvoie le nombre 1 (automatique).

Pour vérifier

`ping` renvoie 188.114.97.2 au lieu de l'IP de ton VPS. Pourquoi ?

04

Certificats HTTPS

ObjectifComprendre pourquoi un certificat est « non sécurisé » et où il est géré.
  • Sur le VPS, Traefik obtient et renouvelle les certificats Let's Encrypt (fichier acme.json).
  • curl -Iv https://design.pix-up.com : regarde la ligne issuer. Il doit y avoir Let's Encrypt, pas TRAEFIK DEFAULT CERT.
  • « self-signed certificate » juste après un changement = Traefik n'a pas encore émis le certificat (nom pas résolu, port 80 injoignable, règle Host absente).
  • Sur un hébergement cPanel / o2switch derrière Cloudflare, la validation automatique échoue souvent (« Error issuing certificate » ou le TXT de vérification) : vérifie que le domaine pointe bien vers ce serveur.

Pour envoyer à cPanel un certificat émis par Traefik, l'idée retenue était de lire acme.json, décoder certificate et key en base64, puis les passer à l'API SSL de cPanel. Si cPanel refuse « le certificat n'a pas pu être analysé », sépare le certificat de sa chaîne.

« You do not have the feature autossl »
CauseL'offre d'hébergement n'inclut pas cette fonction.
SolutionPasse par l'installation manuelle d'un certificat (API SSL/install_ssl).
404 sur git.pix-up.com après redémarrage
CauseLe conteneur n'a plus les labels Traefik du compose global (on a créé un second compose).
SolutionUn seul compose global ; vérifie avec docker inspect forgejo | grep traefik.http.routers.
05

Exploitation courante

ObjectifLes gestes de maintenance, avec une sauvegarde avant chaque mise à jour.
Mettre à jour n8n, avec sauvegarde du volume
cd /home/debian && docker run --rm -v n8n_data:/data -v /home/debian:/backup alpine \
  tar czf /backup/n8n_data_backup_$(date +%F_%H-%M).tar.gz -C /data .
ls -lh /home/debian/n8n_data_backup_*.tar.gz
docker compose pull n8n && docker compose up -d n8n
  • Aucune sortie pendant 10 à 30 s pendant le tar : normal. Ne coupe pas avec Ctrl+C (tu as annulé le backup juste après le téléchargement d'alpine).
  • Sous PowerShell, && n'est pas un séparateur valide : utilise ; ou if ($?) { ... }.
  • .dockerignore doit contenir data, .git, node_modules, vendor pour ne pas embarquer des dossiers à droits root dans le build.
  • Supabase : si docker compose répond « empty section between colons » sur docker.sock, une ligne de volume du compose a un chemin vide avant :/var/run/docker.sock.
Clé Supabase `sb_publishable_…` refusée sur `/rest/v1` (« Access to schema is forbidden »)
CauseCette clé n'est pas faite pour l'API REST depuis n8n.
SolutionUtilise la clé anon (soumise à la RLS) ou service_role (serveur uniquement), dans Project Settings → API.
06

VPS ou serveur à la maison ?

ObjectifGarder en tête le raisonnement pour ne pas migrer à la légère.
CritèreCe que tu as retenu
CoûtUn serveur à 70-100 W revient à ~10-14 €/mois d'électricité : pas d'économie face à un VPS à ~12,5 €
DisponibilitéLe PC doit tourner 24/7 ; une coupure ou une mise à jour fait tomber tous les domaines
RéseauIP dynamique ou CGNAT : prévoir un tunnel (Cloudflare Tunnel, Tailscale) ou garder un petit VPS en entrée
PerformancesNVMe du VPS plus rapide qu'un SSD SATA ; en échange, 2 Gbit/s et trafic illimité
GPUSeul vrai gain d'une machine locale : génération d'images, Ollama

Recommandation donnée : ne pas supprimer le VPS d'abord. Monter la machine locale en parallèle 1 à 2 semaines, y migrer les apps l'une après l'autre, puis décider.

Pour vérifier

Quel est le principal intérêt d'une machine locale par rapport au VPS à 12 €/mois ?

Source : conversations sur Supabase, Docker, Forgejo, Cloudflare, Let's Encrypt et le choix VPS/local, d'octobre 2025 à septembre 2026. Les noms (domaines, dossiers) sont les tiens ; les mots de passe et clés des échanges sont volontairement omis.
Neo