スポンサーリンク

Djangoで作成したアプリをConoha VPSのコンソールを使って公開するための手順のメモ

スポンサーリンク
スポンサーリンク
この記事は約18分で読めます。

この記事では、PythonとDjangoで作成したWebアプリケーションをConoha VPSで公開するための手順をメモしている。

途中、PostgreSQLの設定を行っているが、この記事を書きながら後悔した際は、DBはsqlite3のままで、静的ファイルも使用しなかったため、PostgreSQL関連の設定は実際には不要だった。

 

  1. Conoha VPS コンソールを使った初期設定
    1. root権限でログイン
    2. OSにユーザーを追加
    3. SSHでのrootユーザーとしてのの接続禁止設定
    4. SSH接続設定
    5. パスワード認証から公開鍵認証に変更
    6. SSHのポート番号を変更
    7. サーバ監視ソフトlogwatchをインストール
    8. root権限で作業
    9. Pythonをインストール
      1. pyenvとvirtualenvをクローン
      2. profileをvimで開く
      3. profileに追記してPATHを通す
      4. profileを再読み込み
      5. libffi-devをインストール
      6. pyenvのバージョンを確認
      7. pyenvでインストールできるPythonのバージョンを確認
      8. pyenvでPythonをインストール
      9. globalコマンドでバージョンを切り替え
      10. 再度pyenvのバージョンを確認
    10. pip、DB、Webサーバーをインストール
    11. PosgreSQLがインストールできたかを確認
    12. バージョンを確認
    13. NGINXの状態を確認
    14. 通信が許可されているポートを確認
    15. http(80番ポート)通信と8000番ポートを許可
    16. SSH接続のため22番から変更後のポート番号を許可
    17. 22番ポートへ連続で接続しようとするIPアドレスの拒否
    18. DBの設定
      1. PostgreSQLにユーザーを作成
      2. データベースの状態を確認
      3. ユーザー一覧を取得
      4. ユーザーにDBのアクセス権を付与
  2. ローカルのDjangoプロジェクトの設定
    1. settings_secret.pyの作成
    2. Gitでの管理と設定
      1. ワーキングディレクトリでプロジェクトを移動またはコピー
      2. .gitignoreの作成と編集
      3. ワーキングディレクトリでgit add .
    3. Githubへのアップ
      1. リモートリポジトリの作成
      2. リモートリポジトリへのプッシュ
    4. VPSにGithubからプロジェクトをクローン
    5. venvで仮想環境を作成
      1. Djangoプロジェクトディレクトリに移動
      2. venvで仮想環境を作成
      3. 仮想環境を起動
      4. Djangoなどを仮想環境にインストール
    6. Djangoの設定
      1. settings.py
    7. gunicornの起動
  3. 参考

Conoha VPS コンソールを使った初期設定

 

root権限でログイン

user:root

pass:設定したパスワード

※rootでのログイン時はユーザー名はrootで固定

 

 

OSにユーザーを追加

以下のコマンドでユーザーを追加

VPS起動直後はrootしかユーザーがいない。

そのため、新たに管理者用のユーザーを作成する。

rootは悪用されることを防ぐため、後でrootによる接続は禁止にするための設定を行う

 

 

SSHでのrootユーザーとしてのの接続禁止設定

SSH接続でrootユーザーとして接続することを禁止する。(ConoHaのコンソールからrootユーザーとしてアクセスすることはできる。)

etc/sshディレクトリ内のsshd_configというファイルをvimで編集する。

すると、sshd_configファイルの中身が表示されるので、i を入力してINSERTモードにしてからnoに変更する。

notに変更後、:wq を押して、さらにEnterで保存

~etc/ssh/sshd_config

vimは開いた直後はコマンドモードと呼ばれる状態であり、i を押すと入力モードになってファイルを編集できる。

その後escを押すと入力モードを解除してコマンドモードに戻る。

編集した内容を保存したいときは :wq の後にEnterで可能。

 

また、これだけでは反映されないので一度リロードを行う

これでrootユーザーでのssh接続は不許可となる。

 

 

SSH接続設定

追記予定

 

 

パスワード認証から公開鍵認証に変更

追記予定

 

 

SSHのポート番号を変更

~ルート

vimでetc/sshフォルダ内のsshd_configファイルを編集する。

途中にPort 22と記述があるはず。これはSSH接続時のポート番号を指定している。これを22番以外のポート番号に変更する。

 

0~1023番までのメジャーなサービスやプロトコルが使用するウェルノウンポート、1024~49151までの特定のアプリケーションが使用する登録済みポートがあるので、それらを避けて49152~65535のプライベートポートを使うのが良い。

 

