Diablohu / fly-dbh-discord-bot

Discord bot for FLY-DBH
2 stars 1 forks source link

简单总结了一下使用流程 #1

Open Vindaugar opened 1 year ago

Vindaugar commented 1 year ago

昨天在自己的服务器上把两个Bot都跑起来了,总结一下我配置Discord Bot时的流程。非科班程序员出身,如果有写得不严谨、不标准或者不到位的地方还请批评指正。

因为我是先配置的Discord Bot,所以在Kook Bot配置完成前,我注释掉了Discord Bot里发送数据的代码,转为在终端打印是否成功的字符串。所以建议在配置这个Bot前先配置好配套的Kook Bot

流程

  1. 在Discord创建一个服务器(繁体中文版是「伺服器」),并在里面创建好需要Bot监听的频道。
  2. Discord开发者控制台新建一个Application,之后进入该Application并创建一个Bot,打开 Bot > Privileged Gateway Intents 下的三个选项,关闭 Bot > Authorization Flow 下的两个选项。
  3. 复制并记录Bot页面的TOKEN,如果忘记就只能重置。
  4. 根据自己的情况修改下面的邀请链接里的Application_IDPermission_Number两个参数:https://discord.com/api/oauth2/authorize?client_id=Application_ID&permissions=Permission_Number &scope=bot%20applications.commands ,让Bot加入自己的服务器。其中Application_ID是你创建的Application的ID,其配置页面地址里的那串数字就是;Permission_Number是一个数字组合,代表该Bot需要获取的服务器权限,可在Bot > Bot Permissions下部找到,配置好后复制数字即可(或者直接写8,即赋予管理员权限)。
  5. 在远程服务器上安装Nodejs、NPM和Docker,克隆该仓库到适当路径,执行npm install后,进行如下修改:用自己的频道ID(不是服务器ID)替换掉src/main.ts中第18~33行里的各串频道ID(点进你想让Bot监听的Discord频道,地址从右往左第一串数字是频道ID,第二串数字为服务器ID)。
  6. 在项目根目录新建.env文件,内容如下:
    WEBPACK_BUILD_ENV=dev
    DISCORD_TOKEN=Discord的TOKEN
    KOOK_BOT_API_BASE=http://你的服务器IP
  7. 输入npm run start进行编译和测试运行,测试时可以在监听的频道里随便发点内容,能被Bot获取到并转发给Kook Bot即可。成功后按ctrl/control + C结束程序运行。
  8. .env文件拷贝进dist目录,然后使用docker build -t 镜像名命令进行编译。
  9. 编译完成后,使用docker run -d 镜像名即可在服务器运行此程序。

踩坑

  1. 执行npm install时,如果中间因为Socket问题安装失败,只需要多次重复npm install,总会把所有的库都安装上。但是每失败一次,就会有一个库安装不完整,后面运行程序时,哪个库出问题,就去node_module里删掉那个库的目录,然后单独重新安装。剧透:安装discord.js很可能遇到这个问题。
  2. 在执行docker build前如果不把.env拷贝进dist,在最后运行时可能会报InvalidToken错误。(我感觉自己用的是倒数第二笨的办法……如果各位有其他办法也欢迎提出)
  3. 执行docker build时进行npm安装,如果遇到Socket问题导致安装失败,在Dockerfile第3行后面增加--maxsockets 1即可。
  4. KOOK_BOT_API_BASE=的值写http://localhost:8080http://0.0.0.0:8080http://127.0.0.1:8080都可以(我让Kook Bot监听8080端口)可能会遇到下面的问题:直接在终端里用curl -L http://0.0.0.0:8080curl -L http://127.0.0.1:8080能连接上,用npm run startdocker run -t 镜像名能让Discord bot访问到8080端口,但是换成docker run -d 镜像名在docker容器里运行时,访问8080端口就会提示Connection Refused。如果遇到这种情况,把.env里的KOOK_BOT_API_BASE=的值设置成http://你的服务器IP即可。
Diablohu commented 1 year ago

(通知邮件进了垃圾箱,才看到,抱歉)

感谢总结!

踩坑1 这是在国内网络环境基于 Node.js 开发的通病了,你看市面上有很多 NPM 镜像工具,比如阿里有一款,目的就是解决这一问题

这里也说下我的打包和发布流程

  1. npm run build 打包,会生成名为 dist 的目录
  2. dist 提交到 GitHub,比如本项目的 dist 分支就是干这个用的。另外项目根目录 publish.js 就是自动化这一流程
  3. 使用 DockerHub 创建 Docker 镜像,自动监控 dist 目录所在 Git 仓库
  4. 服务器上以 Docker Service 方式安装运行这一镜像,下面是我用的 Docker 配置
services:

  fly-dbh-discord-bot:
    image: diablohu/fly-dbh-discord-bot
    ports:
      - 9001:8080
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      DISCORD_TOKEN_FILE: /run/secrets/discord_token
      KOOK_BOT_API_BASE: http://host.docker.internal:9000
    secrets:
      - discord_token
    volumes:
      - /docker-mount/fly-dbh-discord-bot/logs:/.logs

另外,我的服务器上还有名为 shepherd 的服务,它可以自动监控 DockerHub 的镜像更新,然后自动拉取、重启 Docker 镜像。 如此一来,在执行打包后,剩下的提交、发布、更新镜像、拉取镜像等流程都是全自动的。

Vindaugar commented 1 year ago

多谢指正!

远程监控和同步dist至Docker的方法我还真的是第一次见,学习到了!我准备用你的方法再配置一遍试试,感觉这个方法更方便维护~