跳转至

源码运行

请使用 v1.1.1 等已发布分支的代码运行 SQLBot。请勿使用 main 等分支,main 等分支代码均处于开发或测试阶段,可能存在较明显功能缺陷。
本文所使用源码为 SQLBot main 分支,操作系统为 Ubuntu 24.04,举例说明如何以源码的形式运行 SQLBot 工程。所有操作均在阿里云(新加坡区) 4核8G 环境中执行。

目前支持的源码运行环境有: Windows (x86)、Linux(x86 & arm64)、MacOS(x86 & arm64)。

1 项目结构

 ```
├── backend                                     # 后端 Python 源码
├── docker-compose.yaml                         # docker compose 一键运行文件
├── Dockerfile                                  # 构建容器镜像使用的 Dockerfile
├── frontend                                    # 前端 Vue 源码
├── g2-ssr                                      # MCP 使用到的出图工具
├── installer                                   # 安装工程源码
├── LICENSE                                     # License 申明
├── README.md
├── sqlbot-assistant-demo.html                  # SQLBot 嵌入式小助手示例
└── start.sh                                    
 ```

2 配置环境

2.1 安装 Python

默认情况下,Ubuntu 24.04 环境中自带了Python,如果没有 Python 环境,可以通过以下命令安装。

apt update -y
apt upgrade -y
add-apt-repository ppa:deadsnakes/ppa
apt install -y python3.11 python3.11-full

2.2 安装 Git

Ubuntu 24.04 默认已安装 Git,如果环境中没有 Git,可执行命令安装 Git。

apt-get install -y git 

验证 Git。

root@iZt4ndy6544y6f1i99ahw0Z:~# git --version
git version 2.43.0

2.3 安装配置 uv

执行命令安装 uv。

# 安装 uv
root@iZt4ndy6544y6f1i99ahw0Z:~# curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.8.13 x86_64-unknown-linux-gnu
no checksums to verify
installing to /root/.local/bin
uv
uvx
everything's installed!

To add $HOME/.local/bin to your PATH, either restart your shell or run:

    source $HOME/.local/bin/env (sh, bash, zsh)
    source $HOME/.local/bin/env.fish (fish)

# 使环境变量生效
root@iZt4ndy6544y6f1i99ahw0Z:~# source $HOME/.local/bin/env

# 验证 uv 命令
root@iZt4ndy6544y6f1i99ahw0Z:~# uv -V
uv 0.8.13

2.4 安装配置 nodejs

执行命令安装 nodejs。

# 下载并安装 nodejs,node 版本可能会变化,如版本升级,请更新连接
wget https://nodejs.org/dist/latest-v22.x/node-v22.21.0-linux-x64.tar.gz
tar xvf node-v22.21.0-linux-x64.tar.gz
mv node-v22.21.0-linux-x64 /opt/node-v22.21.0

# 添加环境变量
echo "export PATH=\$PATH:/opt/node-v22.21.0/bin" >> ~/.bashrc

# 使环境变量生效
source ~/.bashrc

验证 nodejs。

root@iZt4ndy6544y6f1i99ahw0Z:~# node --version
v22.21.0

root@iZt4ndy6544y6f1i99ahw0Z:~# npm version
{
  npm: '10.9.4',
  node: '22.21.0',
  acorn: '8.15.0',
  ada: '2.9.2',
  amaro: '1.1.4',
  ares: '1.34.5',
  brotli: '1.1.0',
  cjs_module_lexer: '2.1.0',
  cldr: '47.0',
  icu: '77.1',
  llhttp: '9.3.0',
  modules: '127',
  napi: '10',
  nbytes: '0.1.1',
  ncrypto: '0.0.1',
  nghttp2: '1.64.0',
  openssl: '3.5.4',
  simdjson: '3.13.0',
  simdutf: '6.4.2',
  sqlite: '3.50.4',
  tz: '2025b',
  undici: '6.22.0',
  unicode: '16.0',
  uv: '1.51.0',
  uvwasi: '0.0.23',
  v8: '12.4.254.21-node.33',
  zlib: '1.3.1-470d3a2',
  zstd: '1.5.7'
}

