## 起因
手头有一台 Vultr 的 $5 小服务器(1vCPU / 1GB RAM),平时主要跑 VLESS 翻墙用,顺便挂了个 Halo 论坛。最近想玩 SillyTavern,又不想专门再开一台机器,就想看看能不能在这台已经塞满东西的小鸡上再叠一层。
最终结论:**完全可以**。SillyTavern 只是个 Node.js 前端,调用外部 LLM API,本身几乎不吃资源。
## 环境
- Ubuntu 24.04
- 1 vCPU / 1 GB RAM / 2GB swap
- 已有服务:
- 1Panel 面板(管理一切)
- OpenResty 容器(占 80/443,反代各种站点)
- Halo 论坛(Docker,端口 8090)
- PostgreSQL(Docker,5432)
- x-ui + xray(VLESS 走 2096 端口)
目标:让 st.renellis.online 跑 SillyTavern,不影响现有服务。
## 部署步骤
### 1. 准备环境
加 swap(1GB 内存跑 npm install 很容易 OOM):
```bash
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
```
装 Node.js 20:
```bash
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
```
### 2. 拉取并安装 SillyTavern
```bash
cd /root
git clone https://github.com/SillyTavern/SillyTavern.git -b release
cd SillyTavern
npm install --no-audit --no-fund
./start.sh # 第一次启动生成 config.yaml,然后 Ctrl+C
```
### 3. 修改 config.yaml
关键改动:
```yaml
listen: true
listenAddress:
ipv4: 0.0.0.0 # 后面要让 Docker 容器内的 OpenResty 访问,所以不能只监听 127.0.0.1
ipv6: "[::1]"
whitelistMode: false
enableForwardedWhitelist: false
basicAuthMode: true
basicAuthUser:
username: <自己的用户名>
password: <强密码>
```
> 这里有个坑:因为 1Panel 的 OpenResty 是跑在 Docker 容器里的,它访问宿主机的 127.0.0.1 是容器自己的 localhost,连不到 SillyTavern。所以监听地址必须是 0.0.0.0(或宿主机的 docker0 网桥地址)。安全靠 Basic Auth + HTTPS 兜底。
### 4. 用 systemd 守护
```ini
# /etc/systemd/system/sillytavern.service
[Unit]
Description=SillyTavern
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/SillyTavern
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
```
```bash
systemctl daemon-reload
systemctl enable --now sillytavern
```
### 5. 在 1Panel 里配反向代理
- 网站 → 创建网站 → 反向代理
- 主域名st.renellis.online
- 代理地址http://172.17.0.1:8000(**重点:必须是 docker0 网桥地址**,不是 127.0.0.1)
- 配置文件里补全 WebSocket 支持:
```nginx
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_read_timeout 600s;
```
### 6. 申请 HTTPS
1Panel 站点设置 → HTTPS → Let's Encrypt → HTTP 验证 → 一键申请。
## 然后翻车了
### 翻车 1:VLESS 突然不通
排查过程:
```bash
ufw status
```
发现 ufw 不知道什么时候被启用了(其实是我之前为了限制 8000 端口的访问范围跑了 ufw deny 8000,触发了 ufw 启用),默认拒绝所有入站,把 VLESS 的 2096 端口也挡了。
修复:
```bash
ufw disable
```
反正服务器是 1Panel 在管,靠面板的防火墙就够了。
### 翻车 2:所有域名都返回 SillyTavern 的证书
申请完证书发现 https://renellis.online(论坛)也变成 SillyTavern 的证书了,浏览器报 ERR_CERT_COMMON_NAME_INVALID。
诊断命令:
```bash
openssl s_client -connect 127.0.0.1:443 -servername renellis.online </dev/null 2>/dev/null | openssl x509 -noout -subject
```
返回 CN = st.renellis.online——也就是不管访问哪个域名,OpenResty 都用了 SillyTavern 的证书。
原因:1Panel 申请证书的流程里有个提示说"IP 为域名的网站需要设为默认站点",我手贱把 SillyTavern 站点设成默认了,结果 OpenResty 对所有 SNI 都 fallback 到这个站点的证书。
修复:1Panel → 网站 → 取消 SillyTavern 的默认站点设置。
## 最终状态
- https://st.renellis.online → SillyTavern(Basic Auth 保护)
- https://renellis.online → Halo 论坛
- VLESS 端口 2096 → 正常翻墙
- 内存占用:所有东西加起来还剩 200+ MB 空闲
## 经验总结
1. 1GB 内存先加 swap,不然 npm install 必 OOM
2. Docker 化的反代访问宿主机服务,要用 172.17.0.1 而不是 127.0.0.1
3. 不要随便设默认站点,会污染其他域名的 TLS 握手
4. 改 ufw 规则前先确认 ufw 状态,触发自动启用会拉清单挡掉一堆端口
5. SillyTavern 只是前端壳,真正吃资源的是 LLM API 调用(在远端),所以小鸡跑它毫无压力