Django×PinaxでWebサービス入門④｜VPSサーバーにデプロイ

## この記事の内容

[前回](https://qiita.com/mtitg/items/270c422def5202d672a9)はPython用統合開発環境（IDE）であるPyCharmをセットアップし、Django製Webアプリケーションの開発を効率的に行うための土台を作りました。

ローカルでのWebアプリケーション構築周りは一旦中断し、今回からは以前作ったアプリケーションを外部のVPSサーバーにデプロイするところまで進めていきます。

今回の対象は、全体像で見てみるとこの緑色で囲った部分です。

![Overall Structure_03.png](https://qiita-image-store.s3.amazonaws.com/0/113133/06a8d770-8e23-e536-a779-41d849f7bb4f.png)

- ConoHa VPSの登録
- CentOSにPython3をインストール
- PostgreSQL(データベース)のセットアップ
- その他のセットアップ
  - Apacheのインストール
  - gitの初期化
- ローカルで開発しているアプリケーションを転送
  - データベースの設定
  - gitでアプリケーションをVPSに転送(push)
- VPSサーバーでアプリケーションをデプロイ

ということをやっていきます。

## ConoHa VPSの登録

それでは、ConoHa VPSに登録し、一番安いプランでサーバーを立ててみます。
今回はConoHaを利用していますが、Sakura VPS等、他のVPSサービスでも基本的に使いかたは同じです。

まずはConoHaでアカウントを作成します。

[ConoHa](http://conoha.jp/)

続いて、[ConoHaコントロールパネル](https://manage.conoha.jp/Service/Create/)からサーバーを追加します。

一番価格の安いプランで、OSはCentOSの最新版を利用するので全てデフォルトで選択されているもののままサーバーを追加します。
`rootパスワード`は任意のパスワードを作成してください。後ほどターミナルからこのサーバーにSSH接続をする際に必要になります。

![conoha.png](https://qiita-image-store.s3.amazonaws.com/0/113133/9ab1ce92-e285-935d-ab39-0461733e1fc6.png)

追加ボタンを押すとサーバー一覧に追加したものが表示されます。

![conoha-after-creation.png](https://qiita-image-store.s3.amazonaws.com/0/113133/5447da4b-e28d-05a2-4293-471e52fec58c.png)

ネームタグ列から詳細を見に行きます。

![FireShot Capture 38 - ConoHaコントロールパネル_ - https___manage.conoha.jp_VPS_Detai.png](https://qiita-image-store.s3.amazonaws.com/0/113133/315b3757-d101-88ae-13e4-43ee8ff3eae6.png)

タイトルの部分にIPアドレスが表示されています。今回は`150.95.139.172`というアドレスが取得されました。
※このアドレスは記事作成のためだけに取得したので、削除済みです。ご自身でIPアドレスを取得されたら、適宜読み替えて進めてください。

それでは、ターミナルからこのサーバーにSSH接続してみます。

```terminal:
$ ssh root@150.95.139.172
```

すると、`Are you sure you want to continue connecting (yes/no)?`と接続してよいか聞かれるので`yes`と入力。パスワードが求められるので先程ConoHaでサーバーを取得するときに指定したパスワードを入力します。

```terminal:
root@150.95.139.172's password: 
[root@150-95-139-172 ~]# 
```

このIPアドレスに管理者権限でログインしていることがわかります。

なお、実際の運用では鍵と一般ユーザーを作り、その情報でアクセスし作業を行います。しかし記事の中では簡単のため、今後も管理者権限でSSH接続していきます。

## CentOSにPython3をインストール

MacOSにおけるHomebrewのように、CentOSにもyumというパッケージマネージャーがあり、これを使って必要なパッケージをインストール可能です。複数のパッケージには依存関係（あるパッケージのためには他のパッケージが必要）があることがありますが、yumは依存するパッケージがまだインストールされていない場合、自動で取得してくれます。

もともとあるパッケージをアップデートします。やや時間がかかります。

```terminal:
# yum -y update
```

ここの`-y`は、インストールの途中で確認を求められる際に`yes`を自動で選択するというオプションです。
続いて、開発に必要なパッケージの一式をインストールします。

```terminal:
# yum groupinstall -y "Development Tools"  
```

次に、Python3をインストールします。
ローカルで利用しているバージョンが3.6.5なので、同じバージョンを指定します。

```terminal:
# yum install -y https://centos7.iuscommunity.org/ius-release.rpm

# yum install -y python36u
```

すると、`python3.6`で今インストールしたPythonが利用できるようになっているので、確認してみます。

```terminal:
# python3.6 -V

Python 3.6.5

# which python3.6

/usr/bin/python3.6
```

ちゃんと最新版の`3.6.5`が`/usr/bin`ディレクトリに格納されています。

Python用パッケージマネージャーのpipをインストールします。

```terminal:
# yum install -y python36u-pip
```

pipも同様に`pip3.6`で呼び出せます。

```terminal:
# pip3.6 -V

pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)
```

Pythonでの開発に必要なライブラリもインストールしておきます。

```terminal
# yum install -y python36u-devel
```

## PostgreSQL(データベース)のセットアップ

続けてCentOSにPostgreSQLをインストールし、後ほどアプリケーションがデータベースに接続できるように準備しておきます。

PostgreSQL及び周辺の開発ツールや便利ツールをインストールします。

```terminal:
# yum install -y postgresql-server postgresql-devel postgresql-contrib 
```

データベースを初期化します。

```terminal:
# postgresql-setup initdb
```

PostgreSQLを起動します。

```terminal:
# systemctl start postgresql 
```

`pg_hba.conf`ファイルを編集します。

```
vim /var/lib/pgsql/data/pg_hba.conf  
```

vimで開き、下の方にある

```vim:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
```

という箇所を

```vim:
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5
```

と書き換えます。

<details><summary>Vimとは</summary><div>
Vimとは、Linuxに標準搭載されているエディタで、ローカルからでもターミナル経由でサーバーに接続し、サーバーにあるファイルを直接編集することを可能にします。
初めてだと使いにくかったり、しばらくすると使い方を忘れたりしますが、Webサービスを公開するにあたって頻繁に触ることになります。個人的には表示モードと編集モードがあるということさえ理解していれば、最低限は使えるようになると思っています。具体的には下記コマンドです。

- 閲覧モード → 編集モード : `i`キー
- 編集モード → 閲覧モード : `esc`キー
- 保存して閲覧モードを閉じる : `:wq`

[最強エディタVimの使い方/コマンド30種まとめ](https://www.sejuku.net/blog/5570)
</div></details>

PostgreSQLを再起動します。

```terminal:
# systemctl restart postgresql 
```

PostgreSQLを実行します。

```terminal:
# su - postgres  
```

PostgreSQLの操作はpsqlというコマンドラインツール経由で行います。

```bash:
-bash-4.2$ psql
```

対話形式でPostgreSQLを操作できるようになります。
データベースやユーザー、パスワード、その他設定をしていきます。

```terminal:
postgres=# CREATE DATABASE projectdata;  
postgres=# CREATE USER projectdatauser WITH PASSWORD 'password';  
postgres=# ALTER ROLE projectdatauser SET client_encoding TO 'utf8';  
postgres=# ALTER ROLE projectdatauser SET default_transaction_isolation TO 'read committed';  
postgres=# ALTER ROLE projectdatauser SET timezone TO 'Asia/Tokyo';  
postgres=# GRANT ALL PRIVILEGES ON DATABASE projectdata TO projectdatauser;  
```

これでPostgreSQLのセットアップは完了です。

psqlを終了し、PostgreSQLの実行を終了します。

```terminal:
postgres=# \q  

-bash-4.2$ exit  
```

## その他のセットアップ

### Apacheのインストール

Webサーバーは老舗のApacheを利用するので、yumでインストールしておきます。
実際に外部にインターネット公開する際にはもっと設定を入れていきますが、それは後ほど行います。

```terminal
# yum install -y httpd-devel  
```

### gitの初期化

最後に、ローカルで開発したアプリケーションをサーバーにデプロイするためにローカルとVPSサーバーを接続するための用意をしておきます。

VPSサーバーでWebアプリケーションを格納するディレクトリに移動します。
なお、このディレクトリは上記でApacheをインストールした際に自動的に構築されたものです。

```terminal:
# cd /var/www/cgi-bin  
```

ローカルとサーバーの接続にはgitを使います。
gitの`init`コマンドに`bare`オプションをつけると、コミット等を行えない管理ファイルのみのリポジトリを作成することができます。
こうして作られたbareリポジトリは、サーバー側のリモートリポジトリとして利用されます。

```terminal:
# git init --bare todo.git 
```

## ローカルで開発しているアプリケーションを転送

それでは一旦ローカルに戻り、以前作成したWebアプリケーションをVPSサーバーに転送します。

### データベースの設定

このままVPSサーバーに転送しても、利用するデータベースの情報がマッチせず、テーブルが構築できません。(`migrate`コマンドがエラーになります。)`settings.py`を開き、該当する箇所を編集します。

```py:todo/todo/settings.py
# DATABASES = {
#     "default": {
#         "ENGINE": "django.db.backends.sqlite3",
#         "NAME": "dev.db",
#     }
# }

DATABASES = {
    'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'projectdata',
       'USER': 'projectdatauser',
       'PASSWORD': 'password',
       'HOST': 'localhost',
       'PORT': '',
   }
}
```

もともとはsqlite3という開発用のサーバーを利用するという設定がされています。
先程VPSサーバー側でPostgreSQLをインストール、セットアップしたため、その時のデータベースを利用するように書き換えます。

なお、こうすることで今度は逆にローカルでアプリケーションを起動したとき利用していたsqlite3に接続できなくなります。
これは後ほど`setting.py`をローカル用とサーバー用に分割して、開発やサーバーデプロイ時にいちいち書き換えなくて良いように対応します。

PostgreSQLを利用するために、`psycopg2`というパッケージが必要になります。
pipは`requirements.txt`というファイルで管理するパッケージを定義できます。PyCharmでこのファイルを開き、`psycopg2`を追加します。(バージョンの指定は割愛します。)

```text:todo/todo/requirements.txt
psycopg2
```

### wsgiの準備

ついでに`mod_wsgi`というライブラリを利用するということも`requirements.txt`で宣言しておきます。

```text:todo/todo/requirements.txt
mod_wsgi
```

このwsgiというライブラリはサーバーでApacheとDjangoアプリケーションをつなぐ役割があります。

最終的に`requirements.txt`は下記のような内容になります。

```text:todo/todo/requirements.txt
-r requirements-zero.txt
-r requirements-account.txt
psycopg2
mod_wsgi
```


### gitでアプリケーションをVPSに転送(push)

先程サーバー側で作ったgitのbareレポジトリにローカルからgitを利用してTODOアプリケーションを転送(push)します。

Macにgitがインストールされていない場合は、homebrewでインストールします。

```terminal:
$ brew install git
```

TODOアプリのルートディレクトリ（`manage.py`ファイルがあるディレクトリです）で、`git init`を行います

```terminal
$ git init
```

先程VPSサーバーで作ったレポジトリを`conoha`という名前でリモート登録します。

```terminal
$ git remote add conoha root@150.95.139.172:/var/www/cgi-bin/todo.git  
```

TODOアプリのファイルを全て`add`し、`commit`します。

```terminal
$ git add .  

$ git commit -m 'first commit'  
```

VPSサーバーのレポジトリに対して`push`します。
このときに、ssh接続時と同様にVPSサーバーのパスワードが聞かれます。

```terminal
$ git push conoha master  
```

## VPSサーバーでアプリケーションをデプロイ

ここからは再度VPSサーバーにて、作業を行っていきます。
bareリポジトリにローカルからpushしたWebアプリケーションが内包されているので、これをcloneします。

```terminal
# cd /var/www/cgi-bin  

# git clone todo.git  
```

すると`todo`フォルダができるので、そのディレクトリに移動します。

```terminal
# cd todo
```

このディレクトリがVPSサーバー内でのアプリケーションのルートディレクトリになります。`pwd`コマンド(present working directory)で確認してみます。

```terminal
# pwd

/var/www/cgi-bin/todo
```

必要なライブラリをpipでインストールし、データベーステーブルの構築とサイトデータのロードを行います。
このあたりはローカルで実行していたのと同じです。

```terminal
# pip3.6 install -r requirements.txt  

# python3.6 manage.py migrate

# python3.6 manage.py loaddata sites
```

これでローカルで作ったWebアプリケーションがVPSサーバーにもデプロイされました。

## 次回

サーバー側にアプリケーションがデプロイされましたが、まだインターネット公開されていません。
次回はそのためのファイアーウォールやApacheの設定を行っていきます。

[Django×PinaxでWebサービス入門⑤｜インターネット公開](https://qiita.com/mtitg/items/a060a5d11659409f5002)