Skip to content

Grafana 接続

関連: PostgreSQL / パネル SQL / 何を見るか

Grafana で支出を可視化する

関連: PostgreSQL / 支出の保存 / アーキテクチャ

構成(今回の前提)

ブラウザ
  → Grafana VM  192.168.40.220
       →(LAN)PostgreSQL  192.168.40.212:5432
            DB: finance_manager
            ユーザー: finance_readonly(SELECT のみ)
役割 IP(想定) やること
finance-manager 192.168.40.212 PG を LAN から読めるようにする、読み取りユーザー
Grafana 192.168.40.220 データソース追加、パネル作成

アプリ用の finance_app は書込権限を持つ。 Grafana には渡さない。


全体の流れ

  1. PG 上に 読み取り専用ユーザー を作る
  2. PG が LAN からの接続を受け付ける ようにする(listen_addresses / pg_hba.conf)
  3. finance-manager 上から Grafana VM(220)相当の接続を試験する(任意)
  4. Grafana UI で PostgreSQL データソース を追加する
  5. パネルを SQL で作る(今日、今週、大分類)

手順 1: 読み取り専用ユーザー

ユーザー分離

ユーザー 用途
finance_app Bot が INSERT/UPDATE/DELETE
finance_readonly Grafana が SELECT だけ

可視化用に書込権限を渡すと、パネルや誤操作でデータを壊す余地が残る。

作業場所

finance-manager VM(192.168.40.212)に SSH する。

強いパスワードを自分で決めてメモする(Git に書かない)。

sudo -u postgres psql -d finance_manager

psql 内で(パスワードは自分のものに置換):

-- ユーザー作成(既にあればスキップか ALTER でパスワード更新)
CREATE USER finance_readonly WITH PASSWORD 'ここに強いパスワード';

-- この DB に接続できる
GRANT CONNECT ON DATABASE finance_manager TO finance_readonly;

-- public スキーマを使える
GRANT USAGE ON SCHEMA public TO finance_readonly;

-- 既存テーブルを読める
GRANT SELECT ON ALL TABLES IN SCHEMA public TO finance_readonly;

-- 今後作られるテーブルもデフォルトで SELECT 可能に(任意だが便利)
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO finance_readonly;

確認:

\du finance_readonly
SET ROLE finance_readonly;
SELECT COUNT(*) FROM expenses;
RESET ROLE;
\q

SELECT が通ればよい。 INSERT が拒否されることも確認しておく。

リポジトリにも同じ内容の参考 SQL がある: sql/grafana_readonly_grants.sql(パスワードは自分で入れる)。


手順 2: PostgreSQL を LAN から届くようにする

いま Bot は同じマシンの 127.0.0.1 だけで足りている。 Grafana(220)から読むには、PG が外部(LAN)の接続を listen し、かつ許可する必要がある。

用語

ファイル 役割
postgresql.conf どこで待つか(listen_addresses)
pg_hba.conf 誰をどういう認証で入れるか(ホストベースアクセス)

Debian だとだいたい:

# バージョン番号は環境で違う(例: 17)
ls /etc/postgresql/*/main/

2-1. listen_addresses

# 実際のパスは ls で確認
sudo nano /etc/postgresql/17/main/postgresql.conf

listen_addresses を探す。

値 意味
localhost(デフォルトに近い) 同じマシンからだけ
* または 0.0.0.0 全インターフェース
192.168.40.212 その IP だけ

自宅 LAN なら、まずは次にする。

listen_addresses = '*'

(インターネットに 5432 を晒す話ではない。ルータでポート開放しないこと。)

2-2. pg_hba.conf

sudo nano /etc/postgresql/17/main/pg_hba.conf

末尾あたりに、Grafana VM だけを許可する行を足す(推奨):

# Grafana (192.168.40.220) → finance_manager 読み取り
host    finance_manager    finance_readonly    192.168.40.220/32    scram-sha-256
列 意味
host TCP 接続
finance_manager DB 名
finance_readonly ユーザー
192.168.40.220/32 Grafana の IP だけ
scram-sha-256 パスワード認証

192.168.40.0/24 全体を開けても動く。 意図をはっきりさせるなら 220 だけにする。

既存の local / 127.0.0.1 の行は消さない(Bot が壊れる)。

2-3. 反映

sudo systemctl reload postgresql
# または
sudo systemctl restart postgresql

listen_addresses 変更は restart が必要なことがある。 reload で足りなければ restart する。

Bot は systemd なので、PG 再起動後に一瞬エラー→Restart=always で復帰しがちである。 念のため:

sudo systemctl status finance-manager

2-4. ファイアウォール

Debian で ufw 等が有効なら、220 から 5432 を許可する必要がある場合がある。

sudo ufw status
# 有効なら例:
# sudo ufw allow from 192.168.40.220 to any port 5432 proto tcp

無効(inactive)なら、この段はスキップでよいことが多い。


手順 3: 接続テスト(finance-manager 上)

「設定したつもり」と「届く」を分ける。

# 同じ VM から、わざと LAN IP 経由で readonly 接続
psql "postgresql://finance_readonly:PASSWORD@192.168.40.212:5432/finance_manager" \
  -c 'SELECT COUNT(*) FROM expenses;'

成功すれば、listen / hba / ユーザーはだいたい正しい。 (本当の「220 から」は Grafana VM に入って同じコマンドを叩くとより確実。)

Grafana VM に SSH できるなら:

psql "postgresql://finance_readonly:PASSWORD@192.168.40.212:5432/finance_manager" \
  -c 'SELECT 1;'

psql が無ければ sudo apt-get install -y postgresql-client。


手順 4: Grafana にデータソースを追加

ブラウザで Grafana(220)を開く。

  1. Connections → Data sources → Add data source
  2. PostgreSQL を選択
  3. だいたい次を入れる:
項目 値
Host 192.168.40.212:5432
Database finance_manager
User finance_readonly
Password (手順1で決めたもの)
TLS / SSL 自宅 LAN なら disable で始めることが多い
Version 自分の PG に近いもの
  1. Save & test → 成功メッセージが出れば OK

失敗したら:

  • Host が 127.0.0.1 になっていないか(それは Grafana 自身を指す)
  • pg_hba の IP が本当に 220 か
  • パスワード、DB 名

詳細なパネル SQL は Grafana パネル SQL へ。