diff --git a/frameworks/open-webui/0.8.10/Dockerfile b/frameworks/open-webui/0.8.10/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..256424a873abb1e523927ed4c3ea5846f0bc2cfb --- /dev/null +++ b/frameworks/open-webui/0.8.10/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.10 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.10/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.10.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.10/* /app/ && \ + cp -r /tmp/open-webui-0.8.10/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.10 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.10 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.10" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.10/README.md b/frameworks/open-webui/0.8.10/README.md new file mode 100644 index 0000000000000000000000000000000000000000..708cee2832588ecdaa5f1db6b1a1f1fb777408d5 --- /dev/null +++ b/frameworks/open-webui/0.8.10/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.10 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.10 +docker build -t oc9-open-webui:0.8.10 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.10 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.10 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.10 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.10 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.10/test.sh b/frameworks/open-webui/0.8.10/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..a097ddb23be842100fe1e04cf938595ee625325c --- /dev/null +++ b/frameworks/open-webui/0.8.10/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.10 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.10" +CONTAINER_NAME="open-webui-test-0.8.10" + +echo "=== Testing Open WebUI 0.8.10 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.11/Dockerfile b/frameworks/open-webui/0.8.11/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..a6d4f3ec36f389e103bce420009b18853748d4da --- /dev/null +++ b/frameworks/open-webui/0.8.11/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.11 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.11/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.11.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.11/* /app/ && \ + cp -r /tmp/open-webui-0.8.11/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.11 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.11 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.11" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.11/README.md b/frameworks/open-webui/0.8.11/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0ebf5004a934496cffa7ec1fd12bff34501a91d0 --- /dev/null +++ b/frameworks/open-webui/0.8.11/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.11 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.11 +docker build -t oc9-open-webui:0.8.11 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.11 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.11 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.11 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.11 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.11/test.sh b/frameworks/open-webui/0.8.11/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..8d91b527dd10b4f28ea28b87a068e0b4c631e5c3 --- /dev/null +++ b/frameworks/open-webui/0.8.11/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.11 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.11" +CONTAINER_NAME="open-webui-test-0.8.11" + +echo "=== Testing Open WebUI 0.8.11 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.12/Dockerfile b/frameworks/open-webui/0.8.12/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..6e33621bc33c6be11af4024befd61b7d0f672959 --- /dev/null +++ b/frameworks/open-webui/0.8.12/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.12 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.12/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.12.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.12/* /app/ && \ + cp -r /tmp/open-webui-0.8.12/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.12 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.12 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.12" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.12/README.md b/frameworks/open-webui/0.8.12/README.md new file mode 100644 index 0000000000000000000000000000000000000000..194384f434d065f2e0a8a4c26b5b81757f0ba911 --- /dev/null +++ b/frameworks/open-webui/0.8.12/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.12 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.12 +docker build -t oc9-open-webui:0.8.12 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.12 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.12 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.12 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.12 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.12/test.sh b/frameworks/open-webui/0.8.12/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..606b41912ad2f0de52bfce3fe307cba8abad57e4 --- /dev/null +++ b/frameworks/open-webui/0.8.12/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.12 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.12" +CONTAINER_NAME="open-webui-test-0.8.12" + +echo "=== Testing Open WebUI 0.8.12 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.3/Dockerfile b/frameworks/open-webui/0.8.3/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..207a70ca50264370dcc3a38782977734ad642594 --- /dev/null +++ b/frameworks/open-webui/0.8.3/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.3 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.3/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.3.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.3/* /app/ && \ + cp -r /tmp/open-webui-0.8.3/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.3 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.3 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.3" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.3/README.md b/frameworks/open-webui/0.8.3/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3c286f38717e022b9bd8033e801ec754a26db63f --- /dev/null +++ b/frameworks/open-webui/0.8.3/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.3 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.3 +docker build -t oc9-open-webui:0.8.3 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.3 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.3 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.3 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.3 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.3/test.sh b/frameworks/open-webui/0.8.3/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..5ee7e64195365da9ad64bf8b9003fe605c0ef4ba --- /dev/null +++ b/frameworks/open-webui/0.8.3/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.3 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.3" +CONTAINER_NAME="open-webui-test-0.8.3" + +echo "=== Testing Open WebUI 0.8.3 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.5/Dockerfile b/frameworks/open-webui/0.8.5/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..de7b162b1a4c4ea76695d403cf8c77e0ac012910 --- /dev/null +++ b/frameworks/open-webui/0.8.5/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.5 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.5/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.5.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.5/* /app/ && \ + cp -r /tmp/open-webui-0.8.5/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.5 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.5 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.5" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.5/README.md b/frameworks/open-webui/0.8.5/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a2830d04312b9f43f2064aa39ba646c0a329d990 --- /dev/null +++ b/frameworks/open-webui/0.8.5/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.5 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.5 +docker build -t oc9-open-webui:0.8.5 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.5 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.5 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.5 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.5 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.5/test.sh b/frameworks/open-webui/0.8.5/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..ec806c94221064e850b8b5110548cac29627e319 --- /dev/null +++ b/frameworks/open-webui/0.8.5/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.5 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.5" +CONTAINER_NAME="open-webui-test-0.8.5" + +echo "=== Testing Open WebUI 0.8.5 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.6/Dockerfile b/frameworks/open-webui/0.8.6/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b7ed0f1d8ca3bb5da5d4bf9891d9c8378d8ffb7e --- /dev/null +++ b/frameworks/open-webui/0.8.6/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.6 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.6/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.6.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.6/* /app/ && \ + cp -r /tmp/open-webui-0.8.6/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.6 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.6 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.6" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.6/README.md b/frameworks/open-webui/0.8.6/README.md new file mode 100644 index 0000000000000000000000000000000000000000..63c38713316772a8cfbf397d847e3acf9d32e1cc --- /dev/null +++ b/frameworks/open-webui/0.8.6/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.6 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.6 +docker build -t oc9-open-webui:0.8.6 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.6 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.6 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.6 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.6 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.6/test.sh b/frameworks/open-webui/0.8.6/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..d077d9a218772b2cca33b1bd5d18a15f5e5f5093 --- /dev/null +++ b/frameworks/open-webui/0.8.6/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.6 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.6" +CONTAINER_NAME="open-webui-test-0.8.6" + +echo "=== Testing Open WebUI 0.8.6 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.7/Dockerfile b/frameworks/open-webui/0.8.7/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..77fe029569cb4e6f5c0b0a3083dbb89c78e1de2b --- /dev/null +++ b/frameworks/open-webui/0.8.7/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.7 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.7/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.7.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.7/* /app/ && \ + cp -r /tmp/open-webui-0.8.7/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.7 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.7 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.7" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.7/README.md b/frameworks/open-webui/0.8.7/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ec0f475ab25802e3c3dcd1d1711a4f0827eb5c5d --- /dev/null +++ b/frameworks/open-webui/0.8.7/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.7 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.7 +docker build -t oc9-open-webui:0.8.7 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.7 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.7 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.7 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.7 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.7/test.sh b/frameworks/open-webui/0.8.7/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..8d50c81aa33d369b1b4266360e10dfe49712053e --- /dev/null +++ b/frameworks/open-webui/0.8.7/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.7 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.7" +CONTAINER_NAME="open-webui-test-0.8.7" + +echo "=== Testing Open WebUI 0.8.7 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.8/Dockerfile b/frameworks/open-webui/0.8.8/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..e4590d539f1fb3bac5cf9d1922d1c51794c01238 --- /dev/null +++ b/frameworks/open-webui/0.8.8/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.8 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.8/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.8.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.8/* /app/ && \ + cp -r /tmp/open-webui-0.8.8/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.8 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.8 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.8" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.8/README.md b/frameworks/open-webui/0.8.8/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fb2de6f48f95dcc161438dc97d44b74c026da871 --- /dev/null +++ b/frameworks/open-webui/0.8.8/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.8 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.8 +docker build -t oc9-open-webui:0.8.8 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.8 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.8 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.8 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.8 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.8/test.sh b/frameworks/open-webui/0.8.8/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..6212595e78780538ec3f3ba83255806d23c36db7 --- /dev/null +++ b/frameworks/open-webui/0.8.8/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.8 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.8" +CONTAINER_NAME="open-webui-test-0.8.8" + +echo "=== Testing Open WebUI 0.8.8 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!" diff --git a/frameworks/open-webui/0.8.9/Dockerfile b/frameworks/open-webui/0.8.9/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..15f642422d3ba3f24599646f1f56df316098f0ca --- /dev/null +++ b/frameworks/open-webui/0.8.9/Dockerfile @@ -0,0 +1,107 @@ +# Open WebUI v0.8.9 on OpenCloudOS 9 +# Based on official: https://github.com/open-webui/open-webui/blob/v0.8.9/Dockerfile +# Changes: Multi-stage build adapted for OC9 + +######## Frontend build stage ######## +FROM --platform=$BUILDPLATFORM node:22-alpine AS build + +ARG BUILD_HASH=oc9-build + +WORKDIR /app + +# Install git for version info +RUN apk add --no-cache git curl + +# Download Open WebUI source +RUN curl -L https://github.com/open-webui/open-webui/archive/refs/tags/v0.8.9.tar.gz -o /tmp/open-webui.tar.gz && \ + tar -xzf /tmp/open-webui.tar.gz -C /tmp && \ + cp -r /tmp/open-webui-0.8.9/* /app/ && \ + cp -r /tmp/open-webui-0.8.9/.* /app/ 2>/dev/null || true && \ + rm -rf /tmp/open-webui.tar.gz /tmp/open-webui-0.8.9 + +# Install frontend dependencies and build +RUN npm ci --force +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## Runtime stage - OpenCloudOS 9 ######## +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="Open WebUI 0.8.9 on OpenCloudOS 9" +LABEL org.opencontainers.image.version="0.8.9" + +# Python & App settings +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 +ENV ENV=prod +ENV PORT=8080 +ENV HOME=/root + +# Security & Privacy +ENV SCARF_NO_ANALYTICS=true +ENV DO_NOT_TRACK=true +ENV ANONYMIZED_TELEMETRY=false + +# API Configuration +ENV WEBUI_SECRET_KEY=*** +ENV OLLAMA_BASE_URL=/ollama +ENV OPENAI_API_BASE_URL="" + +# Embedding Model settings +ENV RAG_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ENV RAG_RERANKING_MODEL="" +ENV SENTENCE_TRANSFORMERS_HOME=/app/backend/data/cache/embedding/models +ENV HF_HOME=/app/backend/data/cache/embedding/models + +# Whisper settings +ENV WHISPER_MODEL=base +ENV WHISPER_MODEL_DIR=/app/backend/data/cache/whisper/models + +WORKDIR /app + +# Install system dependencies +RUN dnf install -y epol-release && \ + dnf install -y --nogpgcheck \ + python3-pip \ + python3-devel \ + git \ + gcc \ + gcc-c++ \ + make \ + curl \ + jq \ + ffmpeg \ + zstd \ + && dnf clean all \ + && rm -rf /var/cache/yum/* + +# Copy built frontend and full source from build stage +COPY --from=build /app /app + +WORKDIR /app/backend + +# Fix stale pinned dependencies and install with uv +RUN pip3 install --no-cache-dir uv && \ + sed -i 's/ddgs==9.11.2/ddgs==9.11.3/g' requirements.txt && \ + uv pip install --system --no-cache-dir -r requirements.txt && \ + pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + rm -rf /root/.cache/pip/* + +# Pre-download nltk data +RUN python3 -c "import nltk; nltk.download('punkt_tab', quiet=True)" 2>/dev/null || true + +# Create data directories +RUN mkdir -p /app/backend/data/cache && \ + mkdir -p /app/backend/data/vector_db + +EXPOSE 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl --silent --fail http://localhost:${PORT}/health | jq -ne 'input.status == true' || exit 1 + +ENV DOCKER=true + +CMD ["bash", "start.sh"] diff --git a/frameworks/open-webui/0.8.9/README.md b/frameworks/open-webui/0.8.9/README.md new file mode 100644 index 0000000000000000000000000000000000000000..89ebf219a5a79f54d07dbcd7d642ed82a577073c --- /dev/null +++ b/frameworks/open-webui/0.8.9/README.md @@ -0,0 +1,77 @@ +# Open WebUI 0.8.9 on OpenCloudOS 9 + +[Open WebUI](https://github.com/open-webui/open-webui) 是一个用户友好的自托管 AI 界面,支持 Ollama 和兼容 OpenAI API 的 LLM。 + +## 镜像信息 + +| 项目 | 值 | +|------|-----| +| 基础镜像 | `opencloudos/opencloudos9-minimal:latest` | +| 前端构建 | `node:22-alpine`(多阶段构建) | +| Python 版本 | 3.11 (OC9 自带) | +| 监听端口 | 8080 | + +## 构建镜像 + +```bash +cd frameworks/open-webui/0.8.9 +docker build -t oc9-open-webui:0.8.9 . +``` + +## 运行容器 + +### 基础运行 +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + oc9-open-webui:0.8.9 +``` + +### 连接到 Ollama(本地) +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \ + --add-host=host.docker.internal:host-gateway \ + oc9-open-webui:0.8.9 +``` + +### 连接到 OpenAI API +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -e WEBUI_SECRET_KEY="your-secret-key" \ + -e OPENAI_API_KEY="sk-your-api-key" \ + -e OPENAI_API_BASE_URL="https://api.openai.com/v1" \ + oc9-open-webui:0.8.9 +``` + +## 数据持久化 + +```bash +docker run -d \ + --name open-webui \ + -p 8080:8080 \ + -v open-webui-data:/app/backend/data \ + oc9-open-webui:0.8.9 +``` + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | `8080` | 服务监听端口 | +| `OLLAMA_BASE_URL` | `/ollama` | Ollama 服务地址 | +| `OPENAI_API_BASE_URL` | 空 | OpenAI API 地址 | +| `WEBUI_SECRET_KEY` | `***` | WebUI 密钥 | +| `RAG_EMBEDDING_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | RAG 嵌入模型 | +| `WHISPER_MODEL` | `base` | Whisper 语音模型 | + +## 健康检查 + +容器内置健康检查,每 30 秒检查一次 `/health` 端点。 diff --git a/frameworks/open-webui/0.8.9/test.sh b/frameworks/open-webui/0.8.9/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..63c036a358dd44ede3f80bdeda7d14f0d3abb6e8 --- /dev/null +++ b/frameworks/open-webui/0.8.9/test.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Test script for Open WebUI 0.8.9 on OpenCloudOS 9 +set -e + +IMAGE_NAME="oc9-open-webui:0.8.9" +CONTAINER_NAME="open-webui-test-0.8.9" + +echo "=== Testing Open WebUI 0.8.9 ===" + +# Clean up any existing container +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +# Step 1: Check image exists +echo "[1/5] Checking image..." +if ! docker image inspect $IMAGE_NAME > /dev/null 2>&1; then + echo "FAIL: Image $IMAGE_NAME not found. Build it first with: docker build -t $IMAGE_NAME ." + exit 1 +fi +echo "PASS: Image exists" + +# Step 2: Check base image is OpenCloudOS 9 +echo "[2/5] Checking base image..." +OS_INFO=$(docker run --rm $IMAGE_NAME cat /etc/os-release 2>/dev/null) +if echo "$OS_INFO" | grep -q "OpenCloudOS"; then + echo "PASS: Base image is OpenCloudOS" +else + echo "FAIL: Base image is not OpenCloudOS" + exit 1 +fi + +# Step 3: Check Python 3.11 available +echo "[3/5] Checking Python 3.11..." +PYTHON_VER=$(docker run --rm $IMAGE_NAME python3 --version 2>/dev/null) +if echo "$PYTHON_VER" | grep -q "3.11"; then + echo "PASS: Python 3.11 available ($PYTHON_VER)" +else + echo "FAIL: Python 3.11 not found" + exit 1 +fi + +# Step 4: Start container and check health +echo "[4/5] Starting container and checking health..." +docker run -d --name $CONTAINER_NAME -p 18080:8080 $IMAGE_NAME + +# Wait for startup +echo "Waiting for container to start (40s)..." +sleep 40 + +# Check if container is running +if ! docker ps | grep -q $CONTAINER_NAME; then + echo "FAIL: Container is not running" + docker logs $CONTAINER_NAME 2>&1 | tail -20 + docker rm -f $CONTAINER_NAME 2>/dev/null || true + exit 1 +fi +echo "PASS: Container is running" + +# Step 5: Check HTTP endpoint +echo "[5/5] Checking HTTP endpoint..." +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:18080/ || echo "000") +if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then + echo "PASS: HTTP endpoint returned $HTTP_CODE" +else + echo "WARN: HTTP endpoint returned $HTTP_CODE (may need more startup time)" +fi + +# Cleanup +docker rm -f $CONTAINER_NAME 2>/dev/null || true + +echo "" +echo "=== Test Summary ===" +echo "Image: $IMAGE_NAME" +echo "All critical checks passed!"