ブログBLOG

\ Web・ゲーム開発に関する情報を発信中 /

【初心者向け】ConohaVPSサーバーにDockerを使ってDjangoで作ったWEBサービス・アプリを公開しよう 運用編

サーバー構築
docker , django , conoha
20230516_docker-django-deploy-to-conoha-vps-server-operation-tmb

ご覧いただきありがとうございます!
領護(りょうご)です。

Djangoで作成したWEBサービスやアプリをネットに公開したいけど、AWSやGCPといったクラウドサービスはいくらかかるか分からないし、Linuxの勉強もしてみたい...。
そんな方に向けて、クラウドサービスより安く、Linuxの勉強もできる、レンタルサーバーにデプロイする方法を3つの準備編、構築編、運用編に分けて解説します。
最後の運用編では、Djangoプロジェクトをサーバーにデプロイして公開するところまで解説します。
初心者向けに分かりやすく書いたつもりですが、もし分からない点などあればツイッターのDMかお問い合わせからご連絡ください。

目次

準備編・構築編はこちら

準備編をまだ見てない方は、こちらの記事からご覧ください。
準備編では、ConohaVPSのサーバー契約について解説しています。

構築編をまだ見てない方は、こちらの記事からご覧ください。
構築編では、サーバーの基本設定・パッケージのインストールについて解説しています。

WinSCPのインストール

デプロイに必要なツール「WinSCP」をインストールします。
WinSCP(ウィン・エスシーピー)は、サーバーにファイルのアップロード・ダウンロードが簡単に行えるツールです。
インストール必須ではないですが、あったほうが便利です。
※ Macの方は、FileZillaが良いかと思います。
※ FileZillaの使い方については、別のサイトを参考にしてみてください。

20230516_docker-django-deploy-to-conoha-vps-server-operation-01

WinSCPのダウロードページにアクセスして、インストール版を「窓の杜からダウンロード」をクリックしてダウンロード

20230516_docker-django-deploy-to-conoha-vps-server-operation-02

「WinSCP-5.21.8-Setup.exe」のダウンロード完了後、ダブルクリックしてインストーラーを起動

20230516_docker-django-deploy-to-conoha-vps-server-operation-03

インストールモードの選択は、「現在のユーザー用にインストール」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-04

使用許諾は、「許諾」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-05

セットアップ形式は、「標準的なインストール(推奨)」を選択して「次へ」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-06

ユーザの初期設定は、「コマンダー」を選択して「次へ」をクリック
※ コマンダーの方が個人的に見やすいので、コマンダーを選択しています。

20230516_docker-django-deploy-to-conoha-vps-server-operation-07

インストール完了後は、「WinSCPを起動」にチェックを入れて「完了」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-08
20230516_docker-django-deploy-to-conoha-vps-server-operation-09

WinSCPの起動とショートカットファイルが生成されたら無事インストール完了です。
※ 画面が表示されない場合は、WinSCPのショートカットファイルをダブルクリックして起動してみてください。

ドメインを取得・設定する

ドメインとは、IPアドレスを分かりやすい名前に置き換えてくれるものです。
WEBサイトに住所名を付けるような感じですね。
今回は、ConohaVPSで取得する方法とムームードメインで取得する方法の2つを解説します。

ConohaVPSでドメインを取得して設定する(簡単)

20230516_docker-django-deploy-to-conoha-vps-server-operation-10

ConohaVPSの管理画面にログインして、左のメニューから「ドメイン」の中の「ドメイン」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-11

「ドメイン取得」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-12

ドメイン名に取得したい好きなドメインを入力してエンターキーを押します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-13

ドメイン一覧が表示されるので、その中から好きなドメインを選んで「カートに追加」をクリック
※ 既に使われているドメインは、取得できません。
※ 一般的によく使われるドメインは、「.com」「.jp」です。

20230516_docker-django-deploy-to-conoha-vps-server-operation-14

右上の詳細内容を確認します。
契約年数は、デフォルトの1年のままでも大丈夫ですが、長く使っていきたい場合は、2年、3年に変更してください。
取得するドメインに間違いがないかよく確認して「次へ」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-15

