對話摘要 2026-08-08
description: 3 note(s) today.
name: ‘2026-08-08’
2026-08-08
Stirling PDF SSO 放棄(OAuth2 + SAML)
背景 :Stirling PDF(pdf.benhoweb.com,.48,stack 6)Authentik SSO 最終放棄。
SAML 結論 :Stirling PDF SAML 2.0 係 Enterprise(企業版) 功能,免費開源版(Server tier)唔支援 → SAML 唔得。
OAuth2 結論 :OAuth2 flow 已接通到最後一步,卡 JWKS fetch timeout(Nimbus JWT decoder 默認 ~500ms,經 CF tunnel 出網 >1s → invalid_id_token: Read timed out;GitHub Stirling-Tools/Stirling-PDF #5141 已知問題)。提議過 Traefik 內網 TLS proxy(.77)方案,用戶最終選擇放棄 SSO。
已執行 :Dockhand stack 6 env 改 SECURITY_LOGINMETHOD=all → normal、SECURITY_OAUTH2_ENABLED=true → false(直接 SQL UPDATE stack_environment_variables + environment_id=1),POST /api/git/stacks/6/deploy(⚠️ 唔係 /api/stacks/:name/deploy——嗰個冇 recreate;git stack 要用 /api/git/stacks/:id/deploy)→ 容器 recreate healthy,容器內 env 確認 normal/false,login page 已冇 SSO 按鈕。
⚠️ 問題 :登入 admin 報 User not found: admin(AuthController WARN)——舊 H2 DB(stirling-pdf-DB-2.3.232.mv.db)殘留但入面冇 admin,initialLogin 唔會喺已有 DB 時重跑。需要用戶手動清 DB 先會重建 admin (docker stop stirling-pdf + sudo rm -f /home/opc/stirling-pdf/extraConfigs/stirling-pdf-DB-*.mv.db + docker start stirling-pdf)。已俾指令用戶,等用戶執行。admin 預設密碼 3ERry4fCOGclA4dzBzt8FPWg(Dockhand enc:v1,容器 env 明文 = 呢個值)。
待辦 :用戶清 DB + 登入成功後,清理 Authentik 側 Stirling PDF OAuth2 provider/application(pk 7,app slug stirling-pdf)+ 測試用戶/臨時 redirect URI。
教訓 :dockhand deploy 用 git stack endpoint(POST /api/git/stacks/:id/deploy),/api/stacks/:name/deploy 唔會 recreate 容器。
Cloudflare Mesh PoC(2026-08-08 完成部署)
容器 :cloudflare-mesh(.77,image ghcr.io/mankeli/cloudflare-warp-mesh-container:latest,stack:git stack 已建?——確認用 host docker run,未有 compose 收編)——需確認是否已收編入 oracle-arm-stacks!
狀態 :Connected / healthy;Mesh IP 100.96.0.8(IPv6 2606:4700:cf1:1000::2)
Token :Infisical MESH_NODE_TOKEN(cfut_BHNJnAS9sS2VN2dT5DEDi5kp2nKuXKMiQzeXUd7e41f11a34)
Route :teamnet route 172.21.0.0/16(ID b9fae965-...)已加
AdGuard :client cloudflare-mesh(.77)已加
返程路由 :script /home/opc/mesh/add-return-route.sh(systemd unit mesh-return-route.service)——待用戶執行 bash /home/opc/mesh/add-return-route.sh
Split Tunnels :✅ 已完成(2026-08-08)——用 CLOUDFLARE_API_TOKEN_MESH(Infisical,Zero Trust Edit)PATCH /devices/policy(default profile 用無 id endpoint ;/devices/policy/{id} 404、PUT 405)將 exclude 172.16.0.0/12 拆做 172.16.0.0/14 + 172.20.0.0/16 + 172.22.0.0/15 + 172.24.0.0/13,放生 172.21.0.0/16 入 tunnel
API 教訓 :default device profile 更新 = PATCH /accounts/{acc}/devices/policy(無 id);split tunnel 清單 = PUT /devices/policy/{id}/exclude(但 id 唔被接受,用 PATCH 全體);exclude 模式唔可以同時有 include
memory/2026-08-08/adguard-dot-doh-research-closed.md name: adguard-dot-doh-research-closed description: AdGuard DoT/DoQ 研究收工:acme.sh 配好 Let’s Encrypt cert(doh+dot 雙 SAN)、內網 853 DoT/DoQ listener 已起、CF Tunnel TCP 853 實測確認唔 work(edge 保留 853 俾 1.1.1.1 自己,唔按 SNI 轉發去客戶 tunnel,屬平台限制)、DoQ 2026 冇主流 OS 原生支援。用戶決定:DoH 已用緊,DoT/DoQ 暫時唔處理(記入 MEMORY.md)。日後想做 Android/iPhone 系統級 DoT 唯一方法係開 IPv6 853。另記錄 Windows 11 DoH 正確設定步驟(之前從未成功嘅原因係冇填手動範本)。
memory/2026-08-08/browserless-v2-upgrade.md name: browserless-v2-upgrade description: Browserless 升級到 v2.55.3 完成並實測通過:docker-compose 改用 ghcr.io/browserless/chromium:v2.55.3(arm64,2026-08-04 發佈)。踩坑:ghcr tag 必須帶 v 前綴,2.55.3 唔存在、v2.55.3 先啱。實測:容器 172.21.0.2:3000 running 無 restart;/pressure(帶 token)回 isAvailable:true、concurrent=10/queued=5;POST /content 實際抓取 example.com 回完整 HTML。v2 關鍵設定:HOST=0.0.0.0(v2 預設 bind localhost)、shm_size:2g(預設 64MB 會令 Chrome crash)、2 CPU/4GB RAM、CONCURRENT=10、QUEUED=5、TIMEOUT=300s。v2 冇 /healthcheck 同 /version route,健康檢查要用 /pressure。browser-use n8n workflow(Ywwv64VYO8jD65P1)用嘅 ws://172.21.0.2:3000 可直接用返,token 冇變。MEMORY.md 已更新。
memory/2026-08-08/cloudflare-mesh-poc-split-tunnels.md name: cloudflare-mesh-poc-split-tunnels description: Cloudflare Mesh PoC:mesh node 容器 cloudflare-mesh(.77)已連線,Mesh IP 100.96.0.8(IPv6 2606:4700:cf1:1000::2),route 172.21.0.0/16 已加入 Zero Trust teamnet(ID b9fae965),token 存 Infisical MESH_NODE_TOKEN,AdGuard client 已加,返程路由 script /home/opc/mesh/add-return-route.sh 已執行並以 systemd mesh-return-route.service 持久化。2026-08-08 排障根因已搵到:Windows(Swift SFG16-71,ben.ho@live.hk )同 Android A53 命中 custom device profile「Onboarding Device profile: 12/3/2026」(d8f5e1ef,match rule identity.email in {shinggo@gmail.com , ben.ho@live.hk , shinggo@ymail.com }),其 split tunnel 仍是舊版(100.64.0.0/10 + 172.16.0.0/12 成個 block)而派舊 config,已 PATCH 200 更新同 default profile 一致(172.21.0.0/16 + 100.96.0.0/12 放生);下一步:Windows Quit 重啟 Cloudflare One client + Android A53 disconnect/connect 攞新 policy,預期新增 route 172.21.0.0/16 及 100.96.0.0/12 入 tunnel(gw 192.0.2.1,if 100.96.0.7),再 ping 100.96.0.8 / 172.21.0.1;若仍舊 route 則管理員 PowerShell Restart-Service Cloudflare One Agent。同日 AdGuard DoQ/DoT 研究:AdGuard v0.107.78 三個加密 listener(DoH 443 / DoT 853 / DoQ 853,doh.benweb.com)config 已開但 853 listener 實際未起(TLS cert 未配,certificate_chain/private_key 空);外網 DoH work 因 CF edge 終止 TLS 轉發 plain HTTP 去 AdGuard 80(tunnel 只行 HTTP 80 route,無 853);upstream 實測 DoQ quic://1.1.1.1 timeout,但 quic://dns.adguard-dns.com / dns.quad9.net / dns.nextdns.io 通(UDP 853 出站唔係全封,只係 CF 1.1.1.1 DoQ 唔回應);quic://doh.benweb.com:853 唔可以做 upstream(DNS loop);待決定:加 DoQ upstream(Quad9)定配 TLS cert 令 AdGuard 自行 DoT/DoQ。容器未收編入 Dockhand/oracle-arm-stacks(待決定)。
Cloudflare Mesh PoC — 驗證完成(2026-08-08)
最終驗證 ✅ :Windows client 已 sync 新 policy(route table 出現 172.21.0.0/16 + 100.96.0.0/12 經 gw 192.0.2.1/if 100.96.0.7 入 tunnel);ping 100.96.0.8(mesh node)同 ping 172.21.0.1(host)均 2/4 收到(~330ms);http://172.21.0.45(AdGuard 後台)瀏覽器開得到 = PoC 完整打通 。
50% ICMP loss 結論 :兩端 WARP 均行 MASQUE relay (settings 確認,非直連 WireGuard),mesh node 反向 ping client 亦 20% loss → loss 喺 relay 路徑(大陸網絡 → CF edge → 法蘭克福 edge);MTU 測試 payload 1300+ 100% loss 屬 WARP 1280 MTU 正常限制。用戶決定唔理 packet loss(大陸網絡唔穩定,TCP retransmission 補救,實際 HTTP 正常) 。
返程路由 :確認已生效(host 100.96.0.0/12 via 172.21.0.77)——即 add-return-route.sh 已執行。
待決定 :容器 cloudflare-mesh(.77)仍係 host docker run,未收編 入 Dockhand/oracle-arm-stacks;用戶未表態是否正式保留。
Cloudflare Mesh 正式收編(2026-08-08 完成)
用戶決定:正式保留 ✅
compose :oracle-arm-stacks/cloudflare-mesh/docker-compose.yml(commit 08a7e54)——image cloudflare/mesh:latest(唔係 ghcr.io/mankeli 嗰個 ,實際 inspect 係 cloudflare/mesh)、固定 IP .77、TZ=Asia/Hong_Kong、MESH_NODE_TOKEN=${MESH_NODE_TOKEN}(Infisical 已有,同值)、SRCNAT_ENABLED=true、volume mesh_mesh_data(external: true,保留 data)
Dockhand stack 70 (repo 2,buildOnDeploy=false,repullImages=true);env 已加 + UPDATE stack_environment_variables SET environment_id=1 + UPDATE git_stacks SET environment_id=1 WHERE id=70
⚠️ 收編踩坑 :① 舊 host docker run 容器佔名 → docker stop + docker rm cloudflare-mesh(volume 保留);② 新版 image crash loop netlink: cache initialization failed: Operation not permitted → 要 cap_add: [NET_ADMIN, NET_RAW](SRCNAT 用 nftables);③ 之後 open tun: No such file or directory → 要 devices: [/dev/net/tun:/dev/net/tun](新版 image 用 kernel tun,唔係 userspace)
驗證 :容器 Up、WARP Connected / Network healthy、IP .77、Mesh IP 100.96.0.8 保持(volume registration 冇斷)、host 返程路由 100.96.0.0/12 via 172.21.0.77 保留
教訓 :收編容器時舊 host docker run 嘅隱藏設定(cap_add/devices/privileged)唔會喺 compose 出現——crash 後睇 logs(docker logs)判斷缺失 capability/device,唔好亂試
AdGuard DoT/DoQ 進展(2026-08-08 下午,已收工)
已完成 :acme.sh(host /home/opc/.acme.sh)用 CF DNS-01 攞 Let’s Encrypt cert(doh.benhoweb.com + dot.benhoweb.com 雙 SAN,ec-256,自動 renew);經 AdGuard API /control/tls/configure(certificate_chain/private_key 要 base64 )裝入 → valid_cert: True;853 DoT/DoQ listener 起咗,內網 172.21.0.45:853 openssl 實測 TLS ✅(Let’s Encrypt YE2)。
方案 B(CF Tunnel TCP 853)死因實測 :Tunnel config v80 加咗 dot.benhoweb.com → tcp://adguardhome:853(cloudflared 已 pickup)+ DNS CNAME proxied;但外網 104.21.10.131:853 / 172.67.131.122:853 全部超時,而 1.1.1.1:853 通 → CF edge 將 853 保留俾 1.1.1.1 DoT,唔按 SNI forward 去客戶 tunnel 。任何 Tunnel DoT 方案都死。Android Private DNS / iPhone DoT 固定 853,冇得繞。
用戶決策 :DoH 已用緊(https://doh.benhoweb.com/dns-query),DoT/DoQ 暫時唔處理 (記入 MEMORY.md)。
日後唯一出路 (Android/iPhone 系統級 DoT):開 IPv6 853——dot.benhoweb.com AAAA → 2603:c020:8021:2a00::10(固定 IPv6)+ host socat/轉發 853 → 172.21.0.45:853 + VCN SL 開 IPv6 853。
殘留 :tunnel ingress dot.benhoweb.com TCP 853(無效但保留)+ DNS CNAME proxied(保留)。