루트 없이 지속적인 통합을 위해 systemd 데몬을 다시 시작하시겠습니까?

루트 없이 지속적인 통합을 위해 systemd 데몬을 다시 시작하시겠습니까?

우리는 systemd에 의해 시작되고 개발 서버의 지속적인 통합을 통해 새 버전을 배포하도록 구성된 Nodejs 기반 서버를 보유하고 있습니다. 문제는 루트가 아닌 사용자가 systemctl 명령을 사용하여 애플리케이션을 다시 시작할 수 없다는 것인데, 이 문제를 해결하는 방법이 궁금합니다.

우리가 시도한 명령:

sudo systemctl start my-nodejs-server

시스템 스크립트의 내용:

[Unit]
Description=NodeJS Based Server

[Install]
WantedBy=multi-user.target

[Service]
User=myserver-user
Group=myserver-userh
Environment=ENV=production NODE_ENV=production
WorkingDirectory=/home/myserver-user/my-nodejs-server/
#ExecStart=/home/myserver-user/my-nodejs-server/scripts/appctl.sh restart
ExecStart=/usr/bin/node lib
Restart=on-failure

또한 제안된 대로 다음 명령을 시도했습니다.

systemctl --user start my-nodejs-server

하지만 다음과 같은 메시지가 나타납니다.

Failed to connect to bus: No such file or directory

어떤 아이디어가 있나요?

우리는 Ubuntu 16에서 실행 중입니다.

답변1

내 필요에 따라 "사용자 단위 파일"이 아닌 "시스템 단위 파일"이 필요합니다 (참조여기), 후자는 사용자의 홈 디렉토리에 있고 로그인 세션 중에 실행되는 프로그램에만 적용되기 때문입니다.

내가 채택한 솔루션은 다음 답변에 설명되어 있습니다.

루트가 아닌 사용자가 system.d 서비스를 제어하도록 허용하려면 어떻게 해야 합니까?

기본적으로 사용자에게 특정 명령을 실행할 수 있는 sudo 권한을 부여합니다. 여기있어:

myserver-user ALL= NOPASSWD: /bin/systemctl start my-nodejs-server
myserver-user ALL= NOPASSWD: /bin/systemctl stop my-nodejs-server
myserver-user ALL= NOPASSWD: /bin/systemctl restart my-nodejs-server

이 권한을 그룹에 적용하려면 다음과 같이 식별자 앞에 백분율 기호를 사용하세요.

%myserver-group ALL= NOPASSWD: /bin/systemctl start my-nodejs-server
%myserver-group ALL= NOPASSWD: /bin/systemctl stop my-nodejs-server
%myserver-group ALL= NOPASSWD: /bin/systemctl restart my-nodejs-server

또한 참조된 답변을 기반으로 배포 사용자가 deployment응용 프로그램을 실행하는 사용자와 동일하지 않도록 배포 사용자를 유사한 것으로 변경할 수도 있습니다.

관련 정보