Go en production : VPS, Docker ou Cloud — choisir le meilleur déploiement

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi Go est le candidat idéal pour la production, mais le déploiement reste crucial

\n\n

Vous avez écrit un backend en Go. Il est performant : compilation en un seul binaire, consommation mémoire minimale, goroutines qui ne craignent pas la charge. Mais il y a un hic : même le code le plus rapide est inutile s'il reste inactif sur votre machine locale. Tôt ou tard, la question se pose : comment déployer ce chef-d'œuvre d'ingénierie en production ?

\n\n

Le déploiement d'applications Go n'est pas une science infuse, mais il est facile de tomber dans des pièges. Dans cet article, nous allons explorer trois voies principales : le VPS classique, la conteneurisation avec Docker et les plateformes cloud. Vous découvrirez quelle approche choisir selon votre projet, et obtiendrez des scripts prêts à l'emploi pour démarrer.

\n\n

Déploiement Go sur VPS : un classique indémodable

\n\n

Un serveur privé virtuel (VPS) est votre propre espace root. Contrôle total, aucune limitation de plateforme, mais la responsabilité vous incombe entièrement. Pour une application Go, c'est souvent l'option optimale : le binaire pèse 10 à 20 Mo, se lance en millisecondes et ne nécessite pas d'orchestration complexe.

\n\n

Ce qu'il faut pour déployer Go sur VPS

\n\n
    \n
  • Un serveur Linux (Ubuntu 22.04 / Debian 11 — les classiques)
  • \n
  • Accès SSH
  • \n
  • Go (optionnel, si vous compilez sur le serveur)
  • \n
  • Systemd pour la gestion des processus
  • \n
  • Nginx ou Caddy comme reverse proxy
  • \n
\n\n

Exemple : déploiement d'un serveur Go avec Systemd

\n\n

Supposons que vous ayez une application simple main.go qui écoute sur le port 8080. Compilez-la sur votre machine pour l'architecture cible :

\n\n
GOOS=linux GOARCH=amd64 go build -o app main.go
\n\n

Copiez le binaire sur le serveur :

\n\n
scp app user@your-server:/opt/app/
\n\n

Créez une unité systemd dans /etc/systemd/system/app.service :

\n\n
[Unit]\nDescription=Go App\nAfter=network.target\n\n[Service]\nExecStart=/opt/app/app\nWorkingDirectory=/opt/app\nRestart=always\nUser=www-data\nGroup=www-data\nEnvironment=PORT=8080\n\n[Install]\nWantedBy=multi-user.target
\n\n

Lancez et activez le démarrage automatique :

\n\n
sudo systemctl daemon-reload\nsudo systemctl enable --now app
\n\n

Votre application Go fonctionne désormais comme un démon. Ajoutez Nginx pour le proxy depuis le port 80 :

\n\n
server {\n    listen 80;\n    server_name yourdomain.com;\n\n    location / {\n        proxy_pass http://127.0.0.1:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}
\n\n

Avantages du VPS : contrôle total, coût faible (à partir de 5 $/mois), transparence. Inconvénients : mises à jour manuelles, pas d'auto-scaling, configuration de la sécurité à faire soi-même.

\n\n

Docker pour Go : la conteneurisation qui simplifie la vie

\n\n

Si vous travaillez en équipe ou prévoyez des microservices, Docker est votre choix. Go et Docker forment un duo parfait : la construction multi-étapes donne des images de 5 à 15 Mo, et la compilation statique permet de se passer d'image de base.

\n\n

Dockerfile pour une application Go

\n\n

Voici un Dockerfile minimal mais prêt pour la production :

\n\n
# Stage 1 : construction\nFROM golang:1.22-alpine AS builder\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o app .\n\n# Stage 2 : image minimale\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/app .\nEXPOSE 8080\nCMD ["./app"]
\n\n

Construisez et lancez :

\n\n
docker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app
\n\n

Docker Compose pour un environnement complet

\n\n

Lorsque l'application nécessite une base de données ou Redis, utilisez docker-compose.yml :

\n\n
version: '3.8'\nservices:\n  app:\n    build: .\n    ports:\n      - "8080:8080"\n    environment:\n      - DB_HOST=db\n      - DB_PORT=5432\n    depends_on:\n      - db\n  db:\n    image: postgres                

Blogs

Book Recommendations