Ollama + Open WebUI
1. 背景
需要关于代码层面的问答
需要账户登陆记录
2. 机器
16c32g
200g的磁盘
centos8.5
3. 选取的模型
Ollama + Open WebUI
ollama的模型库
https://ollama.com/library
codellama模型最低就是7b
- 模型:CodeLlama-13B(4-bit量化)
 - 内存占用:~10-12GB
 - 剩余内存:~20GB用于并发处理
机器申请失败,因此我在自己真机上部署了一套仅仅限制4个人用的模型
我自己的机器
x86_64
16cpu:CPU: model name : Intel® Core™ i7-10700 CPU @ 2.90GHz
64G内存
440G的磁盘
集成显卡:Intel Corporation CometLake-S GT2 [UHD Graphics 630] (rev 05)
存储设备:WD SN550 NVMe SSD
自己配置不高,所以用的是Ollama-7b的小模型,并且限制在4个人使用。因为我的机器有时候还要跑占内存的东西,尽量避免挤压真机使用。
ollama pull codellama:7b 
Open WebUI必需的基础模型
ollama pull sentence-transformers/all-MiniLM-L6-v2  # 嵌入模型(必需)
ollama pull nomic-embed-text                          # 文本嵌入模型
ollama pull all-minilm-l6-v2                         # 轻量嵌入模型
查看已经pull下来的模型,我的位置
/root/.ollama/models
查找命令
sudo find / -name "models" -type d 2>/dev/null
config.json
因为在国内环境下,Hugging Face 被屏蔽。从 Hugging Face 下载 sentence-transformers/all-MiniLM-L6-v2 模型会失败,因此直接去下面的网址下载模型在从本地加载到容器中,
https://public.ukp.informatik.tu-darmstadt.de/reimers/sentence-transformers/v0.2/
compose文件,使用桥接网络
version: '3.8'services:open-webui:image: ghcr.io/open-webui/open-webui:maincontainer_name: zyl-ai-webuirestart: unless-stoppedports:- "3000:8080"volumes:# 数据存储 (保持不变)- ./data:/app/backend/data# 修正后的模型挂载路径 (关键修改)- /home/great/zhangyuling_ai_ollama_7b/models/sentence-transformers/all-MiniLM-L6-v2:/app/backend/models/sentence-transformers/all-MiniLM-L6-v2environment:# Ollama连接- OLLAMA_BASE_URL=http://host.docker.internal:11434# 模型配置 (关键修改)- EMBEDDING_MODEL=/app/backend/models/sentence-transformers/all-MiniLM-L6-v2- DEFAULT_MODEL=codellama:7b- DEFAULT_MODELS=codellama:7b- EMBEDDING_MODEL=nomic-embed-text:latest- DISABLE_MODEL_DOWNLOAD=true# 禁用功能 (修正参数)- DISABLE_VECTOR_DB=false- DISABLE_EMBEDDINGS=false# 性能限制(针对4人团队优化)- MAX_CONCURRENT_REQUESTS=3      # 同时处理3个请求- REQUEST_QUEUE_SIZE=8           # 队列最多8个请求等待- REQUEST_TIMEOUT=120             # 请求超时时间(秒)- MAX_CONCURRENT_SESSIONS=4       # 最大并发会话数# 内存优化- MEMORY_LIMIT=4096               # 内存限制4GB- WORKER_TIMEOUT=300               # 工作进程超时# 用户认证- WEBUI_AUTH=true- USER_REGISTRATION=true- ALLOW_SIGNUP=true# 界面设置- DEFAULT_LOCALE=zh-CN- TITLE=AI代码助手extra_hosts:- "host.docker.internal:host-gateway" healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080"]interval: 30stimeout: 10sretries: 3start_period: 60s
compose文件使用主机网络(推荐使用)
services:open-webui:image: ghcr.io/open-webui/open-webui:maincontainer_name: zyl-ai-webuirestart: unless-stopped# 使用主机网络模式network_mode: "host"volumes:- ./data:/app/backend/dataenvironment:- OLLAMA_BASE_URL=http://127.0.0.1:11434- OFFLINE_MODE=true- EMBEDDING_MODEL=nomic-embed-text- DISABLE_MODEL_DOWNLOAD=true- DISABLE_HUGGINGFACE=true- DISABLE_CLOUD_SYNC=true- DISABLE_TELEMETRY=true- DISABLE_OPENAI=true- DISABLE_AZURE=true- DISABLE_CLOUD=true- DISABLE_PUBLIC=false- DEFAULT_MODEL=codellama:7b- DEFAULT_MODELS=codellama:7b- WEBUI_AUTH=true- USER_REGISTRATION=true- ALLOW_SIGNUP=true- DEFAULT_LOCALE=zh-CN- TITLE=AI代码助手(离线模式)#   # ✅ 增加资源限制配置#   deploy:#    resources:#     limits:#      memory: 8G#     cpus: '4.0'#  reservations:#   memory: 4G#  cpus: '2.0'# 添加启动时安装网络工具的命令command: >bash -c "echo '正在安装网络诊断工具...' &&apt-get update &&apt install iputils-ping &&echo '网络工具安装完成,启动Open WebUI...' &&/start.sh"healthcheck:test: ["CMD", "curl", "-f", "http://127.0.0.1:8080/api/config"]interval: 30stimeout: 15sretries: 3start_period: 120s
- 最终验证
great@great-PC:~/zhangyuling_ai_ollama_7b/webui$ ./final-check.sh 
=== 🎉 AI代码助手平台部署完成 ===📊 服务状态:
WARN[0000] /home/great/zhangyuling_ai_ollama_7b/webui/docker-compose.yml: `version` is obsolete 
NAME           IMAGE                                COMMAND           SERVICE      CREATED          STATUS                    PORTS
zyl-ai-webui   ghcr.io/open-webui/open-webui:main   "bash start.sh"   open-webui   14 minutes ago   Up 14 minutes (healthy)   0.0.0.0:3000->8080/tcp, :::3000->8080/tcp🔗 网络连接:
(Not all processes could be identified, non-owned process infowill not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::3000                 :::*                    LISTEN      -                   🤖 模型状态:
NAME                       ID              SIZE      MODIFIED     
nomic-embed-text:latest    0a109f422b47    274 MB    3 hours ago     
codellama:7b               8fdf8f752f6e    3.8 GB    19 hours ago    🌐 访问测试:
✅ Web服务正常================================================🚀 AI代码助手平台已就绪!
================================================
🌐 访问地址: http://192.168.20.8:3000
🤖 默认模型: codellama:7b
👥 用户限制: 4人并发
💡 功能: 代码生成、调试、多语言支持
================================================
- 使用指南
 
🎯 访问流程
- 打开浏览器访问:http://您的服务器IP:3000
 - 注册账户:点击右上角 “Sign Up” 创建账户
 - 开始使用:在聊天界面输入代码相关问题
功能特性: 
- ✅ 代码生成和补全
 - ✅ 代码调试和解释
 - ✅ 多语言支持(Python, Java, JavaScript等)
 - ✅ 对话历史记录
 - ✅ 用户管理功能
 
🛠️ 管理命令
# 查看状态
docker compose ps# 查看日志
docker compose logs --tail=20# 重启服务
docker compose restart# 停止服务
docker compose down# 更新服务
docker compose pull && docker compose up -d
cd ~/zhangyuling_ai_ollama_7b/webui
创建功能完整的全局管理脚本
cat > ai-manager.sh << 'EOF'
#!/bin/bash# 定义项目目录
PROJECT_DIR="/home/great/zhangyuling_ai_ollama_7b/webui"# 检查项目目录是否存在
if [ ! -d "$PROJECT_DIR" ]; thenecho "❌ 错误:项目目录不存在: $PROJECT_DIR"exit 1
fi# 切换到项目目录
cd "$PROJECT_DIR"show_status() {echo "=== 🤖 AI代码助手平台管理 ==="echo "📍 项目目录: $PROJECT_DIR"echo ""# 获取服务器IPSERVER_IP=$(hostname -I | awk '{print $1}')# 检查服务状态if docker compose ps 2>/dev/null | grep -q "Up"; thenecho "✅ 服务状态: 运行中"echo "🌐 访问地址: http://${SERVER_IP}:3000"elseecho "❌ 服务状态: 停止"fiecho ""echo "📊 资源使用:"echo "   内存: $(free -h | grep Mem | awk '{print $3 "/" $2}')"echo "   磁盘: $(df -h . | tail -1 | awk '{print $4}') 可用"
}case "$1" instatus)show_status;;start)echo "🚀 启动AI代码助手服务..."docker compose up -dsleep 3show_status;;stop)echo "🛑 停止服务..."docker compose downecho "✅ 服务已停止";;restart)echo "🔄 重启服务..."docker compose restartsleep 2show_status;;logs)echo "📋 查看实时日志 (Ctrl+C退出)..."docker compose logs -f;;update)echo "📦 更新服务..."docker compose downdocker compose pulldocker compose up -decho "✅ 服务更新完成";;monitor)echo "📊 实时监控 (Ctrl+C退出)..."watch -n 5 'echo "=== AI平台实时监控 ==="echo "服务状态:"docker compose ps --services 2>/dev/null | while read service; dostatus=$(docker compose ps $service | tail -1 | awk "{print \$4}")echo "  $service: $status"doneecho ""echo "资源使用:"echo "  内存: $(free -h | grep Mem | awk "{print \$3}/\$2}")echo "  连接: $(netstat -an | grep :3000 | grep ESTABLISHED | wc -l) 个活跃用户"';;backup)echo "💾 备份数据..."BACKUP_FILE="ai-backup-$(date +%Y%m%d-%H%M).tar.gz"tar -czf "../$BACKUP_FILE" data/echo "✅ 备份完成: $BACKUP_FILE";;clean)echo "🧹 清理系统..."docker system prune -fecho "✅ 系统清理完成";;help|--help|-h)echo "🤖 AI代码助手平台管理工具"echo ""echo "用法: ai-manager [命令]"echo ""echo "可用命令:"echo "  status    查看服务状态"echo "  start     启动服务"echo "  stop      停止服务"  echo "  restart   重启服务"echo "  logs      查看实时日志"echo "  update    更新服务版本"echo "  monitor   实时监控"echo "  backup    备份用户数据"echo "  clean     清理系统缓存"echo "  help      显示此帮助"echo ""echo "示例:"echo "  ai-manager status    # 查看状态"echo "  ai-manager logs      # 查看日志"echo "  ai-manager restart   # 重启服务";;*)if [ -z "$1" ]; thenshow_statuselseecho "❌ 未知命令: $1"echo "使用 'ai-manager help' 查看可用命令"fi;;
esac
EOF
设置执行权限
chmod +x ai-manager.sh
📋 故障排除
如果遇到问题:
查看详细错误
docker compose logs --tail=30# 重启服务
docker compose restart# 检查Ollama连接
curl http://localhost:11434/api/tags#检查ollama配置文件
cat /etc/systemd/system/ollama.service.d/limit.conf
修改后生效
sudo systemctl daemon-reload
sudo systemctl restart ollamasystemctl status  ollama
6. 折腾了一轮,发现7b的模型我的机器根本带不动!
跟踪耗时
sudo strace -e trace=file,openat,read,write,mmap -T ollama run qwen:4b "test" 2>&1 | grep -v ENOENT | awk '{if ($NF > 0.1) print}'
如果不是独显,性能会大幅度下降,将cpu调整到性能模式,会有所提升,但是依旧是十几秒
great@great-PC:~/zhangyuling_ai_ollama_7b/lib/ollama$ time ollama run  --verbose   llama3.2:1b  "test"
Can I help you with something else?total duration:       11.854634385s
load duration:        99.137755ms
prompt eval count:    26 token(s)
prompt eval duration: 1.354319757s
prompt eval rate:     19.20 tokens/s
eval count:           9 token(s)
eval duration:        10.40069241s
eval rate:            0.87 tokens/sreal    0m11.919s
user    0m0.014s
sys     0m0.007s
