どこか無料で建てられるサーバーないかな〜って思ってたら, そういえばHerokuあるやんてことで
Setup
$ heroku login
$ heroku create app-name
$ heroku addons:create heroku-postgresql:hobby-dev -a app-name
$ git init
$ heroku git:remote -a django-kaito-app
$ heroku buildpacks:set heroku/python
$ heroku config:set DISABLE_COLLECTSTATIC=1 # 必要に応じて
app-nameはグローバルな名前空間だから抽象的なのは被る
CSSとかの静的ファイルを扱いたければWebサーバー側をいじれないのでdjangoからホスティングしてあげるしかないはず.
そんときは, collectstatic機能使ってやるけど, 使わないときはエラー吐かれちゃうので今回は無効にしておく.
環境変数の設定
$ heroku config:set ON_HEROKU=yes
必要な環境変数を, herokuコマンドから設置しておく.
通常の環境変数と同様に使える(os.getenvとかで引っ張ってこれる)
デフォルトでデータベースのURLが入っていた.
サーバー起動用の Procfile, uwsgi.ini を設置
Procfile
web: uwsgi uwsgi.ini
uwsgi.ini
[uwsgi]
module = config.wsgi
master = true
processes = 4
; socket
http-socket = :$(PORT)
chmod-socket = 666
memory-report = true
die-on-term = true
あと requirements.txt も必要なので, 通常通り設置する
とりあえず,
- uwsgi
- dj_database_url
- psycopg2
uWSGI用と, postgreSQL接続用にこの辺が必要だった.
ALLOWED_HOSTS の 設定
めんどければとりあえず “*” で全部許可しても一応動くけど,
ALLOWED_HOSTS = [
"アプリ名.herokuapp.com"
]
しておく.
データベースの設定
常に本番環境のデータベースを使ってもいいが, Heroku postgreSQLは無料枠が制限されてるので極力使いたくないなってことで, ローカルではsqliteの方使って, 本番環境でのみそっちのDB使うことにした.
settings.py
import os
import dj_database_url
ON_HEROKU = os.getenv('ON_HEROKU') == 'yes'
DATABASE_URL = os.getenv('DATABASE_URL')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
if ON_HEROKU:
db_from_env = dj_database_url.config(default=DATABASE_URL, conn_max_age=400)
DATABASES['default'].update(db_from_env)
DEBUG = False
環境変数からデータベースURLもらってきて, Heroku上でのみpostgreSQLを使うようになった.
おまけにHeroku上では, debugモードを解除するようにしておく.
マイグレーション
heroku run に続けてコマンドを打つと, デプロイ先でコードを走らせてくれるので, djangoのmanage.pyから呼ぶコマンドを本番環境でも使うことができる.
ただなぜか, むこうでやっても上手く行かなかったのでローカルからやることにした.
$ python manage.py makemigrations && python mange.py migrate
この変でだいたい設定が終わったのでデプロイする
$ git add . && git commit -m "initiali commit" && git push heroku master
$ heroku open
これで画面にデプロイしたサイトが表示されれば成功, なにか問題が起きたらエラーメッセージか
$ heroku logs --tail
でログみて対処する.