Docker 安装

使用 GitHub Container Registry

使用预构建镜像是通过 Docker 运行 SillyTavern 最快、最简单的方式。你可以从 GitHub Container Registry 拉取最新镜像。

Docker Compose(推荐)

GitHub 仓库 下载 docker-compose.yml 文件,并在该文件所在目录下运行以下命令。这会从 GitHub Container Registry 拉取最新的 release 镜像并启动容器,同时自动创建必要的卷。

docker compose up

你可以编辑该文件并进行额外的自定义以满足需求:

  • 默认端口为 8000,你可以通过修改 ports 部分来更改。
  • 如果你想使用开发分支而非稳定版(release),可将 image 标签改为 staging
  • 如果你想通过环境变量调整服务器配置,请查看 环境变量 页面。

Docker CLI(高级)

要让 SillyTavern 正常运行,你需要两个必需的目录映射和一个端口映射。在命令中,请在以下位置替换为你所选的值:

容器变量

卷映射(Volume Mappings)
  • CONFIG_PATH - 在宿主机上存储 SillyTavern 配置文件的目录
  • DATA_PATH - 在宿主机上存储 SillyTavern 用户数据(包括角色)的目录
  • PLUGINS_PATH -(可选)在宿主机上存储 SillyTavern 服务器插件的目录
  • EXTENSIONS_PATH -(可选)在宿主机上存储全局 UI 扩展的目录
端口映射
  • PUBLIC_PORT - 对外暴露流量的端口。此项为必填,因为你需要从容器虚拟机外部访问该实例。在未单独配置安全服务的情况下,请勿将其直接暴露到互联网。
其他设置
  • SILLYTAVERN_VERSION - 在 GitHub Packages 页面 上你会看到已打标签的镜像版本列表。镜像标签 "latest" 会使你保持与当前 release 同步。你还可以使用 "staging",它指向相应分支的每日构建(nightly)镜像。

运行容器

  1. 打开你的命令行
  2. 在你想存储配置和数据文件的文件夹中运行以下命令:
SILLYTAVERN_VERSION="latest"
PUBLIC_PORT="8000"
CONFIG_PATH="./config"
DATA_PATH="./data"
PLUGINS_PATH="./plugins"
EXTENSIONS_PATH="./extensions"

docker run \
  --name="sillytavern" \
  -p "$PUBLIC_PORT:8000/tcp" \
  -v "$CONFIG_PATH:/home/node/app/config:rw" \
  -v "$DATA_PATH:/home/node/app/data:rw" \
  -v "$EXTENSIONS_PATH:/home/node/app/public/scripts/extensions/third-party:rw" \
  -v "$PLUGINS_PATH:/home/node/app/plugins:rw" \
  ghcr.io/sillytavern/sillytavern:"$SILLYTAVERN_VERSION"

构建 Docker 镜像

如果你想自行构建 Docker 镜像,可以按以下步骤操作。这在你想自定义镜像或将其用于开发目的时很有用。

Linux

  1. 按照此处的 Docker 安装指南安装 Docker。
  2. 按照 Docker 安装后指南Manage Docker as a non-root user(以非 root 用户身份管理 Docker)部分的步骤操作。
  3. 使用你的包管理器安装 Git

    • Debian(Ubuntu/Pop! OS 等)

      sudo apt install git
    • Arch Linux(Manjaro/EndeavourOS 等)

      sudo pacman -S git
    • Fedora、Red Hat Enterprise Linux (RHEL) 等

      sudo dnf install git
  4. 克隆 SillyTavern 仓库。

    • Release(稳定分支)

      git clone https://github.com/SillyTavern/SillyTavern && cd SillyTavern/docker
    • Staging(开发分支)

      git clone https://github.com/SillyTavern/SillyTavern -b staging && cd SillyTavern/docker
  5. 在 Docker 文件夹中运行以下命令以执行 docker compose

    docker compose up -d
  6. 打开新的浏览器并访问 http://localhost:8000。你应该会在几秒钟后看到 SillyTavern 加载完成。

