私有化部署
在 Linux 上部署

在 Linux 上部署 Sally Office

版本要求

软件版本
WPSWPS 11 或 WPS 12
OfficeOffice 2024 +,Office 365

安装 Sally

获取镜像 (任选其一)

A. 从 Docker Hub 拉取 (最快)

docker pull sallysuite/sally-office

B. 离线包 (内网隔离 / 低带宽)
https://sallybot.cn#support (opens in a new tab) 下载 docker 离线包,然后执行:

docker load -i sally-office<version>.tar
docker images        # 验证镜像是否存在

单容器试用 (HTTP :3000)

适合本地开发。插件功能需要 HTTPS – 生产环境请继续阅读第 3 节。

docker run -d -p 3000:3000 sallysuite/sally-office

访问 http://localhost:3000

生产环境栈 – HTTPS & Nginx 反向代理

你可以从这里克隆 Git 仓库以获取 docker-compose.yml 文件:deploy-sally-on-linux (opens in a new tab)

推荐的文件夹布局:

project-root/
├── docker-compose.yml          # *.sqlite.yml / *.postgres.yml 的符号链接或副本
└── nginx-proxy/
    ├── nginx.conf               # 第 5 节
    └── ssl/
        ├── localhost.pem
        └── localhost-key.pem

运行以下命令启动容器:

# SQLite (轻量级)
docker compose up -d -f docker-compose.sqlite.yml
 
# PostgreSQL (生产推荐)
docker compose up -d -f docker-compose.postgres.yml

Docker-Compose 参考

SQLite 版本

services:
  app:
    image: sally-office:latest
    restart: always
    ports: ["3000:3000"]
    environment:
      NEXTAUTH_URL: "https://localhost"
      DOMAIN_NAME: "https://localhost"
      ADMIN_EMAILS: "admin@sallyoffice.com"
      ADMIN_PASSWORD: "admin123"
      NEXTAUTH_SECRET: "SALLYOFFICE" # 生产环境请修改
      NEXT_PUBLIC_VERCEL_ENV: production
      ENABLE_ADMIN_AUTH: "true"
 
  nginx-proxy:
    image: nginx:alpine
    container_name: nginx-proxy
    restart: always
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx-proxy/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx-proxy/ssl:/etc/nginx/ssl:ro
    depends_on: [app]

PostgreSQL 版本

services:
  app:
    image: sally-office:latest
    restart: always
    ports: ["3000:3000"]
    depends_on: [db]
    environment:
      NEXTAUTH_URL: "https://localhost"
      DOMAIN_NAME: "https://localhost"
      ADMIN_EMAILS: "admin@sallyoffice.com"
      ADMIN_PASSWORD: "admin123"
      NEXTAUTH_SECRET: "SALLYOFFICE"
      NEXT_PUBLIC_VERCEL_ENV: production
      ENABLE_ADMIN_AUTH: "true"
      POSTGRES_DATABASE: sallyoffice
      POSTGRES_HOST: db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: passowrd01
      DATABASE_URL: postgres://postgres:passowrd01@db:5432/sallyoffice
 
  db:
    image: postgres:16-alpine
    container_name: postgres-db
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: passowrd01
      POSTGRES_DB: sallyoffice
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports: ["5432:5432"] # 如果仅限内部访问可以移除
proxy:
    image: nginx:alpine
    container_name: nginx-proxy
    restart: always
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx-proxy/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx-proxy/ssl:/etc/nginx/ssl:ro
    depends_on: [app]
 
volumes:
  postgres_data:

Nginx 配置 (nginx.conf)

用于 nginx-proxy/nginx.conf 的配置文件。
功能:HTTP 强制跳转 HTTPS、静态资源缓存、gzip 压缩、/api/chat_proxy 流式传输无缓冲。

# ---------------- HTTP ----------------
server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}
 
