
Djangoを使ったWebアプリの作り方 ⑥レンタルサーバーで公開編
今までは、ローカル環境(自分のPC)でDjangoアプリを動かしていました。今回は、さくらvpsにて作成したDjangoプロジェクトを公開していきます。
手順は以下となります。
1. さくらVPSの契約
さくらVPSのウェブサイトからアカウントを作成し、必要なプランを選択します。

サーバーを選択する
OSはCentOSとしました。また、今回は試しなので、一番リーズナブルなプランにしました。

リージョンも一番リーズナブルな東京第2としました。

パスワード設定と、SSH接続できるように公開鍵を設定します。

自分のPCで、SSHの公開鍵、秘密鍵を生成する方法は以下リンクを参考にしてください。
次に、サーバの名前を設定して”お支払い方法選択へ”をクリックします。

クレジットカード決済で申し込みます。2週間お試しも選択します。

最初は、2か月分の利用料金がかかります。

この内容でよければ、支払いを確定します。

以上でサーバーが作成されます。少し時間がかかりますが、しばらくすると作成されたサーバーを確認することができます。

最初はサーバーが停止しているので起動>実行します。

以上でvpsサーバーを契約して、起動するところまでできました。
2. SSH接続
今回は、Teratermを使って接続します。サーバーのIPアドレス(IPv4)を入力して、OKを押します。

最初は、警告画面がでますが続行を押します。

次に、サーバーの契約時に設定したパスワードと公開鍵を設定して接続します。(ユーザー名は、デフォルト"centos"です)

以上で、サーバーにSSH接続できました。さらにセキュリティ向上する場合は、以下サイトを参考に設定してみてください。
3. Dockerのインストール
Dockerは主に次の2つのバージョンがあります。今回は、Docker CEをインストールします。
Docker CE (Community Edition)
誰でも無料で使えるバージョン。
主に個人ユーザーや小規模なチーム向け。
新しい機能や更新が比較的早くリリースされます。
コミュニティ(開発者グループ)がサポートしています。
Docker EE (Enterprise Edition)
企業向けの有料バージョン。
セキュリティやサポートが強化されています。
大企業や大規模なプロジェクトに適しています。
3.1 必要なパッケージのインストール
Dockerをインストールする前に、必要なシステムツールをインストールします。
yum-utils: パッケージ管理に便利なツール。
device-mapper-persistent-data と lvm2: ストレージ管理に関連するパッケージ。
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3.2 Dockerリポジトリを追加
CentOSにDocker公式リポジトリを追加します。 リポジトリとは、特定のソフトウェアをインストールするためのサーバーのことです。
(以下のコマンドを使って 安定版 (stable)リポジトリをセットアップします)
yum-config-manager: yumの設定を変更するツール。
--add-repo: 指定したリポジトリを追加します。
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.3 Docker本体のインストール
Dockerの本体(docker-ce = Community Edition)をインストールします。
$ sudo yum install docker-ce
上記コードで、最新版がインストールされます。特定のバージョンをインストールしたい場合は以下を参考にしてください。
3.3.1 特定バージョンのDocker CEをインストールする場合(任意)
開発する環境によっては、 Docker CE の最新版を利用するようなことはせずに、特定バージョンをインストールする場合があると思います。以下では、特定のバージョンのインストール方法を記載します。
インストール可能なDockerのバージョン一覧を確認します。
--showduplicates: 同じ名前の複数バージョンを表示。
sort -r: 結果を降順(新しいバージョンが上)に並べ替え。
$ yum list docker-ce.x86_64 --showduplicates | sort -r
特定のバージョンのDockerをインストールします。(例:docker-ce-<バージョン番号>)
$ sudo yum install docker-ce.x86_64
3.4 Dockerサービスを起動
Dockerのサービスを起動します。
systemctl: サービスを管理するコマンド。
start: サービスを開始する。
$ sudo systemctl start docker
3.5 現在のユーザーをdockerグループに追加
Dockerデーモンは通常、rootユーザーか、dockerというグループのメンバーにだけアクセスが許可されています。そのため、現状は、以下のように、Dockerコマンドを実行する際にsudoを付けることで、管理者権限で実行できます。
sudo docker ps -a
ただ、毎回sudoをつけるのは面倒なので、sudoなしでDockerを実行できるようにします。
Dockerをインストールすると、通常はdockerというグループが作成されます。このグループに現在のユーザーを追加することで、sudoなしでDockerコマンドを実行できるようになります。
・dockerグループに現在のユーザーを追加
sudo usermod -aG docker $USER
'''
# コード説明
$USERは、現在ログインしているユーザー名を自動的に取得します。
手動でユーザー名を指定する場合:
sudo usermod -aG docker centos
'''
・変更を反映するためにログアウト & 再ログイン
一度ログアウトしてから再ログインする必要があります。
もし、コマンドラインを再起動したくない場合は、以下のコマンドで変更を即座に反映できます。
newgrp docker
'''
# コードの説明
newgrp docker は、ユーザーを docker グループに追加した後、その変更をすぐに反映するためのコマンドです。
通常、ユーザーをグループに追加した場合、再ログインしないと新しいグループ権限が適用されませんが、このコマンドを使うと再ログインなしで反映できます。
'''
・権限を確認
ユーザーが正しくグループに追加されたか確認するために、次のコマンドを実行します。
groups
出力にdockerが含まれていればOKです。
4. Docker-Composeのインストール
Docker Composeは「Docker CLI」(Dockerのコマンドラインツール)と一緒に使う場合(プラグイン版)と、Docker CLIをインストールせずに、Docker Composeだけを使う場合(スタンドアロン版)があります。今回は、Docker Composeだけを使うスタンドアロン版の設定方法を記載します。
Docker Compolseを手動でダウンロードしますが、バージョンを指定する必要があります。バージョンは以下リンクから確認できます。
今回は、以下最新版(v2.30.3)をダウンロードします。

