だって楽したいじゃんか!

大学院(機械工学科)を首席で卒業した男がこれまでの経験を生かさず殺さず発信していく

【Heroku+Django】DjangoプロジェクトをHerokuにデプロイしてWebサービス化する方法


今回は以前作成した、Djangoチュートリアルの投票アプリをWebアプリケーションとして公開する方法を記載していきます。Herokuが無料でPaasを提供しているとのことで、そこに作ったプログラムをデプロイして動かしてみます。

作ったアプリをウェブに公開したい

前回作ったアプリの実行は自分のPCの中だけでした。せっかく作ったアプリなので、スマホや他の場所からでも使いたい。公開したい。と思うかもしれません。そんな時はどうしましょうか。自分のPCを常に立ち上げておいて、外部から接続できるようにする?うーん。。。本腰入れて勉強しなきゃならない上に、独学だと学習コストが高そう。誰かに環境の構築をお願いする?そんな知り合いいないので、今から誰かにお願いするとお金も時間もかかりそう。

何かいい方法がないものか、と調べてみたところ、Herokuという作ったアプリを乗っけてWebサービスにできるサービスが無料であるようです。今回はそのHerokuに、前回作った投票アプリケーションをデプロイして、スマホのブラウザでアプリを動かすというところをゴールにします。

今回のゴール

スマホからアプリを表示させます。
f:id:makimakimakino:20190113183109p:plainf:id:makimakimakino:20190113183133p:plainf:id:makimakimakino:20190113183152p:plainf:id:makimakimakino:20190113183207p:plain

Herokuとは?

Heroku は、アプリケーションの開発から実行、運用までのすべてをクラウドで完結できる PaaS( サービスとしてのプラットフォーム)です。サーバやOS、データベースなどの「プラットフォーム」と呼ばれる部分を、インターネット越しに使えるようにできます。

Herokuとは

Heroku はアプリの構築、提供、監視、スケールに役立つクラウドプラットフォームで、アイデアを出してから運用を開始するまでのプロセスを迅速に進めることが可能です。また、インフラストラクチャの管理の問題からも解放されます。
https://jp.heroku.com/what

Herokuの特徴は対応しているプログラム言語が豊富、拡張機能が豊富、スケールアウトが簡単などです。無料プランもある上にちょっとした設定とコマンドを打つだけでアプリを公開できるので、時間もお金もない筆者にはちょうどいいサービスです。

⚠️無料で使えるとはいえ、やはり制限があるようです。例えば、30分以上起動していないとスリープモードになって、次回立ち上がるのに時間がかかるなど。大規模サービスを利用したい場合は、有料プランを使うといいでしょう。
jp.heroku.com

どのように使うのか

それでは早速Herokuにアプリケーションを登録(デプロイ)してみましょう。流れは次の通りです。
デプロイ手順

  1. デプロイ用にアプリを修正(アプリを作る毎)
  2. Herokuのアカウント作成(最初のみ)
  3. Heroku CLI(Heroku toolbelt (Git SSH含む) )をインストール(最初のみ)
  4. Gitでリモートリポジトリにプッシュ(アプリ修正毎)
  5. Herokuでデプロイ(アプリ修正毎)

デプロイ用にアプリを修正

流石に丸っとそのままソースをあげて動かすことはできません。Herokuで動かすためのライブラリをインストールしたり、プロジェクトに設定ファイルを追加したり、それ用にソースを修正したりする必要があります。とはいえ、そんなに難しくはないので、1つずつ見ていきましょう。

①ライブラリのインストール

まず、実行する仮想環境に必要なPythonライブラリをインストールする必要があります。必要なライブラリは次のようなものが必要です。

必要なライブラリ


  • dj-database-url
  • gunicorn
  • whitenoise
  • psycopg2
  • pytz

いつも使ってる仮想環境(django)で作業します。
⚠️仮想環境のアクティベーションは、PyCharmのインタープリターに仮想環境を指定して、エディター内のターミナルを開くか、AnacondaNavigatorからターミナルを開く、コマンドラインからターミナルを起動するなど、方法がたくさんあるので、やりやすい方法で実施してください。まず、下記のコマンドでインストールされているライブラリの中に上記があるか確認します。

Terminal

(django) $ pip freeze

入っていない場合は、次のコマンドで追加していきます。1つづつ追加してもいいですが、セットになっているものがあるらしいのでそれをインストールします。

Terminal

(django) $ pip install gunicorn django-heroku

インストールが始まるので、終わったら再度pip freezeコマンドで必要なライブラリが入っているか確認しましょう。

②設定ファイルの追加

続いて、プロジェクトに設定ファイルを追加していきましょう。
追加するのは次のファイルです。

ファイル名役割
runtime.txt Pythonのバージョン指定
ProcfileHerokuプロセスの起動コマンド
requirements.txt依存パッケージのリスト
それぞれ作ったプロジェクトの直下に置きます。

Tree