# ---------------- HTTPS ----------------
server {
    listen 443 ssl http2;
    server_name _;
 
    ssl_certificate      /etc/nginx/ssl/localhost.pem;
    ssl_certificate_key  /etc/nginx/ssl/localhost-key.pem;
    ssl_protocols        TLSv1.2 TLSv1.3;
    ssl_ciphers          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache   shared:SSL:50m;
    ssl_session_tickets off;
    # add_header Strict-Transport-Security "max-age=63072000" always;  # 测试通过后开启
 
    # 静态库和字体 – 缓存 1 天
    location ~* ^/(lib|font) {
        proxy_pass http://app:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        expires 1d;
        add_header Cache-Control "public, max-age=86400";
        gzip on;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
        gzip_comp_level 6;
        gzip_min_length 1000;
    }
 
    # 流式聊天代理 – 禁用缓冲
    location /api/chat_proxy {
        proxy_pass http://app:3000;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding on;
        proxy_buffering off;
        proxy_cache off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
 
    # 默认前端
    location / {
        proxy_pass http://app:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

SSL 证书准备

本地自签名证书 (365 天)

openssl req -x509 -newkey rsa:4096 -nodes \
  -keyout localhost-key.pem -out localhost.pem -days 365 \
  -subj "/CN=localhost"

生产环境
将来自 Let’s Encrypt 或任何 CA 颁发的有效证书/密钥放置到:
./nginx-proxy/ssl/localhost.pem
./nginx-proxy/ssl/localhost-key.pem
并相应地更新 server_name


常用命令

# 查看日志
docker compose logs -f app
docker compose logs -f nginx-proxy
 
# 重启
docker compose restart
 
# 更新镜像
docker compose pull && docker compose up -d

现在你已经拥有了:

  • 开发模式 – 运行在 HTTP 上的单容器
  • 生产模式 – 开启 HTTPS、静态资源缓存、流式聊天接口、可选的 PostgreSQL 数据库
    复制你需要的片段,尽情使用 Sally Office 吧!

配置

配置模型

启动 Sally 后,点击左侧菜单中的设置图标。

设置

在左侧导航中选择 模型 (Models)。左侧显示模型提供商列表,右侧显示模型列表。

模型列表

你可以选择模型提供商,在提供商官网注册以获取 API Key,填入 API Key,并选择你想要使用的模型。

选择模型

你还可以配置企业内部部署的私有模型,获取私有模型的 Base URLAPI Key模型名称,点击 + 按钮,添加新模型。

添加模型

配置搜索服务

目前搜索服务使用的是 searchapi 接口。

获取 API KEY:登录官网获取 API KEY:https://www.searchapi.io/ (opens in a new tab)

  • 选择 文本搜索 (Text Search),设置文本搜索。Searchapi 同时支持 Google 搜索和百度搜索。
  • 选择 图片搜索 (Image Search),设置图片搜索。

Office 加载项部署

下载清单文件 (Manifest)

点击左侧的 Manifest 菜单进入清单文件页面,页面分为两个配置文件:

  • Office (Word, Excel, PowerPoint)
  • Outlook

选择 Office 或 Outlook。

⚠️ 线上设置的域名必须是使用 HTTPS 协议的域名。

点击 下载 (Download) 下载 Manifest 文件。

在 Windows 上部署清单文件

  1. 将 Manifest 文件复制到一个文件夹
  2. 将该文件夹设置为共享文件夹
  3. 将共享文件夹添加到受信任的加载项位置:文件 > 选项 > 信任中心 > 信任中心设置 > 受信任的加载项位置
  4. 打开 Word,点击 加载项 → 获取加载项,在 “共享” 选项卡中选择 Sally,然后点击 添加

在 Mac Office 上部署清单文件

参考部署文档:
https://learn.microsoft.com/zh-cn/office/dev/add-ins/testing/sideload-an-office-add-in-on-mac (opens in a new tab)

使用访达 (Finder) 安装清单文件:

  1. 打开访达,然后按 Cmd+Shift+G 打开 “前往文件夹” 对话框。
  2. 输入以下路径之一 (如果缺少 wef 文件夹请创建):
  • Word:/Users/<username>/Library/Containers/com.microsoft.Word/Data/Documents/wef
  • Excel:/Users/<username>/Library/Containers/com.microsoft.Excel/Data/Documents/wef
  • PowerPoint:/Users/<username>/Library/Containers/com.microsoft.Powerpoint/Data/Documents/wef

注意:其余步骤说明如何旁加载 Word 加载项。

将你的加载项清单文件复制到此 wef 文件夹中。

Mac 部署文件夹

打开 Word (如果已运行请重启),然后打开一个文档。转到 开始 > 加载项,然后从菜单中选择你的加载项。

确认你的加载项在 Word 中显示。

在 Mac 上安装


WPS 插件部署

获取插件安装地址

在后台选择菜单:WPS 加载项 (WPS Add-in),查看加载项安装地址。
示例:https://localhost:5893/wps-doc/entry/publish.html

插件安装

  1. 将插件安装地址复制到浏览器中。
  2. 安装前,打开 WPS,刷新页面,插件安装页面将显示两个插件:
    • wps-sheet:对应表格插件
    • wps-doc:对应文字插件

WPS 加载项列表

  1. 点击 安装,会提示配置成功。
  2. 打开 WPS 文字,稍等片刻,会出现 Sally 菜单,表示安装成功。

WPS 菜单

点击启动 Sally,在侧边栏选择模型,即可开始与模型对话。

测试 Sally

联系我们

如果在部署过程中遇到任何问题,请通过 sally-suite@hotmail.com 联系我们。