macOS 12.7.6部署Ollama+Dify避坑指南
macOS 12.7.6部署Ollama+Dify避坑指南
- 一、背景
- 二、核心组件说明
- 三、详细部署步骤
- 1. 关闭SIP(系统完整性保护)
- 2. 安装基础组件
- 2.1 Docker Desktop
- 2.2 Docker-compose
- 2.3 Ollama
- 3. 配置Ollama
- 3.1 启动服务
- 3.2 下载模型
- 4. 配置Dify
- 4.1 关键配置修改
- `docker/.env`
- `docker/docker-compose.yaml`
- 4.2 启动Dify服务
- 4.3 连接Ollama
- 5. 离线环境处理
- 5.1 镜像打包
- 5.2 目标机器导入
- 四、部署验证
一、背景
Ollama是一个本地化大语言模型运行框架,支持在个人电脑上运行各类开源AI模型(如Llama、Mistral等)。Dify则是一个可视化AI应用开发平台,通过图形界面快速构建AI工作流。本文记录在macOS 12.7.6系统下部署两者的避坑指南。
二、核心组件说明
组件 | 作用 | 必装原因 |
---|---|---|
Ollama | 本地模型运行引擎 | 提供LLM推理能力 |
Dify | AI应用开发平台 | 可视化编排AI工作流 |
Docker | 容器化环境 | 解决依赖冲突问题 |
Docker-compose | 容器编排工具 | 管理多容器应用 |
三、详细部署步骤
1. 关闭SIP(系统完整性保护)
参考链接: macOS开启或关闭SIP
为什么需要关闭:
macOS的SIP会阻止对系统目录(如/usr/local/bin
)的修改,而Dify需要在此目录更新关键组件。
操作步骤:
- 重启Mac,立即长按 Command ⌘ + R 进入恢复模式
- 顶部菜单栏选择 实用工具 > 终端
- 执行关闭命令:
csrutil disable # 禁用SIP reboot # 重启系统
- 重启后验证状态:
csrutil status # 应显示"System Integrity Protection status: disabled"
⚠️ 安全提示:完成部署后可重新启用SIP(
csrutil enable
),但需确保所有组件运行稳定
2. 安装基础组件
2.1 Docker Desktop
下载地址:官方下载链接
版本要求:必须使用 2.1.0.5(40693) 版本,新版Docker与macOS 12存在兼容性问题
安装后检查:
docker --version # 应输出 Docker version 19.03.5, build 633a0ea
2.2 Docker-compose
下载地址:v2.38.2版本
安装命令:
# 替换系统旧版本
sudo cp ~/Downloads/docker-compose-darwin-x86_64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker-compose version # 应输出 Docker Compose version v2.38.2
2.3 Ollama
下载地址:官方DMG安装包
安装方式:双击安装包完成安装
3. 配置Ollama
3.1 启动服务
# 允许网络访问(默认只能本地访问)
export OLLAMA_HOST="0.0.0.0:8000"# 启动服务(会常驻后台)
ollama serve &
验证服务:浏览器访问 http://localhost:8000
应返回Ollama版本信息
3.2 下载模型
# 下载嵌入模型(用于文本向量化)
ollama pull nomic-embed-text:latest# 下载对话模型(7B参数版本)
ollama pull deepseek-r1:7b
模型管理技巧:
# 查看已下载模型
ollama list# 模型保存路径
ls ~/.ollama/models # 所有模型存储在此目录
💡 离线环境部署:
- 在网络环境执行
ollama pull
下载模型- 拷贝
~/.ollama/models
到目标机器- 设置环境变量:
export OLLAMA_MODELS=/path/to/models
4. 配置Dify
4.1 关键配置修改
为什么需要修改:
默认配置针对Linux优化,在macOS上需要调整资源限制和权限设置
以下文件发生修改
- docker/
- .env
- docker-compose.yaml
docker/.env
--- OLD/.env
+++ NEW/.env
@@ -1035,16 +1035,17 @@FORCE_VERIFYING_SIGNATURE=true-PLUGIN_PYTHON_ENV_INIT_TIMEOUT=120
-PLUGIN_MAX_EXECUTION_TIMEOUT=600
-# PIP_MIRROR_URL=https://pypi.tuna.tsinghua.edu.cn/simple
-PIP_MIRROR_URL=
+PLUGIN_PYTHON_ENV_INIT_TIMEOUT=640
+PLUGIN_MAX_EXECUTION_TIMEOUT=2400
+PIP_MIRROR_URL=https://mirrors.aliyun.com/pypi/simple/
+#PIP_MIRROR_URL=# https://github.com/langgenius/dify-plugin-daemon/blob/main/.env.example# Plugin storage type, local aws_s3 tencent_cos azure_blobPLUGIN_STORAGE_TYPE=localPLUGIN_STORAGE_LOCAL_ROOT=/app/storage
-PLUGIN_WORKING_PATH=/app/storage/cwd
+#PLUGIN_WORKING_PATH=/app/storage/cwd
+PLUGIN_WORKING_PATH=/app/cwdPLUGIN_INSTALLED_PATH=pluginPLUGIN_PACKAGE_CACHE_PATH=plugin_packagesPLUGIN_MEDIA_CACHE_PATH=assets
docker/docker-compose.yaml
--- OLD/docker-compose.yaml
+++ NEW/docker-compose.yaml
@@ -451,8 +451,8 @@MARKETPLACE_ENABLED: ${MARKETPLACE_ENABLED:-true}MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai}FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true}
- PLUGIN_PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120}
- PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600}
+ PLUGIN_PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-640}
+ PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-6000}PIP_MIRROR_URL: ${PIP_MIRROR_URL:-}PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local}PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage}
@@ -488,6 +488,11 @@services:# API serviceapi:
+ ulimits:
+ nproc: 65535
+ security_opt:
+ - seccomp:unconfined
+ privileged: trueimage: langgenius/dify-api:1.3.1restart: alwaysenvironment:
@@ -519,6 +524,11 @@worker:image: langgenius/dify-api:1.3.1restart: always
+ ulimits:
+ nproc: 65535
+ security_opt:
+ - seccomp:unconfined
+ privileged: trueenvironment:# Use the shared environment variables.<<: *shared-api-worker-env
@@ -604,6 +614,11 @@# The DifySandboxsandbox:
+ ulimits:
+ nproc: 65535
+ security_opt:
+ - seccomp:unconfined
+ privileged: trueimage: langgenius/dify-sandbox:0.2.11restart: alwaysenvironment:
@@ -628,8 +643,13 @@# plugin daemonplugin_daemon:
+ ulimits:
+ nproc: 65535
+ security_opt:
+ - seccomp:unconfinedimage: langgenius/dify-plugin-daemon:0.0.9-localrestart: always
+ privileged: trueenvironment:# Use the shared environment variables.<<: *shared-api-worker-env
@@ -644,8 +664,8 @@PLUGIN_REMOTE_INSTALLING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003}PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd}FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true}
- PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120}
- PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600}
+ PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-1200}
+ PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-2400}PIP_MIRROR_URL: ${PIP_MIRROR_URL:-}PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local}PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage}
4.2 启动Dify服务
cd dify/docker# 首次启动(后台运行)
docker-compose up -d# 查看日志(排错用)
docker-compose logs -f api
4.3 连接Ollama
在Dify控制台(http://localhost:8000
)配置模型:
API端点: http://host.docker.internal:8000/v1 # 特殊地址指向宿主机
模型名称: deepseek-r1:7b
关键说明:
host.docker.internal
是Docker的保留域名,自动解析到宿主机的IP地址
5. 离线环境处理
5.1 镜像打包
# 导出所有Dify镜像
docker-compose images | awk 'FNR >2 {print $2":"$3}' | sort -u | xargs docker save | gzip > dify-images.tar.gz
5.2 目标机器导入
# 加载Dify镜像
docker load < dify-images.tar.gz
四、部署验证
- 在Dify创建新应用
- 选择 “对话型应用” 模板
- 模型选择
deepseek-r1:7b
- 输入测试问题:“Mac系统有哪些特点?”
- 应获得连贯的技术性回复
最终效果:您现在拥有一个完全本地的AI开发环境,支持:
- 运行开源大语言模型(7B~70B参数)
- 可视化编排AI工作流
- 开发企业级AI应用
- 所有数据100%离线处理
部署完成后,可通过 csrutil enable
重新启用SIP提升系统安全性。