さくらvpsにRailsアプリをデプロイするまで (2) PostgreSQLの設定

# 0. データベースをやっていく
　データベースをやっていかないといけない。わたしのRailsアプリのDBはPostgreSQLでやっており、さくらvpsでほんとうにできるかわからない。さくらvps公式で紹介されているのはMariaDBというやつだった。

　いろんなひとが記録を残しているので、たぶんできるだろう。ちょっとやっていく。


# 1. PostgreSQLをインストール

https://www.postgresql.org/download/linux/redhat/

公式に良いページがあった。プルダウンでインストールしたいやつを選ぶと、したにコマンドリストがでてくる。
バージョン:11、プラットフォーム：CentOS7 、アーキテクチャはx86_64とした。

```terminal
# sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# sudo yum install -y postgresql11-server
# sudo /usr/pgsql-11/bin/postgresql-11-setup initdb
# sudo systemctl enable postgresql-11
# sudo systemctl start postgresql-11
```

できた。ちゃんとバージョンも出てくる。

```terminal
# psql --version

>psql (PostgreSQL) 11.15

```


# 2. アカウント設定

ここからいきなりデータベースを作成しようとしたが以下のエラーが出た。

```terminal
# createdb database_lytnote
createdb: could not connect to database template1: FATAL:  role "root" does not exist

```

ちょっと調べた。

https://www.postgresql.jp/docs/9.2/tutorial-createdb.html

> これは、管理者がそのユーザ用のPostgreSQLユーザアカウントを作成していない時に起こります （PostgreSQLユーザアカウントは、オペレーティングシステムのユーザアカウントとは異なります）。 管理者であれば、アカウントの作成方法に関して第20章を参照してください。

なるほど。

実はPostgreSQLユーザーアカウントはすでにあり、「postgres」という名前らしい。パスワードは未設定なので、まずは設定する。

rootユーザーで操作。

```terminal
# sudo passwd postgres
```

これができたらpostgresにユーザーを切り替える。

```terminal
# su - postgres
```

この状態でデータベースをつくってみよう。

```terminal
-bash-4.2$  createdb mydatabase 

```

データベース一覧でデータがあればOK

```terminal
-bash-4.2$  psql -l

    Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
------------+----------+-----------+---------+-------+-----------------------
 mydatabase | postgres | SQL_ASCII | C       | C     | 
 postgres   | postgres | SQL_ASCII | C       | C     | 
 template0  | postgres | SQL_ASCII | C       | C     | =c/postgres          +
            |          |           |         |       | postgres=CTc/postgres
 template1  | postgres | SQL_ASCII | C       | C     | =c/postgres          +
            |          |           |         |       | postgres=CTc/postgres
(5 rows)
```


# 3. 外部からの接続設定

 ドキュメントによると、postgreSQLはデフォルトでlocalhostからの接続しか許可をしていない。このままではリモートの接続はできないので設定を変更する。

https://www.postgresql.jp/document/11/html/runtime-config-connection.html

　`postgresql.conf` を編集する。場所はpostgresでログインした時に、

`11/data/postgresql.conf`　にある。

11はバージョン番号なので、人によっては異なるかもしれない。

ユーザー名 postgres で作業する。

```terminal
-bash-4.2$ vi 11/data/postgresql.conf
```

```terminal
(中略)
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*' # 追加
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
```

`listen_addresses = '*'`を追加する。設定ファイルが長いので`/localhost`などと打って検索をかけよう。次へ検索は`n`を打てばいい。


# 4. クライアント認証の設定
　`pg_hba.conf`という設定ファイルを編集し、クライアント認証を追加させる。


postgresユーザーになってからファイルを編集する。

```terminal
# su - postgres
-bash-4.2$ vi 11/data/pg_hba.conf
```


```terminal
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
host    all             all             0.0.0.0/0               md5 
```

設定の値は以下のページを参考にした。
https://qiita.com/haruto167/items/05d0d65f243dd01a9ab4


# 5. ファイアウォールの設定
現状でどこまで必要かはわからないが、設定をしておく。さくらvpsにわかりやすいページがある。

https://knowledge.sakura.ad.jp/10583/

https://manual.sakura.ad.jp/vps/support/security/firewalld.html

サーバーOSがCentOS7の場合はファイアウォールの設定コマンドとしてfirewalldを用いる。

まずは現状のファイアウォール設定を確認する。rootユーザーで操作する。

```terminal
# firewall-cmd --get-active-zones
```

これで`FirewallD is not running`と表示されたら以下のコマンドでファイアウォールを有効にする。

```terminal
# systemctl start firewalld
# systemctl enable firewalld
```

ファイアウォールにpostgresの通信を許可するように設定する。
```terminal
# firewall-cmd --add-service=postgresql --permanent
```

できたか状態をみてみる。
```terminal
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client postgresql ssh
  ports: 
  protocols: 

...

```

`services:`　に `postgresql`　が追加されていれば問題ない。

# 6. おわりに

　まだまだ先が見えないがすこしずつ記録していこう。