2.5 安装配置 PostgreSQL

从 v1.1.0 版本开始,SQLBot 需要使用到 PG 的向量扩展。为了方便,这里我们使用 docker 镜像来安装 PG。 如果没有安装 docker 环境,可以先安装相应的 docker 环境

执行以下命令启动 PG:

docker run -d \
    --name pg \
    -p 5432:5432 \
    -v ./data/postgresql:/var/lib/postgresql/data \
    -e POSTGRES_DB=sqlbot \
    -e POSTGRES_USER=root \
    -e POSTGRES_PASSWORD=Password123@pg \
    pgvector/pgvector:pg17

验证:

root@iZt4n8u2tu6392mezufc9rZ:~# docker exec -it pg psql --version
psql (PostgreSQL) 17.6 (Debian 17.6-1.pgdg12+1)

3 代码运行

3.1 源码准备

下载源码到本地

root@iZt4ndy6544y6f1i99ahw0Z:~# git clone -b main https://github.com/dataease/SQLBot.git
Cloning into 'SQLBot'...
remote: Enumerating objects: 12884, done.
remote: Counting objects: 100% (589/589), done.
remote: Compressing objects: 100% (219/219), done.
remote: Total 12884 (delta 453), reused 425 (delta 369), pack-reused 12295 (from 2)
Receiving objects: 100% (12884/12884), 19.42 MiB | 16.47 MiB/s, done.
Resolving deltas: 100% (9092/9092), done.

3.2 配置运行环境

3.2.1 .env 配置

在工程目录下创建配置文件 .env,内容如下(根据自己实际情况修改相应配置):

root@iZt4ndy6544y6f1i99ahw0Z:~/SQLBot# cat .env
PROJECT_NAME="SQLBot"

# Backend
BACKEND_CORS_ORIGINS="http://localhost,http://localhost:5173,https://localhost,https://localhost:5173"
SECRET_KEY=y5txe1mRmS_JpOrUzFzHEu-kIQn3lf7ll0AOv9DQh0s

DEFAULT_PWD="SQLBot@123456"

LOG_LEVEL="DEBUG"  # DEBUG, INFO, WARNING, ERROR
SQL_DEBUG=False

CACHE_TYPE="memory"

# Postgres
POSTGRES_SERVER=localhost
POSTGRES_PORT=5432
POSTGRES_DB=sqlbot
POSTGRES_USER=root
POSTGRES_PASSWORD=Password123@pg # Change this to your pwd

SERVER_IMAGE_HOST=http://192.168.1.112:8001/images/

3.2.2 配置内置向量模型

SQLBot 需要使用到内置向量模型,以 Ubuntu 环境为例,比较简单的办法是从现成的 SQLBot 镜像中拷贝到本地开发环境。注意路径放置在 /opt/sqlbot/models。如果是 windows 环境,则放置在项目所在盘的 /opt/sqlbot/models 下,如 D:\opt\sqlbot\models。

假设本地已经启动了一个 SQLBot 容器,则可以通过以下命令 copy 内置向量模型:

root@iZt4n9ii50pwh74bs5bhuzZ:~# docker cp sqlbot:/opt/sqlbot/models /opt/sqlbot/models
Successfully copied 831MB to /opt/sqlbot/models

也可以参考一些其他的安装方式,如 https://cloud.tencent.com/developer/article/2509399

3.2.3 Oracle Instant Client 安装

为了支持 Oracle 11 以及 thick 模型,我们需要安装 Oracle Instant Client。可以到 Oracle 官网下载对应的版本,地址是 https://www.oracle.com/database/technologies/instant-client/downloads.html

以 Ubuntu 为例,安装示例如下:

