Operator / Seller Subscription Manager (Cloudflare Worker + D1 + Telegram Bot UI)
This service is a multi-tenant subscription manager for VPN sellers/operators. It provides:
- Snapshot-based subscription delivery for massive scale
- Multi-upstream subscription mixing + extras
- Dynamic upstream URL templates per panel token with normalization (
origin,/sub/,/sub/<TOKEN>,{{TOKEN}}) - Customer subscription links with per-link overrides
- Open onboarding (no invite code required) for Telegram bot and web login
- Secure API for automation with JWT or API keys
- SSRF guard + DoH domain verify + rate limiting + audit logs
- Telegram Bot UI wizard with glass-style Persian UX
Core components
- Worker: HTTP + Telegram webhook + API layer
- D1: multi-tenant data model (operators, upstreams, extras, links, rules, domains, keys, snapshots)
- KV (optional): snapshot storage for
/subat scale (SNAP_KV) - Queues (optional): notification pipeline (
NOTIFY_QUEUE) - Telegram Bot UI: wizard for operator actions
- Health/Doctor:
/health,/api/v1/health/full, andscripts/doctor.js
Key tables:
operatorsoperator_settingsoperator_upstreamsextra_configssubscription_rulescustomer_linkscustomerssubscription_linksdomainsapi_keyslast_known_goodsnapshotsaudit_logsinvite_codes(kept for optional future admin workflows; not required)app_state(used for bot command sync timestamp)rate_limitsnotify_jobs
See schema.sql for full details.
/renders Telegram Login Widget./auth/telegramvalidates Telegram login payload.- Session tokens are signed with
SESSION_SECRET. - No invite code is required.
- Login sessions are stored in
localStoragefor the glassmorphism dashboard.
Authorization: Bearer <JWT>(from/auth/telegram)X-API-Key: <key>(stored hashed)
- Any Telegram user who sends a message is auto-created as an
activeoperator. - Defaults are provisioned automatically:
operator_settingssubscription_rules- default
customer_link
Send panel subscription URL/token directly in bot chat:
-
Bot extracts panel token (+ best-effort username decode)
-
Generates branded link:
- verified domain:
https://OP_DOMAIN/sub/<PANEL_TOKEN> - worker domain:
https://WORKER/sub/<OPERATOR_SHARE_TOKEN>/<PANEL_TOKEN>
- verified domain:
-
Returns premium Persian message + one-click app buttons
-
Triggers snapshot refresh in background for instant usability
-
Upstream normalization:
-
/set_upstream https://host:port/sub/=>https://host:port/sub/{{TOKEN}} -
/set_upstream https://host:port/sub/<TOKEN>=> stores template + sample token test -
/set_upstream https://host:port=>https://host:port/sub/{{TOKEN}} -
After save, status is
testing(with sample token) orpending_test(without sample).
Customer links:
- Verified domain customer links:
https://<domain>/sub/<customer_public_token> - Worker customer links:
https://<worker>/sub/<shareToken>/u/<customer_public_token> /sub/<token>on verified domain first checks customer token, then legacy panel token.
Subscription links:
- Add operator-level sources with
/add_sub_link - Add customer-level source during
/add_customerwizard by sending a full URL - Merge order: upstream + subscription links + extras (default)
نکته UI/UX: برای جلوگیری از خطا، ابتدا دستور را با مقادیر کوتاه تست کنید، سپس دادههای طولانی را ارسال کنید.
/panel- پنل اپراتور- مثال:
/panel
- مثال:
/help- راهنمای کامل- مثال:
/help
- مثال:
/set_upstream- تنظیم آپاستریم- مثال:
/set_upstream https://panel.example/sub/{{TOKEN}}
- مثال:
/set_domain- تنظیم دامنه- مثال:
/set_domain sub.goldmarket.ir
- مثال:
/verify_domain- بررسی تایید دامنه- مثال:
/verify_domain
- مثال:
/set_channel- تنظیم کانال اعلانها- مثال:
/set_channel @goldmarket_logs
- مثال:
/link- نمایش پیشوند لینک برند- مثال:
/link
- مثال:
/customers- لیست مشتریها- مثال:
/customers
- مثال:
/add_customer- افزودن مشتری- مثال:
/add_customer Ali-Tehran
- مثال:
/customer- جزئیات مشتری- مثال:
/customer CUSTOMER_ID
- مثال:
/del_customer- حذف نرم مشتری- مثال:
/del_customer CUSTOMER_ID
- مثال:
/toggle_customer- فعال/غیرفعال مشتری- مثال:
/toggle_customer CUSTOMER_ID
- مثال:
/add_sub_link- افزودن لینک اشتراک- مثال:
/add_sub_link https://source.example/sub/a1b2c3
- مثال:
/subs- لیست لینکهای اشتراک + شناسه- مثال:
/subs
- مثال:
/toggle_sub_link- فعال/غیرفعال لینک اشتراک- مثال:
/toggle_sub_link SUB_LINK_ID
- مثال:
/del_sub_link- حذف لینک اشتراک- مثال:
/del_sub_link SUB_LINK_ID
- مثال:
/extras- مدیریت افزودنیها- مثال:
/extras
- مثال:
/add_extra- افزودن کانفیگ- مثال کوتاه:
/add_extra VIP-Mix | vmess://... - مثال متن طولانی:
/add_extra Full-Mix | vmess://... vless://... ss://...
- مثال کوتاه:
/rules- قوانین خروجی- مثال:
/rules
- مثال:
/set_rules- تنظیم قوانین- مثال:
/set_rules merge=append dedupe=1 sanitize=1 prefix=VIP_ keywords=ads,spam format=base64
- مثال:
/rotate- ساخت لینک جدید اپراتور/مشتری- مثال:
/rotate
- مثال:
/logs- لاگهای اخیر- مثال:
/logs
- مثال:
/cancel- لغو عملیات در جریان- مثال:
/cancel
- مثال:
/admin_sync_commands- آپلود مجدد دستورات ربات (admin)- مثال:
/admin_sync_commands
- مثال:
- برای payload های بلند، بین خطوط از newline استفاده کنید.
- بهترین الگو برای
/add_extra:عنوان | متن-کانفیگ. - اگر متن شامل چند خط است، بعد از
|هر خط را جداگانه بفرستید. - در
/set_rulesفقط کلیدهای پشتیبانیشده را بفرستید:merge,dedupe,sanitize,prefix,keywords,format.
- Worker syncs commands via Telegram
setMyCommandsand stores timestamp inapp_state.commands_synced_at. - Sync is performed only if older than 7 days.
- Force sync immediately with admin command:
/admin_sync_commands
- SSRF guard: HTTPS only, private IP blocks, allow/deny list
- Rate limits: per IP, per user, per token
- Output limits: line/size controls and sanitization
- Domain verification via Cloudflare DoH TXT lookup
- Snapshot + LKG fallback architecture preserved
- Encrypted upstream URLs at rest (
ENCRYPTION_KEYorSESSION_SECRET) - Audit logging retained for operator/admin actions
- Optional channel notifications with queue/backoff
Install dependencies:
npm installRun tests:
npm test- Fresh Telegram user sends
hi→ operator auto-created active + bot hint (/panelor/help). - Fresh user sends panel URL → premium smart-paste response + branded link.
/panelshows upstream status (unsetthenok/invalid/error) and snapshot state./helpworks directly and via panel button.setMyCommandssync is persisted and/admin_sync_commandsforces refresh.