systemd EnvironmentFile로 환경변수 주입하기

코드와 시크릿을 분리하기 위한 운영 기본값: EnvironmentFile, 권한, 자주 하는 실수

분야: DevOps/인프라 시리즈: systemd systemdEnvironmentFilesecretslinux

프로덕션에서 .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처럼 앞에 -를 붙여 누락을 허용합니다.

4) 같이 쓰기 좋은 템플릿

관련 가이드