O problema que você está enfrentando é que você está executando o aplicativo com um usuário não raiz ( User=andrei
), mas, em seguida, seu aplicativo está tentando escutar na porta 80 ( http.ListenAndServe(":80", nil)
), que é um privilégio porta que normalmente apenas o root pode escutar.
Quando você diz:
When I run the app from the terminal everything works fine.
Por acaso, você está executando como root ? Porque então, eu esperaria que funcionasse bem.
Se você estiver certo em usar uma porta diferente (número de porta acima de 1024, o que seria sem privilégios), essa seria a solução mais fácil para que seu serviço fosse executado como não-raiz.
Além disso, este snippet do seu arquivo de unidade:
[Socket]
ListenStream=80
NoDelay=true
Isso não funciona realmente em uma unidade de serviço; ela funciona apenas em uma unidade de soquete , para fazer ativação do soquete funcionar, você precisaria de uma unidade MyApp.socket
separada com essas configurações.
Mas a ativação de soquete é mais complexa do que apenas criar uma unidade separada, já que o próprio aplicativo precisa de suporte para receber o soquete de escuta do systemd. Por exemplo, um aplicativo C chamaria sd_listend_fds () e o link para libsystemd para implementar isso. Pode haver ligações para fazer o mesmo no Go, procure por coreos / go-systemd por exemplo, pode haver alguns lá .
A ativação do soquete teria a vantagem de poder usar a porta 80 e um usuário não raiz, mas, conforme mencionado, precisa de alterações em seu aplicativo.