Hello!这里是 Thousandbundles 的云端 AI 工作台搭建笔记。友友们还有什么想看的话题,可以在评论区留言,博主挑一些继续探索。欢迎留言和点赞!
上期咱们配好了 2 核 2G 的云服务器,把带宽改成了按使用流量,峰值拉到了 100Mbps。
不过机器拿到手之后,很多友友真正动手时还是容易卡住。要么对着云控制台满屏的专业名词(专有网络、弹性网卡、安全组、SSH)不知道该点哪里;要么去网上随便搜个脚本,把面板端口、机器人端口全开在公网上,密码设个简单数字,结果没跑两天,机器因为内存不足频繁卡顿掉线,或者平白损耗不少流量。
因为整套流程截图非常细,为了方便大家边看边照着敲命令,这次第六期拆成了上下两篇。上篇先把云服务器收拾干净,设置好流量计费、重装纯净 Debian 13 系统、开好 2G 虚拟内存,再用 EasyTier 组好虚拟局域网,最后把大肥鱼(DSH)和模型接口跑起来。下篇再接着讲怎么给云端大肥鱼接上 NapCat QQ 机器人、换二次元角色卡、配好群聊防刷规则,顺便看一眼全套折腾完到底耗了多少流量。
这里顺嘴提一句,如果后续打算接入 QQ 机器人,建议大家用注册时间比较长、平时有正常日常互动的常用小号,并且只在自己私聊或者熟人小群里自用,千万别去公共大群刷屏打扰别人。
前言
这篇教程主要针对手里拿着 2 核 2G 云服务器、只想安稳挂大肥鱼和日常小助手的友友。
大家不用记那些复杂的网络概念,全程其实就是做四件事:先把按量流量计费设置好,再给系统瘦个身(重装纯净系统加上开 Swap 虚拟内存),然后安全组只留一个 11010 组网端口,最后把面板和大肥鱼都放进虚拟局域网里跑。
简单来说,公网就是让任何人都能访问到你的服务器,内网就是只有在你自己的特定网络环境下才能访问。咱们在安全组里最终只留 11010(TCP 和 UDP)这一个组网端口,SSH、面板、大肥鱼的端口平时都不需要对公网开放。用 EasyTier 把服务器、自己的电脑和手机连进同一个虚拟局域网,核对上自己设的密码才能进网,1Panel 面板、大肥鱼和后面的机器人日常全都绑在虚拟内网 IP 上用,只对自己开放,既省心又安全。
开启 CDT 流量计费设置
拿到机器第一件事先别急着装软件,先去云控制台开启 CDT(云数据传输)计费。
为什么需要先开这个呢?因为如果选了按使用流量计费(100Mbps 峰值)却不开启 CDT 统一计费,机器按量跑出来的公网流量会直接按标准后付费出账。而开启 CDT 之后,中国内地地域每个自然月前 20GB 的公网出网流量会自动纳入基础减免额度。平时挂大肥鱼和 QQ 机器人一个月出网流量连 1 到 2GB 都不到,这 20GB 基础额度日常完全够用了。
操作起来很简单,实时就能生效。先在云控制台顶部搜索框直接搜 CDT,点进云数据传输 CDT,再点管理控制台:
在页面下方找到云产品升级至 CDT 计费列表,可以看到弹性公网 IP 默认已经升级了,我们找到第一行云服务器 ECS,点击右侧红框处的去升级。弹窗点确定后,状态变成绿色勾号已升级就生效了。点开旁边的查看图文说明,也能看到内地地域每月 20GB 的基础公网流量额度规则:
关于流量计费规则,这里再跟大家聊三个小细节。首先它是单向收费的,往服务器里下载软件、拉代码属于入网流量,不计入收费额度,只有服务器往外发数据(出网流量)才算进这 20GB 里,平时挂大肥鱼和机器人基本都是文字和几张小图,一个月用不到 2GB。其次这个月度基础额度是每月 1 号重置,月底清零,不会结转到下个月。最后就是要注意密码和端口安全,因为带宽峰值拉到了 100Mbps,如果密码设得太简单又把所有端口都敞开在公网上,很容易产生异常流量消耗,所以后面设强密码和配安全组很有必要。
熟悉云服务器控制台的常用入口
第一次进云服务器控制台时,如果弹出下面这个安全与备份选项窗口,右边红框的云备份(40 GiB 文件备份)可以顺手勾上;左边那个主机安全检查建议别勾,勾了会在 2G 内存的小机器后台多跑不少扫描进程,挺占内存的,后面我们也会把原厂自带的监控进程清理掉。
云后台按钮看着很多,其实平时自己用主要就看四个地方。刚拿到机器不知道登录密码时,直接在实例卡片点红框处的重置密码,设一个 root 密码,在线就能生效,不用重启。重置密码左边那个蓝色的远程连接按钮是 VNC 应急终端。往下翻的网络与安全组负责放行或关闭公网端口,连不上服务器时优先看那里。至于费用与成本,平时偶尔看一眼账单和流量消耗就行。
如果有的友友在实例信息里看到公网 IP 旁边提示实例存在弹性 IP,这是因为这台机器的 100Mbps 流量带宽绑在了独立的弹性公网 IP 上,直接复制那个弹性 IP 用就行。
为什么需要知道 VNC 在哪呢?因为 VNC 不走你电脑的 SSH 网络,而是直接连机房的虚拟显示器。点开实例操作栏最右边的全部操作,选择 VNC 远程连接(或者点蓝色的远程连接选 VNC),就能在浏览器里打开应急黑框终端。万一哪天把防火墙或者 SSH 端口改错了连不上,或者想看重装系统时的实时画面,都可以从 VNC 进去处理。
SSH 连接与系统精简
很多友友问为什么 2 核 2G 跑个大肥鱼或者机器人,有时候装软件到一半就卡死掉线。我们可以看一眼刚开机连上 FinalShell 时的系统状态(见下图左上角红框):机器刚开出来什么软件都没装,原厂系统内存就已经占了 311M / 1.6G(Ubuntu 镜像占得更多,所以选 Debian 13 更省内存),下面的进程列表里排在前面的是原厂自带的后台监控进程,一直在后台常驻;再看交换(Swap)那一栏是 0% (0/0),完全没有配置虚拟内存。一旦后面安装依赖包或者跑任务时内存峰值冲高,系统没有缓冲空间,就容易直接触发内存不足导致进程中断或卡顿。
所以刚连上服务器的第一步,我们先重装纯净系统,再换机房内网源、开 2G Swap,把底子打好,把开机内存降到 100 多 MB。
用 FinalShell 连上服务器
电脑上可以用 FinalShell,左边能直接看内存和网速,底下能拖拽传文件,具体安装方法可以参考宿舍软路由第一期。
打开 FinalShell 新建 SSH 连接,依次点击左上角蓝色文件夹图标、左上角带绿加号的新建图标,选择 SSH连接(Linux):
在弹出来的窗口里,主机填实例列表里的公网 IP,端口填 22,用户名填 root,密码填刚才在控制台重置的实例密码。平时大家截图发群里提问或者发帖时,记得把公网 IP(包括 FinalShell 左上角显示的 IP)、密钥、Token 和登录凭证打码,保护好个人服务器隐私。
一键重装纯净 Debian 13 系统
在敲命令之前,先跟新手友友提两个最容易踩的复制粘贴误区。第一是别把多行命令糊成一行粘贴,很多友友直接从手机预览或者部分网页里全选复制整个代码块,结果里面的换行符全丢了,好几行命令和井号注释全粘成了一整行,粘进黑框里要么只跑了第一句,要么井号后面的全被当成注释吞掉了。建议在电脑上打开文档点代码块右上角的复制,或者一行一行分开复制、右键粘贴、按回车执行,等上一行跑完再粘下一行。第二是在 FinalShell 终端黑框里,Ctrl+C 的意思是强制打断或取消当前命令,并不是复制,Ctrl+V 也不是粘贴。正确的操作是在教程里复制好单行命令,到 FinalShell 黑框里直接点鼠标右键选粘贴,再按回车。如果哪次不小心粘错了,就按一下 Ctrl+C 开启新的一行重新粘贴就行。
连上终端后,按顺序分开复制下面两行命令,在 FinalShell 黑框里右键粘贴回车,用开源的 reinstall 脚本重装纯净版 Debian 13。因为国内机房直连 GitHub 经常被掐断或者下出 0 字节空文件,所以下面第一行写成了三个镜像源依次兜底,任意一个通就能下下来;要是真全都不通,也可以在自己电脑上把 reinstall.sh 下好,直接拖进 FinalShell 底下的 /root 目录,确认大小是 190 KB 左右再跑第二行。
# 下载重装脚本(三源依次兜底)
curl -fL -O https://cdn.jsdelivr.net/gh/bin456789/reinstall@main/reinstall.sh || curl -fL -O https://raw.gitmirror.com/bin456789/reinstall/main/reinstall.sh || curl -fL -O https://gh-proxy.com/https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh
# 确认不是 0 字节后再执行脚本安装 Debian 13
ls -lh reinstall.sh && bash reinstall.sh debian 13
跑起第二行命令后,终端会依次出现两句提示(见下图红框)。第一句 Username 让你设置用户名,直接按回车默认用 root 就行;第二句 Password 让你设置密码,输入你自己设的密码并回车。
输完密码后,脚本会自动下载 Debian 13 引导文件,直到最后出现黄色的提示 Reboot to start the reinstallation(重启后开始重装)。
看到这句提示之后,再输入 reboot 回车。如果你刚才设的新密码和之前的密码不一样,记得去 FinalShell 连接设置里把密码也换一下。
敲完 reboot 后 FinalShell 会先断开。过一两分钟重新点连接,会看到下面这个 Reinstalling… BusyBox 的临时内存系统界面,底下文件列表是空的。
这时候如果输入它提示的第二行命令 TERM=screen screen -x root/ -p 1 回车,还能在 FinalShell 里直接看到 Debian 13 的实时安装进度条(如下图)。什么都不操作也没关系,耐心等个 5 到 8 分钟,装完它会自动重启,提示符变成正常的 root@debian:~# 或 root@localhost:~# 就说明装好了。
用 LinuxMirrors 切换机房内网源
大概 5 分钟后,用刚才设的密码重新连上 FinalShell,看左上角的系统信息(见下图绿框),开机内存已经从原来的 311M / 1.6G (19%) 降到了 184M / 1.8G (10%),连原本被系统预留占掉的 200M 总内存也释放出来了,而且原来的原厂监控进程已经全部没有了,只剩下基础系统进程。
刚装好的纯净 Debian 13 非常精简,默认还是国外的官方源。我们先用自带源装上 bash 和 curl,然后跑一下 LinuxMirrors 切换成机房内网源:
apt update && apt install -y bash curl
bash <(curl -sSL https://linuxmirrors.cn/main.sh)
跑起脚本后,对照下面两张图来选。先根据自己服务器所在的云平台选择对应的国内镜像源,接着在询问网络地址(访问方式)的时候,用方向键选内网(见下图红框)。因为机器本身就在云机房里,选内网专用地址以后装软件全部走机房内网,不仅下载快,而且完全不消耗公网流量。
后面继续弹出的两个问题(见下图绿框),询问是否跳过更新软件包时选否,顺手把系统软件包更新到最新;询问在更新软件包后是否自动清理下载缓存时选是,帮系统盘省点空间。
换完内网源后,再跑下面这行命令把常用基础工具装齐:
apt install -y wget vim nano sudo git htop unzip tar net-tools lsof ca-certificates
开启 2G Swap 虚拟内存
装好基础工具后,把左上角还是 0/0 的交换空间(Swap)切出 2G 来托底。有了这 2G Swap,后面装软件或者跑任务遇到内存峰值时就有缓冲余地,不容易因为爆内存掉线:
# 创建并永久挂载 2G Swap 虚拟内存
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
# 让内核只在真没内存时才动用 Swap(这一步很重要,别漏)
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swap.conf
sysctl -p /etc/sysctl.d/99-swap.conf
# 查看内存与 Swap 状态
free -h
看到输出里 Mem 的 used 只有 100 多 Mi,且 FinalShell 左上角的交换空间变成 2.0G 就欧克了。
有的友友可能会问,2G 内存的机器要不要干脆开个 4G 甚至 8G 的 Swap?博主的建议是不用,2G 就够了,开太大反而容易变慢。Swap 只是硬盘上划出来的一块空间,主要用来防止内存峰值冲高时系统直接卡死。看咱们这台机器的实测数据就明白了,后面装大肥鱼时 npm 解压依赖的单进程峰值到了 726.8M,整机最高冲到 1.1G / 1.8G,还没碰到 Swap 就自己回落了,全套服务跑起来稳定在 700 到 920M 左右,日常真实需要的只是多几百兆的应急缓冲,2G 已经是好几倍的余量了。
而且 Swap 开太大有几个副作用。系统的 swappiness 默认是 60,Swap 越大内核越爱把暂时不活跃但还有用的内存页提前挪到硬盘上,结果就是 SSH 敲命令、网页工作台刷新开始出现一秒多的顿卡,上面命令里专门把 vm.swappiness 改成 10,就是让它平时优先用物理内存,只在快撑满时才接手。再加上云服务器的云盘走的是网络块存储,读写比物理内存慢得多,真发生大量换页时整机响应会变得比较慢。另外系统盘一共 40G,后续如果挂群聊机器人会攒下几个 G 的图片缓存,再塞 4G Swap 进去后期容易占满空间。如果你以后确实想试着跑更重的东西,把上面的 fallocate -l 2G 改成 4G 也能用,但记得保留那句 vm.swappiness=10,动手前先用 df -h / 看一眼,至少留出 10G 空余。
那要是已经手滑开了 4G 甚至 8G,想换回 2G 怎么办?不用重装系统也不用重启,把旧的换掉重建就行,在 FinalShell 里按顺序跑下面这几句:
swapoff /swapfile # 先关掉当前正在用的 Swap
rm -f /swapfile # 删掉旧的 4G 文件
fallocate -l 2G /swapfile # 重新建一个 2G 的
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
free -h # 看到 Swap 变成 2.0Gi 就欧克了
跑 swapoff 那一步如果停顿几秒,别急着按 Ctrl+C,它正在把被换出去的页面搬回物理内存,等它跑完就好。如果你当时是另建了一个新文件(比如建成了 /swapfile2),那就把命令里的 /swapfile 换成 /swapfile2,并且多跑一句 sed -i '/swapfile2/d' /etc/fstab 把它的开机挂载记录删掉。原本 /etc/fstab 里那条 /swapfile 的记录只写路径不写大小,不用动它,换完之后重启也依然是 2G。
最后可以用 free -h 和 swapon --show 确认一下 2G 虚拟内存与 vm.swappiness=10 已经全部就绪(见下图),接着我们去配安全组和虚拟局域网。
安全组放行 11010 端口
在搭 EasyTier 虚拟内网之前,先去云服务器安全组把组网要用的 11010 端口放行。
切到控制台实例详情下方的网络与安全组标签页,默认有 3 条规则(如下图),其中 22(SSH)和 3389(Windows 远程桌面)的访问来源是 0.0.0.0/0。
点击上图红框里的添加入方向规则,把 11010 端口的 TCP 和 UDP 放行,用不上的 3389 规则可以直接删掉。这里建议大家先留着 22 端口,方便我们在 FinalShell 里继续敲命令,等下一步 EasyTier 虚拟内网连上了,再回来把公网 22 端口删掉。
EasyTier 组网:把服务器、电脑和手机连进同一个虚拟内网
平时在学校里,宿舍宽带、教学楼 Wi-Fi、手机流量的出口 IP 经常变,如果把所有服务端口都直接开在公网上既不安全,而且像后面要装的大肥鱼网页端本身也有安全限制,不允许直接绑 0.0.0.0 对外开放。
用 EasyTier 把云服务器、笔记本、手机组进同一个虚拟局域网(10.144.144.0/24)是最省心的办法。因为云服务器本身就有固定公网 IP,不需要借助别人的公共服务中转,直接让云服务器自己当中心端,延迟低也更稳定。
服务器端安装并启动 EasyTier
在服务器终端里,先运行下面这段命令安装 EasyTier 程序(如果服务器拉取较慢,也可以在电脑上下好 Linux x86_64 压缩包拖进 /opt/easytier 目录):
# 下载安装脚本(两源依次兜底)
wget -q -O /tmp/easytier.sh "https://cdn.jsdelivr.net/gh/EasyTier/EasyTier@main/script/install.sh" || wget -q -O /tmp/easytier.sh "https://raw.gitmirror.com/EasyTier/EasyTier/main/script/install.sh"
ls -lh /tmp/easytier.sh && bash /tmp/easytier.sh install
装好之后,先把脚本默认生成的空服务停掉,避免和我们下面的配置冲突:
systemctl stop easytier@default 2>/dev/null || true
systemctl disable easytier@default 2>/dev/null || true
接着写入开机自启配置并启动。记得把下面代码里的 你的专属网络名 和 你的复杂密码 改成你自己的(比如网络名叫 fish,密码设复杂一点)。里面加了 --dhcp 参数,这样电脑和手机连上来会自动分配 10.144.144.x 的内网 IP。这里的虚拟 IP 网段不一定是博主给的这个,大家也可以自己改,只要保证服务器和客户端在同一网段、不和本地局域网段冲突就行:
cat << 'EOF' > /etc/systemd/system/easytier.service
[Unit]
Description=EasyTier Server Node
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/easytier/easytier-core -i 10.144.144.1 --dhcp --network-name 你的专属网络名 --network-secret 你的复杂密码 --listeners tcp://0.0.0.0:11010 --listeners udp://0.0.0.0:11010
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now easytier
systemctl status easytier --no-pager
看到绿色的 active (running),说明服务器已经在 11010 端口启动了组网服务,并且把自己的虚拟内网地址固定成了 10.144.144.1。
电脑与手机端连接虚拟内网
搜索 EasyTier 下载页面,下载电脑版(Windows 选 x86_64 的 exe,Mac 选 dmg,苹果 M 芯片选 aarch64、Intel 芯片选 x86_64)和安卓手机版(Android 选 arm64 的 apk 安装包)的 easytier-gui 客户端并打开:
从上图可以看到,原生图形客户端目前有 Windows、macOS、Linux、Android(安卓)和鸿蒙版,暂时没有 iOS 独立安装包。用 iPhone 的友友平时只要在电脑上照着本篇和下篇把大肥鱼和消息机器人配好,直接在手机聊天软件里给机器人发指令就行,手机上并不需要装组网软件;如果确实想在 iPhone 上直接打开网页工作台,可以查看官方文档里的子网与移动端接入章节填好配置,或者出门在外没带电脑临时想用手机浏览器看一眼后台面板时,去云控制台安全组把对应端口临时放行两分钟,用完再顺手把端口关上就欧克了。
电脑端和安卓手机端的填法是一样的,对照下图填好四个地方:虚拟 IPv4 地址直接勾选 DHCP(如果不勾 DHCP,电脑可以手动填 10.144.144.2,手机填 10.144.144.3,别重复就行),网络名称和网络密码填刚才在服务器上设好的名字和密码,网络方式填入 tcp://你的服务器公网IP:11010(前提是安全组已经放行了 11010 的 TCP 和 UDP 端口)。填好后点底部的运行网络,手机端首次运行会弹出一个局域网组网的系统授权提示,点确定即可,电脑端可以在设置里把开机自启勾上。
手机上装一个客户端还是挺方便的,平时在教室上课或者在外面用手机流量,打开 EasyTier 点一下运行,就能直接用手机浏览器输入 10.144.144.1:3080 看大肥鱼的任务或者管理后台。
验证连通并关掉公网 22 端口
在自己电脑上打开终端(CMD 或 PowerShell),输入:
ping 10.144.144.1
只要能 Ping 通(或者在服务器上跑 /opt/easytier/easytier-cli peer 看到 cost 显示为 p2p),虚拟内网就通了。接着打开 FinalShell,把连接配置里的主机 IP 从公网 IP 改成 10.144.144.1,重新连接测试。确认能连上之后,就可以回到云服务器安全组,把公网 22 端口那条规则删掉了,以后如果哪天没法开组网,再去安全组重新打开就行。
关于可视化面板(1Panel)与 Docker 的补充说明
这里先说明一点,1Panel 面板并不是必需品,不装完全不影响后面任何一步。装它主要是为了有个网页界面看内存曲线、拖拽传文件、点按钮管进程,但这些在 FinalShell 里一样能干,左边本来就有内存监控和文件窗口。所以如果你只想用大肥鱼和 QQ 机器人,这一步直接跳过就行。
如果你打算装或者已经装了,这里分享几个实际用下来的经验。安装 1Panel 时遇到询问是否安装 Docker [y/n],建议直接输 n 跳过,因为目前国内不少公共 Docker 镜像源不太稳定,在线装 Docker 或者在应用商店里拉容器镜像有时会卡住,而且我们这期装大肥鱼和 NapCat 都是直接在系统里原生运行,不需要用到 Docker,还更省内存。跳过 Docker 之后,1Panel 自带的网页版系统监控、文件管理器、计划任务、进程守护和系统防火墙管理都是直接调用系统的原生功能,日常直接走刚才配好的虚拟内网地址 10.144.144.1:面板端口/安全入口 就能打开。
另外 1Panel 常驻后台会占着 90 到 150MB 内存,平时不用的时候可以跑一句 1pctl stop 停掉省内存,需要拖文件或者看监控曲线时再 1pctl start 启动(配置和数据都留着,想看状态就用 1pctl status)。要是彻底不想用了,备份好文件后跑 1pctl uninstall 就能卸载;如果忘了面板账号密码或者记不清命令,输 1pctl help 就能看到全部子命令,里面还有 user-info 找回账号信息和 reset entrance 取消安全入口后缀这种救急功能。
部署大肥鱼(DSH)与模型接口配置
接下来就是重头戏,安装大肥鱼(DeepSeek Harness,简称 DSH)了。
2 核 2G 跑大肥鱼够不够用?
很多友友担心 2G 内存跑不动 AI Agent,其实大模型的推理计算是在远端接口侧完成的,不在你这台小服务器上算,服务器只负责跑调度逻辑和工具脚本。博主在服务器上用 ps 命令看了一下实际内存占用:纯净 Debian 13 系统底座大概 184 MB,EasyTier 组网进程约 54 MB,PM2 守护进程约 70 MB,1Panel 面板后台约 90 MB,大肥鱼主程序(dsh web)约 325 MB,全套加起来也就 700 多 MB,占总内存的 38% 到 42% 左右,物理内存还剩 1G 多,底下还有 2G Swap 托底。另外提一个小细节,连着 FinalShell 时如果看到 CPU 有 20% 到 30% 的占用,往往是因为 FinalShell 为了刷新左上角的监控面板在后台跑了轮询脚本,把 FinalShell 关掉后服务器平时待机 CPU 只有 1% 到 2%。
平时如果想让大肥鱼用 Python(比如 Pillow、matplotlib)生成课表卡片、天气海报、统计图表,或者调生图接口画图发到手机上,单次只占几十 MB 内存,完全带得动。不过在 2G 内存的机器上,尽量少让它长驻启动无头浏览器(Headless Chrome 或 Playwright 网页截图),因为单开一个 Chrome 浏览器就要吃掉七八百兆内存,日常画小卡片优先让它用 Python 脚本实现就行。
安装并启动大肥鱼(DSH)
在 FinalShell 终端里,先用国内镜像安装 Node 24 环境并切换国内 npm 源:
# 固定 nvm 版本,先下载并检查,失败就停止,不直接把网页交给 bash
(
set -e
tmp=$(mktemp -d)
base="https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.3"
for file in nvm.sh nvm-exec; do
curl -fSL --connect-timeout 10 --max-time 60 \
"$base/$file" -o "$tmp/$file"
bash -n "$tmp/$file"
done
grep -q '^nvm() {' "$tmp/nvm.sh"
mkdir -p "$HOME/.nvm"
install -m 644 "$tmp/nvm.sh" "$HOME/.nvm/nvm.sh"
install -m 755 "$tmp/nvm-exec" "$HOME/.nvm/nvm-exec"
touch "$HOME/.bashrc"
line='export NVM_DIR="$HOME/.nvm"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"'
grep -qxF "$line" "$HOME/.bashrc" || printf '\n%s\n' "$line" >> "$HOME/.bashrc"
) && {
export NVM_DIR="$HOME/.nvm"
. "$NVM_DIR/nvm.sh"
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
nvm install 24 && nvm alias default 24 &&
npm config set registry https://registry.npmmirror.com &&
node -v && npm -v
}
这段代码在服务器上运行:nvm 和 Node 安装在当前用户的 ~/.nvm,临时脚本下载到服务器的临时目录,不需要从电脑上传文件。下载地址已核对返回脚本,但不同服务器的速度仍有差异;任何一步报错都先停下来,看到 Node 的 v24.x.x 和 npm 版本号后,再继续下一步。如果已经有其他来源安装的 nvm,先检查现有环境,不要直接覆盖。
接着全局安装大肥鱼(DSH)、进程守护工具 pm2 与包管理器 pnpm:
npm i -g @deepseek-ai/dsh pm2 pnpm
dsh --version
这里记得把 pnpm 一起装上,因为后面给大肥鱼装插件需要用到 pnpm。如果想让大肥鱼用 Python 画图,也可以顺手跑一句 apt install -y python3-pip python3-pil python3-matplotlib fonts-noto-cjk 把画图库和中文字体装好。
大家可以看一眼下图左上角红框的安装峰值,运行安装命令解压依赖包时,单是一个 npm 进程瞬间就占到了 726.8M 内存,CPU 跑到 97%。如果前面没做系统精简和 2G Swap,这一步很容易因为内存不够中断,做了精简和 Swap 之后(红框里 1.1G/1.8G),等半分钟就顺利装完了。
装好之后,我们用 --max-old-space-size=768 给 Node.js 设一个 768MB 的内存回收上限,并用 --host 10.144.144.1 把大肥鱼绑在前面配好的虚拟内网地址上,设为开机常驻:
NODE_OPTIONS="--max-old-space-size=768" pm2 start "dsh web --host 10.144.144.1 --port 3080 --no-open" --name dsh
pm2 save
pm2 startup
有的友友可能会想,能不能不配虚拟内网,直接写 --host 0.0.0.0 再去安全组开个 3080 端口用公网 IP 访问?博主专门试过了(见下图红框报错),如果写 --host 0.0.0.0,大肥鱼底层出于安全保护机制会直接报错拒绝启动,要求必须绑定具体的内网或本机 IPv4 地址,禁止绑 0.0.0.0 对外敞开;就算绑在服务器网卡的私网 IP(172.22.x.x)上,因为云服务器公网 IP 是 NAT 映射,而且 dsh web 会校验浏览器请求头的 Host 地址,在外网直接输公网 IP 也会被拦截。所以配合前面的 EasyTier 虚拟内网(10.144.144.1)刚好合适,电脑和手机装上客户端就能直接访问,还不用开安全组端口。
刚敲完 pm2 start 启动的前几秒,后台初始化时 CPU 会短暂冲高,等几秒钟启动完就会像下图左上角绿框一样回落,内存稳定在 42% (796M/1.8G) 左右。
因为新版 dsh web 默认开启了访问鉴权,直接打开 10.144.144.1:3080 会提示需要鉴权,所以我们在终端敲下面这行命令,提取出 dsh 启动时生成的完整带 Token 登录地址:
grep -o "http://.*token=[^ ]*" /root/.pm2/logs/dsh-out.log | tail -n 1
把终端打印出来的那整行 10.144.144.1:3080/?token=xxxxxx... 复制下来,粘贴到电脑或手机浏览器地址栏回车就能进去了。这串带 token 的链接相当于进入大肥鱼工作台的钥匙,可以保存在自己的浏览器书签里,只要 dsh 进程不重启就一直有效。如果后面重启了 dsh 进程,每次重启都会自动生成一串新的随机 Token,旧网页拿着旧 Token 请求就会报 HTTP 403 或者左下角显示重新连接中,这时候只需要在终端跑下面这行命令,把新打出来的链接重新复制到浏览器打开一次刷新 Cookie 就恢复正常了:
pm2 restart dsh && sleep 2 && grep -o "http://.*token=[^ ]*" /root/.pm2/logs/dsh-out.log | tail -n 1
看一眼下图左上角绿框,大肥鱼 dsh 加上 easytier-core 跑起来之后,整机内存只占了 38% (714M / 1.8G)。
有的友友看到下图地址栏里的 10.144.144.1:3080 会问这个 IP 露出来要不要紧,其实 10.x.x.x 开头的地址和家里路由器的 192.168.1.1 一样,属于局域网私有内网 IP,每个人的 EasyTier 虚拟内网都可以叫 10.144.144.1,没有你的组网密码外人是连不进来的,真正需要打码保密的是你的公网 IP 和 ?token= 后面的密钥。
配置模型接口参数
工作台打开之后,还需要填入模型 API 接口参数才能开始对话。需要使用的友友可以根据自己的实际需求,自行了解并选择支持 OpenAI 兼容接口的服务来源,本文不做具体来源推荐与引导。
准备好接口参数后,回到大肥鱼网页工作台(10.144.144.1:3080),点左下角更多里的设置,切到模型配置页,把对应的 OpenAI 兼容接口地址填进 Base URL(一般以 /v1 结尾),再填入自己获取的 API Key 密钥和需要调用的模型 ID 名称,保存并设为默认模型就可以正常对话了。
上篇小结与下篇预告
到这里,咱们这台 2 核 2G 云服务器就已经把开启流量计费、重装纯净 Debian 13 系统与 2G 虚拟内存、安全组收敛、EasyTier 虚拟局域网联机,以及大肥鱼常驻启动和模型接口配置这一整套基建全部跑通了,在电脑和手机浏览器里都能随时打开云端大肥鱼工作台对话。
因为单篇篇幅比较长,剩下的部署 NapCat 与 OneBot 插件让大肥鱼接管 QQ、发表情包与发空间、换二次元角色卡、部署 AstrBot、群聊防暴刷设置,以及全套折腾完的真实流量消耗与日常维护自查,全都放在了云端 AI 工作台搭建(下),友友们直接点进主页看下一篇即可!觉得有帮助别忘了点个赞、收个藏!