Day9:環境変数と設定管理 後半
テーマ:本番運用でも安全・確実に動く“環境変数管理の完成形”を理解し、環境差異を完全に吸収できるアプリを作る
後半では、前半・中盤で学んだ
環境変数・.env・Docker Compose の連携
をさらに実務レベルへ引き上げます。
ここを理解すると、あなたは
「開発・テスト・本番のすべてで同じアプリを安全に動かせるエンジニア」
になります。
本番環境では .env をどう扱うべきか
.env は“本番サーバー側で管理する”
開発では .env をローカルに置きますが、
本番では GitHub に置かず、サーバー側で管理 します。
理由は明確で、
パスワード・APIキー・DB接続情報が漏れると重大事故になるため。
本番での .env の置き場所
例:
- サーバーの
/opt/app/.env - Docker ホストの
/var/app/.env - CI/CD(GitHub Actions など)のシークレット機能
本番の .env は 絶対に Git に含めない のが鉄則です。
Docker Compose で本番用の環境変数を読み込む
compose.yml に .env を直接書かない
悪い例:
environment:
DB_PASSWORD: secret
YAMLこれは パスワードがファイルに残る ため危険です。
正しい例:.env を外部に置く
services:
api:
env_file:
- .env
YAML.env(サーバー側に置く):
DB_PASSWORD=supersecret
これで compose.yml に秘密情報を残さずに済む ため安全です。
Docker Secret を使うとさらに安全になる
Docker Secret とは
パスワードや鍵を 暗号化して安全に渡す仕組み です。
例:
echo "supersecret" | docker secret create db_password -
compose(Swarm モード):
services:
api:
secrets:
- db_password
secrets:
db_password:
external: true
YAMLアプリ側では /run/secrets/db_password として読み取れます。
重要ポイント
- .env より安全
- 本番運用でよく使われる
- パスワードがファイルに残らない
初心者はまず .env で十分ですが、
本番では Secret を使うのがベストプラクティス です。
設定を“階層化”して管理する
1つの .env で全部管理しようとすると破綻する
環境が増えると .env が肥大化します。
例:
- .env.dev
- .env.test
- .env.staging
- .env.prod
これらを使い分けることで、
環境ごとに設定を完全に分離 できます。
例:開発用
APP_ENV=development
DB_HOST=localhost
DB_PASSWORD=devpass
例:本番用
APP_ENV=production
DB_HOST=prod-db.internal
DB_PASSWORD=supersecret
アプリは process.env.APP_ENV を見て挙動を変えます。
12-Factor App の“設定は環境変数に置け”という原則
世界的に有名なアプリ設計の原則
12-Factor App(Heroku が提唱)は、
設定は環境変数に置くべき と明言しています。
理由:
- コードと設定を分離できる
- 環境差異を吸収できる
- セキュリティが向上する
- デプロイが簡単になる
Docker はこの思想と非常に相性が良いです。
実務で使う“環境変数の完全版構成例”
docker-compose.yml
services:
api:
image: myapp
env_file:
- .env
ports:
- "3000:3000"
depends_on:
- db
db:
image: mysql:8
env_file:
- .env
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
YAML.env(開発用)
APP_ENV=development
APP_PORT=3000
DB_HOST=db
DB_USER=user
DB_PASSWORD=devpass
DB_NAME=myapp
.env(本番用)
APP_ENV=production
APP_PORT=3000
DB_HOST=prod-db.internal
DB_USER=prod
DB_PASSWORD=supersecret
DB_NAME=myapp
アプリは同じコードで動き、
設定だけが環境ごとに切り替わる という理想形です。
後半まとめ
あなたがここまで理解できていれば、Day9 のゴールは完全達成です。
- 本番の .env は Git に含めず、サーバー側で管理する
- Docker Compose は env_file で安全に環境変数を読み込める
- Docker Secret を使うとさらに安全
- .env を環境ごとに分けることで設定を階層化できる
- 12-Factor App の原則「設定は環境変数に置け」を実践できる
- 開発・テスト・本番の差異を完全に吸収できる