root@iZt4n9ii50pwh74bs5bhuzZ:~# wget https://download.oracle.com/otn_software/linux/instantclient/2326000/instantclient-basic-linux.x64-23.26.0.0.0.zip
--2025-11-05 17:12:57--  https://download.oracle.com/otn_software/linux/instantclient/2326000/instantclient-basic-linux.x64-23.26.0.0.0.zip
Resolving download.oracle.com (download.oracle.com)... 23.206.180.77
Connecting to download.oracle.com (download.oracle.com)|23.206.180.77|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 133613627 (127M) [application/zip]
Saving to: ‘instantclient-basic-linux.x64-23.26.0.0.0.zip’

instantclient-basic-linux.x64-23.26.0.0.0.zip                       100%[=================================================================================================================================================================>] 127.42M  11.9MB/s    in 9.7s

2025-11-05 17:13:07 (13.2 MB/s) - ‘instantclient-basic-linux.x64-23.26.0.0.0.zip’ saved [133613627/133613627]

root@iZt4n9ii50pwh74bs5bhuzZ:~# unzip instantclient-basic-linux.x64-23.26.0.0.0.zip

root@iZt4n9ii50pwh74bs5bhuzZ:~# mv instantclient_23_26 oracle_instant_client

root@iZt4n9ii50pwh74bs5bhuzZ:~# mkdir -p /opt/sqlbot/db_client

root@iZt4n9ii50pwh74bs5bhuzZ:~# mv oracle_instant_client /opt/sqlbot/db_client

修改 .bashrc,加入以下环境变量:

export ORACLE_HOME=/opt/sqlbot/db_client/oracle_instant_client
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME

重新加载 .bashrc

source ~/.bashrc

windows 环境类似,将压缩包下载解压后,改名为 oracle_instant_client,放置到项目所在盘的 /opt/sqlbot/db_client 目录下,完整路径示例 D:\opt\sqlbot\db_client\oracle_instant_client

3.3 源码编译

# 编译前端
cd frontend
npm install && npm run build

# 编译后端
cd ../backend
uv sync --extra cpu

3.4 运行

source .venv/bin/activate

# 启动 g2-ssr,用来为 mcp 生成图形(可选)
nohup node ../g2-ssr/app.js &

# 启动 MCP Server(可选)
nohup uvicorn main:mcp_app --host 0.0.0.0 --port 8001 &

# 启动 SQLBot
nohup uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1 &

4 镜像制作

4.1 安装 Docker

在服务器上安装 Docker,本文使用 DataEase 项目组编写安装脚本进行安装,用户可自行选择如何安装 Docker(需安装 docker compsose)。

curl -fsSL https://resource.fit2cloud.com/get-docker-linux.sh | bash

# 设置 docker 开机自启,并启动 docker 服务
systemctl enable docker; systemctl daemon-reload; service docker start

4.2 制作镜像

进入 SQLBot 项目根目录,执行镜像制作命令。

docker build -t registry.cn-qingdao.aliyuncs.com/dataease/sqlbot:dev-rc1 .

如下输出日志参考。

