「.env」を使ってGitHubで安全なアプリ管理をする（2022.4.2）

これで安全なアプリの運用が出来る気になっています。単に重要そうな情報をサーバーの環境変数に埋め込んでるだけだと思いますが、それでも一見してそういう情報が見えないのは安全なように思えます。私はほとんど素人に近いので明確な事が言えず申し訳ないのですが、もし何かご存じでしたら教えて頂けると幸いです。
<h1>背景</h1>
前回までで、HerokuにGitHub経由でDjangoアプリをデプロイ出来ました。またDBにはPostgreSQLを使ってデータを保存する事が出来ました。ここで、本当にこれでアプリを使って良いか疑問が出てきました。GitHubを見るとパスワードなどの重要なデータが表示されています。Herokuの方ではコードは見えませんが、いろいろ考えるとちょっと怖くなってきました。

前回の記事：[デプロイするDjangoアプリ（メモアプリ）にCSSを反映させる（2022.3.19）](https://qiita.com/tan0ry0shiny/items/7dce5df9da62599bcd3d)
<h1>目的</h1>
前回、投稿するまでの過程で「.env」ファイルで環境変数を設定・管理する事を知りました。これは「.gitignore」と合わせて本番環境に「.env」をアップしない事で安全性を上げる事だと思っています。今回は「.env」ファイルを使って、DBにPostgreSQLを用いたDjangoアプリをデプロイ出来るようにします。<br>
[参考]

[「.env」ファイルで環境変数を設定・管理する](https://e-tec-memo.herokuapp.com/article/277/)
<h1>方法</h1>
手順は以下の通りです。これまで、参考にしたサイトや自分の投稿を元に作成していきます。

<h3>1. GitHub, Heroku, ローカルの準備をする。</h3>
それぞれにアプリ用のリポジトリを作ります。詳しくは下のリンクの「準備」をご覧下さい。

[参考]
    1. [GitHubとHerokuを連携してDjangoアプリをデプロイする（2022.3.15）](https://qiita.com/tan0ry0shiny/items/149179d3d6a3f6c5aa73)
<h3>2. 簡単なメモアプリを作る</h3>

[DjangoBrothers](https://djangobrothers.com/tutorials/memo_app/introduction/)を参考にDjangoアプリを作ります。今回も動作を確認したいだけなので途中までしか作りません。完成すると次の様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/b8973b5e-f3b6-b42e-638a-6ca2013a697f.png)
<h3>3. DBをPostgreで構築する</h3>

「PostgreSQL」を使える様に「.env」ファイルを作成します。詳しくは下のリンクをご覧下さい。今回は、DATABASE_URLとSECRET_KEYを「.env」に記述します。「.env」に合わせて「settings.py」の中も書き直します。
```.env
DATABASE_URL=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
```settings.py
import environ
import os

BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env()
DEBUG = True
if DEBUG:
    env.read_env(os.path.join(BASE_DIR, '.env'))
（中略）
SECRET_KEY = env('SECRET_KEY')
（中略）
DATABASES = {
    'default': env.db(),
}
```

[参考]
1. [DjangoにPostgreSQLデータベースを導入する方法](https://zenn.dev/hathle/articles/django-postgresql)

<h3>4.サーバーで読み込む設定</h3>

サーバーで読み込むための設定ファイルを作成します。詳しくは参考のリンクをご覧下さい。
```.terminal(ubuntu)
(venv) C:\Users\hoge\testproject>echo web: gunicorn testproject.wsgi --log-file - > Procfile
(venv) C:\Users\hoge\testproject>echo python-3.8.10 > runtime.txt
(venv) C:\Users\hoge\testproject>pip install django-heroku
(venv) C:\Users\hoge\testproject>pip install gunicorn
(venv) C:\Users\hoge\testproject>pip freeze > requirements.txt
```
[参考]
    1. [とりあえず秒速でDjangoでホームページを作ってHerokuで公開するやつ（Windows対応）](https://qiita.com/hibit/items/d9b2ed158ac3b0ff7b64)

<h3>5.githubに上げる</h3>

githubに上げるための設定をします。Herokuでstaticファイルを読み込めるようにするのと、「.env」を上げない様に「.gitignore」を作ります。ついでに仮想環境も上げないようにします。詳しくは参考のリンクをご覧下さい。

```.gitignore
.env
venv
```
[参考]
1. [Django と静的アセット](https://devcenter.heroku.com/ja/articles/django-assets)

<h3>6.Herokuサーバーの設定</h3>

ローカルでは.envでサーバーではHerokuの環境変数で管理したいです。GitHub経由でHerokuにもアップできているので、Herokuの環境変数を設定します。詳細は参考のリンク先をご覧下さい。

[参考]
1.[Herokuで環境変数を設定する方法](https://qiita.com/mzmz__02/items/64db94b8fc67ee0a9068)
2.[[Heroku] .envファイルで環境変数を設定・管理する](https://e-tec-memo.herokuapp.com/article/277/)

<h3>7.本番のDBをmigrate</h3>

サーバーのDBを動かして動作確認します。
ローカルからサーバーのDBをmigrateします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/0f61d73d-4f1f-8aba-9666-75c74408d37f.png)

次にサーバーからアプリを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/2c62f8ed-d322-4702-88a4-da485ac2b8d2.png)

<h1>結果</h1>
当初の目的通り、「.env」を使って、パスワードなどの大事な情報を見せない様にしながらアプリを動かすことが出来ました。

<h1>考察</h1>

どこまで安全かは正確には分かりませんが、大事な情報を見せない様にする事は出来ました。あくまで常識的にですが、これは結構大事でそこそこのセキュリティーなのではないかと考えています。と言っても怖いので大事な情報は載せませんが、しばらくこれで運用してみたいと思います。

<h1>課題</h1>
せっかくならアカウントを作れるようにして、ログインして使えるようにしたいです。