※ Django, Python初心者のため不適切な箇所がありましたらご指摘くださいm( )m
筆者が使用しているのはmecab-koですが、mecabと概ね同じ手順になると思います。
ローカルでのKoNLPyとMeCabのセットアップ手順はこちらの記事に書いています
ローカル開発環境
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
エラーメッセージの通り、辞書のパスをクラスの初期化時に渡してあげるといいようです。