ポート番号を22から任意の番号に変更後、ESCでINSERTモードからコマンドモードへ戻り、:wq  Enterの順に入力して内容を保存する。

 

次に、設定を反映させるためにsshdを再起動する。

 

 

サーバ監視ソフトlogwatchをインストール

同時にpostfixと呼ばれるメール転送ソフトもインストールされる。これはサーバの監視結果をメールで知らせるために使うと思われる。No Configurationを選択したが、詳しい設定は別途確認が必要。

 

また、以下のコマンドで直近のログ内容をコンソールに表示できる。

20秒前後時間がかかるので、しばらく待つと、ディスクスペースやrootでログインしようとして認証エラーとなったログが表示される。いろいろなポート番号を指定して認証しようとしている者がいるらしい。けっこう怖い。

 

 

root権限で作業

この後、諸々必要なソフトをインストールしていくが、root権限で作業するためのコマンドを実行する。rootユーザーとしてのパスワードの入力が必要。

 

 

Pythonをインストール

UbuntuのバージョンによってはPythonとGitが既に入っている場合があるが、Conoha VPS契約時にUbuntu20.04を選択したが、Pythonは入っていなかったためインストール。

デフォルトで入っている場合もバージョンが古かったりするので、インストールしなおす場合が多いらしい。

参考:Conoha VPS (Ubuntu)にPython3をインストールする #Python3 – Qiita

 

-yは自動的にyesと解答するオプション

makeはソフトウェアのコンパイルやビルドを自動化するパッケージ

gccはGNU Compiler Collectionの略で、C及びC++プログラムのコンパイラ

Pythonの一部のモジュールやパッケージはC言語で書かれており、これらをビルド・インストールするためgccが必要な場合がある

 

 

pyenvとvirtualenvをクローン

 

 

profileをvimで開く

次の環境変数の設定を行うため

 

 

profileに追記してPATHを通す

環境変数の設定。echoコマンドを使ったりする方法もある。

 

 

profileを再読み込み

profileに追記した内容を再度読み込む

 

 

libffi-devをインストール

libffi-devは、C言語で書かれたソフトウェアプログラムで使用するための外部ライブラリで、主にC言語で書かれたコードから他の言語へのインターフェースを提供する。

以下の4つの役割と特徴で異なるプログラミング言語間のインターフェースを提供する。

  1. 言語間のインターフェース
  2. 動的な関数呼び出し
  3. データ型の変換
  4. プラットフォーム非依存性

 

 

pyenvのバージョンを確認

pyenvのバージョンが表示されればOK

 

 

pyenvでインストールできるPythonのバージョンを確認

縦にずらっとインストールできるPythonのバージョンが表示される。

 

 

pyenvでPythonをインストール

今回は3.12.0を選択。

しばらく待機すると完了。

今回、モジュールがインストールされていないと表示された。

_lzma

ファイル圧縮に用いるらしいが、一旦このまま進む。

Pythonのインストール完了後も、今の状態ではまだPythonコマンドを実行してもPythonは起動されないので、

次のコマンドで起動できるようにする

 

 

globalコマンドでバージョンを切り替え

このコマンドを実行後は、Pythonと送信するとPythonを起動することができる。

 

 

再度pyenvのバージョンを確認

pythonのバージョンとパスが出力されるが、その先頭に*がついていれば、pyenv globalによって指定されたバージョンであること印になる。

 

 

pip、DB、Webサーバーをインストール

Pythonをインストールできたので、次はpip、PosgreSQL、NGINXとそれぞれの開発環境に必要なものをインストール

上記だとNGINXとPostgreSQLが入らなかったので、↓こちらで再度試してみる。

※タイポの可能性大だが、一応一つずつインストールを試す。

インストール中に続けるか否か?と質問されるので yを送信。

 

 

PosgreSQLがインストールできたかを確認

 

 

バージョンを確認

 

 

NGINXの状態を確認

activeと表示が出ていればNGINXのインストールは完了。インストールと同時に起動されている。

http://[IPアドレス]を入力すると接続したいが、設定によってはこのままでは接続できない場合がある。

そのため、次で設定を確認する。

 

 

通信が許可されているポートを確認

自分の場合は、ここで以下の2行が表示されていた

ただし、80/tcpがALLOWになっていないとhttp通信(80番ポート)との通信ができず外部のブラウザからアクセスできない。

※参考

Webサーバーとの疎通ができない時に確認すること #初心者 – Qiita

Conoha VPSでドメイン作成してNginxにアルファSSL設定をする #nginx – Qiita

 

 

