우리는 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
내 필요에 따라 "사용자 단위 파일"이 아닌 "시스템 단위 파일"이 필요합니다 (참조여기), 후자는 사용자의 홈 디렉토리에 있고 로그인 세션 중에 실행되는 프로그램에만 적용되기 때문입니다.
내가 채택한 솔루션은 다음 답변에 설명되어 있습니다.
기본적으로 사용자에게 특정 명령을 실행할 수 있는 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
응용 프로그램을 실행하는 사용자와 동일하지 않도록 배포 사용자를 유사한 것으로 변경할 수도 있습니다.