kixyu‘s blog

章节

1Panel 部署Tg bot

1 引言

本方案旨在将 Tg_bot 从本地通过 CF Tunnel 暴露公网,升级为独立服务部署,提升稳定性与可维护性。核心思路包括:

  • 服务拆分:将 Bot 服务与 MySQL 数据库分别部署在不同环境,避免单点故障。

  • 高可用策略:使用 Docker Compose(1Panel)管理容器,配置重启策略与健康检查。

项目地址:https://github.com/kkyu9527/Tg_bot

2 架构概览

角色

服务组件

说明

Bot 服务

telegram_bot

运行 Python Bot,接收用户消息与 Webhook

数据库服务

telegram_mysql

存储消息与主题数据;独立备份与恢复

3 Bot 服务部署(1Panel)

3.1 基础配置

  1. 首先在应用商店下载openresty和mysql。

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

7752AD10-5991-47F7-AC92-7EFD59AAD43F.jpg
  1. 接着再创建一个编排,输入下面的 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,快速上手。

CD90A160-6E47-4D67-B54B-585FE675F3C1.jpg

5 反向代理

  1. 登录 1Panel 控制台,左侧菜单点击 “网站” → “创建网站”

  2. 选择 “反向代理” 类型。

  3. 填写配置:

    • 域名pmbot.your-domain.com(全名)。

    • 协议:HTTP(1Panel 将接收 HTTP 请求并转发)。

    • 代理目标http://127.0.0.1:9599,将外部请求转发至本地 Bot 服务。

    • SSL/HTTPS:如果没有证书就不勾选开启。

  4. 保存后 1Panel 自动生成并加载内部代理配置(注意图中的端口有误,实际为 9599)。

6 备份与恢复

6.1 备份

6.1.1 1Panel 备份

在左侧的选项中点击数据库,找到对应的数据库,然后选择右侧的备份列表,点击备份后下载该文件。

6.1.2 容器内备份

如果没有创建数据库直接运行 docker-compose,则需要通过命令去备份和恢复备份

  1. 普通备份

docker exec -i Mysql mysqldump -u<用户名> -p<密码> --single-transaction tg_bot_db > tg_bot_db.sql
  1. 压缩备份

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 命令行恢复

如果是使用命令的方式进行备份的,则需要通过命令去恢复备份

  1. 如果数据库不存在

v
docker exec -it Mysql mysql -u<用户名> -p<密码> -e "CREATE DATABASE tg_bot_db;"
  1. 普通恢复

docker exec -i Mysql mysql -u<用户名> -p<密码> tg_bot_db < /root/tg_bot_db.sql
  1. 压缩恢复

gunzip < /root/tg_bot_db.sql.gz | docker exec -i Mysql mysql -u<用户名> -p<密码> tg_bot_db

6.2.2 检查是否成功

  1. 查看表

docker exec -it Mysql mysql -u<用户名> -p<密码> -e "SHOW TABLES FROM tg_bot_db;"
  1. 查看数据

docker exec -it Mysql mysql -u<用户名> -p<密码> -e "SELECT COUNT(*) FROM tg_bot_db.messages;"

评论

留下你的阅读回音