Ubuntu 22.04にPostgreSQL15をインストールしてセットアップする
環境
- Ubuntu 22.04
- PostgreSQL 15.1
インストール
公式サイトの手順に従ってapt
の設定を行う。
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt -y install postgresql-15
apt update
の際に「N: リポジトリ 'http://apt.postgresql.org/pub/repos/apt focal-pgdg InRelease' がアーキテクチャ 'i386' をサポートしないため設定ファイル 'main/binary-i386/Packages' の取得をスキップ」というエラーが表示される場合、エラーを回避するためにapt
のリポジトリ設定ファイルに[arch=amd64]
を追加する。
- deb http://apt.postgresql.org/pub/repos/apt jammy-pgdg main
+ deb [arch=amd64] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main
起動
systemd
で起動する。
sudo systemctl enable postgresql
sudo systemctl start postgresql
普段使いユーザの作成
postgres
ロールでデータベース接続
インストールした時点ではデータベースが作られておらず、またデータベースのユーザも作られていないのでアクセスができない。
PostgreSQLをインストールしたときに作られるLinuxユーザpostgres
を使うことでデータベースにアクセスすることができるので、普段遣い用のユーザとデータベースを作成する。
初回データベースアクセスは以下のコマンドで行う。
sudo -u postgres psql
パスワード認証形式の変更
PostgreSQLはローカルホストからの接続でPeer認証を使用しているので、データベースユーザとしてアクセスするには、OSのユーザ名がそのデータベースユーザと一致していなければ接続できない。
スーパーユーザーであるpostgres
ユーザはPostgreSQLをインストールすると自動で生成されるが、このままだとデータベースユーザを作ってもアクセスできない(OSでも同名のユーザを作ってログインしてシェル立ち上げてpsql
コマンド実行して...という手順を踏まないといけない)。
流石に面倒なので、ローカルホストからのアクセスにはパスワード認証を使うように設定する。
認証方式の設定は/etc/postgresql/15/main/pg_hba.conf
で設定されているので、これを編集する。
- local all all peer
+ local all all password
パスワード認証の方式には、暗号化したパスワードを用いるmd5
と、平文のパスワードを使用するpassword
がある。
設定変更後はPostgreSQLを再起動する必要がある。
sudo systemctl restart postgresql
Optional: ロール作成
単に使うだけなら不要な手順だけど、読み取り専用・読み書き専用ロールを作っておく。
このようなロールを作っておくことで、ユーザ作成時にこれらのロールをアタッチするだけで権限を管理できるようになる。
PostgreSQL14以降は参照・更新専用のロールが事前に定義されるようになり、簡単に権限を管理できるようになった(らしい)ので、それを用いる。
とりあえず以下の2つのロールを作成する。
-
readonly
: データの参照のみを行えるロール -
readwrite
: データの参照・更新のみを行えるロール
readonly
ロールの作成
psql
でデータベースコンソールにアクセスした後、以下のSQLを実行する。
CREATE ROLE readonly;
GRANT pg_read_all_data TO readonly;
readwrite
ロールの作成
同じく以下のSQLを実行する。
CREATE ROLE readwrite;
GRANT pg_read_all_data, pg_write_all_data TO readwrite;
普段使いユーザ作成
開発用のユーザを作成する。データベース作成権限をつけておく。
postgres
ユーザでデータベースにアクセスし、以下のSQL文を実行する。
CREATE USER fjnkt98 WITH CREATEDB ENCRYPTED PASSWORD 'fjnkt98';
念の為、パスワードは暗号化して保存するように設定した。(ENCRYPTED
句を付けることで暗号化して保存できる)
データベース作成
先程作成した普段使い用のユーザでデータベースにアクセスし、データベースを作成する。
psql
コマンドは接続先データベースを指定しなかったとき、ユーザ名と同じ名前のデータベースにアクセスしようとするが、今はまだないのでデフォルトのデータベースであるpostgres
を指定しておく。
psql -U fjnkt98 -d postgres
データベースにアクセスしたら、データベースを作成する。名前はsample
にしておく。
CREATE DATABASE sample;
データベースを作成したら一旦ログアウトし、作成したデータベースに改めてアクセスする。
\q
psql -U fjnkt98 -d sample
あとはテーブルを作成したり、データを挿入したりして好きに開発できる。
Optional: 読み取り専用ユーザの作成
せっかくなので先程作ったreadonly
ロールを使って読み取り専用ユーザを作ってみる。
reader
という名前の読み取り専用ユーザを作る。
ロールを新規作成するので、postgres
ユーザでデータベースにアクセスし、以下のSQL文を実行する。
CREATE USER reader WITH ENCRYPTED PASSWORD 'reader';
GRANT readonly TO reader;
これで、読み取り専用ユーザreader
を作成し、読み取り専用の権限を付与することができた。
reader
でデータベースにアクセスし、テーブルのデータを読み取ることができる。
psql -U reader -d sample
SELECT * FROM hoge;
しかしデータの挿入や削除はできない。
Discussion