16 Commits
Author SHA1 Message Date
kazeyukiro a690ecd3f4 fix(auth,ui): reduce SQLite busy 503; TCP/UDP dual connection chart
Auth user lookup retries briefly on DB lock; SQLite opens with
busy_timeout and a single connection. Dashboard tracks TCP/UDP series
and draws them as solid/dashed lines like traffic rates.
2026-10-02 04:52:22 +00:00
kazeyukiro 7e8094938c fix(ci): remove unused log import in database.go 2026-09-21 00:18:00 +08:00
kazeyukiro fee8f6535d fix(ci): gofmt database.go and user/api.go 2026-09-21 00:10:00 +08:00
kazeyukiro 79e6c778a1 chore: remove HWID feature (subscription device binding) 2026-09-21 00:00:00 +08:00
kazeyukiro 37a5fa0284 feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
feat(traffic): per-node usage + traffic multiplier billing
- Listener.traffic_multiplier (default 1): billable = raw × multiplier
- user_node_traffics: raw per user per node; user quota uses billable totals
- Collector attributes deltas by inbound name; resets clear node rows
- API GET /users/:id/node-traffic
- UI: node multiplier on Listeners; Users node-traffic modal (desktop+mobile)
2026-09-20 23:50:00 +08:00
kazeyukiro 277e65c09a fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
fix(db): drop legacy HWID index before AutoMigrate
SQLite index names are global; uidx_user_hwid left by hw_id_devices
blocked creating hwid_devices and rolled back panel updates.
prepareHWIDDeviceSchema now runs before AutoMigrate and drops the
conflicting index plus legacy/broken HWID tables.
2026-09-20 23:35:00 +08:00
kazeyukiro 00cc0b9f4b fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
fix(db): HWID table column hwid (GORM acronym mapping)
GORM snake_case mapped HWID -> h_w_i_d and table -> hw_id_devices, so
SELECT ... hwid failed with "no such column: hwid". Explicit column tags,
table name hwid_devices, and startup repair that drops broken tables.
2026-09-20 23:15:00 +08:00
Z User 2c625c8790 fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
fix(db): silence GORM record-not-found noise for optional settings
Telegram and traffic_reset_day lookups are expected to miss until configured;
default Info logger flooded journal every scheduler tick and looked like errors.
2026-09-10 14:23:21 +00:00
Z User 7ce3796d9b feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
feat(hwid): Happ/Remnawave-compatible subscription HWID device limit
- Track x-hwid / x-device-os / x-ver-os / x-device-model on sub fetch
- Per-user hwid_limit; response headers x-hwid-active|not-supported|max-devices-reached
- Admin API list/delete/clear devices; user form field
2026-09-07 14:32:02 +00:00
Z User bcb1d50393 feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
feat(cluster): sync remote node mirrors and merge into local user subscription
- Cache remote nodes + URI/client_yaml via POST /cluster/:id/sync-nodes
- Bind local users to mirrors; Clash YAML and v2ray base64 subs merge remote entries
- UI: Sync nodes on cluster page; remote multi-select in user bind dialog
2026-09-04 15:41:26 +00:00
風雪 69df7e5165 fix(db): Unscoped dedupe so unique indexes cannot block panel boot 2026-08-28 22:48:56 +08:00
風雪 9d95c97e7e fix(security): InitDB dedupe + cluster private URL hardening 2026-08-28 22:33:19 +08:00
風雪 5fa916d982 security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
security: restrict SQLite database filesystem permissions
2026-08-18 09:39:04 +08:00
風雪 80c6ef4996 feat: migrate listener templates and versions 2026-08-17 12:36:59 +08:00
風雪 d238ba470e feat: migrate PanelSetting/RemoteServer; ACME/nginx templates 2026-08-16 22:56:07 +08:00
dzx941 5b4cb63a73 fix: align listener generation with mihomo official spec
- Port now supports mihomo ports format (single/range/list)
- Add explicit RoutingMark field support
- Auto-propagate UDP flag for vmess/vless/trojan/anytls/trusttunnel
- Update validator to accept port ranges
- Sync visual config and client converter port types
- Rename module from dzx941 to kazeyukiro
- Fix missing ExpiresAt in JWTClaims
- Fix nodeDTO Port type to string
- Fix frontend tsconfig and add missing dependencies
2026-08-16 09:21:42 +08:00