Pourquoi Go est le candidat idéal pour la production, mais le déploiement reste crucial
\n\nVous 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\nLe 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\nDéploiement Go sur VPS : un classique indémodable
\n\nUn 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\nCe 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
Exemple : déploiement d'un serveur Go avec Systemd
\n\nSupposons que vous ayez une application simple main.go qui écoute sur le port 8080. Compilez-la sur votre machine pour l'architecture cible :
GOOS=linux GOARCH=amd64 go build -o app main.go\n\nCopiez le binaire sur le serveur :
\n\nscp app user@your-server:/opt/app/\n\nCréez une unité systemd dans /etc/systemd/system/app.service :
[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\nLancez et activez le démarrage automatique :
\n\nsudo systemctl daemon-reload\nsudo systemctl enable --now app\n\nVotre application Go fonctionne désormais comme un démon. Ajoutez Nginx pour le proxy depuis le port 80 :
\n\nserver {\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\nAvantages 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\nDocker pour Go : la conteneurisation qui simplifie la vie
\n\nSi 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\nDockerfile pour une application Go
\n\nVoici 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\nConstruisez et lancez :
\n\ndocker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app\n\nDocker Compose pour un environnement complet
\n\nLorsque l'application nécessite une base de données ou Redis, utilisez docker-compose.yml :
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