Skip to content

PostgreSQL 導入

対象 VM: finance-manager(192.168.40.212 / debian) 関連: インフラ / テーブル定義

役割

finance-manager は次を PostgreSQL に永続化する。

  • 支出イベント(金額、店名、カテゴリなど)
  • 生データ(Discord メッセージ、メール本文、通知 raw)
  • Grafana が読む集計の元データ

要件どおり PostgreSQL を使う。 同じ VM に同居させて始め、後で分離してもよい。

用語

用語 意味
PostgreSQL(サーバ) DB エンジン本体(postgresql パッケージ)
データベース データの入れ物。今回は finance_manager
ロール(ユーザー) 接続、権限の単位。アプリ用と読み取り専用を分ける
psql 対話型クライアント
peer / scram-sha-256 認証方式。OS ユーザー一致 or パスワード

0. 初期パスワードを変える

初期パスワードを変える

cloud-init の初期パスワードは changeme なので、変更する。

passwd

1. パッケージ更新と locale

sudo apt-get update
sudo apt-get install -y locales
sudo sed -i 's/^# *en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
sudo locale-gen
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

再ログイン後、locale 警告が消えるか確認する。

2. PostgreSQL のインストール

sudo apt-get install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
sudo systemctl status postgresql --no-pager
  • postgresql … サーバ
  • postgresql-contrib … 拡張パッケージ
  • systemctl enable --now … 今すぐ起動し、再起動後も自動起動する

3. バージョンと接続確認

psql --version
sudo -u postgres psql -c 'SELECT version();'

Debian の初期スーパーユーザー相当は、OS ユーザー postgres に置く。 sudo -u postgres は postgres ユーザーとして実行する、という意味である。

4. アプリ用 DB / ユーザー作成

パスワードは強いものに変える。

sudo -u postgres psql <<'SQL'
CREATE USER finance_app WITH PASSWORD 'CHANGE_ME_STRONG_PASSWORD';
CREATE DATABASE finance_manager OWNER finance_app;
GRANT ALL PRIVILEGES ON DATABASE finance_manager TO finance_app;
\c finance_manager
GRANT ALL ON SCHEMA public TO finance_app;
ALTER DATABASE finance_manager SET timezone TO 'Asia/Tokyo';
SQL
  • USER:ログインできるロール
  • DATABASE:入れ物。OWNER にアプリユーザーを付ける
  • SCHEMA public:テーブルを置く名前空間。PostgreSQL 15+ では明示 GRANT が必要なことが多い
  • timezone:日時を日本時間前提で扱いやすくする

5. パスワード接続の確認

localhost からアプリユーザーで入れるか確認する。

psql "postgresql://finance_app:CHANGE_ME_STRONG_PASSWORD@127.0.0.1:5432/finance_manager" -c '\conninfo'

成功すれば、アプリの DATABASE_URL と同じ形になる。

6. Grafana 用読み取りユーザー

LAN 公開、データソース、パネル SQL は Grafana を参照する。

可視化に進む段階で実施する。 Bot だけなら今はスキップできる。

sudo -u postgres psql -d finance_manager
CREATE USER finance_readonly WITH PASSWORD 'CHANGE_ME_READONLY_PASSWORD';
GRANT CONNECT ON DATABASE finance_manager TO finance_readonly;
GRANT USAGE ON SCHEMA public TO finance_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO finance_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO finance_readonly;

7. 接続を LAN に開けるか

MVP の Bot は同じ VM 内から 127.0.0.1 で足りる。 Grafana(例: 192.168.40.220)から読む段階で、postgresql.conf の listen_addresses と pg_hba.conf を調整する。

手順の本体は Grafana。

5432 をインターネットに出さない

インターネット向けに 5432 をポート開放しない。 LAN 内の Grafana IP だけ許可するのが基本である。

確認

  • systemctl is-active postgresql が active
  • finance_app で finance_manager に接続できる
  • パスワードは VM 上の env(例: /etc/finance-manager.env)にだけ置く。Git には入れない