1 引言
本方案旨在将 Tg_bot 从本地通过 CF Tunnel 暴露公网,升级为独立服务部署,提升稳定性与可维护性。核心思路包括:
服务拆分:将 Bot 服务与 MySQL 数据库分别部署在不同环境,避免单点故障。
高可用策略:使用 Docker Compose(1Panel)管理容器,配置重启策略与健康检查。
项目地址:https://github.com/kkyu9527/Tg_bot
2 架构概览
3 Bot 服务部署(1Panel)
3.1 基础配置
首先在应用商店下载openresty和mysql。

然后再创建一个数据库,数据库名称,用户名,密码需要记住,后面的环境变量的值需要和这里一致。

接着再创建一个编排,输入下面的
yml及环境变量。

3.2 编排文件:docker-compose.yml
services:
app:
image: kixyu9527/tg_bot:latest
container_name: tg-bot-app
restart: always
networks:
- 1panel-network
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/tg_bot_db?createDatabaseIfNotExist=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: your_password
SPRING_JPA_HIBERNATE_DDL_AUTO: update
SPRING_JPA_SHOW_SQL: "false"
SPRING_PROFILES_ACTIVE: dev
TELEGRAM_BOT_TOKEN: "<你的 Bot Token>"
TELEGRAM_BOT_OWNER_ID: "<你的 Telegram 用户 ID>"
TELEGRAM_BOT_GROUP_ID: "<默认群组 ID,可选>"
TELEGRAM_BOT_WEBHOOK_URL: "https://your-domain.com/webhook"
ports:
- "9599:9599"4 绑定域名及加密模式
4.1 绑定域名
在 Cloudflare 控制台中,为二级域名 pmbot.your-domain.com 添加一条 A 记录,指向 VPS 的公网 IP。
主机名:
pmbot类型:
A值:
<你的服务器 IP>TTL:自动
Proxied(橙云):开启(推荐开启以启用 DDoS 防护和 CDN 加速)

4.2 加密模式
根据 VPS 上是否配置证书,选择合适的模式:
Full (完全加密):
要求:VPS 上已安装有效的 SSL/TLS 证书(Let's Encrypt、自签等)。
特点:Cloudflare 与客户端、Cloudflare 与原站之间均使用 HTTPS,端到端加密。
操作:在 1Panel 或 Nginx 配置中指定证书路径;确保证书定期续期。
Flexible (灵活加密):
要求:VPS 上未配置证书。
特点:仅 Cloudflare 与客户端之间使用 HTTPS,Cloudflare 与 VPS 之间仍使用 HTTP。
操作:在 Cloudflare SSL/TLS 面板中选择 “Flexible”;无需在 VPS 上部署证书。
推荐:生产环境优先使用 Full 模式,以保障全链路加密;开发或测试可临时使用 Flexible,快速上手。

5 反向代理
登录 1Panel 控制台,左侧菜单点击 “网站” → “创建网站”。
选择 “反向代理” 类型。
填写配置:
域名:
pmbot.your-domain.com(全名)。协议:HTTP(1Panel 将接收 HTTP 请求并转发)。
代理目标:
http://127.0.0.1:9599,将外部请求转发至本地 Bot 服务。SSL/HTTPS:如果没有证书就不勾选开启。
保存后 1Panel 自动生成并加载内部代理配置(注意图中的端口有误,实际为 9599)。

6 备份与恢复
6.1 备份
6.1.1 1Panel 备份
在左侧的选项中点击数据库,找到对应的数据库,然后选择右侧的备份列表,点击备份后下载该文件。

6.1.2 容器内备份
如果没有创建数据库直接运行 docker-compose,则需要通过命令去备份和恢复备份
普通备份
docker exec -i Mysql mysqldump -u<用户名> -p<密码> --single-transaction tg_bot_db > tg_bot_db.sql压缩备份
docker exec -i Mysql mysqldump -u<用户名> -p<密码> --single-transaction tg_bot_db | gzip > /root/tg_bot_db_$(date +%F).sql.gz注意容器名要和容器里的一致,区分大小写。我的容器名是 Mysql。
6.2 恢复
继续在刚刚的页面中选择备份列表旁边的导入备份,将上一步的备份的文件传入点击恢复即可。
若使用了 CDN 加速服务(例如 Cloudflare),单次附件上传将受限于约 100MB。建议在上传大文件前暂时关闭 CDN,或通过提供文件下载链接的方式进行备份传输。
6.2.1 命令行恢复
如果是使用命令的方式进行备份的,则需要通过命令去恢复备份
如果数据库不存在
v
docker exec -it Mysql mysql -u<用户名> -p<密码> -e "CREATE DATABASE tg_bot_db;"普通恢复
docker exec -i Mysql mysql -u<用户名> -p<密码> tg_bot_db < /root/tg_bot_db.sql压缩恢复
gunzip < /root/tg_bot_db.sql.gz | docker exec -i Mysql mysql -u<用户名> -p<密码> tg_bot_db6.2.2 检查是否成功
查看表
docker exec -it Mysql mysql -u<用户名> -p<密码> -e "SHOW TABLES FROM tg_bot_db;"查看数据
docker exec -it Mysql mysql -u<用户名> -p<密码> -e "SELECT COUNT(*) FROM tg_bot_db.messages;"
评论
留下你的阅读回音