Help us understand the problem. What is going on with this article?

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

前置き

独学で、子供の成長アプリを作った時のことを、記録として残していきます。
間違っているところなどあれば、ご連絡お願いします。
 ①Djangoのようこそページへたどり着くまで
 ②NginxでDjangoのようこそページへたどり着くまで
 ③カスタムユーザーを作ってadminにたどり着く
 ④ログインログアウトをしよう
 ⑤ユーザー登録(サインイン)機能を作ろう
 ⑥ユーザーごとのデータ登録できるようにする〜CRU編
 ⑦ユーザーごとのデータ登録できるようにする〜削除編
 ⑧画像ファイルのアップロード
 ⑨身長体重を記録する@一括削除機能つき
 ⑩成長曲線グラフを描いてみよう
 ⑪本番環境へデプロイ+色々手直し<--最後です

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への上げるためにやったことは、4つ。

1.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 *
(略)

2..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

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

4.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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした