デプロイ方法
flask公式チュートリアルでは、アプリケーションをpipでインストール可能な.wheelにまとめて、インストールしていたがpython専用のデプロイ方法のため、今回は汎用的なgitでインストールする方法を採用。
flask公式チュートリアル:
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/tutorial/deploy.html
手順は以下。
- 本番サーバーにpipインストール
- 本番サーバーにgitインストール
- Github経由でpush/pull
- 必要なライブラリをインストール
アプリケーションの起動のさせ方は、「起動スクリプト」以降を参照。
また、本番サーバーの権限設定などについては以下を参照。
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
コメント