クレジットカード情報を入力して「決済」をクリック
これでドメインを取得することができました。
続いてドメインを設定します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-16

ConohaVPSの管理画面の左のメニューから「DNS」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-17

「ドメイン」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-18

ドメイン名に先ほど取得したドメインを入力して「保存」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-19
  1. 保存したドメイン名をクリックして開きます。
  2. 「鉛筆アイコン」をクリックして、編集モードに変更します。
  3. 「+」をクリックして新しく設定を追加します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-20

タイプには、「A(通常)」を選択します。
名称には、「@」と入力します。
TTLには、「3600」と入力します。
値には、サーバーのIPアドレスを入力します。
上記の内容で選択と入力ができたら「保存」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-21

先ほど入力した内容が保存できれば、ドメインの設定は完了です。
※ 反映には、長くて「1~2日」かかることもあります。

ムームードメインでドメインを取得して設定する

※ 会員登録は、割愛しています。

20230516_docker-django-deploy-to-conoha-vps-server-operation-22

ムームドメインログインページから、ムームーIDとパスワードを入力して「ログイン」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-23

ドメイン取得ページから、取得したい好きなドメインを入力して「検索する」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-24

ドメイン一覧が表示されるので、その中から好きなドメインを選んで「カートに追加」をクリック
※ 既に使われているドメインは、取得できません。
※ 一般的によく使われるドメインは、「.com」「.jp」です。

20230516_docker-django-deploy-to-conoha-vps-server-operation-25

「お申し込みへ」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-26

ドメインの契約年数は、デフォルトの1年のままでも大丈夫ですが、長く使っていきたい場合は、2年、3年に変更してください。

20230516_docker-django-deploy-to-conoha-vps-server-operation-27

レンタルサーバー利用は、「利用しない」を選択

20230516_docker-django-deploy-to-conoha-vps-server-operation-28

有料オプションサービスは、何も選択せずに次へ進みます。

20230516_docker-django-deploy-to-conoha-vps-server-operation-29

お支払い方法の設定は、好きなお支払い方法を選択してください。

20230516_docker-django-deploy-to-conoha-vps-server-operation-30

お支払い価格をよく確認して、「次のステップへ」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-31

詳細内容を確認して、「取得する」をクリック
これでドメインを取得することができました。
続いてドメインを設定します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-16

ConohaVPSの管理画面にログインして、左のメニューから「DNS」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-17

「ドメイン」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-18

ドメイン名に先ほど取得したドメインを入力して「保存」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-19
  1. 保存したドメイン名をクリックして開きます。
  2. 「鉛筆アイコン」をクリックして、編集モードに変更します。
  3. 「+」をクリックして新しく設定を追加します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-20

タイプには、「A(通常)」を選択します。
名称には、「@」と入力します。
TTLには、「3600」と入力します。
値には、サーバーのIPアドレスを入力します。
上記の内容で選択と入力ができたら「保存」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-21

先ほど入力した内容が保存できているか確認します。
続いて、ムームドメインのDNS設定を行います。

20230516_docker-django-deploy-to-conoha-vps-server-operation-32

ムームドメインにログインして、左のメニューから「ドメイン操作」の中の「ムームーDNS」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-33

先ほど取得したドメインの「変更」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-34

「カスタム設定」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-35

サブドメインには、何も入れず未入力です。
種類には、「A」を選択します。
内容には、サーバーのIPアドレスを入力します。
上記の内容で選択と入力ができたら「セットアップ情報変更」をクリック

先ほど入力した内容が保存できれば、ドメインの設定は完了です。
※ 反映には、長くて「1~2日」かかることもあります。

ドメインが反映したか確認する

20230516_docker-django-deploy-to-conoha-vps-server-operation-36

ドメイン反映確認ページ「グローバルIPアドレスまたはドメイン」にドメインを入力します。
入力後は、「ご注意・制約事項」にチェックを入れて「管理情報照会実行」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-37

「入力の逆引きまたは正引き」の欄にサーバーのIPアドレスが表示されれば反映できています。

Djangoプロジェクトを作成する

サーバーにアップロードするDjangoプロジェクトを作成します。

