この記事では、PythonとDjangoで作成したWebアプリケーションをConoha VPSで公開するための手順をメモしている。
途中、PostgreSQLの設定を行っているが、この記事を書きながら後悔した際は、DBはsqlite3のままで、静的ファイルも使用しなかったため、PostgreSQL関連の設定は実際には不要だった。
- Conoha VPS コンソールを使った初期設定
- ローカルのDjangoプロジェクトの設定
- 参考
Conoha VPS コンソールを使った初期設定
root権限でログイン
user:root
pass:設定したパスワード
※rootでのログイン時はユーザー名はrootで固定
OSにユーザーを追加
以下のコマンドでユーザーを追加
1 2 |
useradd 〇〇 passwd 〇〇 |
VPS起動直後はrootしかユーザーがいない。
そのため、新たに管理者用のユーザーを作成する。
rootは悪用されることを防ぐため、後でrootによる接続は禁止にするための設定を行う
SSHでのrootユーザーとしてのの接続禁止設定
1 |
vim /etc/ssh/sshd_config |
SSH接続でrootユーザーとして接続することを禁止する。(ConoHaのコンソールからrootユーザーとしてアクセスすることはできる。)
etc/sshディレクトリ内のsshd_configというファイルをvimで編集する。
すると、sshd_configファイルの中身が表示されるので、i を入力してINSERTモードにしてからnoに変更する。
notに変更後、:wq を押して、さらにEnterで保存
~etc/ssh/sshd_config
1 2 3 4 5 6 7 |
・ ・ ・ PermitRootLogin no ・ ・ ・ |
vimは開いた直後はコマンドモードと呼ばれる状態であり、i を押すと入力モードになってファイルを編集できる。
その後escを押すと入力モードを解除してコマンドモードに戻る。
編集した内容を保存したいときは :wq の後にEnterで可能。
また、これだけでは反映されないので一度リロードを行う
1 |
systemctl relaod sshd |
これでrootユーザーでのssh接続は不許可となる。
SSH接続設定
追記予定
パスワード認証から公開鍵認証に変更
追記予定
SSHのポート番号を変更
~ルート
1 2 3 4 5 6 7 8 9 10 |
#ルートディレクトリでない場合はルートに移動する cd / #vimでsshd_configファイルを編集する sudo vim /etc/ssh/sshd_config ・・・ #ポート番号を22から別の番号に変える Port 22 ・・・ |
vimでetc/sshフォルダ内のsshd_configファイルを編集する。
途中にPort 22と記述があるはず。これはSSH接続時のポート番号を指定している。これを22番以外のポート番号に変更する。
0~1023番までのメジャーなサービスやプロトコルが使用するウェルノウンポート、1024~49151までの特定のアプリケーションが使用する登録済みポートがあるので、それらを避けて49152~65535のプライベートポートを使うのが良い。
ポート番号を22から任意の番号に変更後、ESCでINSERTモードからコマンドモードへ戻り、:wq Enterの順に入力して内容を保存する。
次に、設定を反映させるためにsshdを再起動する。
1 |
sudo service sshd restart |
サーバ監視ソフトlogwatchをインストール
1 |
sudo apt install logwatch |
同時にpostfixと呼ばれるメール転送ソフトもインストールされる。これはサーバの監視結果をメールで知らせるために使うと思われる。No Configurationを選択したが、詳しい設定は別途確認が必要。
また、以下のコマンドで直近のログ内容をコンソールに表示できる。
1 |
sudo logwatch --output stdout |
20秒前後時間がかかるので、しばらく待つと、ディスクスペースやrootでログインしようとして認証エラーとなったログが表示される。いろいろなポート番号を指定して認証しようとしている者がいるらしい。けっこう怖い。
root権限で作業
1 2 |
su - #passを入力:VPSサーバー契約時のパスワード |
この後、諸々必要なソフトをインストールしていくが、root権限で作業するためのコマンドを実行する。rootユーザーとしてのパスワードの入力が必要。
Pythonをインストール
UbuntuのバージョンによってはPythonとGitが既に入っている場合があるが、Conoha VPS契約時にUbuntu20.04を選択したが、Pythonは入っていなかったためインストール。
デフォルトで入っている場合もバージョンが古かったりするので、インストールしなおす場合が多いらしい。
参考:Conoha VPS (Ubuntu)にPython3をインストールする #Python3 – Qiita
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apt install -y make gcc apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils #以下は2行目のインストールに失敗したので1つずつインストールしたときのコマンド。 #個別にインストールしただけ apt install -y make build-essential apt install -y make libssl-dev apt install -y make zlib1g-dev apt install -y make libbz2-dev apt install -y make libreadline-dev apt install -y make libsqlite3-dev apt install -y make wget apt install -y make curl apt install -y make llvm apt install -y make libncurses5-dev apt install -y make libncursesw5-dev apt install -y make xz-utils |
-yは自動的にyesと解答するオプション
makeはソフトウェアのコンパイルやビルドを自動化するパッケージ
gccはGNU Compiler Collectionの略で、C及びC++プログラムのコンパイラ
Pythonの一部のモジュールやパッケージはC言語で書かれており、これらをビルド・インストールするためgccが必要な場合がある
pyenvとvirtualenvをクローン
1 2 |
git clone https://github.com/yyuu/pyenv.git ~/.pyenv git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv |
profileをvimで開く
1 |
vi ~/.profile |
次の環境変数の設定を行うため
profileに追記してPATHを通す
1 2 3 |
export PYENV_ROOT=$HOME/.pyenv export PATH=$PYENV_ROOT/bin:$PATH eval "$(pyenv init -)" |
環境変数の設定。echoコマンドを使ったりする方法もある。
profileを再読み込み
1 |
source ~/.profile |
profileに追記した内容を再度読み込む
libffi-devをインストール
1 |
sudo apt install libffi-dev |
libffi-devは、C言語で書かれたソフトウェアプログラムで使用するための外部ライブラリで、主にC言語で書かれたコードから他の言語へのインターフェースを提供する。
以下の4つの役割と特徴で異なるプログラミング言語間のインターフェースを提供する。
- 言語間のインターフェース
- 動的な関数呼び出し
- データ型の変換
- プラットフォーム非依存性
pyenvのバージョンを確認
1 |
pyenv --version |
pyenvのバージョンが表示されればOK
pyenvでインストールできるPythonのバージョンを確認
1 |
pyenv install --list |
縦にずらっとインストールできるPythonのバージョンが表示される。
pyenvでPythonをインストール
1 |
pyenv install 3.12.0 |
今回は3.12.0を選択。
しばらく待機すると完了。
今回、モジュールがインストールされていないと表示された。
_lzma
ファイル圧縮に用いるらしいが、一旦このまま進む。
Pythonのインストール完了後も、今の状態ではまだPythonコマンドを実行してもPythonは起動されないので、
次のコマンドで起動できるようにする
globalコマンドでバージョンを切り替え
1 |
pyenv global 3.12.0 |
このコマンドを実行後は、Pythonと送信するとPythonを起動することができる。
再度pyenvのバージョンを確認
1 |
pyenv versions |
pythonのバージョンとパスが出力されるが、その先頭に*がついていれば、pyenv globalによって指定されたバージョンであること印になる。
pip、DB、Webサーバーをインストール
1 |
apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx python3-venv -y |
Pythonをインストールできたので、次はpip、PosgreSQL、NGINXとそれぞれの開発環境に必要なものをインストール
上記だとNGINXとPostgreSQLが入らなかったので、↓こちらで再度試してみる。
※タイポの可能性大だが、一応一つずつインストールを試す。
1 2 3 4 5 6 7 |
sudo apt-get install python3-pip sudo apt-get install python3-dev sudo apt-get install python3-venv sudo apt-get install libpq-dev sudo apt-get install postgresql sudo apt-get install postgresql-contrib sudo apt-get install nginx |
インストール中に続けるか否か?と質問されるので yを送信。
PosgreSQLがインストールできたかを確認
1 |
dpkg -l | grep postgresql |
バージョンを確認
1 |
psql --version |
NGINXの状態を確認
1 |
service nginx status |
activeと表示が出ていればNGINXのインストールは完了。インストールと同時に起動されている。
http://[IPアドレス]を入力すると接続したいが、設定によってはこのままでは接続できない場合がある。
そのため、次で設定を確認する。
通信が許可されているポートを確認
1 |
sudo ufw status |
自分の場合は、ここで以下の2行が表示されていた
1 2 |
OpenSSH ALLOW OpenSSH(v6) ALLOw |
ただし、80/tcpがALLOWになっていないとhttp通信(80番ポート)との通信ができず外部のブラウザからアクセスできない。
※参考
Webサーバーとの疎通ができない時に確認すること #初心者 – Qiita
Conoha VPSでドメイン作成してNginxにアルファSSL設定をする #nginx – Qiita
http(80番ポート)通信と8000番ポートを許可
1 2 3 |
sudo ufw allow 80/tcp sudo ufw allow 8000 sudo ufw reload |
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番から変更後のポート番号を許可
1 2 3 |
sudo ufw allow [22番から変更後のポート番号] #設定した内容の反映 sudo ufw reload |
SSH接続に使われている22番ポートから変更した後のポート番号を開放し、その設定を反映する。
22番ポートへ連続で接続しようとするIPアドレスの拒否
1 |
sudo ufw limit 22 |
22番ポートはSSH接続をするためのポート番号として一般的に認知されている(ウェルノウンポート)
悪意を持ってWebサイトに攻撃するものは22番ポートへの接続を試そうとしてくる。
ここでは、複数回連続で接続を試したIPアドレスに対して接続制限を掛ける設定を行っているが、
他の記事ではSSHに使用するポートをウェルノウンポート以外のポート番号に変更するといった設定も紹介されている。
※参考
ConoHa VPSにUbuntu。ufwでファイアウォール。 | Snow Tree in June (snowtree-injune.com)
DBの設定
PostgreSQLにユーザーを作成
1 2 3 4 |
#ユーザー名postgresとしてログイン sudo -u postgres psql create database django_db; create user [ユーザー名] with password '[パスワード]' |
1行目でpostgresというユーザー名でログイン
この時、ログアウトするにはCtrl + Zか、\qを入力する。
2行目でDBを作成
3行目ではユーザー名とパスワードを設定。[]内はカッコを含めて可変。自由に設定して良い
データベースの状態を確認
1 |
\l |
ユーザー一覧を取得
1 |
\du |
ユーザーにDBのアクセス権を付与
1 |
GRANT ALL PRIVILEGES ON DATABASE [DB名] TO [ユーザー名] |
ユーザー名に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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from pathlib import Path #SECRET_KEY # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '・・・・・' # Database # https://docs.djangoproject.com/en/4.2/ref/settings/#databases # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent #DBの設定情報 DATABASES = { 'default': { 'ENGINE': '・・・', 'NAME': ・・・ / '・・・', } } |
GithubへDjangoプロジェクトをPushするにあたり、公開すべきでない情報がある。settings._secret.pyを新規作成してそれらを移動させて、Gitの追跡から外してGithubへのPush対象から外す。設定を行う。
ちなみに、本番環境であるVPSにはGithubからCloneする際、ここで除外した情報を何らかの方法で加える必要がある。
setttings_secret.pyに記載するのは以下の2つ
※ファイル名はsettings_secretでなくても良い。
SECRET_KEY
DB情報と設定
また、settings.pyには以下の内容を最後に記述しておく
1 2 3 4 5 |
from pathlib import Path try: from .settings_secret import * except ImportError: pass |
これは同じフォルダに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のコンソール
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#ルート>homeの順にディレクトリを移動 cd / cd home #GithubからDjangoプロジェクトをCloneして取得 git clone https:・・・・・ Username: #ここでGithubユーザー名を入力 Password #ここでパスワードを入力 #ここで以下のエラーが出る場合がある remote: Support for password authentication was removed on August 13, 2021 ・・・ fatal: Authentication failed for 'https:・・・' |
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
1 2 |
#homeディレクトリからDjangoプロジェクトディレクトリに移動 cd [Djangoプロジェクトディレクトリ名] |
venvで仮想環境を作成
~home/[Djangoプロジェクトディレクトリ]
1 2 3 |
#仮想環境を作成 python -m venv [仮想環境名] cd [仮想環境名] |
python -m venv [仮想環境名]で仮想環境を作成。
Djangoプロジェクトディレクトリの中に、[仮想環境名]と同じ名前のディレクトリが作成される。
仮想環境を起動
~home/[Djangoプロジェクトディレクトリ]/[仮想環境名]
1 2 |
#仮想環境を起動 source bin/activate |
・[仮想環境名]のディレクトリ内に、binというディレクトリがある。その中のactivate.batを実行して仮想環境を起動する。
・sourceはLinuxシェル環境でスクリプトファイルを読み込んで実行するためのコマンド。
ここでは仮想環境名/binディレクトリ内のactivate.batを実行している。
これで仮想環境が起動される。先頭に(仮想環境名)と表示されていれば起動できている。
Djangoなどを仮想環境にインストール
~(仮想環境名)home/[仮想環境名]/bin
1 2 3 4 |
pip install --upgrade pip pip install django pip install gunicorn pip install psycopg2 |
最初にアップグレードしてから諸々をインストールする。
gunicornはPythonのWebアプリケーションサーバー。WSGIアプリケーションをホストするために使用される。今回はNGINXとDjangoアプリをつなぐために使う。
psycopg2はPythonでPostgreSQLへ接続するためのライブラリ。DBとの接続、クエリの実行、データ取得などの操作をPythonスクリプト内で行うことができる。
Djangoの設定
settings.py
~(仮想環境名)home/プロジェクト名/config/settings.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
・・・ SECRET_KEY = 'シークレットキー' DEBUG = FALSE INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'アプリケーション名', ] ALLOWED_HOSTS = ['VPSのIPアドレス', 'localhost'] ・・・ |
・Githubにはアップロードしなかった内容を記述。
・これは、Djangoプロジェクトをローカル端末からGithubへアップロードする際、公開すべきではない情報を取り除いたため、VPS側で取得したDjangoプロジェクトに取り除いた情報を書き加えている。
・INSTALL_APPSは他者と共有するプロジェクトの場合はsettings.pyから取り除く必要はなかったかもしれない。
今回は自作アプリのデプロイテストなのでINSTALL_APPSを全てlocal.settings.pyに移したが、その場合でも最後のアプリケーション名だけでも良かった。
・DEBUGは本番公開時にはFALSEに変えておく。エラーが発生した際、デバッグ用の情報がユーザーに見えてしまうことを防ぐことが目的。
gunicornの起動
1 |
gunicorn --bind 0.0.0.0:8000 [プロジェクト名].wsgi |
・gunicorn –bindは、gunicornを起動するコマンド
・0.0.0.0は全ての端末からのアクセスを許可することを指す。
・8000はポート番号を指定している。外部からポート番号8000を指定して接続することができる。
・manage.pyがあるディレクトリで実行する必要がある。
・プロジェクト名はDjangoでstartprojectを実行したときに指定した名前で、内部にwsgi.pyがあるディレクトリ名
これで、http://IPアドレス:8000//アプリケーション名でブラウザから接続することができればひとまず公開ができたことになる。
参考
・ConoHa VPSでの環境構築
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
コメント