跳到內容

反向代理與限制

只要不是僅在自己的電腦上使用,就請在 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 支手機。

這些限制由每個伺服器程式各自保存在記憶體中。