Introducción: Del desarrollo al servidor de producción en Go
Has escrito una aplicación web de alto rendimiento en Go (Golang). Compilación en un solo binario, tipado estático, manejo de red integrado: todo esto le da una ventaja sobre Node.js o Python. Pero «funciona en mi máquina» no es un argumento para producción. El despliegue avanzado de una aplicación Go en VPS no es solo copiar archivos por SSH. Es configurar un pipeline CI/CD, contenerización, reverse proxy, actualización automática de certificados, monitoreo y graceful shutdown.
En este artículo, analizaremos un escenario completo listo para producción para una aplicación Golang en Ubuntu 22.04 LTS. Aprenderás cómo configurar una compilación Docker, organizar un despliegue zero-downtime a través de GitHub Actions, integrar Nginx con SSL y configurar el monitoreo de métricas con Prometheus.
1. Preparación del VPS y configuración del entorno
Supongamos que tienes un VPS (DigitalOcean, Hetzner, Timeweb) con Ubuntu 22.04. Lo primero es actualizar el sistema e instalar el conjunto básico de herramientas:
ssh root@tu_ip_del_servidorapt update && apt upgrade -yapt install -y git curl htop net-tools ufwCreamos un usuario deploy con permisos sudo (sin contraseña, solo con clave SSH):
adduser deployusermod -aG sudo deploymkdir /home/deploy/.sshcp ~/.ssh/authorized_keys /home/deploy/.ssh/chown -R deploy:deploy /home/deploy/.sshchmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keysConfiguramos el firewall UFW:
ufw allow OpenSSHufw allow 80/tcpufw allow 443/tcpufw enableImportante: Deshabilitamos el inicio de sesión para root en /etc/ssh/sshd_config (PermitRootLogin no) y reiniciamos SSH (systemctl restart sshd).
1.1 Instalación de Docker y Docker Compose
Para una aplicación Go, la contenerización es el estándar de facto. Instalamos Docker siguiendo las instrucciones oficiales:
curl -fsSL https://get.docker.com -o get-docker.shsh get-docker.shusermod -aG docker deployVerificamos la versión: docker --version. Luego instalamos Docker Compose v2 (plugin):
apt install -y docker-compose-plugin2. Pipeline CI/CD con GitHub Actions y Docker
El despliegue avanzado implica automatización. Usaremos GitHub Actions para compilar la imagen y enviarla al servidor a través de SSH, seguido de la ejecución del nuevo contenedor.
Estructura del proyecto en Go:
myapp/├── main.go├── go.mod├── Dockerfile├── docker-compose.yml└── .github/workflows/deploy.ymlDockerfile (Multi-stage build):
FROM golang:1.22-alpine AS builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/myapp .
FROM alpine:latestRUN apk --no-cache add ca-certificates tzdataWORKDIR /root/COPY --from=builder /app/myapp .EXPOSE 8080CMD ["./myapp"]docker-compose.yml (para producción):
version: '3.8'services: app: image: ghcr.io/tu_usuario/myapp:latest restart: always ports: - "127.0.0.1:8080:8080" environment: - DB_URL=postgres://user:pass@db:5432/mydb depends_on: - db db: image: postgres:16-alpine restart: always environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass volumes: - pg_data:/var/lib/postgresql/datavolumes: pg_data:Workflow de GitHub Actions (.github/workflows/deploy.yml):
name: Deploy Go Appon: push: branches: [ main ]jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io