上一篇 下一篇 分享链接 返回 返回顶部

用 Docker 一键搭建自己的 AI 搜索系统:从部署到上线践指南

发布人:慈云数据-客服中心 发布时间:22小时前 阅读量:5

AI搜索 Docker部署教程|一键部署

随着大语言模型和向量数据库技术的快速发展,越来越多企业和个人开始搭建属于自己的 AI搜索系统。相比传统关键词搜索,AI搜索能够理解用户问题的语义,通过向量检索、知识库问答、RAG(Retrieval-Augmented Generation,检索增强生成)等方式,为用户提供更准确、更自然的答案。

如果你希望快速部署一个 AI搜索服务,用于企业知识库、个人文档检索、站内搜索、客服问答、技术文档助手等场景,那么使用 Docker 一键部署 是目前最简单、最稳定、也最适合新手的方式之一。

本文将以通用 AI搜索系统为例,详细介绍如何通过 Docker 和 Docker Compose 完成一键部署,包括服务器准备、环境安装、配置文件编写、服务启动、访问测试、数据持久化、常见问题排查以及后续优化建议。


一、什么是 AI搜索?

AI搜索并不是简单地把关键词匹配出来,而是通过人工智能模型理解用户输入的真实含义,再从知识库、数据库、网页或文档中找到最相关的内容。

一个典型的 AI搜索系统通常包含以下几个核心模块:

  1. 前端页面
    用户输入问题、查看搜索结果或 AI 回答的界面。

  2. 后端服务
    负责接收用户请求,调用向量数据库、大模型接口,并返回最终结果。

  3. 向量化模型 Embedding
    将文本内容转换成向量,用于语义检索。

  4. 向量数据库
    存储文档向量,并根据相似度快速检索相关内容。

  5. 大语言模型 LLM
    根据检索到的内容生成自然语言回答。

  6. 文档解析服务
    用于解析 PDF、Word、Markdown、网页等资料。

通过 Docker 部署,我们可以把这些复杂组件封装起来,减少环境依赖问题,让部署过程变得更加简单。


二、为什么推荐使用 Docker 部署 AI搜索?

AI搜索系统往往涉及多个组件,例如 Web 服务、数据库、向量数据库、Redis、模型服务等。如果手动安装,会遇到许多问题,例如:

  • Python、Node.js、数据库版本不兼容;
  • 不同系统环境差异导致启动失败;
  • 依赖包安装缓慢或冲突;
  • 后期迁移服务器困难;
  • 服务崩溃后不容易自动恢复;
  • 多组件管理复杂。

而 Docker 的优势非常明显:

优势 说明
环境隔离 每个服务运行在独立容器中,互不影响
一键部署 通过 docker compose up -d 即可启动全部服务
易于迁移 复制配置文件和数据目录即可迁移到新服务器
方便升级 拉取新镜像后重启即可
支持数据持久化 数据可挂载到宿主机目录,避免容器删除后丢失
运维成本低 非常适合个人开发者和中小团队

因此,对于大多数 AI搜索项目来说,Docker Compose 是最佳部署方式。


三、服务器配置要求

在正式部署之前,需要准备一台 Linux 服务器。推荐使用 Ubuntu 20.04 / 22.04 或 Debian 系统。

1. 最低配置

如果只是测试或个人使用,可以选择以下配置:

CPU:2核
内存:4GB
硬盘:40GB
系统:Ubuntu 20.04+

2. 推荐配置

如果用于企业知识库或多人访问,建议使用:

CPU:4核及以上
内存:8GB 或 16GB
硬盘:100GB SSD
带宽:5Mbps+
系统:Ubuntu 22.04 LTS

3. 是否需要 GPU?

如果你使用的是第三方大模型 API,例如 OpenAI、通义千问、智谱、DeepSeek、Claude 等,一般不需要 GPU。

如果你希望本地部署大模型,例如 Qwen、Llama、DeepSeek-R1-Distill 等,则建议配置 NVIDIA GPU,并额外安装 NVIDIA Container Toolkit。

本文默认使用 API 方式调用大模型,因此不要求 GPU。


四、安装 Docker 和 Docker Compose

首先登录服务器:

ssh root@你的服务器IP

更新系统软件包:

apt update && apt upgrade -y

安装必要工具:

apt install -y curl wget git vim ca-certificates gnupg lsb-release

1. 一键安装 Docker

可以使用官方脚本安装 Docker:

curl -fsSL https://get.docker.com | bash

安装完成后查看版本:

docker -v

如果看到类似输出,说明 Docker 安装成功:

Docker version 26.x.x, build xxxxx

2. 设置 Docker 开机自启

systemctl enable docker
systemctl start docker

查看 Docker 状态:

systemctl status docker

如果显示 active (running),表示运行正常。

3. 检查 Docker Compose

