反向代理

Termux 的设置让你感到困惑吗?你是否厌倦了在每一台设备上都更新和安装 ST?你想要更好地组织你的对话和角色吗?那你运气不错。本指南将——希望如此——涵盖如何在你自己的 PC 上托管 SillyTavern,让你可以从任何地方连接,并在你运行 AI 模型的同一台 PC 上与你的机器人聊天!

事先提醒

你需要为自己购买一个域名,并为你的 SillyTavern 页面配置一条 CNAME。我们建议在 Cloudflare 上添加或购买域名,因为本指南将涵盖如何直接使用 Cloudflare 完成这些操作。

安装

Linux(裸机版 SillyTavern)

在 Linux 上,我们将通过 Traefik 对 SillyTavern 进行反向代理。也有其他选择,例如 NGINXCaddy,但在本指南中我们将使用 Traefik,因为那正是我们自己使用的方案。

  1. 使用 ifconfig 或通过你的路由器获取你计算机的私有 IP。
  2. 通过搜索引擎搜索 what's my ip 来获取你的调制解调器的公网 IP。
  3. 按照 此处 的 Docker 安装指南安装 Docker。
  4. 按照 Docker 安装后指南 此处Manage Docker as a non-root user 一节的步骤操作。
  5. 进入 Linux 的根目录,新建一个名为 docker 的文件夹。
    cd /
    sudo mkdir docker && cd docker
  6. 执行 chown,将 替换为你的 Linux 用户名,以设置 docker 文件夹的权限。
    sudo chown -R <USER>:<USER> .
  7. docker 文件夹中新建一个名为 secrets 的文件夹,并在 secrets 中新建 cloudflare 文件夹。
    mkdir secrets && mkdir secrets/cloudflare
  8. docker 文件夹中新建一个名为 appdata 的文件夹,并在 appdata 中新建 traefik 文件夹。随后进入 appdata/traefik 文件夹。
    mkdir appdata && mkdir appdata/traefik
    cd appdata/traefik
  9. 使用 touch 创建 acme.json 文件,并将其权限设置为 600。
    touch acme.json
    chmod 600 acme.json
  10. 使用 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"
  11. 返回 docker 文件夹。
    cd /docker
  12. 使用 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
  13. 登录 Cloudflare,点击你的域名,然后点击 Get your API token
  14. 点击 Create Token,然后点击 Create Custom Token,并确保为你的令牌授予以下权限。

    点击 Continue to summary,然后点击 Create Token

  15. 复制系统提供给你的令牌密钥,并将其妥善保存在安全的地方。
  16. cd 进入 secrets/cloudflare,使用 nano 或类似编辑器创建一个名为 CF_DNS_API_KEY 的文件,并将你的密钥粘贴进去。
  17. 返回你的域名页面,进入 DNS。使用 Add record 新建一条记录,并创建两条如下所示的 A 类型记录。将 PUBLIC_IP 替换为你自己的公网 IP,然后点击 Save

    类型 名称(必填) 目标(必填) 代理状态 TTL
    A DOMAIN.com PUBLIC_IP Proxied Auto
    A www PUBLIC_IP Proxied Auto
  18. 再创建一条 CNAME 类型的记录,然后点击 Save。以下是它在 Cloudflare 控制台上应有的展示示例。

    类型 名称(必填) 目标(必填) 代理状态 TTL
    CNAME silly DOMAIN.com Proxied N/A
  19. 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
  20. 使用以下命令运行 Docker Compose:
    cd /docker
    docker compose up -d
  21. 进入你的 SillyTavern 文件夹,编辑 config.yaml 以启用监听模式和基础认证,同时禁用 whitelistMode

    listen: yes
    whitelistMode: false
    basicAuthMode: true

    或者,使用 SillyTavern 账户作为用户名和密码:

    basicAuthMode: true
    enableUserAccounts: true
    perUserBasicAuth: true
  22. 等待几分钟后,打开你为 ST 创建的域名页面。最终,你应该能够仅凭一个 URL 和一个账户,从任何地方打开 SillyTavern。
  23. 尽情使用吧! :D

Linux(Docker 版 SillyTavern)

  1. 按照 Linux(裸机版 SillyTavern) 一节中的第 1 至 11 步操作。
  2. 登录 Cloudflare,点击你的域名,然后点击 Get your API token
  3. 点击 Create Token,然后点击 Create Custom Token,并确保为你的令牌授予以下权限。

    点击 Continue to summary,然后点击 Create Token

  4. 复制系统提供给你的令牌密钥,并将其妥善保存在安全的地方。
  5. cd 进入 secrets/cloudflare,使用 nano 或类似编辑器创建一个名为 CF_DNS_API_KEY 的文件,并将你的密钥粘贴进去。
  6. 返回你的域名页面,进入 DNS。使用 Add record 新建一条记录,并创建两条如下所示的 A 类型记录。将 PUBLIC_IP 替换为你自己的公网 IP,并将示例域名替换为你的域名,然后点击 Save

    类型 名称(必填) 目标(必填) 代理状态 TTL
    A DOMAIN.com PUBLIC_IP Proxied Auto
    A www PUBLIC_IP Proxied Auto
  7. 再创建一条 CNAME 类型的记录,然后点击 Save。以下是它在 Cloudflare 控制台上应有的展示示例。

    类型 名称(必填) 目标(必填) 代理状态 TTL
    CNAME silly DOMAIN.com Proxied N/A
  8. 将 SillyTavern 通过 Git 克隆到 docker 文件夹中。
    cd /docker && git clone https://github.com/SillyTavern/SillyTavern
  9. 使用 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
  10. 使用以下命令运行 Docker Compose:
    docker compose up -d
  11. 停止 SillyTavern Docker 容器。
    docker compose stop sillytavern
  12. 进入你的 SillyTavern 文件夹(appdata/sillytavern/config),编辑 config.yaml 以启用监听模式和基础认证,同时禁用 whitelistMode

    listen: yes
    whitelistMode: false
    basicAuthMode: true
  13. 再次启动 SillyTavern Docker 容器。
    docker compose up -d sillytavern
  14. 等待几分钟后,打开你为 ST 创建的域名页面。最终,你应该能够仅凭一个 URL 和一个账户,从任何地方打开 SillyTavern。
  15. 尽情使用吧! :D

更新你的 Cloudflare DNS

DDClient 允许你在 ISP 更改了你的公网 IP 时,将新的公网 IP 同步到 Cloudflare,让你能够像什么都没发生过一样继续访问你的 ST 实例。