Por qué Go es el candidato ideal para producción, pero el despliegue sigue siendo clave
\n\nHas escrito un backend en Go. Vuela: compilación en un solo binario, consumo mínimo de memoria, gorutinas que no temen a la carga. Pero hay un detalle: incluso el código más rápido es inútil si yace como peso muerto en tu máquina local. Tarde o temprano surge la pregunta: ¿cómo sacar esta maravilla de la ingeniería a producción?
\n\nEl despliegue de aplicaciones Go no es ciencia espacial, pero es fácil pisar el palito. En este artículo analizaremos tres caminos principales: el clásico VPS, la contenerización con Docker y las plataformas en la nube. Descubrirás qué enfoque elegir según tu tarea y obtendrás scripts listos para empezar.
\n\nDespliegue de Go en VPS: un clásico que nunca pasa de moda
\n\nUn servidor privado virtual (VPS) es tu propio root. Control total, sin restricciones de plataforma, pero toda la responsabilidad recae sobre ti. Para una aplicación Go, suele ser la opción óptima: el binario pesa 10–20 MB, se inicia en milisegundos y no requiere orquestación compleja.
\n\nQué necesitas para desplegar Go en un VPS
\n\n- \n
- Servidor con Linux (Ubuntu 22.04 / Debian 11 — clásicos) \n
- Acceso SSH \n
- Go (opcional, si compilas en el servidor) \n
- Systemd para gestionar el proceso \n
- Nginx o Caddy como proxy inverso \n
Ejemplo: despliegue de un servidor Go con Systemd
\n\nSupongamos que tienes una aplicación simple main.go que escucha en el puerto 8080. La compilamos en nuestra máquina para la arquitectura objetivo:
GOOS=linux GOARCH=amd64 go build -o app main.go\n\nCopiamos el binario al servidor:
\n\nscp app user@your-server:/opt/app/\n\nCreamos una unidad systemd en /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\nIniciamos y habilitamos el inicio automático:
\n\nsudo systemctl daemon-reload\nsudo systemctl enable --now app\n\nAhora tu aplicación Go funciona como un demonio. Añadimos Nginx para hacer proxy desde el puerto 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\nVentajas del VPS: control total, bajo costo (desde $5/mes), transparencia. Desventajas: actualización manual, sin autoescalado, debes configurar la seguridad tú mismo.
\n\nDocker para Go: contenerización que simplifica la vida
\n\nSi trabajas en equipo o planeas microservicios, Docker es tu elección. Go y Docker son la pareja ideal: la compilación multi-etapa produce imágenes de 5–15 MB, y la compilación estática permite prescindir de una imagen base.
\n\nDockerfile para una aplicación Go
\n\nAquí tienes un Dockerfile mínimo pero listo para producción:
\n\n# Stage 1: compilación\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: imagen mínima\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/app .\nEXPOSE 8080\nCMD ["./app"]\n\nConstruimos e iniciamos:
\n\ndocker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app\n\nDocker Compose para un entorno completo
\n\nCuando la aplicación necesita una base de datos o Redis, usa 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