使用说明
电报机器人平台+MCP服务器
此存储库包含:
- Telegram机器人平台 --客户端机器人+WebApp(注册、登录、电报ID恢复)。部署到
/www/wwwroot/telegrambot/ybrjch.qgsm.store. - MCP服务器 --可选附加组件(订单、服务、提供商、管理员聊天)。单独出售;核心产品并不依赖于它。
Telegram机器人平台(客户端)
具有WebApp注册/认证和安全恢复功能的生产就绪Telegram Bot。为商业分发而构建(Docker Compose、备份/恢复、安装程序占位符、许可证挂钩)。
回购布局
app/-节点(Telegraf+Fastify)客户端机器人程序+WebApp+APImigrations/--SQL迁移docker/--Dockerfiles和composescripts/--安装、备份.sh、还原器。README.md--这个文件
目标目录(VPS)
| Bot | VPS上的路径 |
|---|---|
| 客户 | /www/wwwroot/telegrambot/ybrjch.qgsm.store |
| 管理员 | /www/wwwroot/telegrambot/jqidyrb.qgsm.store |
同一存储库在两个目录中展开。每个人都有自己的 .env (自己的) BOT_TOKEN, WEBAPP_BASE_URL)和必要时自己的港口(客户3000,管理员3001)。
路径
- Webhook:
/telegram-webhook - WebApp:
/webapp/register,/webapp/login,/webapp/recover - API
/api/*
设置
-
环境
cp app/.env.example .env # Edit: BOT_TOKEN, WEBAPP_BASE_URL, ADMIN_IDS, DATABASE_URL (or POSTGRES_PASSWORD for Docker) -
使用Docker Compose运行
docker compose -f docker-compose.telegram.yml up -d --build迁移在容器启动时运行。
-
或者安装脚本(提示输入env、创建.env、启动容器、打印webhook命令)
./scripts/install.sh -
设置Telegram webhook
https://api.telegram.org/bot<BOT_TOKEN>/setWebhook?url=https://ybrjch.qgsm.store/telegram-webhook
Nginx(aaPanel)
代理到 http://127.0.0.1:3000:
/→http://127.0.0.1:3000/webapp/*→http://127.0.0.1:3000/telegram-webhook→http://127.0.0.1:3000
普通HTTP(不需要websocket/SSE)。HTTPS正在生产中。
备份和恢复
-
备份 (将Postgres转储到
./backups/<date>.sql.gz):./scripts/backup.sh # Or: ./scripts/backup.sh /path/to/dir -
恢复 (来自a
.sql.gz档案;删除公共架构,然后恢复):./scripts/restore.sh ./backups/telegram_bot_YYYYMMDD_HHMMSS.sql.gz如果需要,请重新运行迁移:
docker compose -f docker-compose.telegram.yml run --rm telegram-bot node dist/db/migrate.js
下载到VPS(进入战斗目录)
在VPS上,我们展开两个文件夹进行实时测试:
-
在VPS上创建目录 (如果没有):
sudo mkdir -p /www/wwwroot/telegrambot/ybrjch.qgsm.store sudo mkdir -p /www/wwwroot/telegrambot/jqidyrb.qgsm.store sudo chown "$USER:$USER" /www/wwwroot/telegrambot/ybrjch.qgsm.store sudo chown "$USER:$USER" /www/wwwroot/telegrambot/jqidyrb.qgsm.store -
下载项目 (一个选项):
- Git (如果服务器上有回购):
cd /www/wwwroot/telegrambot/ybrjch.qgsm.store && git clone <URL_репо> . # клиент cd /www/wwwroot/telegrambot/jqidyrb.qgsm.store && git clone <URL_репо> . # админ - 手动装货:复制回购内容(文件夹)
app/,docker/,migrations/,scripts/,docker-compose.telegram.yml等等。D.其他事项)在两个目录中(通过SCP、RSYNC或AAPanel→File窗格)。
- Git (如果服务器上有回购):
-
在每个目录 创建
.env运行:- 客户 (
ybrjch.qgsm.store):WEBAPP_BASE_URL=https://ybrjch.qgsm.store港口3000自己的BOT_TOKEN. - 管理员 (
jqidyrb.qgsm.store):WEBAPP_BASE_URL=https://jqidyrb.qgsm.store在Compose中指定端口3001(不与客户发生冲突)BOT_TOKEN. 然后在每个文件夹中:docker compose -f docker-compose.telegram.yml up -d --build.
- 客户 (
-
在 aaPanel 配置两个站点:
ybrjch.qgsm.store→ 代理на127.0.0.1:3000,jqidyrb.qgsm.store→ 代理на127.0.0.1:3001SSL(Let’s Encrypt) -
网络钩子 对于每个机器人:
- 客户:
https://api.telegram.org/bot<CLIENT_TOKEN>/setWebhook?url=https://ybrjch.qgsm.store/telegram-webhook - 管理员:
https://api.telegram.org/bot<ADMIN_TOKEN>/setWebhook?url=https://jqidyrb.qgsm.store/telegram-webhook
- 客户:
迁移到新的VPS
- 在新的VPS上:安装Docker、克隆仓库、复制
.env. - 还原:运行
./scripts/restore.sh <backup.sql.gz>(DB正在运行或使用DATABASE_URL). - 开始:
docker compose -f docker-compose.telegram.yml up -d. - 将域和webhook指向新主机。
Env(电报平台)
| 变量 | 默认值 | 描述 |
|---|---|---|
NODE_ENV |
生产 | |
PORT |
3000 | 应用程序端口 |
BOT_TOKEN |
- | 电报机器人令牌 |
ADMIN_IDS |
- | 逗号分隔的电报ID(字符串) |
WEBAPP_BASE_URL |
https://ybrjch.qgsm.store | 没有尾随斜线 |
WEBHOOK_PATH |
/电报webhook | |
DATABASE_URL |
- | Postgres URL(在Docker中:postgresql://telegram_bot:...@邮政编码:5432/telegram_bot) |
SESSION_TTL_MIN |
15 | 认证会话TTL(分钟) |
RECOVERY_TOKEN_TTL_MIN |
30 | 恢复令牌TTL(分钟) |
OTP_TTL_MIN |
10 | OTP有效期(分钟) |
OTP_MAX_ATTEMPTS |
2 | 最大OTP验证尝试次数 |
OTP_MAX_SENDS |
2 | 每次恢复的最大OTP发送数 |
PIN_MAX_ATTEMPTS |
3 | 每次恢复的最大PIN尝试次数 |
RECOVERY_LOCK_HOURS |
24 | 疲劳后的锁定时间 |
FLOOD_PROTECTION_ENABLED |
false | 启用洪水阻断 |
FLOOD_HARD_BLOCK_ENABLED |
false | ≥3次阻滞后出现不确定阻滞 |
FLOOD_WINDOW_SEC |
2 | 洪水窗口(秒) |
FLOOD_MAX_EVENTS |
5 | 块前窗口中的最大事件数 |
FLOOD_BLOCK_MIN |
30 | 块持续时间(分钟) |
SMS_PROVIDER |
mock | mock |
TOKEN_HASH_SECRET |
- | 令牌哈希的可选密钥 |
LICENSE_KEY |
- | 树桩 |
LICENSE_SERVER_URL |
- | 树桩 |
测试计划
- /以新用户身份启动 → 按钮«Регистрация»→ 注册流程(姓名、电话、PIN)→ 用户行已创建。
- /以现有用户身份启动 →Button“登入”→Profile Shown(“您已注册”+name,masked phone,recovered flag)。
- 恢复 --管理员运行
/issue_recovery <new_tg_id>→ open/recover?token=...→ 请求OTP(中立消息)→ 验证OTP→ 验证PIN→tg_id更新,tg_id_prev保存,recovered_flag确实如此。 - 使用错误的手机进行恢复 --流量相同;必须显示相同的中性信息;审核日志显示
recovery_phone_not_found. - 洪水 --与
FLOOD_PROTECTION_ENABLED=false:垃圾邮件仅触发审核(flood_suspected).启用后:用户收到一条阻止消息,然后进一步的更新仅为ACK(无回复);机器人还活着。
WebApp安全模型
- 仅限电报 --WebApp只能在Telegram内部运行。开场
/webapp/*或致电/api/*从正常浏览器返回 403 (或API调用失败),因为有效的Telegram WebAppinitData是API所必需的,并且/webapp/*只有当请求来自Telegram的WebView(用户代理检查)或具有有效的initData时,才会提供HTML。 - 直接浏览器访问被阻止 --开幕式
https://domain/webapp/register在正常浏览器中返回403。从Telegram应用程序(WebApp按钮)打开相同的URL是有效的。 - 会话绑定到Telegram用户 --验证Telegram后
initData,服务器将会话绑定到tg_id对于注册和登录,session.tg_id必须等于已验证的Telegram用户id;否则,请求是 401未经授权。被盗的会话链接不能被其他Telegram用户使用。 - 恢复令牌绑定到新的tg_id --恢复令牌是为特定对象发放的
bound_tg_id。每个恢复端点都会检查验证的Telegram用户id是否等于recovery_tokens.bound_tg_id否则 401。不能使用其他帐户中被盗的令牌滥用恢复。 - 速率限制 --轻量级内存速率限制适用于所有
/api/*路由:对于一般端点,每个用户每分钟60个请求,对于恢复端点,每分钟20个请求。超额回报 429请求太多 并接受审计(rate_limit_exceeded).
MCP服务器(可选附加组件)
Telegram Bot项目的生产就绪MCP服务器。为订单、服务、供应商、管理员提供MCP工具;内部管理员聊天;通过OpenAI API的LLM(可选Ollama回退);承载认证;利率限制;审计日志。
技术栈
- Node.js 20 +TypeScript
- 禁食 (选择性能、原生TypeScript、内置模式验证)
- PostgreSQL + 瑞迪斯
- MCP-SDK (可流式传输HTTP+stdio)
- 开放人工智能 API(默认);可选的 奥拉玛 作为OpenAI回退的首选
- Docker Compose + 引擎X + 系统守护进程
VPS文件系统和外壳工具(MCP)
如果MCP服务器在VPS上运行,则Cursor可用于有限目录中的文件和命令:
tool描述
|------|----------|
| vps_fs_list –显示文件/文件夹(相对于数据库或下面的路径)。 |
| vps_fs_copy 复制文件或目录。 |
| vps_fs_move 移动(重命名)文件或目录。 |
| vps_shell_exec 执行shell命令(例如 ls -la, cp -r MCP ybrjch.qgsm.store, docker compose up -d).默认超时60秒。 |
所有路径都受限于基本目录 VPS_FS_BASE_PATH (默认) /www/wwwroot/telegrambot).要使MCP容器在主机上看到此文件夹,请在 docker-compose.yml 服务 mcp 连接Volume:
volumes:
- ${VPS_FS_MOUNT_PATH:-/www/wwwroot/telegrambot}:/www/wwwroot/telegrambot
环境变量(可选): VPS_FS_BASE_PATH, VPS_FS_MOUNT_PATH (安装主机的路径) VPS_SHELL_TIMEOUT_SEC (超时) vps_shell_exec默认为60)。
项目结构
MCP/
├── src/
│ ├── config.ts # Env config, secret masking
│ ├── logger.ts # Pino, token masking
│ ├── index.ts # HTTP Fastify app + MCP /mcp
│ ├── stdio-entry.ts # Stdio entry for Cursor
│ ├── mcp/
│ │ └── server.ts # McpServer + tools
│ ├── tools/
│ │ ├── index.ts # Tool handlers
│ │ └── vpsFs.ts # VPS fs list/copy/move, shell exec
│ ├── llm/
│ │ └── router.ts # OpenAI / Ollama+fallback
│ ├── db/
│ │ ├── client.ts # pg pool
│ │ └── migrate.ts # Migrations
│ ├── redis/
│ │ └── client.ts # ioredis
│ └── middleware/
│ ├── auth.ts # Bearer auth
│ ├── rateLimit.ts # Redis rate limit
│ └── audit.ts # Audit logging
├── app/ # Telegram Bot Platform
│ ├── src/
│ │ ├── bot/ # Telegraf, start, issue_recovery, flood
│ │ ├── routes/ # API + webapp
│ │ ├── api/ # register, login, recover
│ │ ├── services/ # flood
│ │ ├── db/ # client, users, authSessions, etc.
│ │ └── ...
│ └── public/ # WebApp HTML/JS
├── migrations/ # Telegram platform SQL
├── docker/
├── docker-compose.yml # MCP
├── docker-compose.telegram.yml
├── scripts/
│ ├── install.sh # Telegram platform installer
│ ├── backup.sh
│ └── restore.sh
├── .env.example
└── README.md
(以下是原始README中的其他MCP部分,用于快速入门、部署、端点、环境等)