环境:Ubuntu 24.04 + WireGuard + Docker + SillyTavern
1. 目标
在一台 Ubuntu 24.04 服务器上部署:
- WireGuard VPN
- Docker
- SillyTavern
使用方式:
- 用户先连接 WireGuard
- 再通过 VPN 内网地址访问 SillyTavern
- 不直接把 SillyTavern 暴露到公网
SillyTavern 官方支持 multi-user, 但也明确提醒其用户隔离不是强安全边界, 且不建议直接将实例暴露到互联网.
SillyTavern 官方文档: SillyTavern Documentation
2. 服务器信息
示例配置:
- 服务器公网 IP:
xxx.xxx.xxx.xxx - WireGuard 监听端口:
51820/udp - WireGuard 网段:
10.xx.xx.0/24 - 服务器 VPN 地址:
10.xx.xx.1/24 - 客户端 1 VPN 地址:
10.xx.xx.2/24 - SillyTavern 端口:
8000
3. 系统初始化
更新系统:
sudo apt update
sudo apt full-upgrade -y
sudo reboot安装基础工具:
sudo apt install -y curl wget git nano ufw ca-certificates gnupg lsb-release4. 安装 Docker
4.1 推荐:使用 Docker 官方源
移除旧包:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt remove -y $pkg
done添加 Docker 官方仓库:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL --retry 3 https://download.docker.com/linux/ubuntu/gpg -o /tmp/docker.asc
gpg --show-keys /tmp/docker.asc
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg /tmp/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.gpgecho \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装 Docker:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin设置开机启动:
sudo systemctl enable docker
sudo systemctl start docker检查版本:
docker --version
docker compose versionroot@xxx:~# docker --version
Docker version 29.4.0, build 9d7ad9f
root@xxx:~# docker compose version
Docker Compose version v5.1.25. 安装 WireGuard
安装:
sudo apt install -y wireguard生成服务器密钥:
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key查看服务器公钥和私钥:
cat server_public.key
cat server_private.key6. 配置 WireGuard 服务器
编辑配置文件:
sudo nano /etc/wireguard/wg0.conf写入:
此时先完成接口配置即可,生成客户端公钥后再补充 [Peer]段
[Interface]
Address = 10.xx.xx.1/24
ListenPort = 51820
PrivateKey = <服务器私钥>
SaveConfig = false
建议使用一个未被本地网络占用的私有网段,例如 10.66.57.0/24
7. 开启 IP 转发
编辑:
sudo nano /etc/sysctl.conf确保存在:
net.ipv4.ip_forward=1生效:
sudo sysctl -p8. 配置防火墙
只开放 SSH 和 WireGuard:
sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw enable
sudo ufw status不要开放 8000 到公网.
9. 启动 WireGuard
sudo systemctl enable wg-quick@wg0
sudo systemctl restart wg-quick@wg0检查状态:
sudo wg
ip addr show wg0成功时应看到:
interface:wg0listening port:51820inet 10.xx.xx.1/24
10. 生成客户端配置
为客户端生成密钥:
私钥只用于填配置,不要发送给其他人,不要截图,不要放进公开文档。
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
cat client1_private.key
cat client1_public.key把客户端公钥填回服务器 /etc/wireguard/wg0.conf 的 [Peer] 段,
[Interface]
Address = 10.xx.xx.1/24
ListenPort = 51820
PrivateKey = <服务器私钥>
SaveConfig = false
[Peer]
PublicKey = <客户端1公钥>
AllowedIPs = 10.xx.xx.2/32重启:
sudo systemctl restart wg-quick@wg0客户端配置示例:
[Interface]
PrivateKey = <客户端1私钥>
Address = 10.xx.xx.2/24
DNS = 8.8.8.8
[Peer]
PublicKey = <服务器公钥>
Endpoint = xx.xx.xx.xx:51820
AllowedIPs = 10.xx.xx.0/24
PersistentKeepalive = 25导入到 Windows / macOS / Linux / Android / iPhone 的 WireGuard 客户端.
连接成功后, 客户端应能访问:
PS C:\Users\xxx> ping 10.xx.xx.1
正在 Ping 10.xx.xx.1 具有 32 字节的数据:
来自 10.xx.xx.1 的回复:字节=32 时间=19ms TTL=64
来自 10.xx.xx.1 的回复:字节=32 时间=20ms TTL=64
来自 10.xx.xx.1 的回复:字节=32 时间=20ms TTL=64
来自 10.xx.xx.1 的回复:字节=32 时间=20ms TTL=6411. 安装 SillyTavern
创建目录:
mkdir -p ~/sillytavern
cd ~/sillytavern创建 docker-compose.yml:
nano docker-compose.yml写入:
services:
sillytavern:
image: ghcr.io/sillytavern/sillytavern:latest
container_name: sillytavern
restart: unless-stopped
ports:
- "10.xx.xx.1:8000:8000"
volumes:
- ./config:/home/node/app/config
- ./data:/home/node/app/data
- ./plugins:/home/node/app/plugins启动:
docker compose up -d
docker compose logs -f这样 SillyTavern 只绑定在 VPN 地址 10.xx.xx.1 上, 不直接绑定公网地址.
12. 配置 SillyTavern
首次启动后, 配置文件生成在:
~/sillytavern/config/config.yaml编辑:
nano ~/sillytavern/config/config.yaml建议最小配置:
enableUserAccounts: true
enableDiscreetLogin: true
listen: true
port: 8000
whitelist:
- 10.xx.xx.0/24重启容器:
cd ~/sillytavern
docker compose restart说明:
enableUserAccounts: true: 开启多用户enableDiscreetLogin: true: 隐藏登录页用户列表listen: true: 允许外部访问容器服务whitelist: 白名单, 开放对应网络段
SillyTavern 官方文档确认 multi-user 可让不同用户拥有各自设置和数据.
13. 访问 SillyTavern
客户端先连接 WireGuard, 再访问:
http://10.xx.xx.1:8000使用 VPN 内网地址,不是公网 IP 或端口。
首次登录后:
- 创建管理员账号
- 创建普通用户账号
- 每个用户单独使用自己的账号
14. 配置 hosted API
在 SillyTavern 页面中:
- 打开 API Connections
- 选择相应的 API 类型
- 填写 base URL 和 API key
- 测试连接
如果 OpenAI-compatible 网关部署在宿主机,而 SillyTavern 跑在 Docker 里,容器应通过 host.docker.internal 访问宿主机服务。
15. 新增一个用户的流程
每新增一位朋友, 需要做两件事:
15.1 增加一个 WireGuard peer
可以参看 快速新增一个客户端
- 生成新的客户端密钥
- 分配新的 VPN 地址, 例如
10.xx.xx.3/32 - 在服务器
/etc/wireguard/wg0.conf中增加一个[Peer]
15.2 在 SillyTavern 中创建一个新账号
- 单独用户名
- 单独密码
- 不共用账号
Ubuntu 官方 WireGuard 文档也把“新增 peer”作为常规操作. (Ubuntu)
16. 常用运维命令
查看 WireGuard:
sudo wg
watch wg查看 SillyTavern:
cd ~/sillytavern
docker compose ps
docker compose logs -f更新 SillyTavern:
cd ~/sillytavern
docker compose pull
docker compose up -d备份:
tar czf sillytavern-backup-$(date +%F).tar.gz ~/sillytavern17. 故障排查
17.1 Docker 官方源安装失败
常见原因:
download.docker.com网络异常- GPG key 下载失败
- 报
NO_PUBKEY
解决方式:
- 重新下载 GPG key
- 或临时使用 Ubuntu 自带
docker.io
17.2 WireGuard 显示连接但无法 ping 10.xx.xx.1
重点检查:
sudo wg
cat /etc/wireguard/wg0.conf若服务器端没有 [Peer], 客户端就不会真正被接受.
17.3 SillyTavern 打不开
检查:
cd ~/sillytavern
docker compose ps
docker compose logs -f
ss -tulpn | grep 800017.4 VPN 通了但 ST 连不上
确认 docker-compose.yml 绑定的是:
ports:
- "10.xx.xx.1:8000:8000"并且客户端访问的是:
http://10.xx.xx.1:800018. 安全建议
- 只给熟人使用
- 不把 SillyTavern 直接暴露到公网
- 不开放 8000 公网端口
- 不共享管理员账号
- 不安装来源不明的扩展和 server plugins
- 定期备份
~/sillytavern
官方文档明确提示 third-party extensions 和 server plugins 有安全风险, 且 server plugins 不做 sandbox.
19. 最小闭环
成功部署的最小标准:
- 服务器
sudo wg正常 - 客户端连接 WireGuard 成功
- 客户端能访问
10.xx.xx.1 - 浏览器能打开
http://10.xx.xx.1:8000 - 能登录 SillyTavern 并连接 hosted API
Logs
docker 安装失败
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg日志里显示:
curl:(35) Recv failure:Connection reset by peergpg:no valid OpenPGP data found.- 后面
apt update又报NO_PUBKEY 7EA0A9C3F273FCD8
Docker 的 GPG key 没有下载成功,/etc/apt/keyrings/docker.gpg 因此为空或无效。
Docker 源虽然已写入,但系统缺少对应公钥,仓库签名校验会失败。
修复
按下面这组命令重新来, 不要沿用刚才那个坏文件.
- 删掉坏的 key 文件
sudo rm -f /etc/apt/keyrings/docker.gpg- 重新下载 key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL --retry 3 https://download.docker.com/linux/ubuntu/gpg -o /tmp/docker.asc
gpg --show-keys /tmp/docker.asc- 如果上一步能看到 key 信息, 再转成 gpg 格式
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg /tmp/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.gpg- 重新更新
sudo apt update- 再安装 Docker
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin