Django + KoNLPy + MeCabアプリをHerokuにデプロイ

Django, Python初心者のため不適切な箇所がありましたらご指摘くださいm( )m

筆者が使用しているのはmecab-koですが、mecabと概ね同じ手順になると思います。

ローカルでのKoNLPyとMeCabのセットアップ手順はこちらの記事に書いています

pythonで韓国語の形態素解析 - mnlog

ローカル開発環境

Python 3.6.3
pip 20.0.2
仮想環境にvenv使用
Django 3.0.5

Herokuのセットアップ

しばらくはこちらの2記事を参考に進めていきます。

DjangoアプリをHerokuにデプロイする方法 - Qiita

Herokuでpython+mecab+ffmpegを使う - Qiita

※ Heroku CLIは導入済みとする

HerokuでDjangoを動かすための準備

#### gunicorn, django-heroku, dj-database-url インストール

$ pip install gunicorn django-heroku dj-database-url

requirements.txt 作成

$ pip freeze > requirements.txt

Procfile 作成

$ echo web: gunicorn プロジェクトフォルダー名.wsgi --log-file - > Procfile

HerokuにMeCabをインストールするための準備

buildpackのセットアップ

$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi

.buildpacks ファイルに使用するbuildpackを記載します。

一つ目がMeCabのインストールに使用するlinuxbrewのbuildpack、

二つ目がPythonの環境セットアップとpip installに使用するbuildpackです。

記載した順に実行される点に注意です。

https://github.com/sunny4381/heroku-buildpack-linuxbrew.git
https://github.com/heroku/heroku-buildpack-python.git

環境変数の設定

$ heroku config:add LD_LIBRARY_PATH=/app/.linuxbrew/lib
$ heroku config:set MECAB_PATH=/app/.linuxbrew/lib/libmecab.so

デプロイ

$ git push heroku master

あとはherokuにデプロイするだけ...のはずですが、mecab-pythonがインストールできないとエラーが出てしまいました。

remote:        ERROR: Could not find a version that satisfies the requirement mecab-python===0.996-ko-0.9.2 (from -r /tmp/build_1e762344b37986e0579cf1ef71b4961c/requirements.txt (line 16)) (from versions: 0.993, 0.996, 1.0.0rc1, 1.0.0rc2, 1.0.0)
remote:        ERROR: No matching distribution found for mecab-python===0.996-ko-0.9.2 (from -r /tmp/build_1e762344b37986e0579cf1ef71b4961c/requirements.txt (line 16))
remote:  !     Push rejected, failed to compile Multipack app.
remote: 
remote:  !     Push failed

Herokuではmecab-pythonがインストールできないようなので、mecab-python3に書き換えます。 韓国語専用パッケージではありませんがローカルでは問題なく動作しました。

$ pip uninstall mecab-python
$ pip install mecab-python3
$ pip freeze > requirements.txt

heroku pushしたところ、今度はビルドに成功したものの、Slug Sizeが上限の500MBを超えてしまいました...😭

-----> Compressing...
 !     Compiled slug size: 529.5M is too large (max is 500M).
 !     See: http://devcenter.heroku.com/articles/slug-size
 !     Push failed

デプロイ後にpip installを行う設定

pip installをデプロイ後に行うことでSlug Sizeを節約します。

丸ごと後回しにしたいところですが、heroku-buildpack-pythonによる周辺環境セットアップでエラーを発生させないよう、今回はrequirements.txtからmecab-python3とkonlpyを削除して後からインストールする形にします。

次にProcfileの中身を書き換えシェルスクリプトを実行するようにします。

web: bash run.sh
python3 -m pip install mecab-python3 konlpy
gunicorn analysisapi.wsgi --log-file -
$ git push heroku master

試行錯誤の結果、デプロイに成功しました! これでもSlug Sizeがギリギリ(494.8M)なので、herokuでMeCabを使う限界を感じます...。

またデプロイに成功したものの、アプリの実行時に辞書のロケーションでエラーが発生してしまいました。

The MeCab dictionary does not exist at "/usr/local/lib/mecab/dic/mecab-ko-dic". Is the dictionary correctly installed?
You can also try entering the dictionary path when initializing the Mecab class: "Mecab('/some/dic/path')"
dicdir = /app/.linuxbrew/lib/mecab/dic/mecab-ko-dic

エラーメッセージの通り、辞書のパスをクラスの初期化時に渡してあげるといいようです。