Introdução: Do desenvolvimento ao servidor de produção em Go
Você escreveu uma aplicação web de alto desempenho em Go (Golang). Compilação em um único binário, tipagem estática, suporte nativo a rede — tudo isso dá uma vantagem sobre Node.js ou Python. Mas "funciona na minha máquina" não é um argumento para produção. A implantação avançada de uma aplicação Go em VPS não é apenas copiar arquivos via SSH. É configurar um pipeline CI/CD, conteinerização, reverse proxy, atualização automática de certificados, monitoramento e graceful shutdown.
Neste artigo, vamos analisar um cenário completo pronto para produção para uma aplicação Golang no Ubuntu 22.04 LTS. Você aprenderá como configurar uma build Docker, organizar uma implantação zero-downtime via GitHub Actions, integrar Nginx com SSL e configurar o monitoramento de métricas com Prometheus.
1. Preparação da VPS e configuração do ambiente
Supondo que você tenha uma VPS (DigitalOcean, Hetzner, Timeweb) com Ubuntu 22.04. Primeiro, atualizamos o sistema e instalamos um conjunto básico de ferramentas:
ssh root@your_server_ipapt update && apt upgrade -yapt install -y git curl htop net-tools ufwCriamos um usuário deploy com privilégios sudo (sem senha, apenas com chave 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 o firewall UFW:
ufw allow OpenSSHufw allow 80/tcpufw allow 443/tcpufw enableImportante: Desabilitamos o login de root em /etc/ssh/sshd_config (PermitRootLogin no) e reiniciamos o SSH (systemctl restart sshd).
1.1 Instalação do Docker e Docker Compose
Para uma aplicação Go, a conteinerização é o padrão de facto. Instalamos o Docker conforme a instrução oficial:
curl -fsSL https://get.docker.com -o get-docker.shsh get-docker.shusermod -aG docker deployVerificamos a versão: docker --version. Em seguida, instalamos o Docker Compose v2 (plugin):
apt install -y docker-compose-plugin2. Pipeline CI/CD com GitHub Actions e Docker
Implantação avançada implica automação. Usaremos o GitHub Actions para construir a imagem e enviá-la ao servidor via SSH, seguido pela execução do novo contêiner.
Estrutura do projeto em 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 produção):
version: '3.8'services: app: image: ghcr.io/your_username/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 do 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