以下コードを実行することで、所定の場所(/usr/local/bin/docker-compose)にDocker Composeをダウンロードすることができます。
sudo curl -SL https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
'''
# コードの説明
sudo
>管理者権限を使うためのコマンド。
curl
>インターネットからデータを取得するためのツール。
-SL
>-S: ダウンロード中のエラーを画面に表示します。
>-L: リンクがリダイレクト(他のURLに転送)される場合も、最終的なダウンロード先まで追跡します。
https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64
>ダウンロード元のURL。
-o /usr/local/bin/docker-compose
>-o: ダウンロードしたファイルをどこに保存するかを指定します。
'''
次に権限を設定します。
sudo chmod +x /usr/local/bin/docker-compose
'''
# コードの説明
sudo
>管理者権限を使うためのコマンド。
chmod
>ファイルやフォルダの「権限(Permission)」を変更するコマンド。
+x
>ファイルに「実行可能(executable)」な権限を追加するという指定。
/usr/local/bin/docker-compose
>権限を変更する対象のファイル(Docker Composeの実行ファイル)。
'''
以下コードを実行して、バージョンが確認できればOKです。
docker-compose --version
> Docker Compose version v2.30.3
5. Djangoプロジェクトの準備
今回は、以下で作成した、Docker対応したDjangoプロジェクトを使用します。
上記サイトで作成したDjangoプロジェクトは、以下階層をしています。
'''
# ディレクトリ構成
├── Django_Project # << カレントディレクトリ
├── manage.py
├── db.sqlite3
├── Pipfile
├── Pipfile.lock
├── docker-compose.yml
├── docker-compose.prod.yml
├── .env
├── .gitignore
├── containers/
| ├── django
| ├── Dcokerfile
| ├── entorypoint.sh
| ├── postgres
| ├── Dcokerfile
| ├── nginx/
| ├── Dcokerfile
| ├── conf.d/
| ├── default.conf
│
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│ └── asgi.py
│
└── myapp/
├── migrations/
├── templates/
├── __init__.py
├── admin.py
├── apps.py
├── forms.py
├── models.py
├── tests.py
├── urls.py
└── views.py
'''
このDjangoプロジェクトを、さくらvps上にコピーします。SCP接続でコピーしても良いですが、今回は、Githubに登録されたDjangoプロジェクトをpullする方法をとります。
5.1 Gitのインストール
今回はsakuravpsに簡単な方法でgitをインストールします。簡単な方法でGitをインストールする場合、最新版がインストールされるわけではないです。でも、大きな問題はないと思いますので、今回は簡単な方法を記載します。
sudo yum update
sudo yum install git
'''
# コードの説明
# sudo yum update
>>システム全体を最新状態にします。
これにより、他のツールとの互換性が保たれます。
# sudo yum install git
>>新しくGitをインストールします。
事前にシステムが最新だと、インストール後の動作も安定します。
'''
5.2 DjangoプロジェクトをCloneする
GithubからDjangoプロジェクトをCloneします。ただ、SSH接続で取得するには、公開鍵の登録が必要となります。下記サイトを参考に設定をします。
SSH接続の設定が終わったら、GitHubの以下ULRをコピーします。

