当前位置: 首页 > news >正文

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推理能力
DifyAI应用开发平台可视化编排AI工作流
Docker容器化环境解决依赖冲突问题
Docker-compose容器编排工具管理多容器应用

三、详细部署步骤

1. 关闭SIP(系统完整性保护)

参考链接: macOS开启或关闭SIP

为什么需要关闭
macOS的SIP会阻止对系统目录(如/usr/local/bin)的修改,而Dify需要在此目录更新关键组件。

操作步骤

  1. 重启Mac,立即长按 Command ⌘ + R 进入恢复模式
  2. 顶部菜单栏选择 实用工具 > 终端
  3. 执行关闭命令:
    csrutil disable  # 禁用SIP
    reboot          # 重启系统
    
  4. 重启后验证状态:
    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  # 所有模型存储在此目录

💡 离线环境部署

  1. 在网络环境执行 ollama pull 下载模型
  2. 拷贝 ~/.ollama/models 到目标机器
  3. 设置环境变量: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

四、部署验证

  1. 在Dify创建新应用
  2. 选择 “对话型应用” 模板
  3. 模型选择 deepseek-r1:7b
  4. 输入测试问题:“Mac系统有哪些特点?”
  5. 应获得连贯的技术性回复

最终效果:您现在拥有一个完全本地的AI开发环境,支持:

  • 运行开源大语言模型(7B~70B参数)
  • 可视化编排AI工作流
  • 开发企业级AI应用
  • 所有数据100%离线处理

部署完成后,可通过 csrutil enable 重新启用SIP提升系统安全性。

http://www.dtcms.com/a/283829.html

相关文章:

  • 集群聊天服务器各个类进行详解
  • LAMP迁移LNMP Nginx多站点配置全流程
  • 大型语言模型(LLM)在网络安全中最具商业价值的应用场景(Grok3 回答 DeepSearch模式)
  • Java-75 深入浅出 RPC Dubbo Java SPI机制详解:从JDK到Dubbo的插件式扩展
  • 新版本flutter(3.32.7) android 端集成百度地图sdk
  • 网络编程7.17
  • cors跨域资源共享
  • Python 网络爬虫 —— 代理服务器
  • 阿里云-通义灵码:隐私保护机制—为数据安全筑起铜墙铁壁
  • Web3.0 实战项目、简历打造、精准投递+面试准备
  • MongoDB 与MySQL 及es的区别
  • 黑客知识-攻击
  • 数据仓库分层经典架构:ODS、DWD、DWS
  • 安卓 GoFasting(间歇性断食)v1.03.35.0708
  • python-字典、集合、序列切片、字符串操作(笔记)
  • cdh6.3.2的hive使用apache paimon格式只能创建不能写报错的问题
  • Thymeleaf 表单绑定与验证详解
  • Rabbitmq direct 模式与 finout区别
  • Apache Ignite 的 Pages Writes Throttling(页面写入节流)
  • C++ - 仿 RabbitMQ 实现消息队列--C++11 异步操作实现线程池
  • InfluxDB 3与Apache Parquet:打造高性能时序数据存储与分析解决方案
  • Apache DolphinScheduler介绍与部署
  • UE5 Nanite使用
  • 下班倒计时
  • 链路聚合实训
  • 管家婆价格折扣跟踪管理:查询、新增、修改、删除
  • JAVA中的Map集合
  • 【01背包】P1466 [USACO2.2] 集合 Subset Sums
  • 华为云容器产品分析
  • HTML表格基础