deploy_web_sample/ # ワークフォルダ名
├── .env # 新規作成
├── .gitignore # 新規作成・変更
├── docker-compose.pro.yml # 新規作成
├── Dockerfile # 新規作成
├── manage.py
├── requirements.txt # 変更
├── deploy_web_sample_project/ # プロジェクト名
│   ├── asgi.py
│   ├── settings.py # 変更
│   ├── urls.py
│   ├── wsgi.py
│   └── __init__.py
└── nginx/ # 新規作成
    ├── uwsgi_params
    ├── conf/
    │   └── deploy_web_sample.conf.temp
    ├── script/
    │   └── set-nginx-env
    └── ssl_certs

今回デプロイするサンプルデータのフォルダ構成は、上記のようになっています。
新しく本番用に作成する「新規作成」本番用に変更する「変更」の部分を解説します。
ご自身のDjangoプロジェクトと照らし合わせながら作成を進めてください。

下記の部分は、指定した内容に置き換えてファイルを作成してください。
[ユーザー名]・・・サーバーの一般ユーザー名を入力
[ワークフォルダ名]・・・Djangoプロジェクトが入ったワークフォルダ名を入力
[プロジェクト名]・・・Djangoプロジェクト名を入力

.envの作成

「.env」ファイルには、コンテナで使用する環境変数を設定します。
主に、データベースのログイン情報やコンテナ名など、表には見せたくない情報を書きます。
既に.envファイルを作成済みの方は、定義していない項目だけ追記してください。

.env
# Base Settings
SECRET_KEY=[シークレットキー]
DEBUG=False
ALLOWED_HOSTS=[ドメイン名],[サーバーのIPアドレス]
DOMAIN_NAME=[ドメイン名]
WORK_USER=[ユーザー名]

# Path Settings
WORK_DIR=[ワークフォルダ名]
PROJECT_DIR=[プロジェクト名]

# Docker Container Name Settings
HTTPS_PORTAL_CONTAINER_NAME=[HTTPS-PORTALコンテナ名]
WEB_CONTAINER_NAME=[WEBコンテナ名]
DB_CONTAINER_NAME=[DBコンテナ名]

# Port Settings
NGINX_WATCH_PORT=8080
WEB_CONTAINER_PORT=8001
DB_CONTAINER_PORT=5432

# Postgresql Settings
POSTGRES_USER=[DBユーザー名]
POSTGRES_PASSWORD=[DBパスワード]
POSTGRES_DB=[DB名]
DATABASE_URL=postgres://[DBユーザー名]:[DBパスワード]@[DBコンテナ名]:5432/[DB名]

[シークレットキー]には、Djangoのシークレットキーを入力します。
[ドメイン名]には、先ほど取得したドメイン名を入力します。
[サーバーのIPアドレス]には、サーバーのIPアドレスを入力します。
[HTTPS-PORTALコンテナ名][WEBコンテナ名][DBコンテナ名]には、3つが被らないように好きなコンテナ名を入力します。

[DBユーザー名]には、好きなユーザー名を入力します。
[DBパスワード]には、好きなパスワードを入力します。
※ サーバーの一般ユーザーと同じユーザー名とパスワードにしておくと管理が楽なのでおすすめです。

[DB名]には、好きなデータベース名を入力します。
※ Djangoのプロジェクト名にしておくと管理が楽なのでおすすめです。

.env
# Base Settings
SECRET_KEY=django-insecure~~~
DEBUG=False
ALLOWED_HOSTS=ryuogodesgin.com,123.456.789.100
DOMAIN_NAME=ryuogodesgin.com
WORK_USER=adminuser

# Path Settings
WORK_DIR=deploy_web_sample
PROJECT_DIR=deploy_web_sample_project

# Docker Container Name Settings
HTTPS_PORTAL_CONTAINER_NAME=https-portal
WEB_CONTAINER_NAME=web
DB_CONTAINER_NAME=db

# Port Settings
NGINX_WATCH_PORT=8080
WEB_CONTAINER_PORT=8001
DB_CONTAINER_PORT=5432

