从购买云服务器开始,在linux云服务器部署自己的koishi,月成本5块不到

可以去我的github page 托管的 Vitepress站点阅读,或者更好的阅读体验:

背景

现在是2025年12月,内存条和硬盘都涨价了,许多云服小厂商都涨了一圈,所以在云服务器 使用更节省资源linux操作系统是更好的选择。

不同于win的桌面环境于内核强行捆绑,linux的桌面环境更像是挂件/插件,是可选的,而且云服务器厂商提供的系统镜像一般都是默认不带桌面环境,所以会更节省资源。

实践

这是我前两天做的一个实验:这个1C2G的服务器,debian12,配置了4G的swap,swapiness调成100,上面跑了Napcat+Koishi+Nonebot+Astrbot+TRSS-Yunzai( 目前已经稳定运行10多天
图片
图片
图片
0b6bdfeee3edab3a78c524d2b66dc741839e51ae_2_690x92
acfc64a6acfd67fa1d8e0a7e398ada913207980f_2_690x101
bdba43b1020218c83b4ed9a8ed1d1ec136d2ee21_2_690x100

配置了4G的swap + swapiness调整到100, 是这个2G的小机器上面的服务 能稳定运行的关键

问题与想法

由此又衍生出一个问题:本社区大多数人,包括我,接触的第一个pc操作系统都是自带桌面环境win,刚使用纯命令行的linux可能不够习惯。
目前我的想法是:

    1. 习惯用命令行去解决问题,善用大语言模型 和 搜索引擎。
    1. 在linux的云服务器,使用纯命令行系统+一些webui面板(比如1Panel、mcsm) 进行日常的运维,是一个不错的选择,而且是现在很常见的一个选择

想象这样的场景,你出门在外,同时对你云服务器上的bot有运维的需求,此时你使用Termux、Termius的ssh工具也不是不行,但是会比较麻烦(两根手指搓屏幕 和 有个键盘 肯定还是不能比的)。有webui面板的帮助,用手机点点也可以进行一些运维操作,方便不少。

https://1panel.cn/
https://docs.mcsmanager.com/zh_cn/
后文会详细讲述,这两个面板会如何帮助你 简化日常的koishi的运维

1 个赞

选购Linux云服务器


这两家是我找到的便宜的Linux云服务器,一个月的价格都在5块以内。
当然阿里云的那个 一年68的云服务器也不错(那个带宽很大,标称值是200MBps)

你也可以去蹲一些厂商的打折活动 or 去寻找一些小厂商,搜索“挂机宝”字样,最低配置的一般都会很便宜。

选择操作系统

我自己用的最多的linux发行版是Debian/Ubuntu, 其他的用的少。
如果你用的发行版和我一样,那你按照我的操作,依葫芦画瓢,是肯定可以搞起来的。

我用来做实验的云服务器的环境:

ssh连接到云服务器

购买完成以后 在云服务器的后台会显示 你云服务器的ssh地址,端口,用户名。
(如果没说端口可能是默认22)

ssh指令的格式是

ssh 用户名@ip -p 端口

win10从2018年开始预装ssh客户端。大部分linux发行版自带ssh客户端。


如果操作系统没有预装ssh,也可以在网络搜索 ssh的二进制文件、或者使用包管理器安装、或者使用Mobaxterm、Finalshell、VSCode这种支持ssh的工具
图片
Termux、Termius是手机上可以使用的ssh客户端
图片

一般云服厂商给你的ssh用户名是root。如果不是root但是后面需要root权限,你可以使用他给你的用户名ssh进去,然后使用sudo su - 切换用户, 或者调整ssh配置文件:sudo nano /etc/ssh/sshd_config
找到PermitRootLogin, 然后改成yes 就可以用root用户ssh进去了捏

nano中 使用 ↑↓←→控制光标。ctrl+X退出,他会询问你是否保存,根据情况选y/n即可。ctrl+S保存文本。
你也可以使用其他工具,比如vi、vim这种命令行文本编辑器。
PC上的MobaxTerm、finashell、vscode,安卓的MT管理器,都支持ssh连接,都可以对文件进行修改。

把apt软件包的源换了

中科大的源就不错:
https://mirrors.ustc.edu.cn/help/debian.html

nano /etc/apt/sources.list
# 然后按好多下ctrl+K 把里面的原有文件内容全删了,改成下面的内容:
# 默认注释了源码仓库,如有需要可自行取消注释
deb http://mirrors.ustc.edu.cn/debian bookworm main contrib non-free non-free-firmware
# deb-src http://mirrors.ustc.edu.cn/debian bookworm main contrib non-free non-free-firmware
deb http://mirrors.ustc.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware
# deb-src http://mirrors.ustc.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware

# backports 软件源,请按需启用
# deb http://mirrors.ustc.edu.cn/debian bookworm-backports main contrib non-free non-free-firmware
# deb-src http://mirrors.ustc.edu.cn/debian bookworm-backports main contrib non-free non-free-firmware

换源前一定看清楚你自己系统的版本代号…
你可以使用这个指令查看你的发行版版本号:

cat /etc/os-release
lsb_release -a

Fun facts:

然后你可以安装一些常用的软件包:

apt install neofetch htop btop nload wget curl git proxychains4 proxychains nano vim

配置swap

可以去这里获得更好的观看体验:
https://vincentzyu233.github.io/VincentZyu233/notes/system-config/swap.html

在低内存的机器上面,比如这种2G的机器,配置swap,调整swapiness,是缓解memory压力,确保服务长期稳定的重要手段。

如果不知道什么是swap: 可以简单的理解成 拿一块disk空间给memory做缓冲 。类似win上面的pagefile

详细信息可以看这里: https://wiki.archlinux.org/title/Swap

创建swap文件

# 比如我需要一个4G的swapfile
fallocate -l 4G /swapfile
# 如果用不了就用dd
dd if=/dev/zero of=/swapfile bs=1M count=4096

设置权限并启用swap

# 为了安全,只有 root 用户应该能够读写这个 swapfile。
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

验证swap是否启用

# 验证是否启用
swapon --show
free -m
apt install htop
htop


持久化swap的挂载

为了机器重启以后swap也能生效:

# 持久化,重启自动挂载
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 或者使用nano
nano /etc/fstab
# 确保有这一行: /swapfile none swap sw 0 0
# 可以用 PageDown键 和 ↓键翻到最底下,部分终端用右键粘贴,或者ctrl+shift+v
# ctrl+x 保存

调整swapiness并持久化

# 临时调整swapiness
sysctl vm.swappiness=90

# 持久化swapiness
echo 'vm.swappiness=90' >> /etc/sysctl.conf
# 或者使用nano
nano /etc/sysctl.conf
# 确保有这一行: vm.swappiness=90
# 可以用 PageDown键 和 ↓键翻到最底下,部分终端用右键粘贴,或者ctrl+shift+v
# ctrl+x 保存
# 运行以下命令使 /etc/sysctl.conf 的更改立即生效,无需重启。
sysctl -p
# 验证是否生效
cat /proc/sys/vm/swappiness


1 个赞

去这里获得更好的观看体验:
https://vincentzyu233.github.io/VincentZyu233/notes/language-env/linux-nodejs.html

安装Nodejs

Nodejs: run Javascript everywhere.


虽然说koishi官网给了不少安装方式,比如二进制文件,比如docker,但是我认为跑koishi最灵活的方式还是使用 npm/yarn包管理器 然后项目模板创建。

https://koishi.chat/zh-CN/manual/starter/boilerplate.html

国际网络环境

如果是境外的云服务器,或者你配置了bash的环境变量,或者使用了Proxychains这种工具,你可以直接执行:

export HTTP_PROXY="http://127.0.0.1:7890"
export HTTPS_PROXY="http://127.0.0.1:7890"
export ALL_PROXY="socks5://127.0.0.1:7891"
# or 配置Proxychains文件,然后执行:
proxychains bash

# 下载并安装 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 代替重启 shell
\. "$HOME/.nvm/nvm.sh"

# 下载并安装 Node.js:
nvm install 22

# 验证 Node.js 版本:
node -v # Should print "v22.21.1".

# 下载并安装 Yarn:
corepack enable yarn

# 验证 Yarn 版本:
yarn -v

或者你也可以nodejs官网下载预编译二进制,然后传到云服务器上面,然后解压,配环境变量(可选。如果你愿意直接用绝对路径当然也可以)

scp是一个基于ssh协议的文件传输工具。
指令格式:

scp -P 端口号 本地文件路径 用户名@服务器IP:远程保存路径

淘宝源cdn也给了nodejs的二进制:

国内网络环境

# 创建工作目录
mkdir -p /data/nodejs
cd /data/nodejs/

# 从淘宝镜像下载 Node.js
curl -LO https://registry.npmmirror.com/-/binary/node/latest-v22.x/node-v22.9.0-linux-x64.tar.xz

# 解压
tar -xvf node-v22.9.0-linux-x64.tar.xz

配置环境变量(可选)

配置环境变量可以让你在任何目录直接使用 nodenpmyarn 命令。

临时环境变量:

export NODE_HOME=/data/nodejs/node-v22.9.0-linux-x64
export PATH=$NODE_HOME/bin:$PATH

修改bash配置:

# 编辑 .bashrc 文件
nano ~/.bashrc

# 在文件末尾添加以下两行:
export NODE_HOME=/data/nodejs/node-v22.9.0-linux-x64
export PATH=$NODE_HOME/bin:$PATH

# 保存并关闭文件后,执行以下命令使配置立即生效
source ~/.bashrc

安装yarn

npm i -g yarn

换源

npm config set registry https://registry.npmmirror.com
yarn config set registry https://registry.npmmirror.com
1 个赞

去这里获得更好的观看体验:
https://vincentzyu233.github.io/VincentZyu233/notes/bot-deploy/koishi-deploy.html

找个地方创建koishi

mkdir -p /data/koishi
cd /data/koishi
yarn create koishi
# 可以一路回车。cli交互的时候你可以输入koishi实例文件夹名。默认叫koishi-app
cd koishi-app
yarn start

调host访问webui

cd /data/koishi/koishi-app
nano koishi.yml
# 找到server插件的配置,添加一行 host:0.0.0.0, ctrl+x保存。
# 可选:修改port,可以改个大一点的 不常用的端口,防止被扫(, 比如55140甚至六万多这种

调完的实例如下:


注意yml是讲究严格的缩进的

curl localhost:55140

如果输出了html内容,说明koishi的webui正常工作


然后尝试用公网ip:端口访问webui。

有些云服务器他是不给你公网ip,但是给几个nat转发端口,这时候需要做的就是把内网的koishi端口转发出去

【重要】配置账号密码

插件配置→auth→输入账号密码,启动


koishi开在公网,那肯定需要点保护(

安装koishi插件

cd /data/koishi/koishi-app
yarn add koishi-plugin-adapter-onebot
# 或者使用npm install koishi-plugin-adapter-onebot

你也可以去webui里面的依赖管理,输入npm包名进行安装


依赖管理里面的包名是需要带有koishi-plugin前缀的捏

你也可以去插件市场页面安装。 先找到market插件,然后把配置项里面的search.endpoint换掉:

社区有提供一些镜像源:
https://github.com/koishi-shangxue-plugins/koishi-registry-aggregator
http://registry.nyan.zone

你也可以试试看我的捏(https://sh-aliyun2.vincentzyu233.cn/koishi-market-proxy/market


你也可以试试看 我放到github page上面的koishi社区插件市场捏
https://vincentzyu233.github.io/uniapp-koishi-market/#/

去沙盒发个help看看

good, koishi works.

1 个赞

保进程

如果你ssh连接断了,你的koishi也就没了捏,因为运行在ssh前台会话。
可以使用以下工具保持进程运行:

  • screen(推荐新手使用)
  • tmux
  • nohup
  • systemd 系统服务(命令行工具叫systemctl
  • PM2(Node.js 进程管理器)
  • mcsmanager 面板(系统资源充足时推荐):MCSM 文档

使用 screen 示例

# 创建 screen 会话
screen -S koishi
# 进入项目目录并启动
cd /data/koishi/koishi-app

yarn start

# 分离会话(在会话内)
Ctrl+A, 然后按 D

# 恢复会话
screen -r koishi

# 列出所有会话
screen -ls

screen

使用mcsmanager的实践示例

你看他名字是管理mc服务器的是吧,实际上他可以管理任何命令行的程序。

部分linux发行版可以直接用这个指令 安装

sudo su -c "wget -qO- https://script.mcsmanager.com/setup_cn.sh | bash"

比如在我用的Debian/Ubuntu机器上,这个安装脚本执行完以后,他会帮你把mcsm程序下载到/opt下,然后注册成systemd系统服务,使用systemctl cli工具等,就可以进行管理

详细参考MCSM文档 https://docs.mcsmanager.com/zh_cn/

然后创建一个实例,类型选择 通用控制台程序

mcsm中,koishi实例的启动命令填写: yarn start

(可选)在bash环境,koishi实例的更新命令可以填写bash -c "yarn && yarn build"

这个更新指令适用于这样的场景:
external文件夹里面的代码进行了更新,比如从远程仓库git pull获取了更新的代码,然后点击mcsm的更新按钮,就可以把最新的src文件夹中的ts文件编译成lib文件夹中的js文件

mcsm-start-update

然后koishi日常运行的日志,或者在你执行 bash -c "yarn && yarn build"时候的日志 会实时显示捏,很方便捏。

如果mcsm终端里面显示运行失败的话,大概率是环境变量问题。这个时候有两种方法:

  • 方法1:去修改mcsm-daemon的systemctl 配置文件,增加 nodejs的环境变量
  • 方法2:直接用绝对路径。把指令中 所有的"yarn"替换成"<node绝对路径> <yarn绝对路径>“, 所有的"node"替换成”<node绝对路径> <npm绝对路径>"
    就好啦
  • 方法3:写一个start.sh脚本在koishi的根目录,里面写yarn start(也可以按照上面换成绝对路径),然后mcsm的启动命令写bash -c “./start.sh”


实际上这一招在跑其他的 nodejs/py/jvm程序的时候,也屡试不爽:

1 个赞

从开发、测试 到 生产、运维的一些实践指令

下面的部分指令是Powershell的哈,其他的shell需要换成各自的语法

查看git大文件

git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | Where-Object { $_ -match '^blob' } | ForEach-Object { $parts = $_ -split ' ', 4; [PSCustomObject]@{ Size = [int]$parts[2]; Name = $parts[3] } } | Sort-Object Size -Descending | Select-Object -First 20 

git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | Where-Object { $_ -match '^blob' } | ForEach-Object { $parts = $_ -split ' ', 4; [PSCustomObject]@{ Size = [int]$parts[2]; File = $parts[3] } } | Sort-Object Size -Descending | Select-Object -First 20 | ForEach-Object { "{0,10} KB  {1}" -f ([math]::Round($_.Size/1KB, 2)), $_.File }

发布到git workflow

开发环境:

cd G:\GGames\Minecraft\shuyeyun\qq-bot\koishi-dev\koishi-dev-3\external\onebot-info-image
git add .
git commit -m "message"
git push origin main

生产环境:

cd /home/bawuyinguo/SSoftwareFiles/koishi/awa-bot-3/external
git clone https://gitee.com/vincent-zyu/koishi-plugin-onebot-image
cd /home/bawuyinguo/SSoftwareFiles/koishi/awa-bot-3/external/koishi-plugin-onebot-image
git pull
cd /home/bawuyinguo/SSoftwareFiles/koishi/awa-bot-3
yarn && yarn build
yarn

发布到npm workflow

# 确保插件文件夹的名称是*onebot-info-image*, 没有koishi-plugin 前缀,然后:
cd G:\GGames\Minecraft\shuyeyun\qq-bot\koishi-dev\koishi-dev-3
yarn
yarn dev
yarn build onebot-info-image

$Env:HTTP_PROXY = "http://127.0.0.1:7890"
$Env:HTTPS_PROXY = "http://127.0.0.1:7890"
Invoke-WebRequest -Uri "https://www.google.com" -Method Head -UseBasicParsing
npm login --registry https://registry.npmjs.org
# 在浏览器里面登录npm,去邮件里面收验证码
npm run pub onebot-info-image -- --registry https://registry.npmjs.org
npm dist-tag add koishi-plugin-onebot-info-image@0.2.0-alpha.11+20251013 latest --registry https://registry.npmjs.org

npm view koishi-plugin-onebot-info-image
npm-stat.com

npm好像前几天整了个活,(好像就在今年12月),现在npm run pub啥的需要验证, 不然传不上去。我的解决办法是,去npm网站申请一个access token,


然后在你开发的koishi实例根目录放一个.npmrc文件,格式像这样:

1 个赞

然后如果你想对接napcat,看这里:

2 个赞

你看看这个,我给小白做了个基础的懒人包修改了市场源和预装了很多常用功能
不过缺点是要手动安装docker-compose很多云主机没预装的

3 个赞

问一嘴 雨云 可以用吗

还有就是如果部署论坛(假设用户最多100人且活跃度一般),2C2G够不

2 个赞

肯定可以啊,有bash环境,能ssh进去的, 云服务商 就行啊

2 个赞

论坛? 我不到啊,你试试看捏

2 个赞

cool, 羡慕

1 个赞

哦哦最开始画的1panel的饼好像还没写

由于本文没有讲用docker跑koishi,所以把1panel的写在这里吧:

其实主要就讲一点,就是用1panel去修改容器的一些参数 比如端口映射 比如 持久化卷挂载 会比较方便(

比如如果你-p参数忘记加了 或者加少了,docker容器run起来以后是不能改的,只能重建容器。 而你在1panel webui里面修改好以后 他会帮你把重建容器这件事做好捏

1 个赞

其实最开始想取的标题是 “我自己在 使用、开发、运维koishi插件的一些实践经验分享”,后面想搞个吸引人一点的标题 才取的这个(

1 个赞

还有就是vscode,如果预算充足 跑koishi的机器 cpu内存资源比较多的话,用vscode ssh也是不错的选择捏

然后就是vscode原生支持TypeScript,ts的intelisense 比 py诸如此类的语言流畅多了,再加上koishi yarn dev下的hmr 对于开发者来说是非常的方便友好捏

koishi默认使用sqlite3

vscode有不少sqlite插件

我用的是这个:

SQLite Viewer

装好以后 直接在左边文件树 双击koishi.db文件,就可以在vscode的ui里面 查看数据库结构啦

1 个赞