自行架設 Happier 中繼站:SSO、mTLS 和你自己的資料庫
Happier 採 MIT 授權,而每台裝置都會通過的那個中繼站,是一個你可以自己執行的容器。這一頁是隨它而來的控制項清單 — 伺服器強制執行什麼、它儲存什麼,以及它在執行時交給你的用戶端什麼。
在進入清單之前,先把形狀弄清楚是值得的。工作階段跑在你的開發者自己的電腦上,用他們已經有的供應商 CLI。中繼站在那些電腦和他們的手機、瀏覽器與桌面之間傳遞訊息。它是唯一必須從外部連得上的部分,也是我們請你自行架設的那一塊。
以下全部都是伺服器設定:那個容器上的環境變數,由那個容器強制執行,路徑中沒有任何由 Happier 營運的服務。全新伺服器的預設姿態是端對端加密儲存加上開放註冊,前提假設是多數人會把它放在 Tailscale 後面。如果你正在讀這一頁,你幾乎肯定想要這句話後半段的相反。
那個加密預設在底層代表什麼 — 哪一把金鑰在哪裡產生、你的中繼站最後持有什麼、沒有金鑰它能讀到哪些欄位 — 是加密架構,那是寫給開發者而不是寫給你的。誰問伺服器能看到什麼,就把那一頁寄給他;這一頁只談你能強制執行什麼。
SSO:GitHub 組織、OIDC 群組和用戶端憑證
身分委派給你已經在跑的任何東西。Happier 的工作是在每一次請求上強制執行它,而不只在註冊時,並且持續詢問。
- 要求身分提供者,每一次請求都重新檢查
- 匿名註冊預設是開啟的,因為多數自行架設的人把中繼站放在 Tailscale 後面就結束了。把它關掉、改為要求身分提供者,資格會在每一條需驗證的 HTTP 路由上、以及在即時連線的交握上被強制執行 — 不只在大門口。來自已不符合資格者的請求會被拒絕,而不是降級。
- GitHub 登入,限定於你的組織
- 允許特定的登入帳號,或要求隸屬於一個以上的 GitHub 組織,比對其中任一個或全部。建議的做法是透過 GitHub App 驗證成員資格,而不是用使用者自己的 OAuth 權杖,所以開發者撤銷同意時存取權不會留存下來 — 而且不會因此壞掉。
- OIDC 單一登入,每個提供者各有允許規則
- Okta、Entra ID、Auth0、Keycloak,任何有 discovery 文件的都可以。每個提供者有自己的允許規則:登入白名單、允許的電子郵件網域、使用者必須屬於其中任一個的群組、必須全部都屬於的群組。如果你的 IdP 在權杖裡省略群組、改回傳一個 overage 指標,Happier 會把該使用者視為不符合資格,而不是視為沒有群組。
- 來自你 MDM 的 mTLS 用戶端憑證
- 在你的反向代理終結 mTLS,並把驗證過的身分轉發給 Happier。從憑證的 SAN email 或 SAN UPN 對應它,這樣裝置輪替憑證後仍是同一個人,並用發行者和電子郵件網域白名單加以限制。除非你刻意啟用自動佈建,否則未知的憑證會被拒絕。
- 離職處理:成員資格依你設定的間隔重新檢查
- 成員資格會依你設定的間隔重新檢查 — 預設每天一次,最短可到一分鐘 — 結果會快取在身分紀錄上。有意思的設定是當你的 IdP 無法連上時會發生什麼:預設寬鬆,或者嚴格,此時伺服器會直接拒絕,而不是讓一份過期的資格檢查代替一份即時的。
儲存政策、保留期限,以及由你託管的資料庫
稽核人員問完驗證之後,第二個會問到的那些控制項。
- 三種儲存政策,而預設是最嚴格的那個
- 僅端對端加密,會拒絕明文寫入,這是全新伺服器的狀態。選用式,由帳號或工作階段決定。或者僅明文,給那些在基礎架構層管理加密、且想要伺服器端索引的組織 — 這是一個真實的取捨,明說出來:在那個設定下,伺服器可以讀取已儲存的內容。
- 由你設定的保留期限,不需讀取對話紀錄就能執行
- 預設關閉:什麼都不設定,伺服器就永久保留工作階段。開啟後,工作階段的規則刻意保守 — 只有在持久化旗標上顯示為不活躍、在兩個各自獨立的時間戳上都早於截止時間、且記憶體中未觀察到它是活的,一整棵工作階段樹才會被刪除,而截止時間會在刪除交易內再檢查一次。它從來不需要解密對話紀錄才能做出判斷。
- 一次為所有人關閉功能
- 語音、社交、錯誤回報上傳、附件、內嵌終端機、工作階段移交、已連結服務、額度計量 — 每一項都是伺服器上的一個環境變數,在執行時通告給用戶端。用戶端會依伺服器所說的可用範圍調整,所以被停用的功能是從 UI 上消失,而不是出現卻失敗。
- 速率限制,以及由你控制的診斷端點
- 一個全域限流器加上各路由的限制,每一個都有自己的時間窗和你選擇的鍵值策略 — 依 IP,或依使用者並在無法辨識時退回 IP,當一百位開發者共用一個 VPN 出口位址時,後者正是你要的。伺服器診斷快照在你啟用之前是關閉的,啟用之後也僅限擁有者。
- 一個 Docker 映像檔,後面接 SQLite 或 Postgres
- 已發佈的 relay-server 映像檔以非 root 使用者執行,內嵌了網頁 UI,預設在單一掛載磁碟區下使用 SQLite,並接受一份有文件記載的 Postgres 覆寫設定。MySQL 也可以,但要用原始碼建置的映像檔 — 預建的那個刻意不含該用戶端。請釘選不可變的標籤;映像檔不會自我更新。
如果你的組織實施零資料留存
如果你正在讀這一頁,你可能已經從另一個方向撞上這道牆。Anthropic 自己的 Remote Control 文件寫得很明白:有 Zero Data Retention 這類法遵要求的組織無法啟用它。在那種狀態下,Claude Code 管理主控台裡的開關是灰的,所以這不是擁有者可以另行決定的事。它在 Amazon Bedrock、Google Cloud 的 Agent Platform 和 Microsoft Foundry 上同樣無法使用,而且當流量被指向 LLM 閘道而非 api.anthropic.com 時會被停用。
這些都不是批評。Remote Control 把工作階段的對話紀錄留在 Anthropic 伺服器上,才能在你的裝置之間同步,而一個已簽約要求零留存的組織,正確地排除了這個做法。這只是對另一個問題的另一個答案,而如果你的組織處在那個位置,你自己執行的中繼站就是剩下的那種答案。
採購拿到的東西:一份 MIT 授權和一個容器映像檔
MIT。不是 source-available,不是把驗證堆疊放在商業層級後面的 open-core,也不是 AGPL。這一頁上的所有東西都和用戶端在同一個儲存庫裡,採同一份授權,而且沒有任何一項需要和我們簽約才能取得。如果你組織的政策是 copyleft 不進門,那項政策在這裡不會受阻。
上面的控制項沒有一個放在付費牆後面:沒有企業版可買,也沒有任何一項需要談席次數量。依你的採購流程而定,那要嘛是這一頁最令人安心的部分,要嘛是最令人擔心的部分。你得到的是原始碼、一份 MIT 授權和一個容器映像檔。
架起一個測試中繼站,檢查它強制執行什麼
誠實的順序是:在一台用完即丟的主機上把中繼站架起來,讓一位開發者連上去,然後讀 GET /v1/features,看看那台伺服器究竟向它的用戶端通告了什麼。那個回應就是契約,也是最快確認你設下的政策確實會被用戶端遵守的方式。
curl -fsSL https://happier.dev/install | bashDocker 部署指南涵蓋映像檔、磁碟區和 Postgres 覆寫設定。伺服器驗證參考涵蓋上面提到的每一個變數,包括需要 GitHub 或 OIDC 提供者的公開伺服器設定範例。

