初心者がHerokuにDjangoアプリをデプロイする方法

# HerokuにDjangoアプリをデプロイするまで

## Djangoでアプリケーションを作成

以下を参考にDjangoアプリを作成する。

- [Djangoをpyenv+pyenv-virtualenv環境で動かすまで()](https://qiita.com/terappy/items/e4ae44d74ee2e9814681)
- [公式チュートリアル](https://docs.djangoproject.com/ja/2.0/intro/)

いろいろアプリを作りこむ。('ω')ノ

## アプリの設定


```sh:terminal
# Herokuにデプロイするのに必要なものをインストール
$ pip install dj-database-url gunicorn whitenoise
```

プロジェクトファイルのルート階層で以下を実行
[psycopg2](http://initd.org/psycopg/)は適宜最新版を指定するとよい。

```sh:terminal
# インストール済みのpackage情報をrequirements.txtに保存
$ pip freeze > requrements.txt

# herokuでpostgreを使うために以下のパッケージを追記
$ echo 'psycopg2==2.7.4' >> requirements.txt

# 新規にProcfileを作成し、設定を書き込む
$ echo 'web: gunicorn mysite.wsgi' > Procfile

# 新規にruntime.txtを作成し、自身のpythonのバージョン情報を書きこむ
$ echo 'python-3.6.4' > runtime.txt
```

local環境ではSQLite3, herokuではPostgreSQL環境で動作させるためプロジェクトファイルの設定を書いているsettings.pyを編集する。


```python:settings.py
# ~省略~

# 以下を末尾に追記

import dj_database_url
DATABASES['default'] = dj_database_url.config()

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

STATIC_ROOT = 'staticfiles'

DEBUG = False

try:
    from .local_settings import *
except ImportError:
    pass

```

settings.pyと同じディレクトリにlocal_settings.pyを新規作成。

```python:local_settings.py
import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    }
}

DEBUG = True
```

以上の設定を終えるとlocal_settings.pyがある時にはローカルの設定にしてくれる。

wsgi.pyに以下の内容を追記したら設定完了。

```python:wsgi.py
# ~省略~
# 以下を末尾に追記
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
```

# Heroku
## Herokuの無料アカウントを作成

Herokuの無料アカウントを作成する。
https://id.heroku.com/signup/www-home-top

## Heroku CLIをインストール

[Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)をインストールする。インストール済みの場合は飛ばしてOK。

```sh:terminal
$ wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
```

## Herokuにログイン

```sh:terminal
$ heroku login
```

# Git
## gitignoreの作成
gitignoreを手動で作成するのはしんどい。

[gitignore.io](https://www.gitignore.io/)でPythonやDjangoと指定してあげるとgitignoreを作ってくれるのでこれを設置する。

## 初期設定

プロジェクトのルートディレクトリで以下を実行

```sh:terminal
$ git init
$ git config user.name "Your Name"
$ git config user.email you@example.com
$ git add .
$ git commit -m 'first commit'
```

# Deploy
## 準備

以下のコマンドを実行してherokuにアプリを作成する。`[アプリ名]`は好きな名前を設定できる。
ただしURLが`[アプリ名].herokuapp.com`となるので他とかぶらない名前を付ける必要有。
アプリ名を省略したら自動的に名前を付けてくれる。

```sh:terminal
$ heroku create [アプリ名]

# アプリ名を変えたいときは以下を実行する
$ heroku apps:rename [変更後のアプリ名]
```
## Herokuにデプロイ
gitのリモートレポジトリにherokuというレポジトリが自動で登録されているのでそこにpushする。

```sh:terminal
$ git push heroku master
```

エラーが出なければOK。

Herokuのウェブプロセスを起動。

```sh:terminal
# ウェブプロセスが１つ起動。1より大きな値をセットするには課金する必要がある。
$ heroku ps:scale web=1
```

初回デプロイ時のみDBをセットアップする。

```sh:terminal
$ heroku run python manage.py migrate
$ heroku run python manage.py createsuperuser
```

これでWebサイトが見れるようになる。

## アプリを開く

アプリを開くには以下のコマンドを実行する。

```sh:terminal
$ heroku open
```

## Herokuのログをチェック
エラーなどが起きた時、herokuのログをチェックするには以下のコマンドを打つ。

```sh:terminal
$ heroku logs
```

## アプリの更新

アプリの更新はherokuに再pushすればよい。

```sh:terminal
$ git add .
$ git commit -m 'modify hogehoge'
$ git push heroku master
```

## アプリの削除

アプリの削除は2通りの方法がある。

### 方法1

[Heroku](https://dashboard.heroku.com/apps)にアクセスして、削除対象のアプリの設定ページに行く。
`Delete app...`ボタンを押すとアプリ名の確認があるのでアプリ名を入力して実行すると削除できる。

しかし手元の環境にはまだ残っているので、対象のリモートレポジトリを削除する。

```sh:terminal
$ git remote rm heroku
```

これできれいに消える。

### 方法2

herokuコマンドを使用すると、Heroku上のアプリもリモートリポジトリの設定もすべて消してくれる。

```sh:terminal
$ heroku apps:destroy --app アプリ名
```

アプリ名の確認を求められるので入力して削除を実行する。

以下のコマンドを入力すれば一発で削除できる。

```sh:terminal
$ heroku apps:destroy --app アプリ名 --confirm アプリ名
```

# 参考サイト

- [Getting Started on Heroku with Python](https://devcenter.heroku.com/articles/getting-started-with-python#introduction)
- [djangogirlsjapan.gitbooks.io](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/deploy/)