#Django製アプリを「Heroku」へのデプロイ
コード:https://github.com/MachinoTensei/kiite-kikasete
##はじめに
この記事を見てくださっている方はいくつものサイトを見ては、エラーを繰り返している方も多いと思います。
僕はデプロイに丸一日を要しました。他サイトを見ながら試行錯誤してやっとデプロイできましたが、なんせ、拡張子なしのファイル(後で出てきます)の作り方すら知らなかった僕にとっては、もう少し詳しく教えて欲しい!というところも多かったです。
もちろん、記事を書いてくださる方には感謝していますし、この記事よりも専門的な知識は多く得られます。
ですので、この記事では細かな説明もしつこいくらいに入れていきながら解説したいと思います。
そのため、長めの記事ですが、やっていることはそんなに多くありません。
読んでくださる方が、多くても数時間でデプロイできるようにしたいと思います。(一回もエラーが出ないなら、30分もかかりません。)
##前提条件(対象者)
- データベース(MySQL, phpMyAdmin)を用いたアプリを作成済み
- ローカルホストではきちんと動作するアプリが完成している
- Herokuのアカウントを持っている(無料)
- GitHub, git のコマンドを使える(僕のように調べながらでも使えればいいと思います)
###開発環境
Mac OS
python 3.7.3
dj-database-url 0.5.0 #後でインストールします
Django 2.1
django-bootstrap4 0.0.8
gunicorn 19.9.0 #後でインストールします
pip 19.1.1
psycopg2-binary 2.8.3 #後でインストールします
PyMySQL 0.9.3
pytz 2019.1 #後でインストールします
setuptools 41.0.1
sqlparse 0.3.0
whitenoise 3.3.1 #後でインストールします
#「後でインストール」以外のものは、必要かはわかりません。
#ローカルで動いているのなら、この[pip list]はそんなに気にすることもないと思います。
###最終的なファイル構成
どこのファイルかわからない(説明不足)時は、この画像で判断してください。
紫色の線のファイルはこの後追加します。他のファイルはみなさんあると思います。(場合によって、staticファイルとかはないかも)
下記のように、必要なものをインストールしてください。
※注意(下の文を必ず読んでください)
「whitenoise」はバージョン3を指定してください。指定しないと4がインストールされ、この記事の方法だとうまくいきません。
また、「psycopg2」のインストールができない場合は「pip install psycopg2-binary」をインストールしてください。
pip install gunicorn django-heroku
で下記のものを一括インストールできるらしいが、僕はできませんでした。
試してみるのもありかもしれないです。
(dj)$ pip install dj-database-url
(dj)$ pip install gunicorn
(dj)$ pip install whitenoise==3.3.1 👈バージョンを指定しないと whitenoise4.x.x がインストールされる
(dj)$ pip install psycopg2 👈エラーが出る可能性あり
(dj)$ pip install pytz
Herokuへデプロイするのに必要なファイルを作成していきます。
(.gitignore, Procfile, requirements.txt, runtime.txtを追加します。)
###(2-1)「.gitignore」を新規作成
#いつもの開発環境(venv)で実行してください。
(dj)$ cd myapp7 👈プロジェクトに移動(外側のディレクトリであることに注意)(myapp7のところは自分のに変える)
(dj)myapp7 $ touch .gitignore 👈これを実行すると「.gitignore」が作られる
Mac の場合は、Finderで「Shift + cmd + .」で見えるようになる
###(2-2)「.gitignore」を編集する
「.gitignore」を開いて、以下のように編集
(dj の部分は人によって異なる)
dj 👈これは自分の開発環境の名前(terminalの$マークの後ろの文字)
__pycache__
staticfiles
db.sqlite3
*.py[co]
###(2-3)「Procfile」を新規作成
#先ほどの続きで問題ないです。ディレクトリは外側のmyapp7
(dj)myapp7 $ touch Procfile 👈これを実行すると「Procfile」が作られる
Mac の場合は、Finderで「Shift + cmd + .」で見えるようになる
###(2-4)「Procfile」を編集する
Procfileはこの1行だけです。
スペースなどを省略するとエラーの原因になるため、コピペをお勧めします。
そのあとに、myapp7の部分を自分のプロジェクト名に変更してください。
web: gunicorn myapp7.wsgi --log-file -
###(2-5)「requirements.txt」を新規作成
下のコマンドを実行するだけでOK
(dj)myapp7 $ pip freeze > requirements.txt
念の為、下のように記載されたファイルができているか確認してください。
dj-database-url==0.5.0
Django==2.1
django-bootstrap4==0.0.8
gunicorn==19.9.0
psycopg2-binary==2.8.3
PyMySQL==0.9.3
pytz==2019.1
sqlparse==0.3.0
whitenoise==3.3.1
psycopg2==2.7.6.1 👈上で「psycopg2」がインストールできなかった人は追加
###(2-6)「runtime.txt」を新規作成
これは、CotEditorなり、普通のテキストエディタなりを開いて以下の1行を書きこんで保存してください。(このファイルは、Procfile同様に1行だけ)
保存場所は上の最初の画像を参照。
pythonのバージョンは自分が使用しているものに置き換えてください。
ただし、python2は想定していません。ご了承ください。
python-3.7.3
settings.pyのデータベース接続部分をコピーして、新たに作成する「local_settings.py」に貼り付けします。(このファイルの保存場所は上の画像を確認してください。)
①settings.pyからDATABASEの部分をコピーする(DATABASEの部分は人によって異なると思います。)
②local_settings.pyという名前で新たに作成したファイルに、貼り付け(下のような感じになります。少しも省略していないため、local_settings.pyはこれが全てです。)
「👈」の部分以外は人によって異なると思います。(Django2, MySQL, phpMyAdminの組み合わせの人は、"NAME": "kiitedb",
以外は下と全く同じになっても不思議ではありません。)
#この上には何もありません
import os 👈
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 👈
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
"ENGINE": "django.db.backends.mysql",
"NAME": "kiitedb",👈ここは人によって違う
"USER": "root",👈場合によっては違う
"PASSWORD": "root",👈場合によっては違う
"HOST": "127.0.0.1",
"PORT": "3306",
}
}
DEBUG = True 👈
#この下には何もありません
###「.gitignore」に「local_settings.py」を追加
先ほど作成した、「.gitignore」に「local_settings.py」の1行を追加してください。
dj
__pycache__
staticfiles
local_settings.py 👈追加
db.sqlite3
*.py[co]
##(4)「settings.py」を編集する(4ステップ)
(蛇足な部分がある可能性あり)
###(4−1)ステップ1
下のコードを、settings.pyの一番下に貼り付けてください。
"@@@@@@@@@@"
の部分は自分のパソコンのユーザー名に変更してください。
#この上は省略してあります
STATIC_URL = '/static/'👈(静的ファイルがある方のみ)
STATIC_ROOT = os.path.join(BASE_DIR, 'kiite/static')👈kiiteの部分は自分のアプリ名(静的ファイルがある方のみ)
from socket import gethostname
hostname = gethostname()
if "@@@@@@@@@@" in hostname:
# デバッグ環境
DEBUG = True
#=====ここから...=====
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
"ENGINE": "django.db.backends.mysql",
"NAME": "kiitedb",👈ここは人によって違う
"USER": "root",👈場合によっては違う
"PASSWORD": "root",👈場合によっては違う
"HOST": "127.0.0.1",
"PORT": "3306",
}
}
#=====...ここまでは、使用しているデータベースに置き換えてください。=====
ALLOWED_HOSTS = []
else:
# 本番環境
DEBUG = True
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
},
}
# DB設定
import dj_database_url
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
db_from_env = dj_database_url.config()
DATABASES = {
'default': dj_database_url.config()
}
ALLOWED_HOSTS = ['*']
#この下には何もありません
###(4−2)ステップ2
WSGI_APPLICATION = '<プロジェクトネーム>.wsgi.application'
を探して、その下に下記のコードを貼り付け
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES = {
'default': dj_database_url.config()
}
###(4−3)ステップ3
MIDDLEWARE
を探して、下の1行を追加してください。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',👈この1行だけを追加
'django.contrib.sessions.middleware.SessionMiddleware',
###(4−4)ステップ4
下のように変更(最初からなっている人も多いと思いますが、一応)
ALLOWED_HOSTS = ["*"]
「wsgi.py」を下記のコードに変えてください。(追記ではなく、全変えです。)
#この上には何もありません
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp7.settings')👈myapp7は自分のアプリ名に変更
application = get_wsgi_application()
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
#この下には何もありません
##(6)「Heroku CLI」をインストール
ここからインストールしてください。
インストーラーを起動後、「OK」や「完了」を押して、次々に進んでいけば大丈夫だと思います。
下のコマンドをデプロイするアプリがある開発環境で順番に実行。
myapp7
やkiite
は適宜変更してください。
(dj)$ cd myapp7 👈外側のディレクトリに移動
(cd)myapp7 $ git init 👈「.git」ディレクトリが作成される
(cd)myapp7 $ git config user.name <自分の名前> 👈<>はいらない
(cd)myapp7 $ git config user.email *+*+*+@info.com
(cd)myapp7 $ git add -A .
(cd)myapp7 $ git commit -m "First Django App, OK"
(cd)myapp7 $ heroku login 👈Herokuアカウントは事前に作成しておいてください
(cd)myapp7 $ heroku create kiite 👈kiiteは自由に変更(省略も可能)
(cd)myapp7 $ git push heroku master
(cd)myapp7 $ heroku ps:scale web=1
(cd)myapp7 $ heroku run python manage.py migrate
(cd)myapp7 $ heroku run python manage.py createsuperuser
(cd)myapp7 $ heroku open
終了
##参考サイト