[Django]さくらVPSに手動で再デプロイする
さくらVPSにDjangoアプリケーションをデプロイしたその後。
修正したアプリケーションを「手動」で再デプロイする流れをまとめました。
サーバーにアプリケーションを転送する
まずは手元のMacからzip化したDjangoアプリケーションを丸ごとアップロードします。
# macのターミナルにて $ sudo scp -P 設定したポート番号 ファイル名 サーバーのユーザー名@IPアドレス:/アップロード先のディレクトリ
具体例で見てみると、こんな感じ。
$ sudo scp -P 53287 project.zip user@160.11.111.11:/home/django
アップロードが完了したらMacのターミナルからサーバーにログインします。
$ sudo ssh -p ポート番号 user@160.11.111.111
ここからはサーバーにログインしている体で進めていきます。
zipファイルを解凍します。
$ sudo unzip ファイル名 replace project/config/__pycache__/settings.cpython-36.pyc? [y]es, [n]o, [A]ll, [N]one, [r]ename: A←大文字のAと入力
再デプロイで同じファイルがすでにあるので、replaceする?と聞かれます。[y]es、と入力すると1つずつ延々と続くので、[A]ll、つまりAと入力します。aと小文字で入力すると怒られますのでご注意を。
settings.pyを編集する
アップロードする前に編集していても良いですが、リモート側でsetting.pyを編集していきます。
settings.pyがあるディレクトリまで移動して、
$ sudo nano settings.py
setting.pyを編集していきます。
- DEBUG = Falseに変更
- ALLOWED_HOSTS = [‘*’]に変更
- 最下部のSTATIC_ROOTをSTATIC_ROOT = ‘/var/www/static’に変更
- 最下部のMEDIA_ROOTをMEDIA_ROOT = ‘/var/www/media’に変更
ちなみに2の箇所ですが、本当はIPアドレスやドメインを入力した方が良いです。’*’は全てを許可してしまいます。
collectstatic
これはCSSファイルをまとめる作業ですが、manage.pyがあるディレクトリまで移動し、
$ sudo python3.6 manage.py collectstatic
とします。
たとえCSSの変更がない再デプロイでもこのコマンドが抜けると画像が正しく読み込まれずエラーになったりしますのでご注意を。
あとモデルの変更があればmakemigrations/migrateも忘れずに。
gunicornの起動
最後にgunicornを起動しますが、再デプロイの場合はここでハマりポイントがあります。
先にデプロイしたアプリケーションのポートが残っているので、それをkillする必要があります。
# PID番号を確認 $ sudo lsof -i:8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME gunicorn 1234 django 5u IPv4 1234567 0t0 TCP localhost:irdmi (LISTEN) gunicorn 5678 django 5u IPv4 1234567 0t0 TCP localhost:irdmi (LISTEN)
ここで表示されたPIDの番号(上記では2つ)をkillしていきます。
sudo kill -9 1234←PIDの番号
最後に、gunicornを起動します。この時、プロジェクトがあるディレクトリで実行します。
project $ sudo gunicorn --bind 127.0.0.1:8000 config.wsgi:application
私はconfig.wsgiとしていますが、アプリケーション名.wsgiとしている人は読み替えて実行してみてください。
gunicornがnot foundになる場合は、
sudo /usr/local/bin/gunicorn --bind 127.0.0.1:8000 config.wsgi:application
でOKです。
PermissionErrorが出た際の確認事項
モデルのフィールドを追加、変更、削除などして検証をしていたら今までは問題なくImageFieldのアップロードが出来ていたのにエラーが出るようになりました。
パーミッションエラーでmediaディレクトリの書き込み権限がないとのこと。
あれ?おかしいな・・・と思いつつもmediaディレクトリのパーミッションを777に変更するとエラーは解消しました。
ただ、777にすると全ユーザーに書き込み権限を与えるので嫌だな〜と思っていると凡ミスに気づきました。
先ほどのgunicornの起動時にsudoを付け忘れて起動していました。
gunicorn --bind 127.0.0.1:8000 config.wsgi:application
つまり、root権限がない状態で起動していたのでパーミッションエラーが発生していました。
同じようなパーミッションエラーに遭遇した時はgunicornの起動をどんなユーザーで起動したのか、root権限はあるのか?という点も確認してみてください。