웹 개발
systemd 서비스에서만 환경변수가 사라진 이유와 EnvironmentFile 점검표
터미널에서는 동작하지만 서비스로 실행하면 환경변수를 읽지 못했던 원인과 점검 순서
셸에서는 되고 서비스에서는 안 됐다
배포 서버에서 npm run start는 외부 API를 호출했지만 서비스 재시작 뒤에는 API key missing 로그가 나왔다. 애플리케이션 코드보다 프로세스의 사용자와 실행 환경을 먼저 비교했다.
printenv API_BASE_URL
service-manager show myapp --property=Environment
log-reader -u myapp -n 50
내 셸은 .bashrc에서 변수를 읽었지만 서비스 실행기는 로그인 셸이 아니었다. 서비스 사용자도 deploy라 내 홈의 dotenv 파일을 자동으로 읽지 않았다.
전용 환경 파일을 명시했다
유닛에 앱 전용 파일과 작업 디렉터리를 지정하고 파일 권한을 서비스 사용자에게만 열었다. 값에 공백이나 #이 들어가면 실행기 문법에 맞게 인용했다. 설정 파일을 바꾼 뒤에는 데몬이 다시 읽도록 한 다음 프로세스를 재시작했다.
[Service]
User=deploy
WorkingDirectory=/srv/myapp
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/node /srv/myapp/server.js
Restart=on-failure
배포 점검표
- 실제 적용 유닛과
User를 확인한다. WorkingDirectory가 예상과 같은지 본다.- 환경 파일의 존재 여부와 읽기 권한을 확인한다.
- 로그에는 키 값 대신 누락 여부만 남긴다.
- 재부팅 뒤에도 같은 방식으로 시작되는지 확인한다.
회고
환경변수 문제를 코드 버그로 분류하면 범위가 커진다. 셸과 서비스의 환경을 나란히 비교하는 것이 가장 빠른 첫 단계였다.