# Postgresql Settings
POSTGRES_USER=adminuser
POSTGRES_PASSWORD=password
POSTGRES_DB=deploy_web_sample_project
DATABASE_URL=postgres://adminuser:password@db:5432/deploy_web_sample_project

実際の入力例です。

.gitignoreの作成

「.gitignore」ファイルには、GitHubにプッシュしないファイル名を設定します。

.gitignore
*.log
*.env
*.pyc
*.swp
.DS_Store
.devcontainer
.vscode
__pycache__
db.sqlite3
media
tmp

「.gitignore」ファイルに「.env」ファイルとキャッシュファイル関連のファイルを指定しています。
※ 既に「.gitignore」ファイルを作成済みの方は、定義していない項目だけ追記してください。

docker-compose.pro.ymlの作成

「docker-compose.pro.yml」ファイルには、本番用に使用するコンテナを設定します。

docker-compose.pro.yml
version: '3'

services:
  https-portal:
    image: steveltn/https-portal:1.17
    container_name: ${HTTPS_PORTAL_CONTAINER_NAME}
    env_file: ./.env
    restart: always
    volumes:
      - https-portal-data:/var/lib/https-portal
      - ./nginx/ssl_certs:/var/lib/https-portal
      - ./nginx/conf/${WORK_DIR}.conf.temp:/etc/nginx/conf.d/${WORK_DIR}.conf.temp
      - ./nginx/script/set-nginx-env:/etc/cont-init.d/set-nginx-env
      - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
      - ./static:/static
      - ./media:/media
    ports:
      - '80:80'
      - '443:443'
    environment:
      DOMAINS: ${DOMAIN_NAME} -> http://${HTTPS_PORTAL_CONTAINER_NAME}:${NGINX_WATCH_PORT}/
      CLIENT_MAX_BODY_SIZE: 100M
      STAGE: 'production'
    depends_on:
      - web

  web:
    build:
        context: .
        args:
          - WORK_DIR=${WORK_DIR}
          - WORK_USER=${WORK_USER}
    container_name: ${WEB_CONTAINER_NAME}
    env_file: ./.env
    restart: always
    tty: true
    volumes:
      - .:/home/${WORK_USER}/${WORK_DIR}
      - ./log:/tmp
    expose:
      - ${WEB_CONTAINER_PORT}
    command: uwsgi --socket :${WEB_CONTAINER_PORT} --module ${PROJECT_DIR}.wsgi --logto /tmp/uwsgi.log
    depends_on:
      - db

  db:
    image: postgres:15
    container_name: ${DB_CONTAINER_NAME}
    restart: always
    env_file: ./.env
    volumes:
      - postgres_data:/var/lib/postgresql/data
    expose:
      - ${DB_CONTAINER_PORT}
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}

volumes:
  postgres_data:
  https-portal-data:

本番用で使用するコンテナ・パス・ポート番号等を指定します。
それぞれの役割と意味を解説します。

1. https-portal
WEBサイトを簡単にSSL化できるコンテナです。
バージョンは、「1.17」を指定しておかないと動かなかったので「1.17」を指定しています。
environmentの「DOMAINS」には、環境変数からドメインを設定しています。
environmentの「CLIENT_MAX_BODY_SIZE」には、アップロードできるファイルサイズの上限を指定します。
environmentの「STAGE」には、SSLで使用するLet's Encrypt証明書の発行設定を指定しています。
※ 本番環境は「'production'」、ドメインがない、テストで使用する場合は、「'local'」を指定してください。

2. web
Djangoプロジェクトを構築するコンテナです。
commandには、uwsgiのログを出力する設定をしています。

3. db
Postgresのデータベースを構築するコンテナです。
データベースは、postgres(バージョン15)を使用しています。
※ 最新を使う場合は、「latest」を指定すると最新バージョンを使用できます。

4. volumes
Postgresのデータベースとhttps-portalの設定データが消えないように永続化設定をしています。
これを指定しないとコンテナを削除すると同時にデータも消えてしまいます。

Dockerfileの作成

「Dockerfile」ファイルには、本番用に使用するWEBコンテナの作成手順を設定します。

Dockerfile
FROM python:[Pythonのバージョン]
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