新版 Docker 已内置 Compose 插件,可以执行:

docker compose version

如果输出版本号,例如:

Docker Compose version v2.x.x

说明可直接使用。


五、创建 AI搜索部署目录

建议将项目放在 /opt 目录下,方便后续维护。

mkdir -p /opt/ai-search
cd /opt/ai-search

创建常用目录:

mkdir -p data/postgres data/redis data/vector logs nginx

目录说明如下:

/opt/ai-search
├── data
│   ├── postgres   # PostgreSQL 数据持久化
│   ├── redis      # Redis 数据持久化
│   └── vector     # 向量数据库数据
├── logs           # 日志目录
├── nginx          # Nginx 配置目录
├── docker-compose.yml
└── .env

这样的目录结构可以让数据库、缓存、向量数据和日志都持久化到宿主机,即使容器删除,数据也不会丢失。


六、编写环境变量配置文件

/opt/ai-search 目录下创建 .env 文件:

vim .env

写入以下内容:

# =========================
# 基础配置
# =========================
APP_NAME=AI Search
APP_ENV=production
APP_PORT=3000
API_PORT=8000

# =========================
# 数据库配置
# =========================
POSTGRES_DB=ai_search
POSTGRES_USER=ai_search
POSTGRES_PASSWORD=请修改为强密码
POSTGRES_PORT=5432

# =========================
# Redis 配置
# =========================
REDIS_PORT=6379
REDIS_PASSWORD=请修改为Redis强密码

# =========================
# 向量数据库配置
# =========================
VECTOR_PORT=6333

# =========================
# 大模型配置
# 示例:OpenAI / DeepSeek / 通义千问等
# =========================
LLM_PROVIDER=openai
LLM_API_KEY=请填写你的API_KEY
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL=gpt-4o-mini

# =========================
# Embedding 模型配置
# =========================
EMBEDDING_MODEL=text-embedding-3-small

# =========================
# 安全配置
# =========================
JWT_SECRET=请修改为随机字符串
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=请修改为管理员密码

需要特别注意的是:

  • POSTGRES_PASSWORD 必须修改为强密码;
  • REDIS_PASSWORD 必须修改;
  • LLM_API_KEY 必须填写真实可用的大模型 API Key;
  • JWT_SECRET 建议使用随机字符串;
  • ADMIN_PASSWORD 不要使用简单密码。

可以使用下面命令生成随机字符串:

openssl rand -hex 32

七、编写 Docker Compose 文件

创建 docker-compose.yml

vim docker-compose.yml

写入以下内容:

services:
  postgres:
    image: postgres:16
    container_name: ai-search-postgres
    restart: always
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "${POSTGRES_PORT}:5432"
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - ai-search-net

  redis:
    image: redis:7
    container_name: ai-search-redis
    restart: always
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "${REDIS_PORT}:6379"
    volumes:
      - ./data/redis:/data
    networks:
      - ai-search-net

  vector:
    image: qdrant/qdrant:latest
    container_name: ai-search-vector
    restart: always
    ports:
      - "${VECTOR_PORT}:6333"
    volumes:
      - ./data/vector:/qdrant/storage
    networks:
      - ai-search-net

  backend:
    image: your-registry/ai-search-backend:latest
    container_name: ai-search-backend
    restart: always
    depends_on:
      - postgres
      - redis
      - vector
    environment:
      APP_ENV: ${APP_ENV}
      API_PORT: ${API_PORT}

      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
      REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379/0
      VECTOR_URL: http://vector:6333

      LLM_PROVIDER: ${LLM_PROVIDER}
      LLM_API_KEY: ${LLM_API_KEY}
      LLM_BASE_URL: ${LLM_BASE_URL}
      LLM_MODEL: ${LLM_MODEL}
      EMBEDDING_MODEL: ${EMBEDDING_MODEL}

      JWT_SECRET: ${JWT_SECRET}
      ADMIN_EMAIL: ${ADMIN_EMAIL}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
    ports:
      - "${API_PORT}:8000"
    volumes:
      - ./logs:/app/logs
    networks:
      - ai-search-net

  frontend:
    image: your-registry/ai-search-frontend:latest
    container_name: ai-search-frontend
    restart: always
    depends_on:
      - backend
    environment:
      API_BASE_URL: http://backend:8000
    ports:
      - "${APP_PORT}:3000"
    networks:
      - ai-search-net

networks:
  ai-search-net:
    driver: bridge

注意:上面 your-registry/ai-search-backend:latestyour-registry/ai-search-frontend:latest 是示例镜像地址。实际部署时,需要替换为你所使用的 AI搜索项目镜像。如果你的项目已经提供官方镜像,直接替换即可。


八、一键启动 AI搜索系统

确认当前目录为:

pwd

应显示:

/opt/ai-search

然后执行:

