DjangoをVPSにデプロイする3〜PostgreSQL編〜

DjangoをVPSにデプロイする2〜パッケージ編〜の続きです。

この記事では、VPSでPostgreSQLの設定をしていきます。

PostgreSQLにデータベースとユーザーを作成しますが、この名前やパスワードはローカルで作成したものと同一にしておくと事を管理が楽です。

最終環境

  • ubuntu 24.0.4
  • PostgreSQL 14
  • Nginx 1.22.1
  • Gunicorn
  • 独自ドメイン
  • SSL化
  • メール設定

SSH接続

ターミナルでVPSにSSH接続します。

$ ssh COMAND_NAME

postgresの確認

PostgreSQLをインストールすると、ubuntuに「postgres」というユーザー、PostgreSQLに「postgres」というロールが作成されます。

ubuntuのpostgresユーザーが存在するか確認してみましょう。

$ cat /etc/passwd | grep postgres

以下のように表示されればOK!

postgres:x:113:123:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
cat
ファイルを見る時に良く使われるコマンドです。

パスワード設定

生まれたばかりのpostgresには、パスワードが無いのでログインできません。

パスワードを設定してあげます。

$ sudo passwd postgres

PostgreSQLにログイン

postgresユーザーに切り替えます。

USERNAME@xxx.xxx.xxx.xxx:~$ su - postgres

名前がpostgresになれば切り替えられています。

postgres@xxx.xxx.xxx.xxx:~$

PostgreSQLにログインします。

postgres@xxx.xxx.xxx.xxx:~$ psql

補足ですが、通常のユーザーでログインする時は次のようにデータベース名を指定します。

USERNAME@xxx.xxx.xxx.xxx:~$ psql -d database_name

ロールを作成

ロールというとグループのように感じるかもしれませんが、PostgreSQLのユーザーと考えて下さい。

データベースのロールは、ubuntuで作ったシステムユーザーとは別物ですが、データベースのロール名とシステムユーザー名を一致させておくと便利です。

今回はスーパーユーザーの権限を与えています。

「rool_name」と「password」を自身のものに変えて下さい。最後の「;」を忘れないように。

postgres=# CREATE ROLE rool_name WITH SUPERUSER LOGIN PASSWORD 'password';
ロール名
ローカル環境で作成したロール名、パスワードと同一しておくと良い。したがって、システムユーザー名=ロール名=ローカルのロール名が一番便利な方法になります。

ロール一覧を表示

ロールが作成できているか確認します。

postgres=# \du

 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 rool_name | Superuser                                                  | {}

「Attributes」に属性(できること)が表示されています。

少し話は逸れますが、ロールの権限を「継承」することでグループように扱うこともできます。


データベースの作成

ローカルで作成したデータベース名と同じだと楽です。

database_nameというデータベースを作成し、オーナーをrool_nameとしています。

postgres=# CREATE DATABASE database_name OWNER rool_name;

PostgreSQLから出ます。バックスラッシュは「¥」で入力できます。

postgres=# \q

通常のユーザーに戻します。

postgres@xxx.xxx.xxx.xxx:~$ exit

USERNAME@xxx.xxx.xxx.xxx:~$ 

接続設定

ローカルのパソコンからデータベースにアクセスできるように設定します。

接続設定のファイルは2つあり「postgresql.conf」と「pg_hba.conf」で設定します。

どちらも「/etc/postgresql/14/main」の中にあります。

postgresql.confの設定

$ sudo vi /etc/postgresql/14/main/postgresql.conf

コメントアウトを解除し「*」に修正します。

- #listen_addresses = ‘localhost’
+ listen_addresses = ‘*’

pg_hba.confの設定

$ sudo vi /etc/postgresql/14/main/pg_hba.conf
  1. Database administrative login by Unix domain socket
    postgresから「all」に変更、peerから「scram-sha-256」に変更
  2. IPv4 local connections
    「0.0.0.0/0」の行を追加
# Database administrative login by Unix domain socket
- local   all             postgres                                peer
+ local   all             all                                     scram-sha-256

# 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            scram-sha-256
+ host    all             all             0.0.0.0/0               scram-sha-256

「scram-sha-256」は「md5」より安全な接続方法だそうです。

「0.0.0.0/0」は全てのIPから、データベースへの接続を許可しています。

個人の場合は問題ないと思いますが、法人等でセキュリティーを高めたい場合はデータベース、ユーザー、IPを指定した方が良いかもしれません。

詳しく知りたい方は、電算星組さんのページが分かりやすいです。


再起動

PostgreSQLを再起動します。

$ sudo /etc/init.d/postgresql restart

状態確認

PostgreSQLのステータスを確認します。

$ sudo /etc/init.d/postgresql status

● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2022-11-09 18:22:10 JST; 3 days ago
   Main PID: 1051 (code=exited, status=0/SUCCESS)
        CPU: 943us

11月 09 18:22:10 x162-43-6-128 systemd[1]: Starting PostgreSQL RDBMS...
11月 09 18:22:10 x162-43-6-128 systemd[1]: Finished PostgreSQL RDBMS.

Activeが「active (exited)」となっていれば正常に起動しています。


コマンドまとめ

起動
$ sudo /etc/init.d/postgresql start
 
停止
$ sudo /etc/init.d/postgresql stop

再起動
$ sudo /etc/init.d/postgresql restart
 
ステータス
$ sudo /etc/init.d/postgresql status

これでPostgreSQL編は終了です!

次は「DjangoをVPSにデプロイする4〜Nginx編〜」です。