systemd EnvironmentFile로 환경변수 주입하기
코드와 시크릿을 분리하기 위한 운영 기본값: EnvironmentFile, 권한, 자주 하는 실수
프로덕션에서 .env를 앱 폴더에 두면, 백업/배포/정적 서빙 실수로 노출될 수 있습니다. systemd의 EnvironmentFile=은 “시크릿 파일을 안전한 위치에 두고, 서비스가 시작될 때만 읽어서 주입”하는 데 유용합니다.
용어: EnvironmentFile
1) 기본 예시
유닛 파일
[Unit]
Description=myapp
After=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/srv/myapp/current
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
env 파일
# /etc/myapp/myapp.env
NODE_ENV=production
PORT=3000
DATABASE_URL=postgres://user:password@db.example.internal:5432/app
※ 위 예시는 형태만 보여주기 위한 것이며, 실제 값은 서비스별로 다릅니다.
2) 운영 팁
- 파일 권한을 최소화합니다:
chmod 600 /etc/myapp/myapp.env - env 파일의 소유자/그룹을 서비스 계정 기준으로 제한합니다.
- 배포 시에는 코드만 바꾸고, 시크릿은 “파일 교체”로 따로 관리하는 방식이 흔합니다.
3) 자주 하는 실수
export KEY=value형식: systemd env 파일은 보통KEY=value만 기대합니다.- 공백/따옴표:
KEY=a b는 깨질 수 있으니KEY="a b"처럼 명시합니다. - “없어도 되는 파일”인 경우:
EnvironmentFile=-/etc/myapp/optional.env처럼 앞에-를 붙여 누락을 허용합니다.