Por que Go é o candidato ideal para produção, mas o deploy ainda decide tudo
\n\nVocê escreveu um backend em Go. Ele voa: compilação em um único binário, consumo mínimo de memória, goroutines que não temem carga. Mas há um detalhe: mesmo o código mais rápido é inútil se ficar parado como peso morto na máquina local. Mais cedo ou mais tarde surge a pergunta: como colocar essa maravilha da engenharia em produção?
\n\nO deploy de aplicações Go não é rocket science, mas é fácil pisar em cascas de banana. Neste artigo, vamos analisar três caminhos principais: o clássico VPS, a conteinerização com Docker e as plataformas em nuvem. Você descobrirá qual abordagem escolher para sua tarefa e receberá scripts prontos para começar.
\n\nDeploy Go em VPS: o clássico que nunca envelhece
\n\nUm servidor virtual privado (VPS) é o seu root pessoal. Controle total, sem limitações de plataforma, mas toda a responsabilidade é sua. Para uma aplicação Go, esta é frequentemente a opção ideal: o binário pesa 10–20 MB, inicia em milissegundos e não requer orquestração complexa.
\n\nO que é necessário para deploy Go em VPS
\n\n- \n
- Servidor com Linux (Ubuntu 22.04 / Debian 11 — o clássico) \n
- Acesso SSH \n
- Go (opcional, se compilar no servidor) \n
- Systemd para gerenciamento do processo \n
- Nginx ou Caddy como reverse proxy \n
Exemplo: deploy de servidor Go via Systemd
\n\nSuponha que você tenha uma aplicação simples main.go que escuta na porta 8080. Compilamos em sua máquina para a arquitetura alvo:
GOOS=linux GOARCH=amd64 go build -o app main.go\n\nCopiamos o binário para o servidor:
\n\nscp app user@your-server:/opt/app/\n\nCriamos um unit systemd em /etc/systemd/system/app.service:
[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\nIniciamos e habilitamos a inicialização automática:
\n\nsudo systemctl daemon-reload\nsudo systemctl enable --now app\n\nAgora sua aplicação Go funciona como um daemon. Adicionamos Nginx para proxy da porta 80:
\n\nserver {\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\nVantagens do VPS: controle total, baixo custo (a partir de $5/mês), transparência. Desvantagens: atualização manual, sem autoescalonamento, precisa configurar a segurança por conta própria.
\n\nDocker para Go: conteinerização que simplifica a vida
\n\nSe você trabalha em equipe ou planeja microsserviços, Docker é sua escolha. Go e Docker são o par ideal: build multi-estágio gera imagens de 5–15 MB, e a compilação estática permite dispensar a imagem base.
\n\nDockerfile para aplicação Go
\n\nAqui está um Dockerfile mínimo, mas pronto para produção:
\n\n# Stage 1: build\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: imagem mínima\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/app .\nEXPOSE 8080\nCMD ["./app"]\n\nConstruímos e executamos:
\n\ndocker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app\n\nDocker Compose para ambiente completo
\n\nQuando a aplicação precisa de banco de dados ou Redis, use docker-compose.yml:
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