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