1. ホーム
  2. heroku

herokuでサービスを構築する方法

2022-02-23 17:44:07

1. herokuのWebサイトでアカウントを登録する。

https://www.heroku.com/

gmailのメールアドレスを使用して登録する場合

2. heroku CLIをインストールする

https://devcenter.heroku.com/articles/getting-started-with-python#set-up

3. ターミナルでherokuにログインする

$ heroku login 

メールアドレスとパスワードを入力


4. herokuにアプリのリポジトリを作成する

以下のコマンドは、すべてgit bashで実行します。

ここではランダムなアプリ名(floating-sands-17593)が生成されますが、これは後で変更することができます。

$ heroku create 
Creating app... done, floating-sands-17593 done, floating-sands-17593
https://floating-sands-17593.herokuapp.com/ | https://git.heroku.com/floating-sands-17593.git

GitHub上に自分のサーバーのリポジトリがあり、heroku上でリポジトリを実行したい場合、自分のリポジトリ下で以下のコマンドを実行し、herokuのリポジトリと関連付けると、git remote -vコマンドでherokuとoriginの二つのリポジトリを関連付けたことが表示されるようになります。

$ heroku git:remote --app floating-sands-17593
set git remote heroku to https://git.heroku.com/floating-sands-17593.git

$ git remote -v
heroku https://git.heroku.com/floating-sands-17593.git (fetch)
heroku https://git.heroku.com/floating-sands-17593.git (push)
origin [email protected]:xxxxxxx/myserver.git (fetch)
origin [email protected]:xxxxxxx/myserver.git (push)


その後、コードをオリジンリポジトリにコミットする際に、以下のコマンドを実行すれば、ローカルの heroku リポジトリの master ブランチにも変更をコミットすることができます。

$ git push origin HEAD:heroku/master
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/xxxxxxx/myserver
   30b7661..3f8b4e2 HEAD -> heroku/master


次に、以下のコマンドを実行して、ローカル heroku リポジトリの mater ブランチからリモート heroku リポジトリの master ブランチにコードをコミットします。 

$ git push heroku master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 1.68 KiB | 1.68 MiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done. done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: !     The latest version of Python 3.6 is python-3.6.6 (you are using python-3.6.0, which is unsupported).
remote: !     We recommend upgrading by specifying the latest version (python-3.6.6).
remote: Learn More: https://devcenter.heroku.com/articles/python-runtimes
remote: -----> Installing python-3.6.0
remote: -----> Installing pip
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: Collecting requests>=2.12 (from -r /tmp/build_6c9b905b83df6633ae3bb4c4f833da04/requirements.txt (line 1))
remote: Downloading https://files.pythonhosted.org/packages/65/47/7e02164a2a3db50ed6d8a6ab1d6d60b69c4c3fdf57a284257925dfc12bda/ requests-2.19.1-py2.py3-none-any.whl (91kB)
remote: Collecting certifi>=2017.4.17 (from requests>=2.12->-r /tmp/build_6c9b905b83df6633ae3bb4c4f833da04/requirements.txt ( line 1))
remote: Downloading https://files.pythonhosted.org/packages/df/f7/04fee6ac349e915b82171f8e23cee63644d83663b34c539f7a09aed18f9e/ certifi-2018.8.24-py2.py3-none-any.whl (147kB)
remote: Collecting urllib3<1.24,>=1.21.1 (from requests>=2.12->-r /tmp/build_6c9b905b83df6633ae3bb4c4f833da04/requirements. txt (line 1))
remote: downloading https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5e7cb78a1d92c53851ef4f56f62a3486e6a7d8ffb/ urllib3-1.23-py2.py3-none-any.whl (133kB)
remote: Collecting idna<2.8,>=2.5 (from requests>=2.12->-r /tmp/build_6c9b905b83df6633ae3bb4c4f833da04/requirements.txt ( line 1))
remote: Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna- 2.7-py2.py3-none-any.whl (58kB)
remote: Collecting chardet<3.1.0,>=3.0.2 (from requests>=2.12->-r /tmp/build_6c9b905b83df6633ae3bb4c4f833da04/requirements. txt (line 1))
remote: Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/ chardet-3.0.4-py2.py3-none-any.whl (133kB)
remote: Installing collected packages: certifi, urllib3, idna, chardet, requests
remote: Successfully installed certifi-2018.8.24 chardet-3.0.4 idna-2.7 requests-2.19.1 urllib3-1.23
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 55.3M
remote: -----> Launching...
remote: Released v3
remote: https://floating-sands-17593.herokuapp.com/ deployed to Heroku
remote: Verifying deploy..:
remote: Verifying deploy... done. done.
To https://git.heroku.com/floating-sands-17593.git
 * [new branch] master -> master


