Cloudflare / ドメイン / 認証
ドメイン(nkjm.dev)
所持ドメイン nkjm.dev のサブドメインを用途別に使う。
| ホスト | 用途 | MVP |
|---|---|---|
ingest.finance.nkjm.dev |
Android / Tasker からの通知 POST | 使う |
finance.nkjm.dev |
将来の管理画面・健康チェック等 | 後回し |
DNS / Tunnel は Cloudflare 上の nkjm.dev ゾーンに設定する。
認証方針(二重)
スマホ (Tasker)
│ HTTPS
│ CF-Access-Client-Id / CF-Access-Client-Secret
│ Authorization: Bearer ...
▼
Cloudflare Tunnel + Access
▼
Proxmox: finance-manager
POST /ingest/notifications
- Cloudflare Access Service Token … Tunnel 手前で止める
- アプリ Bearer Token … finance-manager 側でも検証
Note
ブラウザログイン型 Access(メール OTP 等)は Tasker と相性が悪いので ingest には使わない。
Tunnel 設定
- Cloudflare Zero Trust / Networks で Tunnel を作成
- Proxmox 上で
cloudflaredを常駐 - Public Hostname を追加
ingest.finance.nkjm.dev→http://127.0.0.1:8000(アプリ listen)- ingest 専用サブドメインにする(他サービスと混ぜない)
Access(Service Token)
- Zero Trust → Access → Service Auth → Service Token 作成
(名前例:finance-manager-tasker) - Client ID / Client Secret を控える(Tasker 変数へ)
- Access → Applications で Self-hosted Application 作成
- Domain:
ingest.finance.nkjm.dev - Policy
- Action: Service Auth(または Allow + Include Service Token)
- Include: 作成した Service Token
- トークンなしが拒否されることを確認
アプリ側 Bearer
openssl rand -hex 32などで生成- サーバ env
INGEST_BEARER_TOKENに設定 - 不一致なら 401
- 同じ値を Tasker ヘッダへ
動作確認
# 失敗例: ヘッダなし → Access またはアプリが拒否
curl -i https://ingest.finance.nkjm.dev/ingest/notifications
# 成功例
curl -i https://ingest.finance.nkjm.dev/ingest/notifications \
-H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \
-H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET" \
-H "Authorization: Bearer $INGEST_BEARER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"source":"android_notification","app":"PayPay","title":"test","text":"¥100","received_at":"2026-08-08T02:00:00+09:00"}'
補足
- Access だけ / Bearer だけでも動くが、併用が正式方針
- 必要なら Cloudflare 側でレート制限を追加
- 漏洩時は Service Token と Bearer の両方をローテーション