【 Docker＋Nginx＋Django＋RDS】WEBアプリができるまで⑪本番環境へデプロイ＋色々手直し

# 前置き
独学で、子供の成長アプリを作った時のことを、記録として残していきます。
間違っているところなどあれば、ご連絡お願いします。
　①[Djangoのようこそページへたどり着くまで](https://qiita.com/quantity82/items/e8c2392bf982efb55f80)
　②[NginxでDjangoのようこそページへたどり着くまで](https://qiita.com/quantity82/items/88a6348135e25c661feb)
　③[カスタムユーザーを作ってadminにたどり着く](https://qiita.com/quantity82/items/b3cd6ded5bbb5f3726f3)
　④[ログインログアウトをしよう](https://qiita.com/quantity82/items/8e4b7ce2ef56e60ad392)
　⑤[ユーザー登録（サインイン）機能を作ろう](https://qiita.com/quantity82/items/bbfc7e72d4a65c71e24c)
　⑥[ユーザーごとのデータ登録できるようにする〜CRU編](https://qiita.com/quantity82/items/4d019a4ee475208a5a26)
　⑦[ユーザーごとのデータ登録できるようにする〜削除編](https://qiita.com/quantity82/items/c48fee71b5f8eb766dae)
　⑧[画像ファイルのアップロード](https://qiita.com/quantity82/items/9bcbd25902f6878ee325)
　⑨[身長体重を記録する＠一括削除機能つき](https://qiita.com/quantity82/items/c8e58742eeaa8c0fc954)
　⑩[成長曲線グラフを描いてみよう](https://qiita.com/quantity82/items/619f5ed2a6cd45f7f592)
　⑪[本番環境へデプロイ＋色々手直し](https://qiita.com/quantity82/items/6e91b7ee7a2d7e0fab32)<--最後です



# Goal
本番環境（AWS EC2）へデプロイ
加えてデプロイするときに躓いたところを手直し。

# アプリのバグ修正
これまでのコードだと、子供情報を登録する前に各データを参照すると
システムエラーになることがわかりました。以下のように直します。

＊解説＊
KidsProfile.objects.filter(user=user_name).first().id


ユーザー情報に紐づくKidsProfileが見つからなかった場合、
objects.filter()の場合、空クエリが返ってきます。
空クエリに対して「そのidを返せ」と言うので、AttributeErrorが返されます。
※objects.get()の場合、DoseNoteExistが返ってきます

それをtryで受け止めて、その場合はHTMLへの返却をNoneにします。
ついでに「子供情報を入れてね」とメッセージを添えます。


```shoes/views.py
#靴リスト
@login_required
def shoes_data_list(request, **kwargs):
    user_name = request.user
    try:
        if len(kwargs) > 0:
            kids_profile_id = kwargs["kidsProfileId"]
        else:
            kids_profile_id = KidsProfile.objects.filter(user=user_name).first().id

        kids_profiles = KidsProfile.objects.filter(user=user_name) #子供情報選択用
        kids_profile_name  = KidsProfile.objects.get(id=kids_profile_id).name
        shoes_data_posts = ShoesData.objects.filter(user=user_name, kidsProfile=kids_profile_id).order_by('buy_date')

    except AttributeError:
        shoes_data_posts = None
        kids_profiles = None
        kids_profile_name = "子供情報を登録してください"

    params = {
        'shoes_data_posts' : shoes_data_posts,
        'kidsProfiles' : kids_profiles,
        'kidsName' : kids_profile_name,
    }
    return render(request, 'shoes/shoes_data_list.html', params)
```

# Githubへコードを上げる
Githubへの上げるためにやったことは、４つ。

１．setting.pyの分割
　　このファイルにはSEACRET_KEYやRDSの情報が書いてあるので、
　　Githubに上げられない。settings.pyからsettings_localをimportする形にして、
　　.gitignoreで指定してあげる。

```settings_local.py
SECRET_KEY = '*************'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': '*************',
        'PASSWORD': '*************',
        'HOST': '*************',
        'PORT': 5432,
    }
}
```
```mysite/settings.py
import os
from .settings_local import *
（略）
```

２．.gitignoreファイルの作成
http://gitignore.io
この変を参考にしながら設定。
migrations履歴は移動しないほうが良いらしい。
でも\__init__.pyがないとmigrationで失敗するはずなので、本番へ持っていく。

```:.gitignore
*.log
*.pot
*.pyc
pycache/
src/mysite/settings_local.py
db.sqlite3


**/media/**
!**/media

**/migrations/**
!**/migrations
!**/migrations/__init__.py
```


３．.gitignoreで/media/をgithubに上げないようにしたので、
　　靴画像のデフォルト画像を/media/から/static/へ移動。
　　staticにファイルを増やしたので、Collectstaticを実施。


４．uwsgiの設定見直し
　　djangoはローカルで試しながら作るときはrunserverのほうが良い。
　　その結果、コメントアウトで使い分ける形にしてみた。
　　合わせて本番向けにはuwsgiの起動はiniファイルを読ませるように修正。

```docker-compose.yml
version: "3"

services:



  db-postgres:
    image: postgres

#　本番デプロイ用定義
#　開発中は、こっちは全部コメントアウトするよ
  nginx:
    image: nginx:1.13
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
      - ./static:/static
    depends_on:
      - web
  web:
    build: ./web
    volumes:
      - ./src:/code
      - ./static:/static
    depends_on:
      - db-postgres
    command: uwsgi --ini /code/mysite/uwsgi.ini #ここが②から変わってます
    expose:
     - "8000"


#　開発中定義
#　本番にあげるときはこっちをコメントアウトするよ
#
#  web:
#    build: ./web
#    volumes:
#      - ./src:/code
#      - ./static:/static
#    depends_on:
#      - db-postgres
#    command: python manage.py runserver 0.0.0.0:8000
#    ports:
#      - "8000:8000"
```
```src/mysite/uwsgi.ini
[uwsgi]
socket = :8000
chmod-socket = 666
module = mysite.wsgi
wsgi-file = /code/mysite/wsgi.py
logto = /code/mysite/uwsgi.log
processes = 1
vacuum=True
max-requests=5000
```

あとは
・ローカルからGithubにpush
・EC2にGithubにpull
・EC2上でsetting_local.pyを作成

で、EC2上で、起動！

```
docker-compose up
```