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 の両方をローテーションする。