> ## Documentation Index
> Fetch the complete documentation index at: https://docs.asktable.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 私有部署（Docker）

> 用 Docker Compose 把 AskTable 完整部署到自己的服务器，数据不出内网。提供完整 docker-compose、访问与升级方法。

AskTable 支持完全私有化部署：所有组件以 Docker 容器运行在你自己的环境里，数据不出内网。本页提供基于 Docker Compose 的一体化部署方法。

## 前置条件

**硬件**（最低）：4 核 CPU、16G 内存、100G 硬盘，x86 架构。

**软件**：Linux 服务器 + [Docker](https://docs.docker.com/engine/install/) + [Docker Compose](https://docs.docker.com/compose/install/) **v2.23.1+**（部署用到 `configs.content` 内联特性）。

**网络**：部署机器需放行以下地址的 HTTPS（443）出站访问：

| 地址                                    | 用途                        |
| ------------------------------------- | ------------------------- |
| `registry.cn-shanghai.aliyuncs.com`   | 拉取镜像                      |
| `dockerauth.cn-hangzhou.aliyuncs.com` | 镜像鉴权                      |
| `aiproxy.asktable.com`                | AI 模型服务（用 AskTable 托管模型时） |
| `lf.asktable.com`                     | AI 调用追踪                   |

<Note>
  完全离线部署：预先把镜像导入内网，并在 [配置大模型](/deploy/models) 时选「自定义」接入内网模型，即可不依赖外网。
</Note>

## docker-compose.yaml

新建一个目录，把下面的内容存为 `docker-compose.yaml`。每个服务的作用见行内注释；后端服务之间通过 Compose 内部网络通信，只有 `asktable` 对外暴露端口。海外服务器把镜像换成注释里的 Docker Hub 版本（`datamini/...`）。

```yaml docker-compose.yaml theme={null}
services:
  # 主服务：后端 API + 前端 + 内置 MCP（对外暴露的唯一服务）
  asktable:
    image: registry.cn-shanghai.aliyuncs.com/datamini/asktable-all-in-one:latest  # 中国大陆；海外用 datamini/asktable-all-in-one:latest
    container_name: asktable
    depends_on:
      - asktable-pg
      - asktable-redis
      - asktable-atbox
    ports:
      - "8000:80"
    privileged: true
    environment:
      TZ: Asia/Shanghai
      DATABASE_HOST: asktable-pg
      DATABASE_PORT: 5432
      DATABASE_USER: asktable
      DATABASE_PASSWORD: asktable          # 【建议修改】
      DATABASE_DB: asktable
      REDIS_URL: redis://asktable-redis:6379
      ATBOX_URL: http://asktable-atbox:5300
      # Workbook 独立数据库：同实例同角色，独立 database（PG 无跨库查询 → 硬隔离）
      WORKBOOK_PG_DSN: postgresql://asktable:asktable@asktable-pg:5432/asktable_workbook
    volumes:
      - ./asktable_data:/asktable

  # PostgreSQL 17（pgvector）：主数据库（元数据、配置、字段向量）
  asktable-pg:
    image: registry.cn-shanghai.aliyuncs.com/dminfra/pgvector:pg17
    container_name: asktable-pg
    restart: unless-stopped
    environment:
      POSTGRES_USER: asktable
      POSTGRES_PASSWORD: asktable          # 【建议修改】与 DATABASE_PASSWORD 保持一致
      POSTGRES_DB: asktable
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    configs:
      # 仅在数据卷为空的全新部署首次执行一次，建 workbook 独立库
      - source: workbook-initdb
        target: /docker-entrypoint-initdb.d/01-create-workbook-db.sql

  # Redis 7.4：任务队列
  asktable-redis:
    image: registry.cn-shanghai.aliyuncs.com/dminfra/redis:7.4.4
    container_name: asktable-redis
    restart: unless-stopped
    command: redis-server --appendonly yes
    volumes:
      - ./redis_data:/data

  # Python 沙箱：隔离执行智能体生成的不可信 Python。
  # 下面标「安全」的是沙箱本体，请勿删改；标「可调」的资源上限可按机器调整。
  asktable-atbox:
    image: registry.cn-shanghai.aliyuncs.com/datamini/asktable-atbox:latest  # 中国大陆；海外用 datamini/asktable-atbox:latest
    container_name: asktable-atbox
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
      ATBOX_MAX_WORKERS: 8          # 可调：并发 worker 数
      ATBOX_DEFAULT_TIMEOUT: 30s    # 可调：默认执行超时
      ATBOX_MAX_TIMEOUT: 120s       # 可调：最大执行超时
      ATBOX_ENABLE_NETWORK: "0"     # 安全：沙箱内禁用网络
    # 安全：只读 rootfs + 临时可写区（/var/atbox/root/tmp 是 chroot 工作目录），两者配套，勿删
    read_only: true
    tmpfs:
      - /var/atbox/root/tmp:rw,noexec,nosuid,nodev,mode=1777,size=512m
      - /tmp:rw,noexec,nosuid,nodev,mode=1777,size=64m
    # 安全：丢弃全部 capability，只加回 chroot + 降 UID 所需的最小集，勿改
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - DAC_OVERRIDE
      - SETUID
      - SETGID
      - SYS_CHROOT
    security_opt:
      - no-new-privileges:true      # 安全：禁止提权
    pids_limit: 128                 # 可调：进程数上限（防 fork 炸弹）
    mem_limit: 1g                   # 可调：内存上限
    cpus: 1.0                       # 可调：CPU 上限

configs:
  # 内联建库 SQL，需 Docker Compose v2.23.1+（configs.content 支持）
  workbook-initdb:
    content: |
      CREATE DATABASE asktable_workbook;
```

<Warning>
  生产部署前务必改掉标了 **【建议修改】** 的默认密钥：`DATABASE_PASSWORD`（与 `POSTGRES_PASSWORD` 一致）。
</Warning>

<Note>
  要让团队在飞书群里问数，还需额外加一个飞书网关容器，见 [飞书网关](/deploy/feishu-gateway)。
</Note>

## 启动与初始化

<Steps>
  <Step title="启动">
    在 `docker-compose.yaml` 所在目录执行：

    ```bash theme={null}
    docker compose up -d
    ```

    首次启动会自动初始化数据库（含 Workbook 独立库）。
  </Step>

  <Step title="访问">
    浏览器打开 `http://<你的服务器地址>:8000/`。
  </Step>

  <Step title="初始化">
    按向导创建管理员账号，并配置大模型（模型组），然后即可开始使用。
  </Step>
</Steps>

## 访问地址

| 入口     | 地址                               |
| ------ | -------------------------------- |
| 控制台 UI | `http://<服务器>:8000/`             |
| API 文档 | `http://<服务器>:8000/api/v1/redoc` |
| MCP 服务 | `http://<服务器>:8000/mcp/`         |

## 配置大模型

AskTable 不绑定特定模型，需要你配置一个大模型才能问数。首次启动向导会引导你完成，详见 [配置大模型](/deploy/models)。

## 启用 Workbook

Workbook 是内置的可写数据集，数据存在独立的 `asktable_workbook` 库，与主库硬隔离。上面的 compose 已配好 `WORKBOOK_PG_DSN` 并内联了建库 SQL：

* **全新部署**：首次启动自动建库，无需操作。
* **已有部署升级**：数据卷已初始化、建库脚本不再执行，需手动建库一次：

  ```bash theme={null}
  docker compose exec asktable-pg psql -U asktable -d asktable -c "CREATE DATABASE asktable_workbook;"
  docker compose up -d
  ```

## 版本升级

```bash theme={null}
docker compose pull
docker compose down
docker compose up -d
```

<Note>
  **从旧版升级**（移除 Qdrant、切换 pgvector 镜像、处理 collation 版本警告、重建 Embedding）见 [迁移](/deploy/migration)。
</Note>

## 卸载

```bash theme={null}
docker compose down
rm -rf asktable_data postgres_data redis_data
```

<Warning>
  删除数据卷会清空所有数据，不可恢复。请先备份。
</Warning>

## 后续步骤

* [配置大模型](/deploy/models) — 接入你自己的或托管的大模型
* [飞书网关](/deploy/feishu-gateway) — 让团队在飞书群里问数
* [AI 搜索（值索引）](/deploy/ai-search) — 用简称提问也能命中完整值（可选，需 aisearch）
* [进阶配置](/deploy/advanced) — 子路径部署、白标定制
* [商业授权](/deploy/license) — 试用限制与企业许可证
* [连接数据源](/concepts/data/connect) — 把数据接进来
