[Django]さくらVPSに手動で再デプロイする

django

さくら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を編集していきます。

  1. DEBUG = Falseに変更
  2. ALLOWED_HOSTS = [‘*’]に変更
  3. 最下部のSTATIC_ROOTをSTATIC_ROOT = ‘/var/www/static’に変更
  4. 最下部の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に変更するとエラーは解消しました。

[Linux]パーミッションの確認や変更まとめ

ただ、777にすると全ユーザーに書き込み権限を与えるので嫌だな〜と思っていると凡ミスに気づきました。

先ほどのgunicornの起動時にsudoを付け忘れて起動していました。

gunicorn --bind 127.0.0.1:8000 config.wsgi:application

つまり、root権限がない状態で起動していたのでパーミッションエラーが発生していました。

同じようなパーミッションエラーに遭遇した時はgunicornの起動をどんなユーザーで起動したのか、root権限はあるのか?という点も確認してみてください。



カテゴリー