Rodar um programa em Go num VPS como um serviço que se reinicia sozinho

Node.js, Python e Docker·· 175 visualizações· 3 min de leitura

A resposta curta: um programa em Go compila para um único arquivo, sem nada para instalar no servidor. Num VPS, o caminho certo é: compilar, copiar o arquivo, e pô-lo a rodar como um serviço do sistema (systemd), que o inicia com o servidor e o reinicia se falhar. Depois, um servidor web à frente trata do endereço e do https.

1. Compilar para Linux

No seu computador (seja Windows, Mac ou Linux), na pasta do projeto:
GOOS=linux GOARCH=amd64 go build -o meuapp .
Isto cria o arquivo meuapp para um servidor Linux de 64 bits. No Windows, defina as duas variáveis antes de rodar o comando, de acordo com o seu terminal.

2. Copiar e preparar

1 Envie o arquivo para o VPS: Atalhos de SSH e scp. Ponha-o numa pasta como /opt/meuapp/.
2 Crie um usuário sem poderes para o rodar (sudo useradd --system --no-create-home meuapp) e dê-lhe o arquivo e a pasta.
3 Faça o programa ouvir só em 127.0.0.1 numa porta (por exemplo, 8080): quem o expõe à internet é o servidor web, e não ele.
4 Dê permissão de execução: sudo chmod +x /opt/meuapp/meuapp.

3. O serviço (systemd)

Crie o arquivo /etc/systemd/system/meuapp.service com:
[Unit]
Description=O meu programa em Go
After=network.target

[Service]
User=meuapp
WorkingDirectory=/opt/meuapp
ExecStart=/opt/meuapp/meuapp
Restart=on-failure
Environment=PORT=8080

[Install]
WantedBy=multi-user.target

Para Comando
Ler o arquivo novo sudo systemctl daemon-reload
Iniciar já e a cada reinício do servidor sudo systemctl enable --now meuapp
Ver se está correndo sudo systemctl status meuapp
Ver o que escreve (os registros) sudo journalctl -u meuapp -f
Depois de enviar uma versão nova sudo systemctl restart meuapp

Se o serviço não inicia, o status diz por quê: Um serviço que não inicia.

4. Mostrá-lo na internet

Ponha o nginx à frente, a passar os pedidos do seu domínio para 127.0.0.1:8080: O nginx como proxy reverso, e o certificado: HTTPS para um contêiner. Abra só as portas 80 e 443 na firewall: A firewall ufw.

Não rode o programa como administrador (root) nem o deixe a ouvir diretamente à internet. E não ponha senhas no código: use variáveis de ambiente no arquivo do serviço, com permissões fechadas (EnvironmentFile=). Veja Senhas fora do código.
O padrão é o mesmo para um programa em Rust, em .NET ou em qualquer outro que gere um arquivo executável. Para um que fica rodando numa janela do terminal e acaba quando a fecha, veja tmux e screen, que é a solução para tarefas pontuais, e não para um serviço.

Quer ajuda para pôr um programa seu num VPS? Abra um pedido a dizer a linguagem, a porta e o domínio.

Abrir pedido de suporte

VEJA TAMBÉM

Um serviço que não inicia no meu VPS: ler o systemctl status

O nginx como proxy reverso à frente de um contêiner

FastAPI num VPS: workers uvicorn, cabeçalhos de proxy e um serviço que reinicia

Atalhos de SSH: o arquivo config, e copiar arquivos com o scp

PRODUTO RECOMENDADO

Servidor VPS com acesso root

Recursos só seus, o sistema que escolher, reinstalação quando quiser. desde $8.40/mês (plano de 3 anos, com cupom)

Ver planos
Esta resposta foi útil? Sua resposta nos ajuda a melhorar este artigo.