.envはgitのコミット対象にしないようにとの記述がLaravel公式サイトにあります。
理由の一つは、そもそも.envには環境に依存するような内容を書くので、例えば開発環境用の.envを本番運用環境にそのまま展開するようなことは基本的にはないはず、ということのようです。
もう一つの理由は、DBのパスワードなどの秘密情報を含む.envをgitの共用リポジトリなどに置くことはセキュリティ的なリスクとなるということのようです。
ただ、一方でgitでのファイル管理はバックアップ的な意味もあり、そこに.envも含めておきたいという思いはあります。
プロダクトのアップデートに合わせて.envの内容を更新することもあり、世代管理しておくことも考えるとgitでの管理は捨て難いです。
上記のような要求に応えるために、Laravelでは.envの暗号化の仕組みが用意されています。
この辺まで考慮されている点がLaravelの良いところです。
環境ごとの.envの準備
先述したように.envは環境ごとに内容が異なるのが通常かと思いますので、それぞれの環境に合わせた.envを用意します。
具体的には開発環境「.env.local」、ステージング環境「.env.staging」および本番環境「.env.production」と言ったところです。
なお、各環境で上記個別ファイルを直接「.env」の代わりに使用することもできるようですが、色々と面倒なので、各環境では上記ファイルを「.env」としてコピーして使うことにします。
また、これらファイルはgitのコミット対象から外しておく必要があるので、「.gitignore」に追加しておきましょう。
.envの暗号化
暗号化は以下のコマンドで行います。
php artisan env:encrypt --key=<暗号化キー> --env=[local|staging|production]
「–key」では暗号化キーを指定します。暗号化キーは任意の32文字の英数記号(すべての記号が使えるかは未確認)で良いようです。
暗号化キーを指定しなければ自動的に適当な文字列が割り振られますが、暗号化するたびに新しいキーを覚えるのは面倒なので、明示的に指定する方が良いかと思います。
「–env」では対象となるファイルを指定します。例えば対象が「.env.local」であれば「–env=local」のように指定します。なお、対象が「.env」であれば「–env」の指定は必要ありません。
暗号化が問題なく実施できると拡張子として「.encrypted」が付加されたファイルが生成されます。例えば対象が「.env.local」であれば「.env.local.encrypted」が生成される訳です。
単なるテキストファイルなのでエディタ等で中身を確認できますが、しっかりと謎の英数字の羅列になっています。
このファイルをgitのコミット対象とします。
.envの復号化
暗号化したファイルを各環境で使用できるようにするためには復号化が必要です。
復号化は以下のコマンドで行います。
php artisan env:decrypt --key=<暗号化キー> --env=[local|staging|production] --force
「–key」「–env」に関しては暗号化と同様です。
「–force」を指定すると、既存のファイルを強制的に上書きできるようになります。
所感
.envのみをピンポイントで暗号化する機能まで存在する点がLaravelの凄いところですね。
個人的には、.envに限定せずにファイル全般を対象とした暗号化の仕組みがあってもよかったように思わなくもないですが、その辺はコマンドではなくロジックで行えと言うことですかね。