From c3ecb3d9ec2e5b7cd01b7b0039ef76afb2737c99 Mon Sep 17 00:00:00 2001 From: Ruk Doe Date: Sat, 24 Oct 2026 13:53:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20Exchange=20=E3=81=AE=20SMTP=20AUTH?= =?UTF-8?q?=20=E3=82=92=E3=82=84=E3=82=81=E3=81=9F(3=20=E3=81=A4=E3=81=AE?= =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E3=82=92=20smtp-relay=20=E7=B5=8C?= =?UTF-8?q?=E7=94=B1=E3=81=AB=E3=81=97=E3=81=9F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1 --- ROADMAP.md | 4 ---- docs/decisions.md | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 6f2ee276..d5e2d8a9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -28,10 +28,6 @@ bond0 の MAC は設定で固定してあるのでルーターは触らない。 - [ ] **R2 の容量が下がり切るのを見る。** `host=main` を消した直後の restic の実データは **5.60 GiB**(2026-10-17)。 日曜の prune のあと、`pulumi` ワークフローの週次の Summary で見る -- [ ] **Exchange Online の SMTP AUTH(ユーザー名とパスワード)をやめる。** 使っているのは Infisical(`bootstrap/infisical/values.yaml`)、 - yosegaki(blog のリポジトリ)、todoroku(Forgejo の doa/todoroku)の 3 つで、どれも `smtp.office365.com:587` に `info@doany.io` で送っている(2026-10-23 に - クラスタの全 Pod の env で確かめた)。Microsoft は **2026-12 末に既存テナントでも既定で無効**(管理者が戻せる)、最終の廃止日は 2027 年後半に発表。 - 移る先は OAuth(XOAUTH2)・Graph の sendMail・IP で許す SMTP リレー(コネクタ)のどれか - [ ] **Talos 1.15.0 の正式版が出たら乗り換える**(Renovate の PR) - [ ] **上流がカーネルにモジュールを必要な時に読ませる仕組み(modprobe の helper)を入れたら**、[apps/cluster/pt3-rebind.yaml](apps/cluster/pt3-rebind.yaml) を外し、 `talos/controlplane.yaml` の `kernel.modules` も `earth-pt3` だけにできるか確かめる。並び順を守る PR([siderolabs/talos#14652](https://github.com/siderolabs/talos/pull/14652))は diff --git a/docs/decisions.md b/docs/decisions.md index d9957f88..1fc6f548 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -345,3 +345,17 @@ ExternalDNS は HTTPRoute の注釈だけで決まり、自分が作ったレコ 疎結合にできる候補(ExternalDNS・cloudflare-operator・Crossplane)のうち、DNS が主役で利用者が多いのが ExternalDNS。 **Entra のリダイレクト URI は中央(`pulumi/entra.ts`)のまま。** 共用のアプリ登録 1 つに全アプリの URI が入るので、そもそも中央に集まる。 + +## メールは Exchange Online の SMTP AUTH をやめ、クラスタの中の中継から Graph の sendMail で送る(2026-10-24) + +SMTP AUTH の Basic 認証は 2026-12 末に既定で無効になる。移る先の候補は OAuth(XOAUTH2)・Graph の `sendMail`・IP で許すコネクタ。 + +- **XOAUTH2 は使えない。** `info@doany.io` は Exchange Online Kiosk で、Kiosk は SMTP の OAuth に対応していないとされる。 + Infisical はそもそも SMTP のユーザー名とパスワードしか話せない +- **コネクタ(IP で許す)は家の IP が固定でないので筋が悪い** +- したがって **Graph の `sendMail`**。アプリごとに Graph を話させず、普通の SMTP を受けて Graph に渡す中継 + ([smtp-oauth-relay](https://github.com/JustinIven/smtp-oauth-relay)、`apps/smtp-relay/`)を 1 つ置き、3 つのアプリは向け先だけ替えた +- **Graph の `Mail.Send` をテナント全体には付けない。** 誰としてでも送れてしまうので、Exchange の RBAC for Applications で + 送れるメールボックスを `info@doany.io` だけに絞った。初回は組織が dehydrated で `Enable-OrganizationCustomization`(取り消せない)が要り、 + 実体化まで数時間かかった +- 中継は秘密を持たない(アプリが SMTP AUTH でクライアントシークレットを渡す)。クラスタの中だけで TLS なし、届く namespace は NetworkPolicy で絞る From eafb468cb037ea7173af27419cbffa4b15993513 Mon Sep 17 00:00:00 2001 From: Ruk Doe Date: Sat, 24 Oct 2026 13:53:20 +0900 Subject: [PATCH 2/3] =?UTF-8?q?docs(roadmap):=20PT3=20=E3=81=AE=20modprobe?= =?UTF-8?q?=20helper=20=E3=82=92=E5=AE=9F=E6=A9=9F=E3=81=A7=E7=A2=BA?= =?UTF-8?q?=E3=81=8B=E3=82=81=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1 --- ROADMAP.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index d5e2d8a9..1cf2e937 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -33,7 +33,8 @@ bond0 の MAC は設定で固定してあるのでルーターは触らない。 `talos/controlplane.yaml` の `kernel.modules` も `earth-pt3` だけにできるか確かめる。並び順を守る PR([siderolabs/talos#14652](https://github.com/siderolabs/talos/pull/14652))は 2026-10-23 に「並び順ではなく、カーネルが必要な時に読み込む形にすべき。こちらで別に実装する」(smira)として閉じられた。 その実装が [siderolabs/talos#14724](https://github.com/siderolabs/talos/pull/14724)(2026-10-23 に Open。説明に earth-pt3 → tc90522 が例として載っている)。 - マージされて Talos のリリースに入り、Renovate の PR で上げたら確かめる。入ったら dvb-pt3 の extension の README も直す(上流) + 2026-10-24 に v1.15.0-alpha.1 + この PR を自前で組んだ installer で実機を起こし、`earth-pt3` だけでチューナー 4 つが付き、pt3-rebind も付け直し不要だった(PR にも報告)。 + ノードは今その installer で動いている。リリースに入ったら Renovate の PR で公式の版に戻し、`kernel.modules` を `earth-pt3` だけにして pt3-rebind を消す。入ったら dvb-pt3 の extension の README も直す(上流) ## 済んだこと(記録) From ce9167639764f178b92b966b5c04d9a87d87736c Mon Sep 17 00:00:00 2001 From: Ruk Doe Date: Sat, 24 Oct 2026 13:54:36 +0900 Subject: [PATCH 3/3] =?UTF-8?q?docs(pulumi):=20SPF=20=E3=81=AE=E3=82=B3?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=20smtp-relay=20=E7=B5=8C?= =?UTF-8?q?=E7=94=B1=E3=81=AB=E7=9B=B4=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1 --- pulumi/dns.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pulumi/dns.ts b/pulumi/dns.ts index 723c26f8..a7b8502c 100644 --- a/pulumi/dns.ts +++ b/pulumi/dns.ts @@ -36,7 +36,7 @@ record("caa-issuewild", { name: "doany.io", type: "CAA", ttl: 1, data: { flags: // DNSSEC に対応した MX(Enable-DnssecForVerifiedDomain で払い出された)。DANE はこれで効く record("mx-dnssec", { name: "doany.io", type: "MX", content: "doany-io.o-v1.mx.microsoft", priority: 0, ttl: 3600 }); record("autodiscover", { name: "autodiscover.doany.io", type: "CNAME", content: "autodiscover.outlook.com", proxied: false, ttl: 3600 }, "93eb5f05c05d9ca6ae8239cad26089e2"); -// 送るのは Exchange だけ(アプリも smtp.office365.com 経由)なので -all +// 送るのは Exchange だけ(アプリも apps/smtp-relay → Graph の sendMail で Exchange から出る)なので -all record("spf", { name: "doany.io", type: "TXT", content: "v=spf1 include:spf.protection.outlook.com -all", ttl: 3600 }, "05522a739cbd45b787b93f1a700b8916"); // DKIM。行き先は Get-DkimSigningConfig の Selector1CNAME / Selector2CNAME。明示しないとワイルドカードに吸われる record("dkim-selector1", { name: "selector1._domainkey.doany.io", type: "CNAME", content: "selector1-doany-io._domainkey.doany.q-v1.dkim.mail.microsoft", proxied: false, ttl: 3600 });