root@iZt4n65gnl36fhkxbx0qgrZ:~/SQLBot# docker build -t registry.cn-qingdao.aliyuncs.com/dataease/sqlbot:dev-rc1 .
[+] Building 383.1s (29/29) FINISHED                                                                                                                                                                                                                           docker:default
=> [internal] load build definition from Dockerfile                                                                                                                                                                                                                     0.0s
=> => transferring dockerfile: 2.44kB                                                                                                                                                                                                                                   0.0s
=> [internal] load metadata for registry.cn-qingdao.aliyuncs.com/dataease/sqlbot-python-pg:latest                                                                                                                                                                       1.5s
=> [internal] load metadata for ghcr.io/1panel-dev/maxkb-vector-model:v1.0.1                                                                                                                                                                                            2.3s
=> [internal] load metadata for registry.cn-qingdao.aliyuncs.com/dataease/sqlbot-base:latest                                                                                                                                                                            1.4s
=> [internal] load .dockerignore                                                                                                                                                                                                                                        0.0s
=> => transferring context: 244B                                                                                                                                                                                                                                        0.0s
=> [internal] load build context                                                                                                                                                                                                                                        6.7s
=> => transferring context: 350.82MB                                                                                                                                                                                                                                    6.5s
=> [vector-model 1/1] FROM ghcr.io/1panel-dev/maxkb-vector-model:v1.0.1@sha256:da730ff243f5502304c390ec5a52cf79b2b3a0a46e52100e288850dafbf2c8bf                                                                                                                       116.0s
=> => resolve ghcr.io/1panel-dev/maxkb-vector-model:v1.0.1@sha256:da730ff243f5502304c390ec5a52cf79b2b3a0a46e52100e288850dafbf2c8bf                                                                                                                                      0.0s
=> => sha256:da730ff243f5502304c390ec5a52cf79b2b3a0a46e52100e288850dafbf2c8bf 1.61kB / 1.61kB                                                                                                                                                                           0.0s
=> => sha256:40a3399a26800998a98e7d339fbac319a9705bc761a5614ff0fe7ca95931f03f 482B / 482B                                                                                                                                                                               0.0s
 => => sha256:e9371e013945879dd76389bb40ecec858072064f06d2c7623e12c3e32e9dd40f 448B / 448B                                                                                                                                                                               0.0s
 => => sha256:81824665db64d25d3105e8f62a2b3807ff88faa96a62b0a0e1cfc3aeb6c12e6b 762.38MB / 762.38MB                                                                                                                                                                     107.2s
