Skip to content

PostgreSQL 導入(学習用)

対象 VM: finance-manager192.168.40.212 / debian
関連: インフラ

なぜ PostgreSQL か

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

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

SQLite でも試作はできるが、要件どおり 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 だけなら今はスキップ可だったが、Grafana に進む段階では実施する。

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.conflisten_addressespg_hba.conf を調整する。

手順の本体は Grafana

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

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

うまくいった状態

  • systemctl is-active postgresqlactive
  • finance_appfinance_manager に接続できる
  • パスワードをメモし、後で VM 上の env(例: /etc/finance-manager.env)にだけ置く。Git には入れない

次のステップ: Discord Bot 用の Python/Node 環境と、最初のテーブル設計。