もちろん、コードを直接herokuのリポジトリに投稿して、自分で実験することも可能です。

5. heroku openコマンドを実行し、デプロイされたサイトを開きます。

6. データベースの設定、ここではpostgresqlの例を示します。

https://elements.heroku.com/addons/heroku-postgresql   インストールをクリックして、自分のアプリケーションにデータベースを追加します。

postrgre の hobby-dev の最下位バージョンは、1万レコード未満、20コネクション、キャッシュなし、fork/followなし、Postgresログなしをサポートしており、低コストで始められるバージョンとなっています。

また、アプリ(appname)にhobby-dev版のpostgreデータベースを追加するには、コマンドを使用します。

heroku addons:add heroku-postgresql:hobby-dev --app appname 

データベースを追加すると、データベースのURL(DATABASE_URL)が生成され、以下のコマンドで確認することができます。

heroku config -s --app appname

データベース情報を表示するコマンドです。

heroku pg:info --app appname

データベースとのセッションを確立するためのコマンドです。

heroku pg:psql --app appname, 接続を確立した後、sqlステートメントを入力することができます。

C:\Users\llz>heroku pg:psql --app floating-sands-17593
--> Connecting to postgresql-closed-48647
psql (10.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, key bits: 256, compression: off)
floating-sands-17593::DATABASE=>
floating-sands-17593::DATABASE=> CREATE TABLE posts ( content TEXT,
floating-sands-17593::DATABASE(> time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
floating-sands-17593::DATABASE(> id SERIAL );
CREATE TABLE
floating-sands-17593::DATABASE=>
floating-sands-17593::DATABASE=> insert into posts values('abc');
INSERT 0 1
floating-sands-17593::DATABASE=> commit;
WARNING: there is no transaction in progress
COMMIT
floating-sands-17593::DATABASE=> select * from posts;
 content | time | id
---------+----------------------------+----
 abc | 2018-09-16 16:21:36.222737 | 1
(1 row of records)

postgreデータベースをwindowで展開する手順

https://devcenter.heroku.com/articles/heroku-postgresql#set-up-postgres-on-windows

7. データベースを手に入れたら、今度はプログラムによってデータベースを呼び出します。

pipenv インストール psycopg2-binary  

その後、pythonのコードに、追加します。

import os
import psycopg2

DATABASE_URL = os.environ['DATABASE_URL']

conn = psycopg2.connect(DATABASE_URL, sslmode='require')

コードに加えて、さらに3つの重要なファイルがリポジトリに存在する必要があります。

(1) 要件.txt    は、Pythonの依存モジュールを以下のフォーマットで保持します。

requests>=2.12
flask>=0.12.2
psycopg2>=2.7.5
bleach>1.5.0

(2) ランタイム.txt    実行環境設定

python-3.6.0

(3) プロファイル    実行されるpyファイル

web: python BookmarkServer.py

デバッグ方法

heroku logs --tail サーバー側のログを表示します。

一般的なエラーログ

1. r10 ブートタイムアウト

2018-09-16T14:44:19.344061+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2018-09-16T14:44:19.344061+00:00 heroku[web.1]: Stopping process with SIGKILL
2018-09-16T14:44:19.470277+00:00 heroku[web.1]: Process exited with status 137
2018-09-16T14:44:19.488826+00:00 heroku[web.1]: State changed from starting to crashed
2018-09-16T14:44:22.212756+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host= floating-sands-17593.herokuapp.com request_id=072c4c2c-2e86-4123-844b-d03bb5f00e36 fwd="223.72.44.189" dyno= connect= service = status=503 bytes= protocol=https


https://devcenter.heroku.com/articles/error-codes#r10-boot-timeout