diff --git a/frameworks/maxkb/2.5.0/Dockerfile b/frameworks/maxkb/2.5.0/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..38d7211b19c377ff4893844c5996060edc3aaeea --- /dev/null +++ b/frameworks/maxkb/2.5.0/Dockerfile @@ -0,0 +1,106 @@ +# MaxKB v2.5.0 on OpenCloudOS 9 +# 基于 https://github.com/1Panel-dev/MaxKB/tree/v2.5.0/installer/Dockerfile +# 适配修改:基础镜像更换为 opencloudos9-minimal,PostgreSQL/Redis 改为外部服务 + +# ========== Stage 1: Source Clone ========== +FROM opencloudos/opencloudos9-minimal:latest AS src + +RUN dnf install -y git \ + && dnf clean all && rm -rf /var/cache/yum/* + +RUN git clone --depth 1 --branch v2.5.0 \ + https://github.com/1Panel-dev/MaxKB.git /src + +# ========== Stage 2: Frontend Build ========== +FROM node:24-alpine AS web-build +COPY --from=src /src/ui ui +RUN cd ui && ls -la && if [ -d "dist" ]; then exit 0; fi && \ + npm install --prefer-offline --no-audit && \ + npm install -D concurrently && \ + NODE_OPTIONS="--max-old-space-size=4096" npx concurrently "npm run build" "npm run build-chat" && \ + find . -maxdepth 1 ! -name '.' ! -name 'dist' ! -name 'public' -exec rm -rf {} + + +# ========== Stage 3: Application Build ========== +FROM opencloudos/opencloudos9-minimal:latest AS stage-build + +COPY --from=src /src /opt/maxkb-app + +RUN dnf install -y \ + gcc gcc-c++ gettext libffi-devel python3.11 python3.11-pip \ + && dnf clean all && rm -rf /var/cache/yum/* \ + && ln -sf /usr/bin/python3.11 /usr/bin/python3 \ + && python3.11 -m venv /opt/py3 + +ENV PATH=/opt/py3/bin:$PATH + +WORKDIR /opt/maxkb-app +# 构建阶段设置 MAXKB_CONFIG_TYPE=ENV,使 Django 加载配置走环境变量而非 YAML 文件 +# (/opt/maxkb/conf/config.yml 在构建时不存在,走 YAML 路径会 ImportError) +ENV MAXKB_CONFIG_TYPE=ENV +RUN mkdir -p /opt/maxkb-app/sandbox/lib && \ + gcc -shared -fPIC -o /opt/maxkb-app/sandbox/lib/sandbox.so /opt/maxkb-app/installer/sandbox.c -ldl && \ + rm -rf /opt/maxkb-app/ui && \ + pip install uv && \ + python -m uv pip install -r pyproject.toml && \ + find /opt/maxkb-app -depth \( -name ".git*" -o -name ".docker*" -o -name ".idea*" \ + -o -name ".editorconfig*" -o -name ".prettierrc*" -o -name "README.md" \ + -o -name "poetry.lock" -o -name "pyproject.toml" \) -exec rm -rf {} + && \ + python /opt/maxkb-app/apps/manage.py compilemessages && \ + PIP_TARGET=/opt/maxkb-app/sandbox/python-packages && \ + python -m uv pip install --target=$PIP_TARGET requests pymysql psycopg2-binary && \ + rm -rf /opt/maxkb-app/installer + +COPY --from=web-build --chown=root:root ui /opt/maxkb-app/ui + +# ========== Stage 4: Runtime ========== +FROM opencloudos/opencloudos9-minimal:latest + +LABEL maintainer="OpenCloudOS Community" +LABEL org.opencontainers.image.source="https://gitee.com/OpenCloudOS/ai-agent-container" +LABEL org.opencontainers.image.description="MaxKB v2.5.0 on OpenCloudOS 9" + +ARG DOCKER_IMAGE_TAG=2.5.0 + +RUN dnf install -y \ + curl ca-certificates python3.11 \ + && dnf clean all && rm -rf /var/cache/yum/* \ + && update-ca-trust \ + && ln -sf /usr/bin/python3.11 /usr/bin/python3 + +ENV PATH=/opt/py3/bin:$PATH \ + LANG=en_US.UTF-8 \ + PYTHONUNBUFFERED=1 \ + TZ=Asia/Shanghai \ + MAXKB_VERSION="${DOCKER_IMAGE_TAG}" \ + MAXKB_DB_NAME=maxkb \ + MAXKB_DB_HOST=127.0.0.1 \ + MAXKB_DB_PORT=5432 \ + MAXKB_DB_USER=root \ + MAXKB_DB_PASSWORD=Password123@postgres \ + MAXKB_DB_MAX_OVERFLOW=80 \ + MAXKB_REDIS_HOST=127.0.0.1 \ + MAXKB_REDIS_PORT=6379 \ + MAXKB_REDIS_DB=0 \ + MAXKB_REDIS_PASSWORD=Password123@redis \ + MAXKB_EMBEDDING_MODEL_PATH=/opt/maxkb-app/model/embedding \ + MAXKB_EMBEDDING_MODEL_NAME=/opt/maxkb-app/model/embedding/shibing624_text2vec-base-chinese \ + MAXKB_LOCAL_MODEL_HOST=127.0.0.1 \ + MAXKB_LOCAL_MODEL_PORT=11636 \ + MAXKB_LOCAL_MODEL_PROTOCOL=http \ + PIP_TARGET=/opt/maxkb/python-packages \ + MAXKB_CONFIG_TYPE=ENV \ + MAXKB_LOG_LEVEL=INFO \ + MAXKB_SANDBOX=1 \ + MAXKB_SANDBOX_HOME=/opt/maxkb-app/sandbox \ + MAXKB_SANDBOX_PYTHON_PACKAGE_PATHS="/opt/py3/lib/python3.11/site-packages,/opt/maxkb-app/sandbox/python-packages,/opt/maxkb/python-packages" \ + MAXKB_ADMIN_PATH=/admin + +WORKDIR /opt/maxkb-app +COPY --from=stage-build /opt/maxkb-app /opt/maxkb-app +COPY --from=stage-build /opt/py3 /opt/py3 + +EXPOSE 8080 +VOLUME /opt/maxkb + +ENTRYPOINT ["python", "/opt/maxkb-app/main.py"] +CMD ["start"] \ No newline at end of file diff --git a/frameworks/maxkb/2.5.0/README.md b/frameworks/maxkb/2.5.0/README.md new file mode 100644 index 0000000000000000000000000000000000000000..057e7801dbe1314a3a35eb3e6286f501551ef270 --- /dev/null +++ b/frameworks/maxkb/2.5.0/README.md @@ -0,0 +1,120 @@ +# MaxKB on OpenCloudOS 9 + +## 基本信息 +- **框架版本**:v2.5.0 +- **基础镜像**:opencloudos9-minimal:latest +- **Python 版本**:3.11 +- **Node.js 版本**:24.x(仅构建时使用) +- **框架类型**:知识库问答平台(Django + Vue.js) +- **CUDA 版本**:N/A(CPU 框架) + +## 简介 + +[MaxKB](https://github.com/1Panel-dev/MaxKB) 是 1Panel 团队开发的开源知识库问答平台,基于大语言模型(LLM)和 RAG 技术,提供强大的知识库管理与智能问答能力。支持多种 LLM 接入(OpenAI、Anthropic、Ollama、DeepSeek 等),内置文档解析、向量检索、工作流编排等功能。 + +## 构建 + +```bash +docker build -t oc9-maxkb:2.5.0 frameworks/maxkb/2.5.0/ +``` + +> 构建需要 ≥8GB 内存(PyTorch + LangChain 依赖较多)。 + +## 使用示例 + +MaxKB 需要配合以下外部服务一起部署: + +| 服务 | 说明 | +|------|------| +| **PostgreSQL** | 主数据库(≥17,需安装 pgvector 扩展) | +| **Redis** | 缓存(≥7.0) | + +### docker-compose 部署示例 + +```yaml +services: + maxkb: + image: oc9-maxkb:2.5.0 + container_name: maxkb + restart: always + ports: + - "8080:8080" + volumes: + - ./maxkb-data:/opt/maxkb + environment: + - MAXKB_DB_HOST=pgsql + - MAXKB_DB_PORT=5432 + - MAXKB_DB_USER=root + - MAXKB_DB_PASSWORD=Password123@postgres + - MAXKB_DB_NAME=maxkb + - MAXKB_REDIS_HOST=redis + - MAXKB_REDIS_PORT=6379 + - MAXKB_REDIS_PASSWORD=Password123@redis + - MAXKB_EMBEDDING_MODEL_PATH=/opt/maxkb/model/embedding + - MAXKB_SANDBOX=1 + depends_on: + - pgsql + - redis + + pgsql: + image: pgvector/pgvector:0.8.0-pg17 + container_name: pgsql + restart: always + volumes: + - ./pgsql-data:/var/lib/postgresql/data + environment: + - POSTGRES_USER=root + - POSTGRES_PASSWORD=Password123@postgres + - POSTGRES_DB=maxkb + + redis: + image: redis:7.2-alpine + container_name: redis + restart: always + volumes: + - ./redis-data:/data + command: redis-server --requirepass Password123@redis --appendonly yes +``` + +启动后访问 `http://localhost:8080`。 + +## 主要环境变量 + +| 变量 | 说明 | 默认值 | +|------|------|--------| +| `MAXKB_DB_HOST` | PostgreSQL 主机地址 | `127.0.0.1` | +| `MAXKB_DB_PORT` | PostgreSQL 端口 | `5432` | +| `MAXKB_DB_USER` | PostgreSQL 用户名 | `root` | +| `MAXKB_DB_PASSWORD` | PostgreSQL 密码 | `Password123@postgres` | +| `MAXKB_DB_NAME` | 数据库名 | `maxkb` | +| `MAXKB_REDIS_HOST` | Redis 主机地址 | `127.0.0.1` | +| `MAXKB_REDIS_PORT` | Redis 端口 | `6379` | +| `MAXKB_REDIS_PASSWORD` | Redis 密码 | `Password123@redis` | +| `MAXKB_EMBEDDING_MODEL_PATH` | Embedding 模型路径 | `/opt/maxkb-app/model/embedding` | +| `MAXKB_SANDBOX` | 是否启用沙箱 | `1` | +| `MAXKB_ADMIN_PATH` | 管理后台路径 | `/admin` | +| `MAXKB_LOG_LEVEL` | 日志级别 | `INFO` | + +## 测试验证 + +```bash +bash test.sh oc9-maxkb:2.5.0 +``` + +测试脚本会验证以下内容: +- Python 版本 ≥ 3.11 +- Django 框架可用 +- MaxKB 核心模块可导入 +- LangChain 核心库可用 +- PyTorch CPU 可用 +- 前端构建产物存在 +- sandbox 共享库存在 +- 入口文件完整性 + +## 已知问题 + +- 构建时需要 ≥8GB 内存,内存不足会导致 pip install 或 npm build OOM +- 镜像仅包含 MaxKB 应用本身,PostgreSQL(带 pgvector)和 Redis 需通过 docker-compose 单独部署 +- 首次启动时需确保数据库已初始化并创建了 pgvector 扩展(需执行 `CREATE EXTENSION vector`) +- 原始官方镜像将 PostgreSQL 和 Redis 打包在同一容器中,本适配将它们分离为独立服务 +- Embedding 模型需要额外下载到 `/opt/maxkb/model/embedding/` 目录 diff --git a/frameworks/maxkb/2.5.0/build.conf b/frameworks/maxkb/2.5.0/build.conf new file mode 100644 index 0000000000000000000000000000000000000000..644bd1e1d1ba69da6cccfc8247199c73d6bf058b --- /dev/null +++ b/frameworks/maxkb/2.5.0/build.conf @@ -0,0 +1,4 @@ +# maxkb 2.5.0 on OpenCloudOS 9 +IMAGE_NAME=oc9-maxkb +IMAGE_TAG=2.5.0 +GPU_TEST=false diff --git a/frameworks/maxkb/2.5.0/test.sh b/frameworks/maxkb/2.5.0/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..56a13cf1dfe2443170a0005f1e76bc1407f60fc5 --- /dev/null +++ b/frameworks/maxkb/2.5.0/test.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -e + +IMAGE="${1:?ERROR: 缺少镜像参数。用法: bash test.sh }" + +echo "=== MaxKB v2.5.0 基础功能测试 ===" + +# 1. 验证 Python 版本 >= 3.11 +echo -n "检查 Python 版本... " +docker run --rm --entrypoint python3.11 "$IMAGE" -c " +import sys +assert sys.version_info >= (3, 11), f'Python version too low: {sys.version}' +print(f'Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 2. 验证 Django 框架可用 +echo -n "检查 Django 框架... " +docker run --rm --entrypoint python3.11 "$IMAGE" -c " +import django +print(f'Django {django.__version__}') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 3. 验证 MaxKB 核心模块可导入 +echo -n "检查 MaxKB 核心模块... " +docker run --rm --entrypoint python3.11 "$IMAGE" -c " +import sys, os +sys.path.insert(0, '/opt/maxkb-app/apps') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maxkb.settings') +from maxkb import settings +print(f'MaxKB settings module loaded') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 4. 验证 LangChain 核心库可用 +echo -n "检查 LangChain 核心库... " +docker run --rm --entrypoint python3.11 "$IMAGE" -c " +from langchain_core.messages import HumanMessage +print('langchain_core 可用') +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 5. 验证 PyTorch CPU 可用 +echo -n "检查 PyTorch CPU... " +docker run --rm --entrypoint python3.11 "$IMAGE" -c " +import torch +print(f'PyTorch {torch.__version__} (CPU)') +assert not torch.cuda.is_available(), 'GPU should not be available in CPU image' +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 6. 验证前端构建产物存在 +echo -n "检查前端构建产物... " +docker run --rm --entrypoint bash "$IMAGE" -c " +test -d /opt/maxkb-app/ui/dist && echo '前端构建产物存在' || { echo '前端构建产物不存在'; exit 1; } +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 7. 验证 sandbox 共享库存在 +echo -n "检查 sandbox 共享库... " +docker run --rm --entrypoint bash "$IMAGE" -c " +test -f /opt/maxkb-app/sandbox/lib/sandbox.so && echo 'sandbox.so 存在' || { echo 'sandbox.so 不存在'; exit 1; } +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +# 8. 验证入口文件存在 +echo -n "检查入口文件... " +docker run --rm --entrypoint bash "$IMAGE" -c " +test -f /opt/maxkb-app/main.py && echo 'main.py 存在' || { echo 'main.py 不存在'; exit 1; } +" && echo "✓ 通过" || { echo "✗ 失败"; exit 1; } + +echo "=== 所有测试通过 ===" \ No newline at end of file