Despliegue de una aplicación Go en VPS: guía avanzada

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

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 ufw

Creamos 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_keys

Configuramos el firewall UFW:

ufw allow OpenSSHufw allow 80/tcpufw allow 443/tcpufw enable

Importante: 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 deploy

Verificamos la versión: docker --version. Luego instalamos Docker Compose v2 (plugin):

apt install -y docker-compose-plugin


2. 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.yml

Dockerfile (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                

Blogs

Book Recommendations