腾讯云新加坡VPS+1Panel+DOCKER部署MoltBot指南2026
第一篇:基础环境准备 (基础设施)
1. VPS 选择与初始化
- 硬件建议:2C2G 为起步配置,推荐 4C8G 以备后续挂载更多 Subagents。
- 系统选择:Ubuntu 24.04 LTS。
- 1Panel 安装:使用官方一键脚本。安装后在“应用商店”确保 Docker 和 Docker Compose 已就绪。
2. 网络权限开放 (安全组)
在腾讯云控制台和 1Panel 防火墙中,必须手动开放:
- 18789:Moltbot 默认监听端口,用于网关通信与 Canvas 预览。
3、 AI模型的选择
建议使用智谱的GLM-4.7模型,许多专业人员都认为是国内可以媲美Claude 4.5的,个人使用过MiniMax-M2 130M token,GLM-4.6 80M token,还用过Qwen3-Coder-480B ,Kimi-K2-Instruct ,实际感觉还是GLM在coding方面强一些。推荐使用官方链接:https://www.bigmodel.cn/glm-coding?ic=IORXTLCLVM
也可以使用硅基流动的,免费可获得2000万token,可以使用大部分国内主流文本生图音频甚至是视频模型:https://cloud.siliconflow.cn/i/kQTQzfuz
注册登录之后,可以获得Base_url和api-key。
4、 Discord 机器人凭证获取与设置
实现对话的第一步,必须确保权限配置正确,否则机器人无法“看见”或“回复”消息。
- 创建应用: 访问 Discord Developer Portal,点击 New Application。
- 获取 Token: 在左侧菜单点击 Bot。 点击 Reset Token 并复制。这就是你的 DISCORD_BOT_TOKEN(务必妥善保管,不要泄露)。
- 开启特权意图(关键): 在 Bot 页面向下滚动,找到 Privileged Gateway Intents。 必须开启:MESSAGE CONTENT INTENT(允许机器人读取消息内容)。 建议开启:SERVER MEMBERS INTENT(用于识别用户信息)。备注:我截图中选择了 Presence Intent ,不用选择这个。
- 生成邀请链接: 左侧菜单进入 Installation 或 OAuth2 -> URL Generator。 Scopes 勾选:bot。 Bot Permissions 勾选:Administrator(最简单)或至少勾选 Send Messages、Read Message History、Embed Links、Attach Files(为了 GLM-4.6V 的视觉功能)。 复制生成的 URL 在浏览器打开,将机器人邀请进你的服务器。
第二篇:部署过程
1、1Panel 面板安全部署流程
为了防止 API Key 泄露及 VPS 数据安全,建议严格执行以下步骤:
1. 目录结构与权限初始化
进入 1Panel 文件管理:
- 创建目录:/opt/apps/moltbot
- 在该目录下创建子目录 data 用于持久化存储。
- 权限加固:点击 moltbot 文件夹“权限”,设置所有者为 root 或 1panel,权限设为 755。
2. 编写 .env 环境变量文件
在 /opt/docker/compose/moltbot 下新建 .env 文件。
安全提示:在 1Panel 中将此文件权限设为 600。
Bash
# ------------------------------
# AI 模型配置 (SiliconFlow)
# ------------------------------
# 适配 SiliconFlow 必须确保 API_KEY 和 BASE_URL 准确
OPENAI_API_BASE=https://api.siliconflow.cn/v1
OPENAI_API_KEY=vvv
# 建议模型名称变量统一,确保视觉逻辑被触发
AI_PROVIDER=siliconflow
DEFAULT_MODEL=deepseek-ai/DeepSeek-V3.2
MODEL=deepseek-ai/DeepSeek-V3.2
ENABLE_VISION=true
# ------------------------------
# Moltbot 特有配置
# ------------------------------
# 这里的 Token 必须与 docker-compose.yml 中 --token 后的参数完全一致
MOLTBOT_GATEWAY_TOKEN=bbb
CLAWDBOT_GATEWAY_TOKEN=bbb
MOLTBOT_EXTERNAL_URL=http://2.2.2.2:18789
SANDBOX_MODE=non-main
# 禁用消息下方的“查看详情”按钮链接 (Invalid URL 的主要元凶)
MOLTBOT_DISCORD_METADATA=false
# 禁用画布预览链接
MOLTBOT_CANVAS_ENABLED=false
MOLTBOT_EXTERNAL_URL=http://2.2.2.2:18789
3. 创建 配置文件(moltbot.json)
在 项目目录/opt/apps/moltbot 下新建 moltbot.json文件。内容如下:
{
"meta": {
"lastTouchedVersion": "2026.1.27-beta.1",
"lastTouchedAt": "2026-01-30T04:54:20.036Z"
},
"models": {
"providers": {
"siliconflow": {
"baseUrl": "https://api.siliconflow.cn/v1",
"apiKey": "ccc",
"api": "openai-completions",
"models": [
{
"id": "deepseek-ai/DeepSeek-V3.2",
"name": "DeepSeek-V3.2",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 128000,
"maxTokens": 32000
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "siliconflow/deepseek-ai/DeepSeek-V3.2"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
}
},
"messages": {
"ackReactionScope": "group-mentions"
},
"commands": {
"native": "auto",
"nativeSkills": "auto"
},
"channels": {
"discord": {
"enabled": true,
"groupPolicy": "open",
"dm": {
"policy": "allowlist",
"allowFrom": [
"11111"
]
}
}
},
"gateway": {
"mode": "local",
"auth": {
"token": "{{MOLTBOT_GATEWAY_TOKEN}}"
}
},
"plugins": {
"entries": {
"discord": {
"enabled": true
}
}
}
}
4. 创建 Docker 编排 (docker-compose.yml)
在 1Panel -> 容器 -> 编排 中新建编排,因为1panel这里路径不能选择项目目录,必须是:/opt/docker/compose/,路径可以添加moltbot,内容如下:
YAML
services:
moltbot-gateway:
image: node:22-slim
container_name: moltbot-app
restart: unless-stopped
environment:
- HOME=/home/node
- MOLTBOT_DATA_DIR=/home/node/.moltbot
- NODE_OPTIONS=--max-old-space-size=768
working_dir: /home/node/moltbot
command:
[
"node",
"dist/index.js",
"gateway",
"--bind",
"lan",
"--port",
"18789",
"--token",
"ccc",
"--allow-unconfigured"
]
env_file:
- .env
volumes:
- /opt/moltbot/source:/home/node/moltbot:ro
- /opt/moltbot/data:/home/node/.moltbot:rw
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "18789:18789"
init: true
networks:
default:
name: moltbot_net
4、 使用与交互方式
如果部署成功并启动后(可在 1Panel 容器日志看到 Ready 字样),
2026-01-30T04:59:27.285Z [heartbeat] started
2026-01-30T04:59:27.289Z [gateway] agent model: siliconflow/deepseek-ai/DeepSeek-V3.2
2026-01-30T04:59:27.291Z [gateway] listening on ws://0.0.0.0:18789 (PID 7)
2026-01-30T04:59:27.293Z [gateway] log file: /tmp/moltbot/moltbot-2026-01-30.log
2026-01-30T04:59:27.408Z [browser/service] Browser control service ready (profiles=2)
2026-01-30T04:59:28.105Z [discord] [default] Discord Message Content Intent is limited; bots under 100 servers can use it without verification.
2026-01-30T04:59:28.107Z [discord] [default] starting provider (@moltbot)
2026-01-30T04:59:28.413Z [discord] users resolved: 834866
2026-01-30T04:59:29.861Z [discord] logged in to discord as 15719
之后你可以通过以下方式操作(但是一般人都没有这么幸运,请继续往下看):
1. Discord 基础对话
- @机器人 或直接在私聊中发送:你好,你是谁?
- 如果配置了 GLM-4.6V,你可以直接上传图片并询问:分析一下这张图里的代码哪里写错了?
2. WebUI 管理
- 如果你在 1Panel 开放了 18789 端口,可以访问 http://VPS_IP:18789。
- 系统会要求输入 .env 中设置的 MOLTBOT_GATEWAY_TOKEN。
- 在这里你可以实时监控机器人的运行状态和技能调用。
第三篇:安全加固与维护
这是最容易被忽视的一步。 默认情况下,Linux 文件的权限是 644,这意味着系统内其他普通用户可以读取你的 .env(包含 Discord Token 和 API Key)。
1. 强制执行 0600 权限
在宿主机终端执行以下命令,确保只有 root 用户能触碰这些敏感文件:
Bash
# 锁定环境变量文件
chmod 600 /opt/docker/compose/moltbot/.env
# 锁定核心配置文件
chmod 600 /opt/moltbot/data/moltbot.json
# 确认权限
ls -l /opt/docker/compose/moltbot/.env
# 应显示: -rw------- 1 root root ...
2. 身份验证安全
在 2026 Beta 版中,Moltbot 引入了 Pairing Code 机制。为了安全,建议:
- 不要向任何人透露你的 MOLTBOT_GATEWAY_TOKEN。
- 白名单机制:在 moltbot.json 中通过 allowFrom 锁定你的 Discord User ID。
3. 容器沙箱权限
由于 Moltbot 具备 local 模式(可以执行 shell 指令),如果不限制白名单,任何能接触到机器人的用户都可能通过 prompt 注入来探测你的 VPS 目录。
- 对策:仅开启必要的 Discord 频道,并严格配置 groupPolicy: “allowlist”。
第四篇:进阶排错与“外科手术”诊断
当容器启动后,如果 Discord 依然报错或无反应,我们需要使用以下四组“手术刀”命令剥离真相。
1. 路径探针:确认“家”在哪里
指令:docker exec -it moltbot-app ls -l /home/node/
- 深度分析:通过此命令,我们发现该版本 Moltbot 将程序放在 moltbot 目录,而配置锁死在隐藏目录 .moltbot。确认这个路径,是所有后续 cat 和 grep 操作的前提。
2. 配置审计:抓捕“未解析占位符”
指令:docker exec -it moltbot-app grep baseUrl /home/node/.moltbot/moltbot.json
- 实战结论:如果我们看到 “baseUrl”: “{{OPENAI_API_BASE}}”,说明 模板引擎失效了。程序没有把环境变量填进 JSON。这种带有 {{}} 的非法 URL 是导致 Discord 报 Invalid URL 的物理元凶。
3. 逻辑诊断:机器人的“心电图”
指令:docker exec -it moltbot-app node dist/index.js channels status --probe
- 核心反馈: intents:content=limited:确认“听力”依然受限。 in: 13m ago:确认消息流是否真正到达过网关。
4. 流量监听:查看“求救信号”
指令:docker logs -f moltbot-app
- 发现:若看到 [canvas] host mounted at http://0.0.0.0…,说明外部访问地址被误设为 0.0.0.0。Discord 客户端无法跳转到该回环地址,触发 Invalid URL。
第五篇:安装过程中的天坑
第一坑:环境准备与源码编译 (解决“镜像拉取失败”坑)
如果你发现 docker-compose.yml 无法下载 ghcr.io/moltbot/moltbot 镜像,最稳妥的办法是本地克隆并编译。
1. 克隆代码至 1Panel 应用目录
Bash
# 进入 1Panel 应用推荐存放目录
mkdir -p /opt/apps/moltbot
cd /opt/apps/moltbot
# 克隆源码并命名为 source 文件夹
git clone https://github.com/moltbot/moltbot.git source
cd source
2. 本地构建环境 (Node.js 22+)
为了加快速度,建议使用国内或新加坡优化的镜像源:
Bash
# 1. 设置镜像源加速
npm config set registry https://registry.npmmirror.com
# 2. 安装构建所需的依赖
npm install
# 3. 执行编译任务,生成 dist 运行时文件夹
npm run build
执行完毕后,你会发现 source/dist 文件夹已生成,这就是机器人的“心脏”。
第二坑:目录结构与路径对齐 (解决“1Panel 路径冲突”坑)
🚨 关键预警: 1Panel 在执行 Docker 编排时,会将配置文件强制保存在 /opt/docker/compose/moltbot。如果你的 .env 放在别处,编排时将无法读取。
1. 规范路径映射
为了遵循 1Panel 的设计逻辑,建议将所有核心文件移动到编排目录下:
Bash
# 确保编排目录存在
mkdir -p /opt/docker/compose/moltbot
# 将 .env 文件从应用目录移动到编排目录
mv /opt/apps/moltbot/.env /opt/1panel/docker/compose/moltbot/.env
2. 最终目录视图
- 编排与环境变量:/opt/docker/compose/moltbot/ (docker-compose.yml, .env)
- 持久化数据:/opt/apps/moltbot/data/ (moltbot.json)
- 源码运行时:/opt/apps/moltbot/source/
第三坑:编排配置实战 (Docker Compose)
在 1Panel 的“编排”面板中,使用以下配置。注意我们直接挂载源码目录以运行:
YAML
version: '3.8'
services:
moltbot-app:
image: node:22-slim # 使用轻量级 Node 镜像直接运行编译后的代码
container_name: moltbot-app
working_dir: /home/node/moltbot
restart: always
env_file:
- .env # 此时 .env 必须在当前编排目录下
volumes:
# 挂载编译好的源码
- /opt/apps/moltbot/source:/home/node/moltbot
# 挂载数据目录
- /opt/apps/moltbot/data:/home/node/.moltbot
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "18789:18789"
command: ["node", "dist/index.js"]
第四坑:模型适配与非默认模型配置 (解决“模型报错”坑)
对于追求极致性能的用户,往往不使用默认模型,而是选择 DeepSeek 3.2或者GLM-4.7 等高性能多模态模型。
1. 修改 moltbot.json 核心配置
请确保 moltbot.json 中的 agents 与 models 块严格对应。注意如果选取的不是Openai或者Anthropic这些非标准厂商前缀的处理,因此请仔细查看我之前粘贴的文件内容,参数和格式错误都会导致启动故障。
2. 对应的 .env 文件配置
确保变量名与 JSON 中的占位符(若使用模板)完全一致,但在本地编译版中,推荐直接在 JSON 写死:
代码段
OPENAI_API_BASE=https://api.siliconflow.cn/v1
OPENAI_API_KEY=sk-vvvv...
3.用 CLI 强行注入“真实值” (The Hardcode Strike)
在排查的最后阶段,我们发现即便 .env 变量配置正确,Moltbot 内部的模板引擎(Template Engine)仍旧将 {{OPENAI_API_BASE}} 当作原始字符串处理。这导致程序尝试向一个字面意思为 {{OPENAI_API_BASE}}/v1/chat/completions 的地址发请求。这种包含大括号的非标准 URL 是任何 HTTP 客户端都无法解析的,也是 Discord 报错 Invalid URL 的元凶。
为了绕过这个解析 Bug,我们使用了 Moltbot 自带的配置管理工具进行“强制写实”:
1. 强制写入真实的 API 基址
指令:
Bash
docker exec -it moltbot-app node dist/index.js config set models.providers.siliconflow.baseUrl https://api.siliconflow.cn/v1
- 深度分析: 作用:该命令直接跳过了 .env 的读取逻辑,通过 Moltbot 内部的运行时 API,将物理文件 moltbot.json 中的 baseUrl 字段直接修改为字符串 https://api.siliconflow.cn/v1。 结果:程序发出的请求从 POST {{OPENAI_API_BASE}}/v1/… 变为了 POST https://api.siliconflow.cn/v1/…。 意义:这是解决“无效 URL”最彻底的办法——让地址回归标准格式。
2. 强制写入真实的 API 密钥
指令:
Bash
docker exec -it moltbot-app node dist/index.js config set models.providers.siliconflow.apiKey "你的真实KEY"
- 深度分析: 作用:同样的操作逻辑,将密钥字段硬编码进 JSON。 安全性注意:在终端执行此命令时,密钥会暂时留在你的 Bash 历史记录 中。 建议操作:执行完后建议运行 history -c 清理终端历史,或在 1Panel 面板内直接编辑文件。
安全考量:权衡与防护
将 API Key 明文写入容器挂载卷是否安全?我们需要理性分析。
1. 风险评估
- 宿主机内:拥有 root 权限的人或能执行 docker exec 的用户可以直接 cat 到密钥。
- 跨容器/网络:只要文件权限设置正确,外部用户和其它容器无法获取。
- 避坑:只要不将密钥写进 Dockerfile 并构建成镜像,密钥就不会随镜像泄露。
- 结论:对于个人 VPS 或小团队,“明文配置 + 宿主机 600 权限” 已经兼顾了调试效率与安全性。
2. 权限加固 (必须执行)
由于 moltbot.json 现在包含了明文密钥,必须收紧宿主机文件权限:
Bash
chmod 600 /opt/apps/moltbot/data/moltbot.json
chown root:root /opt/apps/moltbot/data/moltbot.json
备注:安全考虑:处理“硬编码”后的后遗症
但是由于我们使用了 config set 强行将密钥写入了物理文件,这带来了一个新的安全课题:配置文件的权限管控。
因此建议:
警惕“写实”后的明文暴露: 当你通过
config set成功修复Invalid URL后,你的moltbot.json文件中已经包含了明文 API Key。此时,绝对禁止将该文件上传到任何公共仓库(如 GitHub)。同时,请在宿主机执行chmod 600 /opt/apps/moltbot/data/moltbot.json,确保只有 root 用户能读取这个包含“财富密码”的文件。
第六篇:故障排错四大核心“手术刀”命令
在 Docker 容器这个“黑盒”里,这四组命令分别代表了:路径探针、配置审计、逻辑诊断、流量监听。
1. 路径探针:确认“家”在哪里
执行指令:
Bash
docker exec -it moltbot-app /bin/bash
pwd
ls -l /home/node/
深度分析:
- 作用:确认容器内真实的程序运行目录(CWD)。
- 实战意义:在本次排错中,我们发现程序安装在 /home/node/moltbot,但数据目录挂载在 /home/node/.moltbot(注意那个点,是隐藏文件夹)。
- 发现的问题:如果宿主机的挂载路径(Volume)映射错了容器内部路径,那么你修改宿主机的 moltbot.json,容器内部根本看不见。通过 ls -l 确认 clawd 和 moltbot 目录的共存,帮我们锁定了配置文件其实是在 .moltbot 目录下。
2. 配置审计:寻找“未解析的占位符”
执行指令:
Bash
docker exec -it moltbot-app grep baseUrl /home/node/.moltbot/moltbot.json
深度分析:
- 作用:直接穿透容器,检查物理配置文件里的真实内容。
- **为什么这是“破案”关键?**: 如果返回:”baseUrl”: “https://api.siliconflow.cn/v1″ —— 说明环境变量注入成功。 如果返回:”baseUrl”: “{{OPENAI_API_BASE}}” —— 这是重大发现! 说明模板引擎没有生效。程序直接拿着 {{…}} 这串字符去请求网络,Discord 收到这种非法字符自然会报 Invalid URL。
- 结论:这个命令帮我们确认了“.env 环境变量 -> JSON 模板解析”这一链路在 Beta 版中已断裂,从而坚定了我们“手动写死(Hardcode)配置”的决心。
3. 逻辑诊断:机器人的“心电图”
执行指令:
Bash
docker exec -it moltbot-app node dist/index.js channels status --probe
深度分析:
- 作用:这是 Moltbot 内置的最高级别诊断工具,它跳过网络层,直接检查程序内部逻辑状态。
- 输出关键项解读: **token:env**:确认程序正在尝试从环境变量读取 Token。 **intents:content=limited**:这是第二个重大发现。 意味着机器人虽然登录了,但“听力受限”。它能看到有人在说话,但看不见说话的内容。这直接指向了 Discord Developer Portal 的 Message Content Intent 开关没开,或者 JSON 里没声明权限。 **in:13m ago**:记录了最后一次接收到信号的时间。如果时间很久没更新,说明 Webhook 或 WebSocket 连接已断开。
4. 流量监听:查看实时“求救信号”
执行指令:
Bash
docker logs -f moltbot-app --tail 50
深度分析:
- 作用:实时滚动查看容器的控制台输出。
- 实战价值: **[canvas] host mounted at http://0.0.0.0…**:通过这一行,我们发现了 0.0.0.0 这个非法 IP 正在被作为回调地址使用,这是导致 Discord 客户端报错的物理根源。 **device pairing auto-approved**:确认了网关认证已经通过,排除了认证层面的嫌疑,将火力集中在应用层配置。
📝 5. 排错逻辑小结:如何像专家一样思考?
当遇到“没反应”或“报错”时,请按此顺序自问:
- 进程在吗? (docker ps)
- 配置写进去了吗? (grep JSON 里的占位符是否被替换)
- 地址对吗? (日志里是否有 0.0.0.0 这种无法访问的地址)
- 听得见吗? (status –probe 里的 intents 是否为 works)