mysite
│  db.sqlite3
│  manage.py
│  Procfile👈
│  requirements.txt👈
│  runtime.txt👈
│  __init__.py
│
├─mysite
│      settings.py
│      urls.py
│      wsgi.py
│      __init__.py
│    
└─polls
    │  admin.py
    │  apps.py
    │  models.py
    │  tests.py
    │  urls.py
    │  views.py
    │  __init__.py
    │
    ├─migrations
    │
    ├─static
    │  └─polls
    │          style.css
    │
    └─templates
        └─polls
                detail.html
                index.html
                results.html

プロジェクトの下(manage.pyと並列)ですね。
requirements.txtは次のコマンドで作ることができます。

Terminal

(django) $ pip freeze > requirements.txt

内容はこんな感じでインストールされたPython ライブラリが記載されています。

requirements.txt

:
:
dj-database-url==0.5.0
Django==1.11.3
django-heroku==0.3.1
gunicorn==19.9.0
psycopg2==2.7.6.1
pytz==2017.2
whitenoise==4.1.2
:
:

ほかのファイルも追加していきます。

Procfile

web: gunicorn mysite.wsgi --log-file -👈※mysiteのところはプロジェクト名に合わせて変更します。


runtime.txt

python-3.6.0👈※Pythonのバージョンはお使いのPythonのバージョンに変更してください。

③開発環境独自の設定を定義

続いて、下記のファイルを追加・編集していきます。ここでは開発と本番で異なる環境について明記します。例えば使うDBやパスなんかは環境に合わせて設定する必要があります。毎回開発時と本番にデプロイするたびにそれぞれソースやファイルを編集してもいいですが、面倒ですよね。あらかじめこっちは開発用、こっちは本番用定義という風にどちらの設定で実行をさせるか書いておきます。追加するファイルは次のようなファイルです。

ファイル名役割
mysite/local_settings.py 【新規作成】開発環境用設定ファイル
mysite/settings.py 本番環境用設定ファイル
.gitignore 【新規作成】 Git管理除外リスト
これらを下記に追加・編集していきます。

Tree

mysite
│  .gitignore👈
│  db.sqlite3
│  manage.py
│  Procfile
│  requirements.txt
│  runtime.txt
│  __init__.py
│
├─mysite
│      local_settings.py👈
│      settings.py👈
│      urls.py
│      wsgi.py
│      __init__.py
│    
└─polls
    │  admin.py
    │  apps.py
    │  models.py
    │  tests.py
    │  urls.py
    │  views.py
    │  __init__.py
    │
    ├─migrations
    │
    ├─static
    │  └─polls
    │          style.css
    │
    └─templates
        └─polls
                detail.html
                index.html
                results.html

まずは開発での実行に呼ばれるDBの設定を切り出します。

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

既存の設定ファイルの最後に開発環境用ファイルの読み込みとdjango-herokuの実行を追加します。

settings.py

DEBUG = False

try:
    from .local_settings import *
except ImportError:
    pass

if not DEBUG:
    import django_heroku
    django_heroku.settings(locals())

.gitignoreにlocal_settings.pyを追加します。Heroku環境にlocal_settings.pyはコピーされないので、開発環境の設定が有効になることはありません。

.gitignore

django👈<your_env>
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]

Herokuのアカウント作成

こちらからHerokuを使うためのユーザー登録をします。
jp.heroku.com

Heroku CLI(Heroku toolbelt (Git SSH含む) )をインストール

下記サイトから自分の端末でHerokuを使うためのツールをインストールします。
The Heroku CLI | Heroku Dev Center
f:id:makimakimakino:20190113190854p:plain
お使いの環境に合わせてインストールをしてください。
インストール時には以下で使うGitやSSHのツールもインストールされます。(デフォルトの設定で大丈夫です。)

Gitでリモートリポジトリにプッシュ

Gitのリモートリポジトリ経由でHerokuにソースをデプロイします。Gitにソースを挙げます。
仮想環境用をアクティベートしているTerminalを開いておいて下記の手順でプッシュします。


Terminal

(django) $ cd mysite👈作ったプロジェクトの直下に移動します。(manag.pyと並列の階層)
(django) $ git init                                
(django) $ git config user.name "Your Name" 👈ご自身の名前で登録します。
(django) $ git config user.email xxxxx@mail.com  👈メールアドレスを入力します。
(django) $ git add -A .                            
(django) $ git commit -m "first commit" 👈コミット用のコメントを入力します。

makimakimakino.hatenablog.com

Herokuへデプロイ

Heroku CLIのコマンドでHerokuにデプロイします。
Terminalで下記を順番に打ち込んでいき、流れに沿って処理を実行していきます。


Terminal

(django) $ heroku login
(django) $ heroku create <your-app-name> 👈 任意・かぶらないもの
(django) $ git push heroku master
(django) $ heroku ps:scale web=1
(django) $ heroku run python manage.py migrate
(django) $ heroku run python manage.py createsuperuser

最後に下記を入力すると、ブラウザが立ち上がり、自分で作ったアプリが表示されます。

Terminal

(django) $ heroku open

まとめ

いかがでしたでしょうか。以上が自分で作ったDjangoアプリをHeroku(Web上)で動かす方法になります。少しコマンドでの作業が多いですが、慣れてしまえばそんなに難しい作業でもないと思います。あとはいろいろソースをいじってあげてみて練習して、有料版に切り替えるなり別サービスにするなり、選択肢の幅を広げていければと思います。