反向代理
注意
本节不是指 OpenAI/Claude 反向代理。本节仅专门讨论 HTTP/HTTPS 反向代理。
Termux 的设置让你感到困惑吗?你是否厌倦了在每一台设备上都更新和安装 ST?你想要更好地组织你的对话和角色吗?那你运气不错。本指南将——希望如此——涵盖如何在你自己的 PC 上托管 SillyTavern,让你可以从任何地方连接,并在你运行 AI 模型的同一台 PC 上与你的机器人聊天!
警告
本指南并不面向初学者。内容会非常技术化。
事先提醒
面向 Windows 用户
本指南不适用于 Windows 用户。我们建议使用 Linux 虚拟机或 WSL2 来跟随本指南。
你需要为自己购买一个域名,并为你的 SillyTavern 页面配置一条 CNAME。我们建议在 Cloudflare 上添加或购买域名,因为本指南将涵盖如何直接使用 Cloudflare 完成这些操作。
安装
Linux(裸机版 SillyTavern)
在 Linux 上,我们将通过 Traefik 对 SillyTavern 进行反向代理。也有其他选择,例如 NGINX 或 Caddy,但在本指南中我们将使用 Traefik,因为那正是我们自己使用的方案。
- 使用
ifconfig或通过你的路由器获取你计算机的私有 IP。提示
建议将你的私有 IP 设置为静态 IP。请参考路由器的说明书或通过搜索引擎查找如何配置静态 IP。
- 通过搜索引擎搜索
what's my ip来获取你的调制解调器的公网 IP。关于公网 IP
大多数住宅/家庭网络使用的是 动态 IP,它在使用数月后会被重新分配。如果你使用的是动态 IP,请使用 DDClient,或者记得定期在 Cloudflare 控制台上检查并更新你的公网 IP。
- 按照 此处 的 Docker 安装指南安装 Docker。
注意
不要安装 Docker Desktop。
- 按照 Docker 安装后指南 此处 中 Manage Docker as a non-root user 一节的步骤操作。
- 进入 Linux 的根目录,新建一个名为
docker的文件夹。cd / sudo mkdir docker && cd docker - 执行
chown,将替换为你的 Linux 用户名,以设置 docker 文件夹的权限。 sudo chown -R <USER>:<USER> . - 在 docker 文件夹中新建一个名为
secrets的文件夹,并在 secrets 中新建cloudflare文件夹。mkdir secrets && mkdir secrets/cloudflare - 在 docker 文件夹中新建一个名为
appdata的文件夹,并在 appdata 中新建traefik文件夹。随后进入appdata/traefik文件夹。mkdir appdata && mkdir appdata/traefik cd appdata/traefik - 使用
touch创建 acme.json 文件,并将其权限设置为 600。touch acme.json chmod 600 acme.json - 使用
nano或类似编辑器,创建一个名为 traefik.yml 的文件,并粘贴以下内容。将模板中的邮箱替换为你自己的邮箱,然后保存文件。api: dashboard: true debug: true insecure: true entryPoints: http: address: ":80" http: redirections: entryPoint: to: https scheme: https https: address: ":443" serversTransport: insecureSkipVerify: true providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false file: filename: /config.yml watch: true certificatesResolvers: cloudflare: acme: email: YOUR_CLOUDFLARE_EMAIL@DOMAIN.com storage: acme.json dnsChallenge: provider: cloudflare #disablePropagationCheck: true # uncomment this if you have issues pulling certificates through cloudflare, By setting this flag to true disables the need to wait for the propagation of the TXT record to all authoritative name servers. resolvers: - "1.1.1.1:53" - "1.0.0.1:53" - 返回
docker文件夹。cd /docker -
使用
nano或类似编辑器,创建一个名为 docker-compose.yaml 的文件,并粘贴以下内容。随后保存文件。secrets: CF_DNS_API_KEY: file: ./secrets/cloudflare/CF_DNS_API_KEY services: traefik: image: traefik:latest container_name: traefik restart: unless-stopped secrets: - CF_DNS_API_KEY ports: - 80:80 - 443:443 - 8080:8080 environment: CLOUDFLARE_DNS_API_TOKEN_FILE: /run/secrets/CF_DNS_API_KEY CLOUDFLARE_ZONE_API_TOKEN_FILE: /run/secrets/CF_DNS_API_KEY volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./appdata/traefik/traefik.yml:/traefik.yml:ro - ./appdata/traefik/config.yml:/config.yml:ro - ./appdata/traefik/acme.json:/acme.json - /etc/localtime:/etc/localtime:ro networks: internal: driver: bridge - 登录 Cloudflare,点击你的域名,然后点击 Get your API token。
-
点击 Create Token,然后点击 Create Custom Token,并确保为你的令牌授予以下权限。
令牌权限
Zone -> DNS -> Edit
Zone -> Zone -> Read
点击 Continue to summary,然后点击 Create Token。
- 复制系统提供给你的令牌密钥,并将其妥善保存在安全的地方。
cd进入secrets/cloudflare,使用nano或类似编辑器创建一个名为 CF_DNS_API_KEY 的文件,并将你的密钥粘贴进去。-
返回你的域名页面,进入 DNS。使用 Add record 新建一条记录,并创建两条如下所示的 A 类型记录。将
PUBLIC_IP替换为你自己的公网 IP,然后点击 Save。 -
再创建一条
CNAME类型的记录,然后点击 Save。以下是它在 Cloudflare 控制台上应有的展示示例。 -
cd进入 appdata/traefik,使用nano或类似编辑器创建一个名为 config.yml 的文件,并粘贴以下内容。将PRIVATE_IP替换为你获取到的私有 IP,将silly.DOMAIN.com替换为你的子域名和域名页面名称,然后保存文件。http: routers: sillytavern: entryPoints: - "https" rule: "Host(`silly.DOMAIN.com`)" middlewares: - https-redirectscheme tls: {} service: sillytavern services: sillytavern: loadBalancer: servers: - url: "http://PRIVATE_IP:8000" passHostHeader: true middlewares: https-redirectscheme: redirectScheme: scheme: https permanent: true - 使用以下命令运行 Docker Compose:
cd /docker docker compose up -d -
进入你的 SillyTavern 文件夹,编辑
config.yaml以启用监听模式和基础认证,同时禁用whitelistMode。listen: yes whitelistMode: false basicAuthMode: true提示
务必将默认用户名和密码修改为强度高且你能记住的内容。
或者,使用 SillyTavern 账户作为用户名和密码:
basicAuthMode: true enableUserAccounts: true perUserBasicAuth: true提示
在启用 perUserBasicAuth 之前,请确保你已拥有一个有效的多用户设置且密码可用。
- 等待几分钟后,打开你为 ST 创建的域名页面。最终,你应该能够仅凭一个 URL 和一个账户,从任何地方打开 SillyTavern。
提示
如果几分钟后没有任何反应,请检查 Traefik 的容器日志以排查可能的错误。
- 尽情使用吧! :D
Linux(Docker 版 SillyTavern)
注意
请注意,我们自己在生产环境中是在裸机上运行 SillyTavern,而非使用 Docker。本节只是我们在 Docker 上配合我们常用的其他 Docker 容器使用 ST 时的一个大致思路。
- 按照 Linux(裸机版 SillyTavern) 一节中的第 1 至 11 步操作。
- 登录 Cloudflare,点击你的域名,然后点击 Get your API token。
-
点击 Create Token,然后点击 Create Custom Token,并确保为你的令牌授予以下权限。
令牌权限
Zone -> DNS -> Edit
Zone -> Zone -> Read
点击 Continue to summary,然后点击 Create Token。
- 复制系统提供给你的令牌密钥,并将其妥善保存在安全的地方。
cd进入secrets/cloudflare,使用nano或类似编辑器创建一个名为 CF_DNS_API_KEY 的文件,并将你的密钥粘贴进去。-
返回你的域名页面,进入 DNS。使用 Add record 新建一条记录,并创建两条如下所示的 A 类型记录。将
PUBLIC_IP替换为你自己的公网 IP,并将示例域名替换为你的域名,然后点击 Save。 -
再创建一条
CNAME类型的记录,然后点击 Save。以下是它在 Cloudflare 控制台上应有的展示示例。 - 将 SillyTavern 通过 Git 克隆到
docker文件夹中。cd /docker && git clone https://github.com/SillyTavern/SillyTavern -
使用
nano或类似编辑器创建一个名为 docker-compose.yaml 的文件,并粘贴以下内容。将silly.DOMAIN.com替换为你之前添加的子域名,然后保存文件。secrets: CF_DNS_API_KEY: file: ./secrets/cloudflare/CF_DNS_API_KEY services: traefik: image: traefik:latest container_name: traefik restart: unless-stopped secrets: - CF_DNS_API_KEY ports: - "80:80" - 443:443 - 8080:8080 environment: CLOUDFLARE_DNS_API_TOKEN_FILE: /run/secrets/CF_DNS_API_KEY CLOUDFLARE_ZONE_API_TOKEN_FILE: /run/secrets/CF_DNS_API_KEY volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./appdata/traefik/traefik.yml:/traefik.yml:ro - ./appdata/traefik/config.yml:/config.yml:ro - ./appdata/traefik/acme.json:/acme.json - /etc/localtime:/etc/localtime:ro sillytavern: build: ./SillyTavern container_name: sillytavern hostname: sillytavern image: ghcr.io/sillytavern/sillytavern:latest volumes: - "./appdata/sillytavern/config:/home/node/app/config" - "./appdata/sillytavern/data:/home/node/app/data" restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.sillytavern.entrypoints=http" - "traefik.http.routers.sillytavern.rule=Host(`silly.DOMAIN.com`)" - "traefik.http.middlewares.sillytavern-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.sillytavern.middlewares=sillytavern-https-redirect" - "traefik.http.routers.sillytavern-secure.entrypoints=https" - "traefik.http.routers.sillytavern-secure.rule=Host(`silly.DOMAIN.com`)" - "traefik.http.routers.sillytavern-secure.tls=true" - "traefik.http.routers.sillytavern-secure.service=sillytavern" - "traefik.http.services.sillytavern.loadbalancer.server.port=8000" networks: internal: driver: bridge - 使用以下命令运行 Docker Compose:
docker compose up -d - 停止 SillyTavern Docker 容器。
docker compose stop sillytavern -
进入你的 SillyTavern 文件夹(
appdata/sillytavern/config),编辑config.yaml以启用监听模式和基础认证,同时禁用whitelistMode。listen: yes whitelistMode: false basicAuthMode: true提示
务必将默认用户名和密码修改为强度高且你能记住的内容。
- 再次启动 SillyTavern Docker 容器。
docker compose up -d sillytavern - 等待几分钟后,打开你为 ST 创建的域名页面。最终,你应该能够仅凭一个 URL 和一个账户,从任何地方打开 SillyTavern。
提示
如果几分钟后没有任何反应,请检查 Traefik 的容器日志以排查可能的错误。
- 尽情使用吧! :D
更新你的 Cloudflare DNS
DDClient 允许你在 ISP 更改了你的公网 IP 时,将新的公网 IP 同步到 Cloudflare,让你能够像什么都没发生过一样继续访问你的 ST 实例。