http(80番ポート)通信と8000番ポートを許可

ufwはubuntuのファイアウォールを設定するソフトウェア。ディストリビューションによってfirewalldを使う場合もある。

sudo ufw allow 80/tcpは80番(http通信)ポートを開放している。

sudo ufw allow 8000は8000番ポートを開放している。後のgunicorn起動時に8000番ポートを指定するため、ここで先に開放しておく。

sudo ufw reloadはファイアウォールの設定を読み込むために再起動している。

※参考

Conoha VPSでドメイン作成してNginxにアルファSSL設定をする #nginx – Qiita

 

SSH接続のため22番から変更後のポート番号を許可

SSH接続に使われている22番ポートから変更した後のポート番号を開放し、その設定を反映する。

 

 

22番ポートへ連続で接続しようとするIPアドレスの拒否

22番ポートはSSH接続をするためのポート番号として一般的に認知されている(ウェルノウンポート)

悪意を持ってWebサイトに攻撃するものは22番ポートへの接続を試そうとしてくる。

ここでは、複数回連続で接続を試したIPアドレスに対して接続制限を掛ける設定を行っているが、

他の記事ではSSHに使用するポートをウェルノウンポート以外のポート番号に変更するといった設定も紹介されている。

※参考

ConoHa VPSにUbuntu。ufwでファイアウォール。 | Snow Tree in June (snowtree-injune.com)

 

 

DBの設定

PostgreSQLにユーザーを作成

1行目でpostgresというユーザー名でログイン

この時、ログアウトするにはCtrl + Zか、\qを入力する。

2行目でDBを作成

3行目ではユーザー名とパスワードを設定。[]内はカッコを含めて可変。自由に設定して良い

 

 

データベースの状態を確認

 

 

ユーザー一覧を取得

 

 

ユーザーにDBのアクセス権を付与

ユーザー名にDBのアクセス権を付与

\l コマンドで再度DBの状態を確認するとAccess privilegesの記載が変わっている。

 

 

ローカルのDjangoプロジェクトの設定

VPSでDjangoアプリケーションを公開するには、Githubからプロジェクトを取得する方法がある。

Githubからプロジェクトを取得するには、ローカルで開発しているDjangoプロジェクトをプッシュする必要がある。

DjangoプロジェクトをGithubへプッシュする際、公開すべきではない情報があるので、その設定を行う。

 

公開すべきではない情報は以下の3つ

・SECRET_KEY

settings.pyに生成されているキー。Djangoアプリケーションはユーザーのパスワード暗号化やパスワード変更用のURL/トークン生成を行う。このキーが漏れるとパスワード漏れやPOSTデータの偽造のリスクがある。

・DBの設定値

デフォルトで用意されているsqlite3以外を使う場合は、settings.pyにDB名、ユーザー名、パスワードを書く必要がある。

・API認証キー

外部APIを使用している場合に記載する認証キー

 

公開しないための方法は2つある。

・django-environの使用

・settings.pyをもう一つ作る

どちらも、上記の公開すべきではない情報を別ファイルにして管理を行うために行う。

 

※参考

DjangoアプリのSECRET_KEYなどの機密情報を別ファイルで管理 (denno-sekai.com)

 

 

 

settings_secret.pyの作成

~(仮想環境名)/[プロジェクト名]/settings_secret.py

 

GithubへDjangoプロジェクトをPushするにあたり、公開すべきでない情報がある。settings._secret.pyを新規作成してそれらを移動させて、Gitの追跡から外してGithubへのPush対象から外す。設定を行う。

ちなみに、本番環境であるVPSにはGithubからCloneする際、ここで除外した情報を何らかの方法で加える必要がある。

 

setttings_secret.pyに記載するのは以下の2つ

※ファイル名はsettings_secretでなくても良い。

SECRET_KEY

DB情報と設定

 

また、settings.pyには以下の内容を最後に記述しておく

これは同じフォルダにsettings_secretがあればその全ての内容をインポートするもの。インポートエラーになった場合は何もしない。

settings.pyに本来あった設定をsettings_secret.pyに移しているので、その内容を取り込むために記述している。

 

 

Gitでの管理と設定

VPSでDjangoプロジェクトを取得するにはGithubからのCloneが必要。

GithubからCloneするには自分のローカル端末で開発しているDjangoプロジェクトをGithubにPushが必要。

ここでは、GithubにDjangoプロジェクトをPushする前に、公開すべきではない情報を公開しないための事前準備について記載。

 

ワーキングディレクトリでプロジェクトを移動またはコピー