ターミナルに以下を入力して、DjangoプロジェクトをCloneします。
git clone git@github.com:******/Django_Project.git
5.3 .envファイルを作成
次に、環境変数の設定がされている.envファイルを作成します。.envファイルはGitの管理対象外のため、このファイルだけは手動で作成する必要があります。(または、ローカル(自分のPC)にある、.envファイルをさくらvpsにアップロードします)
今回.envファイルに記載する内容は、データベース(POSTGRES)の設定と、DEBUGの設定、DjangoのSECRET_KEYです。以下内容を.envファイルに記載します。
POSTGRES_NAME=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=db
POSTGRES_PORT=5432
DEBUG=False
SECRET_KEY='hogehgoe'
'''
# ディレクトリ構成
├── Django_Project # << カレントディレクトリ
├── manage.py
├── db.sqlite3
├── Pipfile
├── Pipfile.lock
├── docker-compose.yml
├── .env # << 作成
├── .gitignore
├── containers/
| ├── django
| ├── Dcokerfile
| ├── entorypoint.sh
| ├── postgres
| ├── Dcokerfile
│
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│ └── asgi.py
│
└── myapp/
├── migrations/
├── templates/
├── __init__.py
├── admin.py
├── apps.py
├── forms.py
├── models.py
├── tests.py
├── urls.py
└── views.py
'''
.envファイルを作成するコードは以下です。
touch .env
vi .env
'''
# コードの説明
touch .env
>>.envファイルを作成します。
vi .env
>>.envファイルの中身を編集します。
vi .envでファイルを開いたら、i キーを押して編集モードに入ります。
上記のPOSTGRESの環境変数を入力する。
編集が終わったら、以下を順に実行します。
Esc キーを押して編集モードを終了
:wq と入力してエンターキーを押す(w は保存、q は終了を意味します)
'''
6. Djangoプロジェクトの設定変更
さくらvpsでDjangoプロジェクトを公開する場合は、settings.pyの設定を変更する必要があります。変更する部分は、ALLOWED_HOSTS部分です。以下のように、さくらvpsのIPアドレス(IPv4)を指定します。
ALLOWED_HOSTS = ['さくらvpsのIPアドレス']
'''
# コードの説明
Djangoの**ALLOWED_HOSTS**は、Djangoアプリケーションにアクセスを許可する「ドメイン名」や「IPアドレス」を指定する設定です。
ALLOWED_HOSTSにさくらvpsのIPアドレスを設定しておくと、DjangoはこのURLからのアクセスを許可します。
それ以外のドメイン(例えばfakewebsite.com)からのアクセスは「不正なアクセス」とみなされて拒否されます。
理由は、ホストヘッダー攻撃と呼ばれる手法を防ぐためです。
不正なリクエストが他のドメインやIPアドレスを通じてアプリにアクセスするのを防ぎます。
例えば、攻撃者が偽のホスト名を使ってDjangoアプリにアクセスすると、意図しないデータ漏洩や挙動が発生する可能性があります。
'''
7. さくらのVPSでポートの許可(80番)
コントロールパネルから、さくらのVPSで80番ポートを許可します。
下図より、パケットフィルターを設定をクリックします。

パケットフィルター設定を追加するをクリックします。

以下のように設定して、設定を保存します。

8. コンテナのビルドと起動
以下のコマンドを実行して、Dockerイメージをビルドし、コンテナを起動します。今回は、docker-compose.prod.ymlファイルからビルドを行うため、以下コードを実行します。
docker-compose -f docker-compose.prod.yml up -d --build
'''
# コードの説明
docker-compose up:
>>Docker Composeで定義されたサービス(コンテナ)を起動します。
-d(デタッチドモード):
>>コンテナをバックグラウンドで実行します。
つまり、ターミナルを占有せずに他の作業ができます。
--build:
>>各サービスのDockerイメージをビルドしてから起動します。
Dockerfileやコードに変更があった場合、新しいイメージを作成します。
-f:
>>使用するComposeファイルを指定します。
通常、Docker Composeはデフォルトでdocker-compose.ymlを使用します。
ここではdocker-compose.prod.ymlという別のファイルを指定しています。
'''
以上を行うと、作成したDjangoプロジェクトを公開することができます。
http://さくらvpsのIPアドレス(IPv4):80 にアクセスするとアプリが正常に起動しているのが確認できます。

9. まとめ
以上で、さくらvpsでDjangoプロジェクトを公開する流れを説明しました。少し長くなりましたが、これで、作成したDjangoプロジェクトを誰でも見れる状態に公開することができました。
最後まで目を通していただきありがとうございます。
スマホからでもPCからでも、どこからでも見れる状態になると、うれしくなりますね!
この後は、独自ドメイン、https対応を行っていこうと思います。