# 変数設定
ARG WORK_DIR
ARG WORK_USER
ARG USER_UID=1000
ARG USER_GID=1000

# uwsgiのパスを通す
ENV PATH "$PATH:/home/$WORK_USER/.local/bin"

# ユーザーを新規作成
RUN groupadd --gid $USER_GID $WORK_USER \
    && useradd --uid $USER_UID --gid $USER_GID -m $WORK_USER \
    && apt-get update \
    && apt-get install -y sudo \
    && echo $WORK_USER ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$WORK_USER \
    && chmod 0440 /etc/sudoers.d/$WORK_USER
USER $WORK_USER

# ワークスペースを作成
RUN mkdir /home/$WORK_USER/$WORK_DIR
WORKDIR /home/$WORK_USER/$WORK_DIR
COPY . /home/$WORK_USER/$WORK_DIR

# pipライブラリをインストール&パーミッションを変更
RUN pip install --upgrade pip \
    && sudo chown -R $WORK_USER:$WORK_USER /home/$WORK_USER/$WORK_DIR\
    && pip install -r /home/$WORK_USER/$WORK_DIR/requirements.txt

[Pythonのバージョン]には、使用したいPythonのバージョンを入力します。

Dockerfile
FROM python:3.10.9
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

# 変数設定
ARG WORK_DIR
ARG WORK_USER
ARG USER_UID=1000
ARG USER_GID=1000

# uwsgiのパスを通す
ENV PATH "$PATH:/home/$WORK_USER/.local/bin"

# ユーザーを新規作成
RUN groupadd --gid $USER_GID $WORK_USER \
    && useradd --uid $USER_UID --gid $USER_GID -m $WORK_USER \
    && apt-get update \
    && apt-get install -y sudo \
    && echo $WORK_USER ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$WORK_USER \
    && chmod 0440 /etc/sudoers.d/$WORK_USER
USER $WORK_USER

# ワークスペースを作成
RUN mkdir /home/$WORK_USER/$WORK_DIR
WORKDIR /home/$WORK_USER/$WORK_DIR
COPY . /home/$WORK_USER/$WORK_DIR

# pipライブラリをインストール&パーミッションを変更
RUN pip install --upgrade pip \
    && sudo chown -R $WORK_USER:$WORK_USER /home/$WORK_USER/$WORK_DIR\
    && pip install -r /home/$WORK_USER/$WORK_DIR/requirements.txt

実際の入力例です。
それぞれの役割と意味を解説します。

Dockerfile
FROM python:3.10.9
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

このコードでは、3つの設定を行っています。
1. Pythonのバージョンを指定
2. 「.pyc」ファイルを生成しない設定
3. 標準入出力に関するPythonのバッファリングを無効

Dockerfile
# 変数設定
ARG WORK_DIR
ARG WORK_USER
ARG USER_UID=1000
ARG USER_GID=1000

Dockerfileで使用する変数を設定しています。

Dockerfile
# uwsgiのパスを通す
ENV PATH "$PATH:/home/$WORK_USER/.local/bin"

uwsgiのログファイル生成に関するパスを設定しています。

Dockerfile
# ユーザーを新規作成
RUN groupadd --gid $USER_GID $WORK_USER \
    && useradd --uid $USER_UID --gid $USER_GID -m $WORK_USER \
    && apt-get update \
    && apt-get install -y sudo \
    && echo $WORK_USER ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$WORK_USER \
    && chmod 0440 /etc/sudoers.d/$WORK_USER
USER $WORK_USER

コンテナ内で使用するユーザーを作成して、管理者権限を追加しています。

注意!

これを設定しない場合は、rootユーザーになりますが、セキュリティ的によろしくありません。


Dockerfile
# ワークスペースを作成
RUN mkdir /home/$WORK_USER/$WORK_DIR
WORKDIR /home/$WORK_USER/$WORK_DIR
COPY . /home/$WORK_USER/$WORK_DIR

コンテナで使用するワークスペースを作成しています。

Dockerfile
# pipライブラリをインストール&パーミッションを変更
RUN pip install --upgrade pip \
    && sudo chown -R $WORK_USER:$WORK_USER /home/$WORK_USER/$WORK_DIR\
    && pip install -r /home/$WORK_USER/$WORK_DIR/requirements.txt

