A resposta curta: um programa em Go compila para um único ficheiro, sem nada para instalar no servidor. Num VPS, o caminho certo é: compilar, copiar o ficheiro, e pô-lo a correr como um serviço do sistema (systemd), que o arranca 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 ficheiro meuapp para um servidor Linux de 64 bits. No Windows, defina as duas variáveis antes de correr o comando, de acordo com o seu terminal.
2. Copiar e preparar
| 2 |
Crie um utilizador sem poderes para o correr (sudo useradd --system --no-create-home meuapp) e dê-lhe o ficheiro 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 ficheiro /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 ficheiro novo |
sudo systemctl daemon-reload |
| Arrancar já e a cada reinício do servidor |
sudo systemctl enable --now meuapp |
| Ver se está a correr |
sudo systemctl status meuapp |
| Ver o que escreve (os registos) |
sudo journalctl -u meuapp -f |
| Depois de enviar uma versão nova |
sudo systemctl restart meuapp |
Se o serviço não arranca, o status diz porquê: Um serviço que não arranca.
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 inverso, e o certificado: HTTPS para um contentor. Abra só as portas 80 e 443 na firewall: A firewall ufw.
|
Não corra 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 ficheiro do serviço, com permissões fechadas (EnvironmentFile=). Veja Palavras-passe fora do código.
|
|
O padrão é o mesmo para um programa em Rust, em .NET ou em qualquer outro que gere um ficheiro executável. Para um que fica a correr 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 456,30 MT/mês (plano de 3 anos, com cupão) Ver planos |