反向代理與限制
只要不是僅在自己的電腦上使用,就請在 Balnana 前面放一個 TLS 反向代理,例如 Caddy、Traefik 或 nginx。
| 設定 | 原因 |
|---|---|
BALNANA_PUBLIC_URL=https://balnana.example.com |
群組連結與電子郵件中的連結都以它為基礎。 |
BALNANA_TRUST_PROXY=true |
頻率限制才會從 X-Forwarded-For 看到真實的用戶端位址。否則所有用戶端都共用代理的位址,只要有一個用戶端在猜密碼或群組連結,就會擋住所有人。 |
BALNANA_BIND=127.0.0.1 |
代理在同一台機器上時,Compose 只會在 loopback 上開放 8080 連接埠。 |
在同一台機器上最簡單的 Caddy 設定,憑證也會自動幫你取得:
balnana.example.com { reverse_proxy 127.0.0.1:8080}開啟中的群組透過 Server-Sent Events(/api/v1/g/<token>/events)即時更新,因此:
- 代理不能緩衝這些回應。nginx 會遵守伺服器送出的
X-Accel-Buffering: no標頭;Caddy 與 Traefik 不需設定。 - 盡量使用 HTTP/2。瀏覽器對每個網站只允許六條 HTTP/1.1 連線,而每個開啟中的群組分頁都會佔用一條。
- 由於即時更新會保持連線,伺服器沒有設定整體讀取逾時。請讓代理去限制過慢的用戶端。
BALNANA_RATE_LIMIT 設定每個用戶端位址每分鐘的 API 請求數(預設 600;0 為關閉)。開啟時,每個用戶端位址還有以下限制:
- 一次最多建立 30 個群組,之後每分鐘一個;
- 一次最多建立 10 個帳號,之後每小時六個;
- 一次最多為 20 支手機註冊通知,之後每天 20 支;
- 最多保持 100 條即時連線。
每個帳號一次最多寄出 20 封電子郵件邀請(之後每分鐘一封),一次最多更改電子郵件地址五次(之後每小時六次),因此伺服器無法被拿來發送垃圾郵件。每個帳號以及管理員,不論來源為何,一次最多接受 20 次錯誤密碼,之後每小時 30 次。每個群組最多傳送通知給 200 支手機。
這些限制由每個伺服器程式各自保存在記憶體中。