Windows

  1. 按照此处的 Docker 安装指南安装 Docker Desktop。
  2. 安装 Git for Windows
  3. 克隆 SillyTavern 仓库。

    • Release(稳定分支)

      git clone https://github.com/SillyTavern/SillyTavern && cd SillyTavern/docker
    • Staging(开发分支)

      git clone https://github.com/SillyTavern/SillyTavern -b staging && cd SillyTavern/docker
  4. 在 Docker 文件夹中运行以下命令以执行 docker compose

    docker compose up -d
  5. 打开新的浏览器并访问 http://localhost:8000。你应该会在几秒钟后看到 SillyTavern 加载完成。

macOS

  1. 按照此处的 Docker 安装指南安装 Docker Desktop。
  2. 使用 Homebrew 安装 git

    brew install git
  3. 克隆 SillyTavern 仓库。

    • Release(稳定分支)

      git clone https://github.com/SillyTavern/SillyTavern && cd SillyTavern/docker
    • Staging(开发分支)

      git clone https://github.com/SillyTavern/SillyTavern -b staging && cd SillyTavern/docker
  4. 在 Docker 文件夹中运行以下命令以执行 docker compose

    docker compose up -d
  5. 打开新的浏览器并访问 http://localhost:8000。你应该会在几秒钟后看到 SillyTavern 加载完成。

配置 SillyTavern

SillyTavern 的配置文件 (config.yaml) 将位于 config 文件夹中。配置该配置文件与在非 Docker 环境下配置并无不同,但你需要使用管理员权限运行 nano 或代码编辑器才能保存更改。

定位用户数据

SillyTavern 的数据文件夹将位于 data 文件夹中。备份文件应该很简单,但恢复或向其中添加内容可能需要你使用管理员权限来执行。

运行服务器插件

在 Docker 中运行 HoYoWiki-Scraper-TSSillyTavern-Fandom-Scraper 等插件,与在非 Docker 系统上运行没有区别,但我们需要对 Docker Compose 脚本稍作修改才能做到。

  1. 使用 nano 或代码编辑器打开 docker-compose.yml,并在 volumes 下方添加以下行。

        volumes:
            - "./config:/home/node/app/config"
            - "./data:/home/node/app/data"
            - "./plugins:/home/node/app/plugins"
  2. docker 文件夹中新建一个名为 plugins 的文件夹。
  3. 按照你所用插件的说明安装插件。
  4. 使用管理员权限的 nano 或代码编辑器打开 config.yaml(位于 config 文件夹中),并启用 enableServerPlugins

    enableServerPlugins: true
  5. 重启 Docker 容器。

    docker compose restart sillytavern

非 root 用户模式

默认情况下,容器以 root 身份运行。如果你希望挂载卷中创建的文件归属于某个特定的宿主机用户(例如,避免产生 root 拥有的文件),你可以启用非 root 模式。

选项 1:PUID/PGID(推荐)

PUIDPGID 环境变量设置为你希望容器使用的 UID/GID。入口点(entrypoint)会更新所需目录的归属,然后以该映射用户的身份运行服务器。

Docker Compose 示例:

services:
  sillytavern:
    environment:
      - PUID=1000
      - PGID=1000

Docker CLI 示例:

docker run \
  --name="sillytavern" \
  -e PUID=1000 \
  -e PGID=1000 \
  -p "$PUBLIC_PORT:8000/tcp" \
  -v "$CONFIG_PATH:/home/node/app/config:rw" \
  -v "$DATA_PATH:/home/node/app/data:rw" \
  -v "$EXTENSIONS_PATH:/home/node/app/public/scripts/extensions/third-party:rw" \
  -v "$PLUGINS_PATH:/home/node/app/plugins:rw" \
  ghcr.io/sillytavern/sillytavern:"$SILLYTAVERN_VERSION"

选项 2:Docker --user 标志

你也可以使用 Docker 的 --user 标志以特定用户身份运行容器。在此模式下,容器无法自动修复权限,因此请确保你提供的 UID/GID 对挂载的卷已具有写入权限。

