IdentitiesOnly=yes et que la clé publique est bien ajoutée au dépôt.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.
Ton architecture
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.
| Élément | Chez toi |
|---|---|
| Serveur | VPS 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 |
| Orchestration | Un docker-compose.yml global dans ~ qui déclare toutes les apps |
| Git | Forgejo sur git.pix-up.com (SSH sur le port 2222) |
| n8n | Conteneur debian-n8n-1, volume n8n_data |
Pour vérifier
Combien de ports faut-il ouvrir sur le VPS pour toutes les applications web ?
Déployer une application
Ajouter une application au compose global
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.
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).
RUN npm ci (étape builder), puis copie du build dans l'image finale
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 ?
Forgejo : relier le VPS à ton dépôt
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 leforgejo-pixutilisé dansgit clone forgejo-pix:pix-up/logo.git).
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
docker 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é ?
DNS et Cloudflare
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 vois | Signification |
|---|---|
ping renvoie une IP en 188.114.x / 104.x | Enregistrement proxifié (nuage orange) : tu atteins Cloudflare, pas ton VPS |
ping renvoie l'IP du VPS | Enregistrement DNS seul : le trafic arrive directement |
ENOTFOUND dans n8n | Le conteneur n'arrive pas à résoudre le nom (cache ou DNS Docker) |
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
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}'Authorization: Bearer <token> ; teste GET /user/tokens/verify ; permission Zone → DNS → Edit sur la bonne zone.ttl envoyé en texte ("1").1 (automatique).Pour vérifier
`ping` renvoie 188.114.97.2 au lieu de l'IP de ton VPS. Pourquoi ?
Certificats HTTPS
- Sur le VPS, Traefik obtient et renouvelle les certificats Let's Encrypt (fichier
acme.json). curl -Iv https://design.pix-up.com: regarde la ligneissuer. 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
Hostabsente). - 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.
SSL/install_ssl).docker inspect forgejo | grep traefik.http.routers.Exploitation courante
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;ouif ($?) { ... }. .dockerignoredoit contenirdata,.git,node_modules,vendorpour ne pas embarquer des dossiers à droits root dans le build.- Supabase : si
docker composerépond « empty section between colons » surdocker.sock, une ligne de volume du compose a un chemin vide avant:/var/run/docker.sock.
anon (soumise à la RLS) ou service_role (serveur uniquement), dans Project Settings → API.VPS ou serveur à la maison ?
| Critère | Ce que tu as retenu |
|---|---|
| Coût | Un 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éseau | IP dynamique ou CGNAT : prévoir un tunnel (Cloudflare Tunnel, Tailscale) ou garder un petit VPS en entrée |
| Performances | NVMe du VPS plus rapide qu'un SSD SATA ; en échange, 2 Gbit/s et trafic illimité |
| GPU | Seul 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 ?