🚀 Multi-Node Resilience, ECH & Scale
- 🌐 Multi-node resilience — client/inbound edits survive an offline node, remote updates are scoped to a single inbound, and stale node snapshots no longer re-enable disabled clients or miscount traffic.
- 🔐 End-to-end ECH — now carried in TLS share links, JSON subscriptions, outbound import, and per-entry external proxy.
- 🧩 Modern Xray JSON subscriptions — new format with a unified finalmask editor.
- 🧭 Clash routing — routing rules and an enable-routing option for Clash subscriptions.
- 💾 DB migration — SQLite ⇄
.dumpconversion and Download Migration from the Overview page.
⚡ Performance — scales to ~200k clients
Benchmarked on PostgreSQL 16 (gains are largest on Postgres, where every round-trip pays network latency):
| Operation | Scale | Before | After | Improvement |
|---|---|---|---|---|
Toggle one client (SyncInbound)
| 50k-client inbound | 8m 54s | 0.9s | ~600× (~99.8%) |
| Seed clients | 50k clients | 2m 48s | 1.6s | ~100× (~99%) |
| Bulk create | large inbound | 8m 35s | ~1–5s | ~99% |
| Bulk detach | large inbound | 52s | ~4s | ~92% |
| Bulk delete | large inbound | 16s | ~1–4s | ~85% |
| Bulk adjust | large inbound | 20s | ~7–10s | ~55% |
| Delete-all clients | 100k-client inbound | ❌ crashed (param limit) | ~7s | now works |
| Bulk group add/remove | 100k clients | — | ~6s | scaled |
| Full client list | 100k clients | — | ~1s | scaled |
GetClientTrafficByEmail
| flat in N | 439ms | ~1.5ms | ~290× (~99.7%) |
🆕 New
- feat(sub): modern xray JSON format with unified finalmask editor (#4912) @biohazardous-man
- feat(Clash): add routing rules and enable-routing option for Clash subscriptions (#4904) @Misfit-s
- feat(migrate-db): SQLite ⇄ .dump conversion and Download Migration in Overview
⚡ Update & improvement
- perf(clients): make SyncInbound bulk to fix large-inbound timeouts (#4885)
- perf(clients): scale add/delete and bulk client operations
- perf(clients): chunk IN queries and de-quadratic bulk delete/group/list
- perf(clients): scale-audit remaining client/inbound endpoints to 200k
- chore(deps): bump i18next from 26.3.0 to 26.3.1 in /frontend (#4901)
- i18n: add 1-year expiration to language cookie (#4890) @lim-kim930
- docs(contributing): refresh frontend guide and add Postgres launch profile
🐞 Bug fixed
- fix(node): keep client/inbound edits working when a node is offline (#4923, #4931)
- fix(multi-node): scope remote client update/delete to one inbound (#4892)
- fix(node-traffic): prevent stale node snapshot from re-enabling disabled client (#4917) @younesvatan78
- fix: restart remote xray after disabling a client to kill active sessions (#4918) @younesvatan78
- fix(traffic): count local traffic for clients whose shared row is node-owned (#4921)
- fix(sub): include ECH config in TLS share links and JSON subscription
- fix(outbound): import ech and pcs from TLS share links
- fix(external-proxy): relabel "Host" as "Address", add per-entry ECH (#4935)
- fix(ssl): clean ECC state, guard cert reuse, register renew hook (#4875)
- fix(fail2ban): exempt SSH and panel ports from IP-limit ban (#4896)
- fix(migrate-db): drop legacy client_traffics FK before Postgres copy (#4882)
- fix(tgbot): ignore commands for other bots (#4894) @kanghouchao
Reports
Full Changelog: v3.2.7...v3.2.8