ワークスペースの権限を一般ユーザーに変更して、「requirements.txt」ファイルからpipライブラリをコンテナにインストールします。

nginx設定ファイルの作成

WEBサーバーで使用するnginxの設定ファイルを作成します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-38

「nginx」フォルダを作成して、その中に「conf」「script」「ssl_certs」の3つのフォルダを作成します。

ワークフォルダ名.conf.temp
upstream WEB_CONTAINER_NAME {
    ip_hash;
    server WEB_CONTAINER_NAME:WEB_CONTAINER_PORT;
}

server {
    listen      NGINX_WATCH_PORT;
    server_name dockerhost;
    charset     utf-8;

    client_max_body_size 100M;

    location /static {
        alias /static;
    }

    location /media {
        alias /media;
    }

    location / {
        uwsgi_pass  WEB_CONTAINER_NAME;
        include     /etc/nginx/uwsgi_params;
    }
}

「conf」フォルダの中に「[ワークフォルダ名].conf.temp」ファイルを作成します。

set-nginx-env
#!/usr/bin/with-contenv sh
cp /etc/nginx/conf.d/$WORK_DIR.conf.temp /etc/nginx/conf.d/$WORK_DIR.conf
sed -i -e "s/WEB_CONTAINER_NAME/$WEB_CONTAINER_NAME/g" /etc/nginx/conf.d/$WORK_DIR.conf
sed -i -e "s/WEB_CONTAINER_PORT/$WEB_CONTAINER_PORT/g" /etc/nginx/conf.d/$WORK_DIR.conf
sed -i -e "s/NGINX_WATCH_PORT/$NGINX_WATCH_PORT/g" /etc/nginx/conf.d/$WORK_DIR.conf

「script」フォルダの中に「set-nginx-env」ファイルを作成します。

uwsgi_params
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

「nginx」フォルダの中に「uwsgi_params」ファイルを作成します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-39

上記のフォルダ構成になっていればOKです。
「ssl_certs」フォルダには、何も入れていない状態です。

requirements.txtにライブラリを追加

本番用に使用するpipライブラリを「requirements.txt」ファイルに追加します。

requirements.txt
Django==4.1.7
django-environ==0.10.0
uWSGI==2.0.21
psycopg2-binary==2.9.6

「django-environ」「uWSGI」「psycopg2-binary」の3つを追加します。
「django-environ」は、「.env」ファイルを読み込むために必要なライブラリです。
「uWSGI」は、DjangoプロジェクトとWEBサーバーを繫ぐために必要なライブラリです。
「psycopg2-binary」は、postgresのデータベースを扱うために必要なライブラリです。

settings.pyの変更

「settings.py」ファイルを環境変数から読み込むように変更します。

settings.py
import environ
# from pathlib import Path

# 環境変数を読み込む
env = environ.Env()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
# BASE_DIR = Path(__file__).resolve().parent.parent

# ↓ パスを変更
# path : プロジェクトパス
PROJECT_DIR = environ.Path(__file__) - 2

# path : ワークフォルダパス
BASE_DIR = environ.Path(__file__) - 3

# SECRET_KEY = '~~~'
# DEBUG = True
# ALLOWED_HOSTS = []
# DATABASES = {
#     "default": {
#         "ENGINE": "django.db.backends.sqlite3",
#         "NAME": BASE_DIR / "db.sqlite3",
#     }
# }

# ↓ 変更
SECRET_KEY = env("SECRET_KEY")
DEBUG = env.bool("DEBUG", False)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS")
DATABASES = {
    "default": env.db(),
}

# 追加もしくは変更
STATIC_ROOT = BASE_DIR("static")
STATIC_URL = "/static/"

MEDIA_ROOT = BASE_DIR("media")
MEDIA_URL = "/media/"

それぞれの役割と意味を解説します。

settings.py
import environ
# from pathlib import Path

# 環境変数を読み込む
env = environ.Env()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
# BASE_DIR = Path(__file__).resolve().parent.parent

