開発Tips アプリ公開:デプロイ編

デプロイ方法

 flask公式チュートリアルでは、アプリケーションをpipでインストール可能な.wheelにまとめて、インストールしていたがpython専用のデプロイ方法のため、今回は汎用的なgitでインストールする方法を採用。

flask公式チュートリアル:
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/tutorial/deploy.html

手順は以下。

  1. 本番サーバーにpipインストール
  2. 本番サーバーにgitインストール
  3. Github経由でpush/pull
  4. 必要なライブラリをインストール

アプリケーションの起動のさせ方は、「起動スクリプト」以降を参照。
また、本番サーバーの権限設定などについては以下を参照。

1. 本番サーバーにpipインストール

pythonがインストールされていないならpythonからインストール必要。(そんなことはないと思うので割愛)
Linuxの場合↓

curl -kL https://bootstrap.pypa.io/get-pip.py | python

pip -V
(バージョン情報)

windowsの場合は別の方法。参考↓
https://qiita.com/suzuki_y/items/3261ffa9b67410803443

2. 本番サーバーにgitインストール

gitのインストール(windowsはやり方違うので注意)

sudo yum install -y git

初期設定

$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"

参考↓
https://kitsune.blog/git-install

3. Github経由でpush/pull

 Github経由でpushするので、Githubに大事な情報を上げないように.gitignoreを正しく設定しましょう。flaskの場合だとSECRET_KEYなど。というか環境に依存するファイル、config系のファイルは除外しましょう。flaskのconfigについては以下にTipsあり(SECRET_KEY当たりの項)

 本番サーバーで依存ライブラリをインストールできるようにrequirements.txtを生成しておくこと。

$ pip freeze > requirements.txt

GitHubのリモートリポジトリにプッシュ(ローカルPC)

 以下は git add . をしているため、フォルダ下すべてがgit管理対象になるので注意。事前に.gitignoreで除外設定をすることを忘れないこと。
 管理下に置きたくないファイルをgit add した場合は「git rm –cached foo.txt」で除外する。オプション「–cached」を忘れると、ファイル自体も削除されるため注意!

$ git init
$ git remote add origin https://redmine.example.com/git_repository/example.git
$ git add .
$ git commit -m "First Commit"
$ git push -u origin master

# 要らないファイルを git add した場合は以下で取消し。「--cached」を忘れないこと!
$ git rm --cached foo.txt

push時に認証を求められるが、
 userはGitHubのユーザー名
 パスワードは発行したトークン文字列
userはメールアドレスでなくユーザー名。パスワードはログインパスワードでないことに注意。
また、パスワードとなるトークンは、事前にGitHub側で発行しないといけない。昔はログインパスワードを使えたみただが、今はトークンを使用でしか認証されない仕様変更あった模様。

 ネットで調べると、「git remote」でリモートを追加するときに、ユーザー名とパスワードを加えると毎回認証を求められなくなるみたい。
 例「https://username:password@redmine.example.com/git_repository/example.git」
個人的には、パスワードを入力するのが嫌だったため、この方法は使用していない。httpsだから暗号化されているから大丈夫かもだけど、知識不足なのでこの方法は使用せず。

GitでPull(本番サーバー)

$ git init
$ git remote add origin https://redmine.example.com/git_repository/example.git
$ git pull origin master

4.必要なライブラリをインストール

 忘れずに依存ライブラリをインストールすること。

$ pip install -r requirements.txt

 ちなみに、venv で仮想環境を作って、そこにインストールしても、本投稿の起動方法でアプリ起動は可能だった。(その場合は起動時にも仮想環境をオンにすること)
 勉強用のサーバーなどの使用用途だと、稼働させるアプリを切り替えることが多々あると思うので、venv仮想環境を作成するのが良いかも。

参考:
https://blog.s-giken.net/343.html

起動スクリプト

前書き

 今回はflaskの公式で利用していたwaitressをサーバーとした。(flask公式のチュートリアルでwaitressだったのは、macとWindows両方とも同じ方法で起動できるためなので、gunicornとかが普通っぽい)

 公式チュートリアルでは、起動スクリプトではなくコマンドからwaitressを起動しているが、waitress公式的にはコマンドからのサーバー起動は開発環境用とのこと。
 そのため、今回は起動用のスクリプトを作成。

flask公式チュートリアル:
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/tutorial/deploy.html
waitress公式:
https://docs.pylonsproject.org/projects/waitress/en/stable/usage.html

waitress起動スクリプト

 reversi は自作のアプリケーション。create_app()はFlaskオブジェクト(アプリケーション自体)を返すメソッド。
 また80ポートで起動させる場合は、rootユーザーで起動スクリプトを実行すること。「sudo python start.py」では起動に失敗した。

from waitress import serve
from reversi import create_app


if __name__ == '__main__':
    app = create_app()
    serve(app, host='0.0.0.0', port='80')

以下をシェルでサーバーを起動させる。

python (上記ファイル).py

ログアウトしてもサーバーを起動し続けたい場合は、「ログアウトしてもサーバーを起動し続ける」を参照。


ログアウトしてもサーバーを起動し続ける

起動方法

nohup python start.py > /dev/null 2>&1 </dev/null &

①nohup がログアウトしても動き続けるようにするコマンド。
②末尾の「&」がバックグランドでコマンドを実行。バックグランドで実行するから、実行後にログアウトが出来る。
③「> /dev/null 2>&1 </dev/null」が標準出力、エラー出力を捨てる。

停止方法

考え方としては、プロセスをkillコマンドで停止させる。

プロセスの検索

ps aux | grep [p]ython
# 実行結果
root         558  0.3  2.3 127640 43032 ?        Ssl  20:23   0:22 /usr/bin/python3 -s ******
root         665  0.1  1.5 408464 27968 ?        Ssl  20:23   0:09 /usr/bin/python3 -s *******
root        2946  5.8  1.5 329340 28932 ?        Sl   20:57   4:43 python start.py

# または
pgrep -f "python"
# 実行結果
558
665
2946

プロセスをkill

kill -9 2946

参考サイト
https://neos21.net/blog/2018/09/26-01.html

コメント

タイトルとURLをコピーしました