Go en producción: VPS, Docker o Cloud — elegimos el mejor despliegue

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué Go es el candidato ideal para producción, pero el despliegue sigue siendo clave

\n\n

Has 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\n

El 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\n

Despliegue de Go en VPS: un clásico que nunca pasa de moda

\n\n

Un 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\n

Qué 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
\n\n

Ejemplo: despliegue de un servidor Go con Systemd

\n\n

Supongamos que tienes una aplicación simple main.go que escucha en el puerto 8080. La compilamos en nuestra máquina para la arquitectura objetivo:

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

Copiamos el binario al servidor:

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

Creamos una unidad systemd en /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

Iniciamos y habilitamos el inicio automático:

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

Ahora tu aplicación Go funciona como un demonio. Añadimos Nginx para hacer proxy desde el puerto 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

Ventajas del VPS: control total, bajo costo (desde $5/mes), transparencia. Desventajas: actualización manual, sin autoescalado, debes configurar la seguridad tú mismo.

\n\n

Docker para Go: contenerización que simplifica la vida

\n\n

Si 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\n

Dockerfile para una aplicación Go

\n\n

Aquí 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\n

Construimos e iniciamos:

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

Docker Compose para un entorno completo

\n\n

Cuando la aplicación necesita una base de datos o Redis, usa 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