PythonのDjangoに興味があり、Django Girls Tutorialというサイトを見てTutorialをやってみました。
Tutorialでは、Djangoの使い方の紹介とともに、Herokuでアプリを公開することもレッスンに含まれています。
そこで、はまったことを紹介します。
SSHキーの保存場所
heroku keys:add で作成される公開キーの保存場所は、C:/Users/(your name)/.ssh/id_rsa.pubです。MSYS2のMinGW 64-bitを使っていたのですが、MSYS2のホームディレクトリにある~/.ssh/のキーが使われませんでした。
Gitでheroku CLIのものを使う場合
heroku CLIというherokuコマンドを含むtoolがあるのですが、一緒にGitもインストールされます。最初MSYS2のgitをつかってgit push heroku masterしても、usernameとpasswordを聞かれてしまいすんなりとpushできません。
heroku loginでEmailとPasswordを聞かれてログインしているはずですが、認識していません。
結局heroku CLIでインストールされたGitを使うとusernameが聞かれなくなりました。
MSYS2のGitを使う場合は_netrcを.netrcにコピーする
heroku loginで認証したときのユーザー名やパスワードの情報は、ホームディレクトリの~/_netrcというファイルに保存されているようです。
MSYS2のGitを使えないか試してみて、ホームディレクトリの~/_netrc を~/.netrcにコピーすると使えることがわかりました。Heroku CLIのGitも使いたいときは_netをそのままにしておいた方がいいようです。
Pythonのバージョンとpsycopg2のバージョン
MSYS2のPythonは、3.4.5です。Django Girls Tutorialでは3.5.2を指定するよう書かれているので、runtime.txtに書いてgit pushしてみましたが、エラーで動きません。
エラーはpsycopg2をインストールするときに出て、ImportError: No module named 'six'となっています。
remote: Traceback (most recent call last): remote: File "<string>", line 1, in <module> remote: File "/tmp/pip-build-799m2cq_/psycopg2/setup.py", line 583, in <module> remote: ext_modules=ext) remote: File "/app/.heroku/python/lib/python3.5/distutils/core.py", line 148, in setup remote: dist.run_commands() remote: File "/app/.heroku/python/lib/python3.5/distutils/dist.py", line 955, in run_commands remote: self.run_command(cmd) remote: File "/app/.heroku/python/lib/python3.5/distutils/dist.py", line 974, in run_command remote: cmd_obj.run() remote: File "/app/.heroku/python/lib/python3.5/site-packages/setuptools/command/install.py", line 61, in run remote: return orig.install.run(self) remote: File "/app/.heroku/python/lib/python3.5/distutils/command/install.py", line 551, in run remote: self.run_command(cmd_name) remote: File "/app/.heroku/python/lib/python3.5/distutils/cmd.py", line 313, in run_command remote: self.distribution.run_command(command) remote: File "/app/.heroku/python/lib/python3.5/distutils/dist.py", line 974, in run_command remote: cmd_obj.run() remote: File "/app/.heroku/python/lib/python3.5/site-packages/setuptools/command/install_scripts.py", line 17, in run remote: import setuptools.command.easy_install as ei remote: File "/app/.heroku/python/lib/python3.5/site-packages/setuptools/command/easy_install.py", line 49, in <module> remote: from setuptools.py27compat import rmtree_safe remote: File "/app/.heroku/python/lib/python3.5/site-packages/setuptools/py27compat.py", line 7, in <module> remote: import six remote: ImportError: No module named 'six' remote: remote: ---------------------------------------- remote: Rolling back uninstall of psycopg2 remote: Command "/app/.heroku/python/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-799m2cq_/psycopg2/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-dpg0rw8e-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-799m2cq_/psycopg2/ remote: ! Push rejected, failed to compile Python app. remote: remote: ! Push failed
仕方がないので、sixをrequirements.txtに加えましたがエラーのままです。
runtime.txtの設定でpython-3.4.5をにしてみると、pipのインストールでエラーになります。No such file or directoryだそうです。
pythonのバージョンを下げるのは得策ではないようです。
remote: -----> Installing requirements with pip remote: /app/tmp/buildpacks/779a8bbfbbe7e1b715476c0b23fc63a2103b3e4131eda558669aba8fb5e6e05682419376144189b29beb5dee6d7626b4d3385edb0954bffea6c67d8cf622fd51/bin/steps/pip-install: line 7: /app/.heroku/python/bin/pip: No such file or directory remote: ! Push rejected, failed to compile Python app. remote: remote: ! Push failed
pythonを3.6.1にしてもpsycopg2のエラーは変わりませんでした。
Django Girls Tutorialではpsycopg2のバージョンは、2.5.4を指定するようになっています。これを2.6や2.6.1にしてもエラーは変わりませんでした。
いろいろ試してみて結局psycopg2のバージョンを2.7.1にあげることでデプロイが成功しました。pythonのバージョンは、3.5.2と3.6.1のどちらでもよかったです。
requirements.txt
dj-database-url==0.4.2 Django==1.11 gunicorn==19.7.1 pytz==2017.2 whitenoise==3.3.0 psycopg2==2.7.1
Pythonを始めると、virutalenvやvenvといった仮想環境を使ってモジュールのバージョン管理をすることが推奨されていますが、バージョンが合わないとアプリケーションが動かなくなることが納得できました。
Herokuがうまく動かないときの情報が検索してもあまり出てこないので本当に困りました。