=> => extracting sha256:81824665db64d25d3105e8f62a2b3807ff88faa96a62b0a0e1cfc3aeb6c12e6b                                                                                                                                                                                6.6s
=> [stage-3 1/9] FROM registry.cn-qingdao.aliyuncs.com/dataease/sqlbot-python-pg:latest@sha256:36cf8054190210d91ffcd648014d9f93510ca122b2d4e056c33ce7c29bdb4b93                                                                                                        38.0s
=> => resolve registry.cn-qingdao.aliyuncs.com/dataease/sqlbot-python-pg:latest@sha256:36cf8054190210d91ffcd648014d9f93510ca122b2d4e056c33ce7c29bdb4b93                                                                                                                 0.0s
=> => sha256:36cf8054190210d91ffcd648014d9f93510ca122b2d4e056c33ce7c29bdb4b93 856B / 856B                                                                                                                                                                               0.0s
=> => sha256:cccfbb03d0ee118c7491a6bad94649013a8ec0faf58fe91b81272280f326fa55 4.11kB / 4.11kB                                                                                                                                                                           0.0s
=> => sha256:25387b42b9f27e647631f4c721791239bfff95c1768a0a0d0651525f9884212c 12.67kB / 12.67kB                                                                                                                                                                         0.0s
=> => sha256:d16299ff3f87ff575cc6869657c06c344343b2941738c73387c21b28e0d45908 122.25kB / 122.25kB                                                                                                                                                                       6.7s
=> => extracting sha256:d16299ff3f87ff575cc6869657c06c344343b2941738c73387c21b28e0d45908                                                                                                                                                                                0.0s
=> => sha256:2b715279f55e071fc7c3c5d7b117ce1d087cf17260416a43887b030f5c9b8036 1.45MB / 1.45MB                                                                                                                                                                           7.3s
=> => extracting sha256:2b715279f55e071fc7c3c5d7b117ce1d087cf17260416a43887b030f5c9b8036                                                                                                                                                                                0.1s
=> => sha256:94c286c44c81cc64bc39bb85da3c704f4a3a818d4f4dd019dc2fea8d032471b8 13.68MB / 13.68MB                                                                                                                                                                         9.8s
=> => extracting sha256:94c286c44c81cc64bc39bb85da3c704f4a3a818d4f4dd019dc2fea8d032471b8                                                                                                                                                                                1.4s
=> => sha256:20d375d36dbdbbe154faf8eb0b03152b0236d44ea90d9666a1d41e693976d369 3.15MB / 3.15MB                                                                                                                                                                          10.8s
=> => sha256:50d19ad3b50cf75827ef36f72fe41ca6077621ceda8f29d49f3b7637340457ff 17.39MB / 17.39MB                                                                                                                                                                        13.6s
=> => extracting sha256:20d375d36dbdbbe154faf8eb0b03152b0236d44ea90d9666a1d41e693976d369                                                                                                                                                                                1.0s
=> => extracting sha256:50d19ad3b50cf75827ef36f72fe41ca6077621ceda8f29d49f3b7637340457ff                                                                                                                                                                                0.2s
=> => sha256:23f08e3574c23361ebf69d3db0cdb1693b48e181f01e9b20a81c93e108543f1f 171.45MB / 171.45MB                                                                                                                                                                      31.6s
=> => extracting sha256:23f08e3574c23361ebf69d3db0cdb1693b48e181f01e9b20a81c93e108543f1f                                                                                                                                                                                5.8s
=> [ssr-builder 1/5] FROM registry.cn-qingdao.aliyuncs.com/dataease/sqlbot-base:latest@sha256:5f1602bbb306a4f24fb73797eeaa41f539f6dd236936a896063265a9cd655faf                                                                                                         61.3s
=> => resolve registry.cn-qingdao.aliyuncs.com/dataease/sqlbot-base:latest@sha256:5f1602bbb306a4f24fb73797eeaa41f539f6dd236936a896063265a9cd655faf                                                                                                                      0.0s
=> => sha256:59e22667830bf04fb35e15ed9c70023e9d121719bb87f0db7f3159ee7c7e0b8d 28.23MB / 28.23MB                                                                                                                                                                         5.9s
=> => sha256:5f1602bbb306a4f24fb73797eeaa41f539f6dd236936a896063265a9cd655faf 1.61kB / 1.61kB                                                                                                                                                                           0.0s
=> => sha256:60e3dbde8a7285935e47e6122ee0c440d935df1af5277a89e45ed3af8c7f9da0 1.44kB / 1.44kB                                                                                                                                                                           0.0s
=> => sha256:d4112c627f99470a588ac096d77321e2941f1ae66f297b3eae40cbaae0212041 6.30kB / 6.30kB                                                                                                                                                                           0.0s
=> => sha256:abd846fa1cdb2ae1ef7731213cd4f0c40b05fdbeeaef9301a4dc9575b2088ece 3.51MB / 3.51MB                                                                                                                                                                           1.3s
=> => sha256:b7b61708209ad8f9b9a11c61dc9df90f74c1e39eddc169936146259febc2ec24 16.21MB / 16.21MB                                                                                                                                                                         3.8s
=> => sha256:4085babbc5702254267393a22fc7f0d644efddd41dc328f81b1549c13a210b4e 249B / 249B                                                                                                                                                                               4.0s
=> => sha256:41aa4b05abc967567fcc949d31d533c12de0112e53749a28b28bedd32002d89a 17.39MB / 17.39MB                                                                                                                                                                         6.3s
=> => sha256:4ae0ababaedadcb88fa606c101cac74b0544d9b97bc347f637d85f9168eb7b7e 220.27MB / 220.27MB                                                                                                                                                                      53.1s
=> => extracting sha256:59e22667830bf04fb35e15ed9c70023e9d121719bb87f0db7f3159ee7c7e0b8d                                                                                                                                                                                1.7s
=> => extracting sha256:abd846fa1cdb2ae1ef7731213cd4f0c40b05fdbeeaef9301a4dc9575b2088ece                                                                                                                                                                                0.1s
=> => extracting sha256:b7b61708209ad8f9b9a11c61dc9df90f74c1e39eddc169936146259febc2ec24                                                                                                                                                                                0.8s
=> => extracting sha256:4085babbc5702254267393a22fc7f0d644efddd41dc328f81b1549c13a210b4e                                                                                                                                                                                0.0s
=> => extracting sha256:41aa4b05abc967567fcc949d31d533c12de0112e53749a28b28bedd32002d89a                                                                                                                                                                                0.6s
=> => extracting sha256:4ae0ababaedadcb88fa606c101cac74b0544d9b97bc347f637d85f9168eb7b7e                                                                                                                                                                                7.7s
=> [stage-3 2/9] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&     echo "Asia/Shanghai" > /etc/timezone                                                                                                                                                5.3s
=> [stage-3 3/9] COPY start.sh /opt/sqlbot/app/start.sh                                                                                                                                                                                                                 0.1s
=> [stage-3 4/9] COPY g2-ssr/*.ttf /usr/share/fonts/truetype/liberation/                                                                                                                                                                                                0.2s
=> [sqlbot-builder 2/8] RUN mkdir -p /opt/sqlbot/app /opt/sqlbot/frontend                                                                                                                                                                                               5.1s
=> [ssr-builder 2/5] WORKDIR /app                                                                                                                                                                                                                                       5.1s
=> [ssr-builder 3/5] COPY g2-ssr/app.js g2-ssr/package.json /app/                                                                                                                                                                                                       0.1s
=> [sqlbot-builder 3/8] WORKDIR /opt/sqlbot/app                                                                                                                                                                                                                         0.1s
=> [sqlbot-builder 4/8] COPY frontend /tmp/frontend                                                                                                                                                                                                                    56.8s
=> [ssr-builder 4/5] COPY g2-ssr/charts/* /app/charts/                                                                                                                                                                                                                  0.1s
=> [ssr-builder 5/5] RUN npm install                                                                                                                                                                                                                                   52.6s
=> [sqlbot-builder 5/8] RUN cd /tmp/frontend; npm install; npm run build; mv dist /opt/sqlbot/frontend/dist                                                                                                                                                            46.6s
=> [sqlbot-builder 6/8] RUN test -f "./uv.lock" &&     --mount=type=cache,target=/root/.cache/uv     --mount=type=bind,source=backend/uv.lock,target=uv.lock     --mount=type=bind,source=backend/pyproject.toml,target=pyproject.toml     uv sync --frozen --no-insta  0.2s
=> [sqlbot-builder 7/8] COPY ./backend /opt/sqlbot/app                                                                                                                                                                                                                  0.2s
=> [sqlbot-builder 8/8] RUN --mount=type=cache,target=/root/.cache/uv    uv sync --extra cpu                                                                                                                                                                           77.2s
=> [stage-3 5/9] COPY --from=sqlbot-builder /opt/sqlbot /opt/sqlbot                                                                                                                                                                                                    36.6s
=> [stage-3 6/9] COPY --from=ssr-builder /app /opt/sqlbot/g2-ssr                                                                                                                                                                                                       15.0s
=> [stage-3 7/9] COPY --from=vector-model /opt/maxkb/app/model /opt/sqlbot/models                                                                                                                                                                                      11.8s
=> [stage-3 8/9] WORKDIR /opt/sqlbot/app                                                                                                                                                                                                                                0.0s
=> [stage-3 9/9] RUN mkdir -p /opt/sqlbot/images /opt/sqlbot/g2-ssr                                                                                                                                                                                                     0.2s
=> exporting to image                                                                                                                                                                                                                                                  55.1s
=> => exporting layers                                                                                                                                                                                                                                                 55.1s
=> => writing image sha256:dfe2e3227a661b8be4d2ac611b1d50c688151e917396a2f4636ecd540f7ad35e                                                                                                                                                                             0.0s
=> => naming to registry.cn-qingdao.aliyuncs.com/dataease/sqlbot:dev-rc1                                                                                                                                                                                                0.0s

1 warning found (use docker --debug to expand):
- SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "POSTGRES_PASSWORD") (line 62)

使用 docker images 可查看镜像是否成功打包.

root@iZt4n65gnl36fhkxbx0qgrZ:~/SQLBot# docker images
REPOSITORY                                         TAG       IMAGE ID       CREATED         SIZE
registry.cn-qingdao.aliyuncs.com/dataease/sqlbot   dev-rc1   dfe2e3227a66   8 minutes ago   3.98GB