Restored from v0.2.4:
- notifiers/: 14 push channels (bark/serverchan/telegram/lark/webhook/wechat/discord/smtp/...)
- push-user.service.ts: multi-user push config linked to cloud_configs.promotion_account
- notification.service.ts: full dispatcher with per-config + global fallback
New integrations:
- cloud.service.ts: notifyConfigEvent on save_success/cookie_expire/save_fail
- admin.routes.ts: 7 new API endpoints for push users, notify providers, channel test
- database.ts: migration for cloud_configs.notify_config column
How it works:
- Configure push channels in /admin/system-configs (global_notify_config JSON)
- Or per-cloud: link push_users.account = cloud_configs.promotion_account
- Notify events: save_success (green), cookie_expire (red), save_fail >=3 consecutive (yellow)
- db-status endpoint: redis_status returns 已连接/未连接/错误 instead of English
- Frontend compares k.redis_status === "已连接" → green text-success badge
- English connected was not matching, always showed yellow text-warning
- db-status endpoint: fallback to config.dbPath when system_config db_path is empty
- test-redis endpoint: handler wasnt async, causing Promise serialization to {} instead of result
- Both endpoint handlers now properly async with await
- AdminDashboard: M() now sends admin_token from localStorage with fetch
- rate-limit: keyGenerator uses req.ip instead of req.socket.remoteAddress
(Express trust proxy reads X-Forwarded-For for real client IP)
- main.ts: moved global rateLimiter after express.static so static files
(JS/CSS/admin page/favicon) are never rate-limited