# ↓ パスを変更
# path : プロジェクトパス
PROJECT_DIR = environ.Path(__file__) - 2

# path : ワークフォルダパス
BASE_DIR = environ.Path(__file__) - 3

環境変数を読み込むライブラリをインポートして、フォルダパスを変更しています。

settings.py
# SECRET_KEY = '~~~'
# DEBUG = True
# ALLOWED_HOSTS = []
# DATABASES = {
#     "default": {
#         "ENGINE": "django.db.backends.sqlite3",
#         "NAME": BASE_DIR / "db.sqlite3",
#     }
# }

# ↓ 変更
SECRET_KEY = env("SECRET_KEY")
DEBUG = env.bool("DEBUG", False)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS")
DATABASES = {
    "default": env.db(),
}

「SECRET_KEY」「DEBUG」「ALLOWED_HOSTS」「DATABASES」「.env」ファイルで設定した環境変数から読み込むように変更します。
「.env」ファイルで設定した環境変数から読み込むことで、サーバーの設定情報の漏洩を防ぎます。

settings.py
# 追加もしくは変更
STATIC_ROOT = BASE_DIR("static")
STATIC_URL = "/static/"

MEDIA_ROOT = BASE_DIR("media")
MEDIA_URL = "/media/"

staticとmediaフォルダを読み込むパスを設定しています。
※ 既にstaticとmediaフォルダのパスを設定している場合は、上記のコードに変更してください。

GitHubにアップロード(プッシュ)する

Djangoプロジェクトの作成完了後は、変更内容をコミットしてGitHubにアップロード(プッシュ)します。
GitHubとは、簡単に言うとプログラムのソースコードをインターネット上で管理・閲覧・共有できるサービスです。

「GitHubをまだ使ったことがない」「アップロードの仕方が分からない」方は、こちらの記事を参考にしてください。

サーバーにDjangoプロジェクトを配置する

先ほど作成したDjangoプロジェクトをサーバーに配置します。

git clone https://github.com/[GitHubのユーザー名]/[リポジトリ名].git

TeraTermを起動して一般ユーザーでログイン後、gitコマンドを使って、先ほどGitHubにアップロードしたソースコードをクローンして配置します。
[GitHubのユーザー名]には、GitHubのユーザー名を入力します。
[リポジトリ名]には、GitHubからクローンしたいリポジトリ名を入力します。

git clone https://github.com/ryougodesign/deploy_web_sample.git

実際の入力例です。

プライベートリポジトリの場合

git clone https://[GitHubのユーザー名]:[GitHubのアクセストークン]@github.com/[GitHubのユーザー名]/[リポジトリ名].git

[GitHubのアクセストークン]には、GitHubのアクセストークンを入力します。
GitHubのアクセストークンは、「ghp_~~~」から始まるやつですね!

git clone https://ryougodesign:ghp_~~~@github.com/ryougodesign/deploy_web_sample.git

実際の入力例です。

リポジトリのブランチを指定する場合

git clone -b [ブランチ名] https://[GitHubのユーザー名]:[GitHubのアクセストークン]@github.com/[GitHubのユーザー名]/[リポジトリ名].git

[ブランチ名]には、クローンしたいブランチ名を入力します。

git clone -b master https://ryougodesign:ghp_~~~@github.com/ryougodesign/deploy_web_sample.git

実際の入力例です。

WinSCPを使用して残りのファイルをアップロードする

GitHubにアップロードできない機密ファイルをWinSCPを使用してアップロードします。

.envファイルのアップロード

20230516_docker-django-deploy-to-conoha-vps-server-operation-40

WinSCPをダブルクリックで起動して、「新しいセッション」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-41

「新しいサイト」をクリックして、セッション画面にサーバーの接続情報を入力します。
「転送プロトコル」には、デフォルトの「SFTP」を選択します。
「ホスト名」には、サーバーのIPアドレスを入力します。
「ポート番号」には、サーバーで指定したポート番号を入力します。(デフォルトは22番)
「ユーザー名」には、サーバーの一般ユーザー名を入力します。
上記の内容で選択と入力ができたら「設定」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-42

左メニューから「認証」をクリックして、秘密鍵の「ファイル選択」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-43

