PostgreSQL 導入(学習用)
対象 VM: finance-manager(192.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.conf の listen_addresses と pg_hba.conf を調整する。
手順の本体は Grafana。
5432 をインターネットに出さない
インターネット向けに 5432 をポート開放しない。 LAN 内の Grafana IP だけ許可するのが基本。
うまくいった状態
systemctl is-active postgresqlがactivefinance_appでfinance_managerに接続できる- パスワードをメモし、後で VM 上の env(例:
/etc/finance-manager.env)にだけ置く。Git には入れない
次のステップ: Discord Bot 用の Python/Node 環境と、最初のテーブル設計。