Implantação de aplicação Go em VPS: guia avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 ufw

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

Configuramos o firewall UFW:

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

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

Verificamos a versão: docker --version. Em seguida, instalamos o Docker Compose v2 (plugin):

apt install -y docker-compose-plugin


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

Blogs

Book Recommendations