docker compose up -d

首次启动会自动拉取镜像,时间取决于服务器网络环境。

启动完成后查看容器状态:

docker compose ps

正常情况下,应看到所有服务均为 runningUp 状态:

ai-search-postgres   Up
ai-search-redis      Up
ai-search-vector     Up
ai-search-backend    Up
ai-search-frontend   Up

如果某个服务没有启动,可以查看日志:

docker compose logs -f backend

或者查看全部日志:

docker compose logs -f

九、初始化数据库

部分 AI搜索项目首次启动时会自动初始化数据库;如果你的项目需要手动执行迁移,可以进入后端容器:

docker exec -it ai-search-backend sh

执行数据库迁移命令,例如:

npm run migrate

或:

python manage.py migrate

具体命令取决于项目技术栈。如果官方文档提供初始化命令,以官方文档为准。

初始化完成后,重启后端服务:

docker compose restart backend

十、访问 AI搜索页面

如果服务器防火墙已经开放端口,可以直接访问:

http://你的服务器IP:3000

后端接口地址为:

http://你的服务器IP:8000

如果无法访问,请检查云服务器安全组是否开放了以下端口:

端口 用途
3000 前端页面
8000 后端 API
5432 PostgreSQL,不建议公网开放
6379 Redis,不建议公网开放
6333 Qdrant 向量数据库,不建议公网开放

生产环境中,数据库、Redis 和向量数据库端口不建议暴露到公网。如果只是容器内部访问,可以删除 postgresredisvector 中的 ports 配置,只保留内部网络访问。


十一、配置 Nginx 反向代理

为了使用域名访问 AI搜索系统,建议配置 Nginx 反向代理。

如果服务器还没有安装 Nginx,可以执行:

apt install -y nginx

创建站点配置:

vim /etc/nginx/sites-available/ai-search.conf

写入以下内容:

server {
    listen 80;
    server_name search.example.com;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        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;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8000/;
        proxy_http_version 1.1;

        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;
    }
}

启用配置:

ln -s /etc/nginx/sites-available/ai-search.conf /etc/nginx/sites-enabled/

检查配置是否正确:

nginx -t

重载 Nginx:

systemctl reload nginx

然后访问:

http://search.example.com

即可打开 AI搜索系统。


十二、配置 HTTPS 证书

生产环境强烈建议启用 HTTPS。可以使用 Certbot 免费申请 Let’s Encrypt 证书。

安装 Certbot:

apt install -y certbot python3-certbot-nginx

申请证书:

certbot --nginx -d search.example.com

按照提示输入邮箱并确认即可。完成后,Certbot 会自动修改 Nginx 配置并开启 HTTPS。

测试自动续期:

certbot renew --dry-run

如果没有报错,表示证书自动续期正常。


十三、上传文档并构建知识库

部署完成后,进入管理后台,通常需要完成以下步骤:

  1. 登录管理员账号;
  2. 创建知识库;
  3. 上传文档;
  4. 等待系统解析文档;
  5. 执行文本切分;
  6. 调用 Embedding 模型生成向量;
  7. 写入向量数据库;
  8. 开始提问测试。

常见可上传的文档格式包括:

  • PDF;
  • Word;
  • Markdown;
  • TXT;
  • HTML;
  • CSV;
  • Excel;
  • 网页链接。

文档上传后,系统会将长文本拆分为多个片段,并生成向量存入向量数据库。当用户提问时,系统会先将问题向量化,再从向量数据库中检索相关片段,最后把这些片段和问题一起交给大模型生成回答。

这就是典型的 RAG 工作流程。


十四、常用运维命令

1. 查看服务状态

docker compose ps

2. 查看实时日志

docker compose logs -f

查看某个服务日志:

docker compose logs -f backend

3. 重启服务

docker compose restart

只重启后端:

docker compose restart backend

4. 停止服务

docker compose down

5. 启动服务

docker compose up -d

6. 更新镜像

docker compose pull
docker compose up -d

7. 查看容器资源占用

docker stats

8. 进入容器

docker exec -it ai-search-backend sh

十五、数据备份方案

AI搜索系统中最重要的数据通常包括:

  • PostgreSQL 数据;
  • 向量数据库数据;
  • 上传的原始文档;
  • 用户配置;
  • 日志文件;
  • .env 配置文件。

建议定期备份 /opt/ai-search 目录:

tar -zcvf ai-search-backup-$(date +%F).tar.gz /opt/ai-search

如果需要备份 PostgreSQL,可以执行:

docker exec -t ai-search-postgres pg_dump -U ai_search ai_search > backup.sql

恢复数据库:

cat backup.sql | docker exec -i ai-search-postgres psql -U ai_search ai_search

对于生产环境,建议结合定时任务进行自动备份:

crontab -e

添加每天凌晨 2 点自动备份:

