跳转到内容

反向代理与限制

只要不是仅在自己的电脑上使用,就请在 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 部手机发送通知。

这些限制由每个服务器程序各自保存在内存中。