追記予定

 

.gitignoreの作成と編集

追記予定

 

ワーキングディレクトリでgit add .

追記予定

 

Githubへのアップ

 

リモートリポジトリの作成

追記予定

 

リモートリポジトリへのプッシュ

追記予定

 

 

VPSにGithubからプロジェクトをクローン

~VPSのコンソール

 

cd / でルートディレクトリに移動している。その後 cd homeでホームディレクトリに移動。

GithubからDjangoプロジェクトを取得すると、homeディレクトリにプロジェクトディレクトリが作成される。

 

git clone時、http接続でパスワード認証を行った場合はエラーが発生した可能性がある。

その場合は以下の記事を参照して、パーソナルアクセストークンを生成してパスワードの代わりに入力する。

git clone時のremote: Support for password authentication was removed on August 13, 2021.というエラーの対処法

 

 

venvで仮想環境を作成

Githubから取得したDjangoプロジェクトディレクトリの中に、venvで仮想環境を作成する

 

Djangoプロジェクトディレクトリに移動

~home

 

 

venvで仮想環境を作成

~home/[Djangoプロジェクトディレクトリ]

python -m venv [仮想環境名]で仮想環境を作成。

Djangoプロジェクトディレクトリの中に、[仮想環境名]と同じ名前のディレクトリが作成される。

 

 

仮想環境を起動

~home/[Djangoプロジェクトディレクトリ]/[仮想環境名]

・[仮想環境名]のディレクトリ内に、binというディレクトリがある。その中のactivate.batを実行して仮想環境を起動する。

・sourceはLinuxシェル環境でスクリプトファイルを読み込んで実行するためのコマンド。

ここでは仮想環境名/binディレクトリ内のactivate.batを実行している。

これで仮想環境が起動される。先頭に(仮想環境名)と表示されていれば起動できている。

 

 

Djangoなどを仮想環境にインストール

~(仮想環境名)home/[仮想環境名]/bin

最初にアップグレードしてから諸々をインストールする。

gunicornはPythonのWebアプリケーションサーバー。WSGIアプリケーションをホストするために使用される。今回はNGINXとDjangoアプリをつなぐために使う。

psycopg2はPythonでPostgreSQLへ接続するためのライブラリ。DBとの接続、クエリの実行、データ取得などの操作をPythonスクリプト内で行うことができる。

 

 

Djangoの設定

 

settings.py

~(仮想環境名)home/プロジェクト名/config/settings.py

・Githubにはアップロードしなかった内容を記述。

・これは、Djangoプロジェクトをローカル端末からGithubへアップロードする際、公開すべきではない情報を取り除いたため、VPS側で取得したDjangoプロジェクトに取り除いた情報を書き加えている。

・INSTALL_APPSは他者と共有するプロジェクトの場合はsettings.pyから取り除く必要はなかったかもしれない。

今回は自作アプリのデプロイテストなのでINSTALL_APPSを全てlocal.settings.pyに移したが、その場合でも最後のアプリケーション名だけでも良かった。

・DEBUGは本番公開時にはFALSEに変えておく。エラーが発生した際、デバッグ用の情報がユーザーに見えてしまうことを防ぐことが目的。

 

 

gunicornの起動

・gunicorn –bindは、gunicornを起動するコマンド

・0.0.0.0は全ての端末からのアクセスを許可することを指す。

・8000はポート番号を指定している。外部からポート番号8000を指定して接続することができる。

・manage.pyがあるディレクトリで実行する必要がある。

・プロジェクト名はDjangoでstartprojectを実行したときに指定した名前で、内部にwsgi.pyがあるディレクトリ名

 

これで、http://IPアドレス:8000//アプリケーション名でブラウザから接続することができればひとまず公開ができたことになる。

 

 

参考

 

・ConoHa VPSでの環境構築

ConoHa VPSでのコンソール使用方法と管理者用ユーザーの作成

第3回:黒い画面を撃て!|ConoHa VPSサポート

 

 

・その他

ConoHa VPSで個人的な開発環境を構築① まずはUbuntuでサーバーを立てる (zenn.dev)

 

Conoha VPS (Ubuntu)にPython3をインストールする #Python3 – Qiita

【Ubuntu】ConoHaのVPSを作成した時にはじめにやること | VPS Life (server-memo.net)

 

 

・ConoHa VPSにPythonをインストール

pyenvでのPythonインストール

pyenv/pyenv: Simple Python version management (github.com)

 

pyenv を用いた Python3 インストール #Python – Qiita

 

Ubuntu環境のPython: Python環境構築ガイド – python.jp

コメント