0 2 * * * tar -zcf /backup/ai-search-$(date +\%F).tar.gz /opt/ai-search

十六、常见问题排查

1. 容器启动失败怎么办?

查看日志:

docker compose logs -f 服务名

常见原因包括:

  • .env 配置错误;
  • 数据库密码不一致;
  • 镜像拉取失败;
  • 端口被占用;
  • 服务器内存不足;
  • API Key 无效。

2. 端口被占用怎么办?

查看端口占用:

ss -tunlp | grep 3000

如果端口被占用,可以修改 .env 中的端口,例如:

APP_PORT=3010
API_PORT=8010

然后重启:

docker compose up -d

3. AI 回答失败怎么办?

一般需要检查:

  • LLM_API_KEY 是否正确;
  • LLM_BASE_URL 是否填写正确;
  • 当前模型是否支持;
  • API 账户是否欠费;
  • 服务器是否能访问模型接口;
  • 后端日志中是否有报错。

可以在服务器中测试网络:

curl https://api.openai.com/v1/models

如果你使用的是兼容 OpenAI 格式的接口,需要根据服务商文档修改 LLM_BASE_URL

4. 文档上传成功但无法检索怎么办?

可能原因包括:

  • 文档解析失败;
  • 文本切分失败;
  • Embedding 模型调用失败;
  • 向量数据库连接失败;
  • 知识库未启用;
  • 检索阈值设置过高。

建议查看后端日志,并检查向量数据库状态:

curl http://127.0.0.1:6333/collections

5. 服务器内存不足怎么办?

AI搜索在文档解析和向量化时可能占用较多内存。可以通过以下方式优化:

  • 增加服务器内存;
  • 降低并发任务数量;
  • 减小文档上传大小;
  • 使用异步任务队列;
  • 给 Docker 设置合理内存限制;
  • 将数据库和向量数据库部署到独立服务器。

十七、安全加固建议

部署完成后,不建议直接将所有端口暴露到公网。可以做以下安全优化:

  1. 只开放 80、443 端口
    前端和 API 通过 Nginx 代理访问。

  2. 关闭数据库公网端口
    PostgreSQL、Redis、Qdrant 只允许容器内部访问。

  3. 修改默认管理员密码
    首次登录后立即修改。

  4. 保护 .env 文件
    该文件包含数据库密码和 API Key,不要上传到公开仓库。

  5. 启用 HTTPS
    避免登录信息和 API 请求被明文传输。

  6. 限制上传文件类型和大小
    防止恶意文件上传。

  7. 定期更新镜像
    修复潜在安全漏洞。

  8. 配置防火墙
    使用 ufw 开放必要端口:

ufw allow 22
ufw allow 80
ufw allow 443
ufw enable

十八、性能优化建议

如果 AI搜索系统访问量逐渐增加,可以从以下几个方面进行优化:

1. 使用更快的 Embedding 模型

Embedding 模型直接影响文档入库速度和检索效果。如果追求中文效果,可以选择中文表现更好的向量模型。

2. 调整文本切分策略

文本切分过短,容易丢失上下文;文本切分过长,会增加模型输入成本。一般建议每个片段控制在 300~800 字之间,并设置适当重叠。

3. 优化向量检索参数

可以调整 Top-K、相似度阈值、重排序策略等参数,提高召回质量。

4. 增加缓存

对高频问题进行缓存,可以减少大模型调用次数,降低成本。

5. 使用异步任务

文档解析、向量化和入库可以放到后台任务中执行,避免阻塞用户操作。

6. 拆分服务

当用户量变大后,可以将数据库、向量数据库、后端服务分别部署到不同服务器,提升整体稳定性。


十九、升级 AI搜索系统

升级前建议先备份:

tar -zcvf ai-search-before-upgrade-$(date +%F).tar.gz /opt/ai-search

然后拉取最新镜像:

docker compose pull

重新启动:

docker compose up -d

查看日志确认是否正常:

docker compose logs -f

如果升级失败,可以通过备份恢复配置和数据。


二十、总结

通过 Docker Compose 部署 AI搜索系统,可以大幅降低安装和运维难度。整个流程可以概括为:

安装 Docker
创建部署目录
配置 .env
编写 docker-compose.yml
执行 docker compose up -d
配置 Nginx 和 HTTPS
上传文档构建知识库
开始使用 AI搜索

对于个人用户来说,这种方式可以快速搭建自己的智能知识库;对于企业团队来说,也可以作为内部文档问答、客服机器人、研发知识库、产品手册检索系统的基础方案。

如果你只是测试,单机 Docker 部署已经足够;如果用于生产环境,建议重点关注数据备份、安全加固、HTTPS、权限管理和性能监控。只要配置合理,AI搜索系统可以稳定运行,并显著提升信息检索和知识管理效率。

目录结构
全文