3x-ui/internal/web/service
MHSanaei d97bd8643e
feat(mtproto): adopt dolonet/mtg-multi and make MTProto inbounds multi-client
Replace the upstream 9seconds/mtg sidecar with the dolonet/mtg-multi fork so a single MTProto inbound can serve many per-user secrets. Each panel client is now one named FakeTLS secret in the fork's [secrets] section: clients are first-class (attach/detach, limits, expiry, per-client tg:// links) exactly like every other protocol, mirroring the WireGuard multi-client model. Per-client traffic and online status come from the fork's /stats JSON API (its Prometheus output has no per-user label), fed into the existing email-keyed client_traffics accumulator; an optional throttle caps concurrent connections. A one-time seeder converts each legacy single-secret inbound into a one-client inbound.

The fork ships only linux/darwin amd64/arm64 binaries but is pure Go, so provisioning builds it from source for every supported platform (release.yml, DockerInit.sh) while keeping the panel-expected mtg-<os>-<arch> filename and the 'run' verb, so process.go is untouched. Also fixes a pre-existing update.sh gap that never renamed the mtg binary for armv6/armv7 updates.
2026-07-06 16:04:32 +02:00
..
email style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
integration style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
outbound feat(outbound): add real-delay connection test mode 2026-07-06 08:35:48 +02:00
panel fix: make all self-managed file downloads/installs atomic, with real completion status (#5711) 2026-07-02 18:19:33 +02:00
tgbot feat(tgbot): register usage, inbound, restart and clearall in the bot command menu 2026-07-03 09:36:53 +02:00
api_scale_postgres_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
backup_filename_test.go feat(backup): prefix backup filenames with date and time (#5606) 2026-06-27 12:08:20 +02:00
bulk_clients_test.go fix(node): stop client edits from tearing down node inbounds and harden reconcile fingerprints 2026-07-05 02:06:58 +02:00
bulk_traffic_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_add_dedupe_test.go fix(client): stop duplicate client entries accumulating in inbound settings 2026-07-05 21:17:25 +02:00
client_apply_field_test.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
client_bulk.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
client_bulk_flow_test.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
client_bulk_reenable_test.go fix(clients): re-enable depleted clients on API renewal (#5619) 2026-06-29 13:39:03 +02:00
client_crud.go feat(mtproto): adopt dolonet/mtg-multi and make MTProto inbounds multi-client 2026-07-06 16:04:32 +02:00
client_delete_node_full_test.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
client_effective_flow_test.go fix(flow): restore XTLS Vision when an inbound becomes flow-eligible (#5520) 2026-06-24 13:02:42 +02:00
client_email_validation_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_external_link.go feat(sub): per-client external links and remote subscriptions 2026-06-14 20:57:14 +02:00
client_flow_isolation_test.go fix: enable XTLS vision flow for VLESS+XHTTP+vlessenc in UI and share links (#5157) (#5185) 2026-06-11 12:04:02 +02:00
client_group_node_sync_test.go fix(client): clear group when removed in the single-client editor 2026-06-17 15:55:56 +02:00
client_group_reset_test.go fix(groups): keep group traffic totals stable across client resets and deletes 2026-07-02 09:17:47 +02:00
client_groups.go refactor: use the built-in max/min to simplify the code (#5751) 2026-07-05 01:58:18 +03:00
client_inbound_apply.go feat(mtproto): adopt dolonet/mtg-multi and make MTProto inbounds multi-client 2026-07-06 16:04:32 +02:00
client_link.go fix(sub): resolve subscription clients and stats from normalized tables 2026-07-02 16:58:00 +02:00
client_locks.go fix(client): stop duplicate client entries accumulating in inbound settings 2026-07-05 21:17:25 +02:00
client_lookup.go fix(flow): restore XTLS Vision when an inbound becomes flow-eligible (#5520) 2026-06-24 13:02:42 +02:00
client_paging.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_portable.go fix(groups): keep group traffic totals stable across client resets and deletes 2026-07-02 09:17:47 +02:00
client_sync_multiprotocol_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
client_traffic.go fix(groups): keep group traffic totals stable across client resets and deletes 2026-07-02 09:17:47 +02:00
client_update_enable_test.go fix(clients): re-enable depleted clients on API renewal (#5619) 2026-06-29 13:39:03 +02:00
client_wireguard.go feat(wireguard): make client allowedIPs editable with validation 2026-07-02 09:45:54 +02:00
client_wireguard_crud_test.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
client_wireguard_test.go feat(wireguard): make client allowedIPs editable with validation 2026-07-02 09:45:54 +02:00
config.json feat: apply inbound/outbound/routing changes live via Xray gRPC API 2026-06-10 23:01:33 +02:00
del_shared_email_runtime_test.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
fallback.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
global_traffic_test.go fix(node): stop force-restarting a node's Xray when its clients auto-disable 2026-07-02 13:27:36 +02:00
host.go feat(hosts): managed Hosts for per-host subscription link overrides (#5409) 2026-06-17 12:06:55 +02:00
host_test.go feat(hosts): managed Hosts for per-host subscription link overrides (#5409) 2026-06-17 12:06:55 +02:00
inbound.go feat(mtproto): adopt dolonet/mtg-multi and make MTProto inbounds multi-client 2026-07-06 16:04:32 +02:00
inbound_autorenew_test.go perf(scale): speed up traffic, auto-renew, and node bulk ops at 50k-100k clients 2026-06-20 10:35:46 +02:00
inbound_client_ips.go fix(node): stop Postgres deadlocks and deleted-client resurrection in node sync 2026-07-02 13:37:06 +02:00
inbound_client_ips_merge_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
inbound_client_traffic_test.go fix(traffic): persist delayed-start expiry only for converted clients 2026-07-02 16:24:18 +02:00
inbound_clients.go feat(mtproto): adopt dolonet/mtg-multi and make MTProto inbounds multi-client 2026-07-06 16:04:32 +02:00
inbound_disable.go fix(traffic): disable depleted clients by id instead of a second full scan 2026-07-02 16:24:18 +02:00
inbound_flow_restore.go fix(flow): restore XTLS Vision when an inbound becomes flow-eligible (#5520) 2026-06-24 13:02:42 +02:00
inbound_flow_restore_test.go fix(flow): restore XTLS Vision when an inbound becomes flow-eligible (#5520) 2026-06-24 13:02:42 +02:00
inbound_import_external_proxy_test.go fix(inbound): convert legacy externalProxy to hosts on import 2026-06-27 13:50:06 +02:00
inbound_import_shared_clients_test.go fix(inbound): avoid UNIQUE email constraint when importing inbounds that share clients 2026-06-12 13:00:04 +02:00
inbound_migration.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
inbound_migration_test.go Test-quality audit: fix 2 prod bugs, strengthen weak tests, add mutation/fuzz/CI tooling (#5345) 2026-06-15 15:17:03 +02:00
inbound_mtproto_test.go feat(mtproto): adopt dolonet/mtg-multi and make MTProto inbounds multi-client 2026-07-06 16:04:32 +02:00
inbound_node.go fix(client): stop duplicate client entries accumulating in inbound settings 2026-07-05 21:17:25 +02:00
inbound_node_ips.go fix(node): stop Postgres deadlocks and deleted-client resurrection in node sync 2026-07-02 13:37:06 +02:00
inbound_node_ips_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
inbound_node_reconcile_test.go fix(node): stop one rejected inbound from starving a node's traffic sync 2026-07-03 09:47:30 +02:00
inbound_options_node_address_test.go fix(panel): use the hosting node address for WireGuard client configs (#5679) 2026-07-03 01:12:32 +02:00
inbound_protocol.go fix: enable XTLS vision flow for VLESS+XHTTP+vlessenc in UI and share links (#5157) (#5185) 2026-06-11 12:04:02 +02:00
inbound_protocol_test.go fix: enable XTLS vision flow for VLESS+XHTTP+vlessenc in UI and share links (#5157) (#5185) 2026-06-11 12:04:02 +02:00
inbound_sub_sort_test.go feat(sub): per-inbound sort order for subscription links 2026-06-12 12:03:22 +02:00
inbound_sublink.go feat(inbounds): apply remark template to Export all inbound links 2026-06-27 11:22:45 +02:00
inbound_tgbot_lookup_test.go fix(tgbot): find clients by tgId regardless of settings JSON formatting 2026-07-05 20:18:59 +02:00
inbound_traffic.go fix(db): clamp traffic counters below int64 max and repair overflowed rows 2026-07-05 20:33:09 +02:00
inbound_traffic_global.go feat(node-sync): push global client usage to nodes for display and local enforcement 2026-06-11 15:14:08 +02:00
inbound_update_tag_test.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
inbound_util.go feat(sub): per-inbound sort order for subscription links 2026-06-12 12:03:22 +02:00
metric_history.go perf(metrics): tiered rollup history (7d at ~1.5MB) and cleaner ranges 2026-06-25 23:30:13 +02:00
metric_history_test.go chore: bump deps and modernize test loops 2026-06-26 00:10:30 +02:00
node.go fix(node): stop the offline-sync toast firing on saves to online nodes 2026-06-29 18:35:38 +02:00
node_bulk_dispatch_test.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
node_client_breakdown_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_client_expiry_sync_test.go fix(node): show the activated first-use deadline on the Clients page 2026-07-02 09:36:07 +02:00
node_client_traffic_sum_test.go fix(node): stop Postgres deadlocks and deleted-client resurrection in node sync 2026-07-02 13:37:06 +02:00
node_delete_orphan_test.go fix(nodes): block node delete while inbounds are still attached (#5394) 2026-06-20 01:09:53 +02:00
node_dirty_test.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
node_mtls.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
node_mtls_test.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
node_netmetrics_test.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
node_origin_guid_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_shared_guid_test.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_tag_sync_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
node_test.go feat: allow selecting inbounds synchronized from nodes (#5178) 2026-06-11 20:48:26 +02:00
node_tree.go fix(nodes): cloned-node attribution, node-hosted client display (online/speed/counts), and sync robustness (#5488) 2026-06-22 20:20:55 +02:00
node_tree_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
outbound_subscription.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
outbound_subscription_test.go fix(subscription): bound outbound response body (#5493) 2026-06-23 10:48:01 +02:00
port_conflict.go fix(inbounds): flag conflicts with the reserved Xray API port (#5304) 2026-06-15 17:21:06 +02:00
port_conflict_test.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
reality_scan.go feat(reality): add live REALITY target scanner with IP/CIDR discovery 2026-06-26 22:18:47 +02:00
reality_scan_test.go feat(reality): add live REALITY target scanner with IP/CIDR discovery 2026-06-26 22:18:47 +02:00
scale_helpers_test.go test(scale): cover traffic poll, ws payloads, ip-limit job, sub and xray config at 500k 2026-07-02 16:12:46 +02:00
server.go feat(db): add pgclient command to install or upgrade PostgreSQL client tools 2026-07-06 09:24:18 +02:00
server_pg_restore_test.go feat(db): add pgclient command to install or upgrade PostgreSQL client tools 2026-07-06 09:24:18 +02:00
server_vlessenc_test.go feat(web): vless encryption new modes (#5517) 2026-06-24 21:22:42 +02:00
server_xray_checksum_test.go fix(xray): verify the release archive checksum before installing (#5396) 2026-06-20 00:37:35 +02:00
setting.go feat(settings): let users clear stored secrets from the UI 2026-07-02 13:57:34 +02:00
setting_mtls.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
setting_mtls_test.go feat(node): node hardening — mTLS, hashed+zstd reconcile transport, per-node net metrics (#5382) 2026-06-16 12:19:33 +02:00
setting_security_test.go feat(settings): let users clear stored secrets from the UI 2026-07-02 13:57:34 +02:00
shadowsocks_client_key_test.go fix(inbound): regenerate SS-2022 client PSKs on method key-size change 2026-06-17 14:11:35 +02:00
sub_uri_base_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
sync_scale_postgres_test.go fix(node): fully delete clients on nodes instead of only detaching them 2026-07-05 20:28:26 +02:00
traffic_poll_scale_test.go test(scale): cover traffic poll, ws payloads, ip-limit job, sub and xray config at 500k 2026-07-02 16:12:46 +02:00
traffic_writer.go fix(service): serialize client/inbound writes to prevent Postgres deadlock 2026-06-17 15:55:47 +02:00
traffic_writer_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
url_safety.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
ws_payload_scale_test.go test(scale): cover traffic poll, ws payloads, ip-limit job, sub and xray config at 500k 2026-07-02 16:12:46 +02:00
xray.go fix(xray): reconcile client auto-disable through the API instead of a forced restart 2026-07-02 09:26:53 +02:00
xray_config_inject_test.go feat(mtproto): route Telegram egress through Xray routing rules 2026-06-12 17:58:45 +02:00
xray_config_scale_test.go test(scale): cover traffic poll, ws payloads, ip-limit job, sub and xray config at 500k 2026-07-02 16:12:46 +02:00
xray_metrics.go feat(notifications): event bus architecture with Telegram and SMTP subscribers (#5326) 2026-06-15 21:03:41 +02:00
xray_setting.go style: adopt golangci-lint v2 and resolve all findings 2026-06-27 15:42:22 +02:00
xray_setting_routing_sync.go fix(routing): sync xray rules when panel inbound tags change or are deleted (#5367) 2026-06-20 01:18:31 +02:00
xray_setting_routing_sync_test.go fix(routing): sync xray rules when panel inbound tags change or are deleted (#5367) 2026-06-20 01:18:31 +02:00
xray_setting_test.go refactor: focused service files, leaf subpackages, and an internal/ layout (#5167) 2026-06-10 15:19:22 +02:00
xray_strip_rules_test.go Add Enable/Disable Toggle for Xray Routing Rules (#5296) 2026-06-15 00:43:49 +02:00
xray_wireguard_config_test.go feat(wireguard): multi-client support 2026-06-28 00:44:38 +02:00
xray_xhttp_session_test.go feat(xhttp): support sessionID* rename + sessionIDTable/Length (xray v26.6.22) (#5506) 2026-06-23 17:38:16 +02:00