웹 개발
Node 프로세스가 재시작될 때만 사라진 환경변수를 추적한 배포 회고
수동 실행에서는 동작하지만 서비스 재시작 뒤 설정값이 비어 있던 배포를 환경 파일과 실행 사용자 관점에서 되짚었습니다.
재현 조건이 재시작이었다
배포 직후 API는 정상인데 서버를 재부팅하면 외부 저장소 연결이 실패했다. 수동 셸에서 실행한 프로세스와 서비스 매니저가 시작한 프로세스가 같은 환경을 가진다고 생각한 것이 실수였다. 실제로는 실행 사용자와 작업 디렉터리가 달랐다.
서비스 파일에 로딩 주체를 적었다
[Service]
User=turin
WorkingDirectory=/srv/turin-blog
EnvironmentFile=/etc/turin-blog/app.env
ExecStart=/usr/bin/node /srv/turin-blog/server.js
Restart=on-failure
환경 파일은 서비스 사용자만 읽게 했다.
sudo chown root:turin /etc/turin-blog/app.env
sudo chmod 640 /etc/turin-blog/app.env
sudo daemon-reload
sudo service turin-blog restart
sudo service turin-blog status
토큰 값을 로그에 남기지 않고 존재 여부만 출력하는 임시 진단도 사용했다.
for (const name of ['DATABASE_URL', 'STORAGE_BUCKET']) {
console.log(name, process.env[name] ? 'present' : 'missing');
}
다음 배포의 확인 기준
- 어떤 사용자가 프로세스를 시작하는가
- 어떤 파일을 어느 시점에 읽는가
- 재부팅 뒤에도 같은 경로와 명령으로 시작하는가
수동 셸에서만 성공하는 테스트는 배포 검증으로 부족했다. 서비스 파일을 운영 설정의 일부로 보고 재부팅을 완료 조건에 넣었다.