docker run \
  --name="sillytavern" \
  --user 1000:1000 \
  -p "$PUBLIC_PORT:8000/tcp" \
  -v "$CONFIG_PATH:/home/node/app/config:rw" \
  -v "$DATA_PATH:/home/node/app/data:rw" \
  -v "$EXTENSIONS_PATH:/home/node/app/public/scripts/extensions/third-party:rw" \
  -v "$PLUGINS_PATH:/home/node/app/plugins:rw" \
  ghcr.io/sillytavern/sillytavern:"$SILLYTAVERN_VERSION"

容器健康检查

Docker 镜像内置了健康检查(healthcheck)机制,用于监控 SillyTavern 服务器的响应能力。这对于容器编排系统(如 Docker Compose、Kubernetes 或 Docker Swarm)检测并自动重启无响应的容器非常有用。

工作原理

健康检查使用心跳文件机制:

  1. 启用后,SillyTavern 服务器会定期将时间戳写入数据目录中的 heartbeat.json 文件。
  2. 健康检查脚本 (src/healthcheck.js) 会验证心跳文件是否存在以及是否近期更新过。
  3. 如果心跳文件缺失或过于陈旧(超过 2 个间隔未更新),容器将被标记为不健康(unhealthy)。

配置

健康检查由 SILLYTAVERN_HEARTBEATINTERVAL 环境变量(或 config.yaml 中的 heartbeatInterval)控制。该值指定了两次心跳写入之间以秒为单位的间隔。

  • 默认值: 0(禁用)
  • 推荐值: 在使用 Docker 健康检查时设为 30

默认的 docker-compose.yml 文件包含已启用心跳的健康检查配置:

services:
  sillytavern:
    environment:
      - SILLYTAVERN_HEARTBEATINTERVAL=30
    healthcheck:
      test: ["CMD", "node", "src/healthcheck.js"]
      interval: 30s
      timeout: 10s
      start_period: 20s
      retries: 3

检查容器健康状态

你可以使用以下命令检查容器的健康状态:

docker inspect --format='{{.State.Health.Status}}' sillytavern

或者查看包括健康状况在内的完整容器状态:

docker ps

STATUS 列会在运行时间旁边显示 healthyunhealthystarting

禁用健康检查

如果你不需要健康检查功能,可以通过以下方式禁用:

  1. 将环境变量设置为 0

    environment:
      - SILLYTAVERN_HEARTBEATINTERVAL=0
  2. 移除或注释掉 docker-compose.yml 中的 healthcheck 部分。

Docker 常见问题

SELinux 下挂载卷的权限问题

启用了 SELinux 的 Linux 发行版(如 RHEL、CentOS、Fedora 等)可能会因安全策略阻止 Docker 容器访问挂载的卷。当容器尝试读取或写入挂载目录时,这可能导致权限被拒绝的错误。

可以在卷挂载中添加 :z:Z 两个后缀。这些后缀会告知 Docker 重新标记共享卷上的文件对象。

  • z 选项用于卷内容将在多个容器之间共享的情况。
  • Z 选项用于卷内容仅由当前容器使用的情况。

示例:

# docker-compose.yml
volumes:
  ## 共享卷
  - ./config:/home/node/app/config:z
  ## 私有卷
  - ./data:/home/node/app/data:Z

被白名单拒绝

  1. 执行以下 Docker 命令以获取你的 SillyTavern Docker 容器的 IP。

    docker network inspect docker_default

    你应该会收到类似以下的一些输出。

    [
        {
            "Name": "docker_default",
            "IPAM": {
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            }
        }
    ]

    记下你在 Gateway 中看到的 IP,这一点很重要。

  2. 使用你选择的文本编辑器并以管理员权限运行,转到 config 并打开 config.yaml

    在编辑器中,向下滚动到 whitelist 部分。你应该会看到类似以下的内容。

    whitelist:
        - 127.0.0.1

    127.0.0.1 下方添加一行,并填入你从 Docker 复制的 IP。之后它应该看起来类似以下内容。

    whitelist:
        - 127.0.0.1
        - 172.18.0.1

    保存文件并退出文本编辑器。

  3. 重启 Docker 容器以应用新配置。

    docker compose restart sillytavern