[{"data":1,"prerenderedAt":158},["ShallowReactive",2],{"seo-verification":3,"blog-deployer-golang-vps-ma-fr":6,"promo-bar-likely":157},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-deployer-golang-vps-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":100,"ctaBody":101,"ctaButton":102,"ctaUrl":103,"relatedPosts":104},51,"deployer-golang-vps",{"fr":10,"en":12,"ar":13,"es":14},"deploying-a-go-gin-application-on-a-vps","نشر-تطبيق-go-gin-على-خادم-vps","desplegar-aplicacion-go-gin-en-un-vps","Déployer une application Go (Gin) sur un VPS","Déployez une API Go (Gin) sur un VPS Cloud : binaire statique, Docker scratch, reverse proxy et SSL. Tutoriel pour développeurs Go.",8,1,false,"2026-04-30T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Développement","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-golang-vps-poster.svg",{"categorySlug":25,"appSlug":34},"golang","Go compile en un seul binaire statique sans dépendances : c'est le langage idéal pour le self-hosting. Une API Gin tient dans 15 à 30 Mo de RAM et démarre en quelques millisecondes. Ce guide vous emmène de zéro à une stack complète en production : Dockerfile multi-stage avec image `scratch`, Docker Compose avec Nginx et Certbot, live reload en développement via `air`, gestion des secrets, et dépannage des erreurs les plus courantes.",[37,41,51,54,57,82,85,88,91,94,97],{"type":38,"title":39,"body":40},"h2","Pourquoi self-héberger une API Go sur un VPS","Contrairement à Java ou Node, une application Go (avec le framework Gin) se compile en un binaire statique unique qui n'a besoin ni d'interpréteur, ni de runtime, ni de bibliothèque partagée. Vous pouvez littéralement déposer le binaire sur un VPS et l'exécuter. Cette légèreté change tout pour le self-hosting : une API Gin tourne dans 15 à 30 Mo de RAM et démarre en quelques millisecondes. Sur un VPS, vous exploitez à fond cette efficacité : un serveur d'entrée de gamme suffit à servir une charge que les langages interprétés exigeraient sur une machine bien plus grosse. Vous évitez aussi la complexité des images Docker volumineuses : une image `scratch` de 10 Mo suffit, et les builds comme les pulls sont quasi instantanés.",{"type":42,"title":43,"items":44},"ul","Bénéfices concrets",[45,46,47,48,49,50],"Binaire statique unique : aucun runtime à installer, déploiement par simple copie de fichier","Empreinte mémoire minuscule (15-30 Mo) permettant de saturer un petit VPS de requêtes","Image Docker `scratch` ou `distroless` de 10-15 Mo : builds et pulls quasi instantanés","Démarrage en millisecondes : redéploiements et redémarrages sans interruption perceptible","Concurrence native via les goroutines : un seul vCPU gère des milliers de connexions simultanées","Surface d'attaque réduite : pas d'interpréteur ni de packages système à patcher",{"type":38,"title":52,"body":53},"Prérequis matériels et logiciels","C'est là que Go brille : une API Gin sans base de données tient sur un VPS de 1 vCPU et 1 Go de RAM, et reste à l'aise. Avec PostgreSQL co-localisé, visez 2 Go pour être confortable. Vous n'avez même pas besoin de Go sur le serveur si vous compilez en CI ou en cross-compilation locale (`GOOS=linux GOARCH=amd64 go build`). Installez Docker et Docker Compose sur le VPS. Pointez un domaine `api.mondomaine.com` vers l'IP du VPS via un enregistrement A. 5 Go de disque suffisent largement. Sur votre poste de développement, Go 1.27+ est recommandé — téléchargez depuis go.dev\u002Fdl.",{"type":38,"title":55,"body":56},"Dockerfile multi-stage avec image scratch","Le Dockerfile multi-stage est la clé d'une image finale minimale. La première étape compile le binaire dans un conteneur Go complet ; la seconde le copie dans une image `scratch` vide — aucun shell, aucun OS, juste votre binaire et les certificats CA pour les appels HTTPS sortants. Voici un Dockerfile complet pour un projet Gin :\n\n```\nFROM golang:1.27-alpine AS build\nWORKDIR \u002Fapp\nCOPY go.mod go.sum .\u002F\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags=\"-s -w\" -o server .\n\nFROM scratch\nCOPY --from=build \u002Fetc\u002Fssl\u002Fcerts\u002Fca-certificates.crt \u002Fetc\u002Fssl\u002Fcerts\u002F\nCOPY --from=build \u002Fapp\u002Fserver \u002Fserver\nEXPOSE 8080\nENTRYPOINT [\"\u002Fserver\"]\n```\n\nLe flag `CGO_ENABLED=0` force un binaire 100 % statique, indispensable pour que `FROM scratch` fonctionne. Les flags `-ldflags=\"-s -w\"` suppriment les tables de debug et réduisent la taille du binaire d'environ 30 %. Le `COPY` des certificats CA est indispensable dès que votre API contacte des services externes en HTTPS (Stripe, SendGrid, etc.). Si vous avez besoin d'un shell pour déboguer, remplacez `FROM scratch` par `FROM gcr.io\u002Fdistroless\u002Fstatic-debian12` — même légèreté, mais avec quelques outils de base.",{"type":58,"title":59,"steps":60},"steps","Docker Compose de production avec Nginx et Certbot",[61,64,67,70,73,76,79],{"title":62,"body":63},"Créer la structure de fichiers sur le VPS","Connectez-vous en SSH et créez le dossier du projet : `mkdir -p \u002Fopt\u002Fmyapp\u002F{nginx\u002Fconf.d,certbot\u002Fwww,certbot\u002Fconf} && cd \u002Fopt\u002Fmyapp`. Cette structure accueillera la configuration Nginx et les volumes Certbot.",{"title":65,"body":66},"Écrire le fichier docker-compose.yml","Créez `\u002Fopt\u002Fmyapp\u002Fdocker-compose.yml` avec trois services : `app` (votre image Go), `nginx` (reverse proxy) et `certbot` (renouvellement SSL). Exemple minimal :\n```\nservices:\n  app:\n    image: monapp:latest\n    restart: unless-stopped\n    env_file: .env\n    expose:\n      - \"8080\"\n  nginx:\n    image: nginx:1.27-alpine\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\u002Fnginx\u002Fconf.d:\u002Fetc\u002Fnginx\u002Fconf.d:ro\n      - .\u002Fcertbot\u002Fwww:\u002Fvar\u002Fwww\u002Fcertbot:ro\n      - .\u002Fcertbot\u002Fconf:\u002Fetc\u002Fletsencrypt:ro\n    depends_on:\n      - app\n  certbot:\n    image: certbot\u002Fcertbot\n    volumes:\n      - .\u002Fcertbot\u002Fwww:\u002Fvar\u002Fwww\u002Fcertbot\n      - .\u002Fcertbot\u002Fconf:\u002Fetc\u002Fletsencrypt\n```",{"title":68,"body":69},"Configurer Nginx en frontal","Créez `nginx\u002Fconf.d\u002Fapp.conf`. Commencez par un bloc HTTP seul pour valider le challenge ACME, puis ajoutez le bloc HTTPS après l'obtention du certificat :\n```\nserver {\n    listen 80;\n    server_name api.mondomaine.com;\n    location \u002F.well-known\u002Facme-challenge\u002F {\n        root \u002Fvar\u002Fwww\u002Fcertbot;\n    }\n    location \u002F {\n        return 301 https:\u002F\u002F$host$request_uri;\n    }\n}\nserver {\n    listen 443 ssl;\n    server_name api.mondomaine.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fapi.mondomaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fapi.mondomaine.com\u002Fprivkey.pem;\n    location \u002F {\n        proxy_pass http:\u002F\u002Fapp:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n```",{"title":71,"body":72},"Obtenir le certificat Let's Encrypt","Démarrez Nginx seul d'abord, puis lancez Certbot en mode standalone webroot : `docker compose up -d nginx && docker compose run --rm certbot certonly --webroot -w \u002Fvar\u002Fwww\u002Fcertbot -d api.mondomaine.com --email vous@domaine.com --agree-tos`. Une fois le certificat émis, relancez Nginx : `docker compose restart nginx`.",{"title":74,"body":75},"Builder et démarrer l'application","Buildez l'image Go sur le VPS (ou transférez-la via `docker save\u002Fload` ou un registry privé) : `docker build -t monapp:latest .`. Puis démarrez la stack complète : `docker compose up -d`. Vérifiez les logs avec `docker compose logs -f app`.",{"title":77,"body":78},"Automatiser le renouvellement SSL","Ajoutez une crontab sur le VPS pour renouveler automatiquement le certificat chaque semaine : `(crontab -l 2>\u002Fdev\u002Fnull; echo \"0 3 * * 0 cd \u002Fopt\u002Fmyapp && docker compose run --rm certbot renew && docker compose restart nginx\") | crontab -`. Certbot ne renouvelle effectivement que si l'expiration est dans moins de 30 jours.",{"title":80,"body":81},"Configurer Gin pour la production","Dans votre code, passez Gin en mode release avec `gin.SetMode(gin.ReleaseMode)` ou la variable d'environnement `GIN_MODE=release` pour désactiver les logs verbeux de debug. Lisez le port et les secrets depuis l'environnement (`os.Getenv`), jamais en dur dans le code.",{"type":38,"title":83,"body":84},"Live reload en développement avec air","En développement, recompiler et relancer manuellement à chaque modification est pénible. `air` (github.com\u002Fair-verse\u002Fair, actuellement v1.67.4) surveille votre arborescence et relance le binaire à chaque changement de fichier `.go`. Installation : `go install github.com\u002Fair-verse\u002Fair@latest`. Lancez simplement `air` à la racine de votre projet — un fichier `.air.toml` par défaut est généré automatiquement au premier lancement. Pour personnaliser les répertoires surveillés ou exclure `vendor\u002F` :\n```\n[build]\n  cmd = \"go build -o .\u002Ftmp\u002Fserver .\"\n  bin = \".\u002Ftmp\u002Fserver\"\n  include_ext = [\"go\", \"html\", \"tmpl\"]\n  exclude_dir = [\"vendor\", \"testdata\"]\n```\nair ne convient qu'au développement local : n'installez jamais air dans votre image Docker de production.",{"type":38,"title":86,"body":87},"Variables d'environnement et secrets","Ne codez jamais en dur les secrets (clés API, mots de passe de base de données, tokens JWT) dans le code source. La pratique standard en Go est de les lire depuis l'environnement avec `os.Getenv(\"DB_PASSWORD\")`. Pour le développement local, un fichier `.env` chargé par `godotenv` simplifie le flux : `go get github.com\u002Fjoho\u002Fgodotenv`, puis au démarrage :\n```\nimport \"github.com\u002Fjoho\u002Fgodotenv\"\nfunc main() {\n    _ = godotenv.Load() \u002F\u002F charge .env si présent, silencieux en prod\n    db := os.Getenv(\"DB_DSN\")\n    port := os.Getenv(\"PORT\")\n    if port == \"\" { port = \"8080\" }\n    \u002F\u002F ...\n}\n```\nEn production, passez les variables via le fichier `env_file: .env` de Docker Compose (ce fichier ne doit jamais être commité — ajoutez `.env` à votre `.gitignore`). Pour les secrets très sensibles (tokens, clés privées), préférez les secrets Docker ou un vault externe (Vault by HashiCorp, Infisical). La règle d'or : un secret dans un `git log` est un secret compromis.",{"type":89,"body":90},"tip","Activez le profiling `pprof` de Go derrière un endpoint protégé : `import _ \"net\u002Fhttp\u002Fpprof\"` exposé sur un port interne uniquement accessible en SSH tunnel (`ssh -L 6060:localhost:6060 user@vps`). Vous obtenez des flame graphs CPU et mémoire en production réelle sans surcharge notable. Pensez aussi à compiler avec `-ldflags=\"-s -w\"` pour réduire la taille du binaire de ~30 % en supprimant les tables de debug.",{"type":38,"title":92,"body":93},"Dépannage : erreurs courantes","Voici les cinq erreurs les plus fréquentes lors d'un premier déploiement Go sur VPS, avec leurs messages exacts et la correction à appliquer.\n\n**1. `standard_init_linux.go:228: exec user process caused: no such file or directory`** — Le binaire a été compilé avec CGO activé et l'image `scratch` ne contient aucune libc. Correction : recompilez avec `CGO_ENABLED=0 go build -o server .`.\n\n**2. `exec format error`** — Le binaire a été compilé pour une architecture différente (ex. : macOS ARM → Linux AMD64). Correction : vérifiez `GOOS=linux GOARCH=amd64` avant le build, ou buildez directement sur le VPS.\n\n**3. `bind: address already in use` (port 8080)** — Un autre processus écoute déjà sur ce port. Vérifiez avec `ss -tlnp | grep 8080` et arrêtez le processus conflictuel, ou changez le port dans votre `.env`.\n\n**4. `x509: certificate signed by unknown authority` ou `certificate has expired`** — Votre conteneur `scratch` ne dispose pas des certificats CA (`\u002Fetc\u002Fssl\u002Fcerts\u002Fca-certificates.crt`), ou le certificat Let's Encrypt a expiré. Correction : vérifiez que le `COPY --from=build \u002Fetc\u002Fssl\u002Fcerts\u002Fca-certificates.crt` est présent dans votre Dockerfile, et relancez Certbot pour renouveler.\n\n**5. `permission denied` au démarrage du binaire** — Le binaire n'est pas exécutable. Correction : vérifiez les permissions avec `ls -la server` et appliquez `chmod +x server` si nécessaire. Dans un Dockerfile, le `COPY --from=build` préserve normalement les permissions, mais un `RUN chmod +x \u002Fserver` explicite garantit le résultat.",{"type":38,"title":95,"body":96},"Déployer Go (Gin) en un clic depuis le Marketplace ServOrbit","Le Marketplace ServOrbit propose un template Go (Gin) Stack préconfiguré : Go depuis le binaire officiel go.dev, Nginx et PostgreSQL 16 sont installés automatiquement sur votre VPS dès la commande. Pas de session SSH pour l'installation de base — vous arrivez directement à l'étape de compiler votre projet et d'uploader le binaire. La fiche marketplace contient les spécifications exactes, les cas d'usage et un guide de première connexion.",{"type":38,"title":98,"body":99},"Pour aller plus loin","Vous maîtrisez maintenant le déploiement d'une API Go sur VPS. Pour aller encore plus loin : configurez **Traefik v3** comme reverse proxy à la place de Nginx — il gère le routage, les certificats Let's Encrypt et le load balancing dans un seul conteneur, avec une configuration déclarative en labels Docker (voir notre guide [Traefik v3 sur VPS](\u002Fblog\u002Ftraefik-v3-vps-reverse-proxy)). Pour les mises à jour en production sans interruption, consultez notre article sur les [bonnes pratiques Docker Compose](\u002Fblog\u002Fdocker-compose-mise-a-jour-best-practices-vps) : déploiements rolling, health checks et stratégies de rollback. Enfin, si vous préférez déléguer l'infrastructure, notre [template Go (Gin) dans le Marketplace](\u002Fapplications\u002Fdeveloppement\u002Fgolang) provisionnne l'ensemble de la stack en quelques minutes.","Déployez votre Go (Gin) Stack en quelques minutes","Le template Go (Gin) Stack ServOrbit installe Go 1.22+, Nginx et PostgreSQL 16 sur votre VPS. Cross-compilez votre projet et déployez le binaire immédiatement.","Déployer Go (Gin) Stack","\u002Fapplications\u002Fdeveloppement\u002Fgolang",[105,122,140],{"id":106,"slug":107,"slugs":108,"title":112,"excerpt":113,"readTime":114,"views":23,"isPinned":19,"noindex":19,"publishedAt":115,"updatedAt":21,"category":116,"categories":117,"featuredImage":30,"bgImage":31,"posterImage":119,"relatedSolution":120},45,"deployer-fastapi-vps",{"fr":107,"en":109,"ar":110,"es":111},"deploy-a-fastapi-application-on-a-vps","نشر-تطبيق-fastapi-على-vps","desplegar-una-aplicacion-fastapi-en-un-vps","Déployer FastAPI sur un VPS : guide complet production","Déployez FastAPI sur un VPS avec Docker multi-stage, Gunicorn, PostgreSQL, CI\u002FCD GitHub Actions et monitoring. Guide Python production 2025.",10,"2026-05-06T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[118],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-fastapi-vps-poster.svg",{"categorySlug":25,"appSlug":121},"fastapi",{"id":123,"slug":124,"slugs":125,"title":129,"excerpt":130,"readTime":131,"views":132,"isPinned":19,"noindex":19,"publishedAt":133,"updatedAt":21,"category":134,"categories":135,"featuredImage":30,"bgImage":31,"posterImage":137,"relatedSolution":138},44,"deployer-django-vps",{"fr":124,"en":126,"ar":127,"es":128},"deploy-a-django-application-on-a-vps","نشر-تطبيق-django-على-vps","desplegar-una-aplicacion-django-en-un-vps","Déployer une application Django sur un VPS","Déployez Django sur un VPS : Gunicorn, Nginx, PostgreSQL, Docker et SSL. Guide complet pour développeurs Python qui veulent self-héberger.",3,7,"2026-05-07T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[136],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":25,"appSlug":139},"django",{"id":141,"slug":142,"slugs":143,"title":147,"excerpt":148,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":149,"updatedAt":150,"category":151,"categories":152,"featuredImage":30,"bgImage":31,"posterImage":154,"relatedSolution":155},43,"deployer-nodejs-vps",{"fr":142,"en":144,"ar":145,"es":146},"deploy-a-nodejs-application-on-a-vps","نشر-تطبيق-nodejs-على-vps","desplegar-una-aplicacion-nodejs-en-un-vps","Déployer une application Node.js sur un VPS","Déployez une application Node.js en production sur un VPS : PM2, reverse proxy Nginx, SSL Let's Encrypt et démarrage automatique au boot.","2026-05-08T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[153],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":25,"appSlug":156},"nodejs-stack",true,1794270696977]