「すべてのファイル」を選択して秘密鍵「id_rsa」ファイルを選択します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-44

「秘密鍵OpenSSHをPuTTY形式に変換しますか?」と表示されるので「OK」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-45

「秘密鍵が変換されました」と表示されるので「OK」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-46

秘密鍵のパスが入っていることを確認したら「OK」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-47

「保存」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-48

セッションの保存名に好きな名前を入力して「OK」をクリック
※ デフォルトのままでもOKです。

20230516_docker-django-deploy-to-conoha-vps-server-operation-49

「ログイン」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-50

「不明なサーバーに接続し、そのホスト鍵をキャッシュに追加しますか?」と表示されるので「はい」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-51

無事サーバーに接続できました。
先ほどgitコマンドでダウンロード(クローン)したDjangoプロジェクトが入ってるフォルダをダブルクリックして開きます。

20230516_docker-django-deploy-to-conoha-vps-server-operation-52

ローカルにある「.env」ファイルを選択して「アップロード」をクリック
サーバー側のフォルダにアップロードされます。

コンテナで使用するフォルダの作成

「log」「media」「static」の3つの空フォルダを作成します。

20230516_docker-django-deploy-to-conoha-vps-server-operation-53

何もないところで右クリックしてメニューの「新規」から「ディレクトリ」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-54

新しいフォルダ名に「log」と入力して「OK」をクリック

20230516_docker-django-deploy-to-conoha-vps-server-operation-55

「log」フォルダの作成が完了しました。
この時に「所有者」がrootではなく、一般ユーザー名になっていることを確認してください。
あとは、同じ要領でmediaとstaticフォルダを作成します。

サーバーでコンテナを起動する

これで全ての準備が整いました!
いよいよコンテナを起動していきますよ!
docker-composeを使って、コンテナを起動します。

cd [ワークフォルダ名]

TeraTermを起動して一般ユーザーでログイン後、Djangoプロジェクトのフォルダの中に移動します。
「docker-compose.pro.yml」ファイルが置かれている場所ですね。

docker compose -f docker-compose.pro.yml up

「docker-compose.pro.yml」を指定して、コンテナを起動します。
コンテナ作成には、しばらく時間がかかるのでコーヒーを飲みながら気長に待ちましょう。

20230516_docker-django-deploy-to-conoha-vps-server-operation-56

「Done」と表示されたらOKです。
「Ctrl」+「Z」キーを押してコマンドから離脱します。
「xxxxx exited with code 1」と表示される場合は、正しくコンテナが起動していないので、ログをよく確認してみましょう。

migrateとcollectstaticを実行する

Djangoプロジェクトのデータベース適用と静的ファイルをstaticフォルダに集約します。

docker container exec -it [WEBコンテナ名] bash

Djangoプロジェクトのコンテナの中に入ります。
[WEBコンテナ名]には、「.env」ファイルで指定した[WEBコンテナ名]と同じ値を入れます。

python manage.py migrate

マイグレーションファイルをデータベースに適用します。

python manage.py collectstatic --noinput

静的ファイルをstaticフォルダに集約します。

exit

コンテナから抜けます。

docker compose -f docker-compose.pro.yml restart

コンテナを再起動します。

公開したページを確認する

20230323_django-easy-development-environment-43

サーバーのIPアドレスもしくはドメインを入力すると閲覧できます!

20230516_docker-django-deploy-to-conoha-vps-server-operation-57

鍵マークが付いていればSSL化(HTTPS)も設定できています。

最後に

ここまで見てくれた方、本当にお疲れ様でした!
セキュリティも考慮したので、かなり長くなってしまいましたが、Djangoで作成したWEBサービスやアプリを公開する所まで解説しました。
今回公開したサンプルデータは、GitHubに公開していますので、下記のGitHubリンクからご覧ください。
GitHubリポジトリを見る

参考にさせて頂いたサイト様

https://linux-svr.com/tips/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%8F%96%E5%BE%97/27.php
https://create-it-myself.com/know-how/construct-httpsportal-django-posgresql-by-docker-compose/


\ よかったらシェアしてね /

関連記事