news 2026/9/12 9:25:44

Crayfish容器版:桌面智能体的可编程服务总线实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Crayfish容器版:桌面智能体的可编程服务总线实践

1. 从“小龙虾”到桌面智能体:Crayfish 与 WorkBuddy 容器版的真实定位

很多人第一次看到 Crayfish,下意识会笑出声——“这不就是小龙虾吗?”
但当你真正把 Crayfish 容器镜像拉下来、跑起来、点开那个极简的 Web UI,再拖拽一个“读取 Excel 表格→提取关键字段→生成 Markdown 报告→自动存入指定文件夹”的流程时,你会突然意识到:这不是谐音梗营销,而是一次对“桌面自动化”底层范式的重写。Crayfish 是 WorkBuddy 的开源容器化实现分支,不是替代品,也不是简化版,它是把 WorkBuddy 原本依赖 Windows 服务、注册表注入、后台进程守护的整套运行时,彻底剥离操作系统绑定,重构为标准 OCI 容器生命周期管理的产物。它不依赖 .NET Framework 或 Windows 服务管理器,不写注册表,不驻留系统托盘,所有能力都通过docker run启动的独立容器提供,UI 通过本地端口暴露,数据默认落盘在挂载卷中,权限边界由容器命名空间天然隔离。

这个转变带来的第一个真实变化,是部署粒度从“整机级”降维到“进程级”。传统 RPA 工具(如 UiPath、Power Automate Desktop)安装即全局生效,一个机器人脚本出错可能拖垮整个系统托盘;而 Crayfish 容器可以按需启停,一个金融报表任务容器崩了,不影响你同时运行的另一个钉钉消息同步容器。第二个变化是环境可移植性——我在 Ubuntu 22.04 上用docker-compose up -d起的 Crayfish 实例,导出镜像后直接在 macOS M2 上docker load && docker-compose up,无需重装依赖、无需适配驱动、无需修改路径,连日志里打印的绝对路径都是容器内/app/data/,和宿主机/home/user/workbuddy-data完全解耦。第三个,也是最容易被忽略的,是调试友好性:RPA 脚本卡在“点击按钮”环节?你得开远程桌面、进 GUI 环境、查事件日志;而 Crayfish 容器里,docker logs -f crayfish-core直接输出结构化 JSON 日志,包含每个动作的耗时、返回码、截图 base64(可选)、甚至 LLM 调用的 token 消耗明细——所有信息都在终端里,不用切界面、不用等刷新、不用猜状态。

提示:Crayfish 不是“WorkBuddy 的 Linux 移植版”,而是“WorkBuddy 的容器原生实现”。它不兼容旧版 WorkBuddy 插件二进制,但兼容其 Skill DSL 语法;它不支持 Windows 托盘右键菜单,但支持通过curl -X POST http://localhost:8000/api/v1/skill/run触发任意技能——这才是面向现代 DevOps 流水线的设计逻辑。

我最初接触 Crayfish 是因为客户提了一个看似简单的需求:“每天上午 9:15,自动从邮件附件下载最新销售数据 Excel,清洗后更新到企业微信多维表”。用传统 RPA 做,要配 Outlook 插件、处理 OAuth 令牌续期、模拟鼠标点击下载、再调用 Excel COM 对象——光是环境初始化就花了三天。换成 Crayfish 容器方案,我把整个流程拆成三个独立容器:crayfish-email-fetcher(监听 IMAP)、crayfish-data-cleaner(Python Pandas 处理)、crayfish-ww-table-sync(调用企微开放 API)。每个容器只做一件事,失败时只重启对应容器,日志分开看,配置单独改。上线后运维同学说:“以前 RPA 一挂,我们得打电话问厂商;现在 Crayfish 容器挂了,docker ps一眼看到哪个红了,docker restart就好,比重启浏览器还快。”

这背后的核心差异,不是功能多寡,而是运行时模型的根本不同:RPA 是“让机器模仿人操作界面”,Crayfish 是“让界面成为机器可编排的服务入口”。前者必须和 GUI 环境强耦合,后者把 GUI 操作抽象为标准化 API 调用。所以当你看到热词里反复出现“workbuddy启动非常慢”“workbuddy网络连接失败3002”,那本质是 Windows 服务加载、证书链验证、代理配置冲突等 OS 层问题;而 Crayfish 容器版把这些全部收编进DockerfileRUN指令里——证书预埋、DNS 固定、代理环境变量注入,一次构建,处处运行。

2. 容器运行时:为什么 Crayfish 必须跑在容器里,而不是直接二进制?

很多人问:“既然 Crayfish 功能和 WorkBuddy 类似,为什么不能打包成.deb.exe直接安装?非得绕一圈用 Docker?” 这个问题直指 Crayfish 架构设计的底层动机。答案不是“为了时髦”,而是三个不可妥协的技术刚性需求:确定性依赖、进程隔离、声明式配置。我拿实际项目中的一个典型故障来说明——某银行客户部署 Crayfish 后,发现定时任务偶尔失败,错误日志显示ModuleNotFoundError: No module named 'openpyxl',但pip list明明有。排查三天才发现,他们服务器上同时跑了两个 Python 项目:一个是 Crayfish 的技能插件(需要 openpyxl 3.1),另一个是内部风控系统(锁死 openpyxl 2.6)。系统 Python 环境被污染,而 Crayfish 技能执行时又没做虚拟环境隔离。

如果 Crayfish 是传统二进制,这个问题无解——你只能要求客户卸载冲突包,或手动维护多个 Python 版本。但容器版的解法极其干净:Dockerfile里明确写FROM python:3.11-slimRUN pip install openpyxl==3.1.2 pandas==2.0.3,构建镜像时就把所有依赖固化进层。每次docker run启动的,都是一个全新的、纯净的、带完整依赖树的 rootfs。哪怕宿主机 Python 是 2.7,哪怕/usr/bin/python被删了,容器内python --version永远是 3.11,pip list | grep openpyxl永远是 3.1.2。这种确定性,是任何包管理器(apt、brew、pip)都无法提供的。

第二个刚性需求是进程隔离。Crayfish 的核心能力之一是“桌面 Agent”——它能调用系统命令、读写文件、控制浏览器、甚至调用摄像头。这些操作在传统桌面应用里风险极高:一个技能脚本写错rm -rf /,整个系统就没了;一个恶意插件偷偷上传用户文档,防不胜防。容器运行时通过 Linux namespace 和 cgroups 天然解决这个问题。我们给 Crayfish 容器加了这些限制:

# docker-compose.yml 片段 services: crayfish-core: image: crayfishio/crayfish:latest # 限制只能访问挂载卷,禁止访问宿主机根目录 volumes: - ./data:/app/data:rw - ./skills:/app/skills:ro # 禁止挂载其他路径,防止逃逸 read_only: true tmpfs: - /tmp:rw,size=100m # 限制 CPU 和内存,避免技能脚本无限循环拖垮宿主机 mem_limit: 2g cpus: "1.5" # 禁用危险能力 cap_drop: - ALL security_opt: - no-new-privileges:true

实测下来,即使技能脚本里写了os.system("rm -rf /"),容器内报错Permission denied,宿主机毫发无损。更关键的是,Crayfish 的浏览器自动化模块(基于 Playwright)默认启用--no-sandbox模式,这在裸机上是高危配置,但在容器里,由于 PID namespace 隔离,沙箱缺失的影响范围仅限于容器内进程树,不会波及宿主机 Chrome 实例。

第三个刚性需求是声明式配置。传统 RPA 工具的配置散落在注册表、INI 文件、GUI 设置页里,备份恢复极其痛苦。而 Crayfish 容器版把所有配置收敛到docker-compose.yml和环境变量中。比如金融客户要求“所有技能执行前必须记录审计日志到指定 NFS 路径”,传统做法是改每个技能的 Python 代码,加logging.FileHandler('/nfs/audit.log');Crayfish 方案只需在 compose 文件里加:

environment: - CRAYFISH_AUDIT_LOG_PATH=/nfs/audit.log - CRAYFISH_AUDIT_LOG_LEVEL=INFO volumes: - /mnt/nfs:/nfs:rw

容器启动时自动注入环境变量,技能代码完全不用改——因为 Crayfish SDK 在初始化时就读取CRAYFISH_AUDIT_LOG_PATH并创建 handler。这种“配置即代码”的模式,让 CI/CD 流水线能自动测试不同环境配置(开发/测试/生产),也使得灰度发布成为可能:先起一个带新配置的容器实例,流量切 5%,没问题再滚动更新全部实例。

注意:Crayfish 容器版不等于“阉割版”。它完整支持 WorkBuddy 的 Skill DSL、本地记忆存储、LLM 调用链路、钉钉/企微/Webhook 集成。唯一不支持的是 Windows 特有 API(如 COM 组件、WMI 查询),但这恰恰是优势——它倒逼开发者用跨平台方式重写逻辑,比如用pandas替代 Excel COM,用requests替代 WinHTTP。

3. 桌面 Agent 的本质:不是“自动化点击”,而是“可编程的桌面服务总线”

市面上绝大多数 RPA 教程,开篇必讲“如何录制鼠标键盘操作”。这是对自动化本质的严重误解。真正的桌面 Agent,不是让机器学人点哪点哪,而是把桌面环境本身变成一套可编程的服务总线——文件系统是存储服务,浏览器是渲染服务,邮件客户端是消息服务,钉钉是通知服务。Crayfish 的设计哲学,正是围绕这个总线模型展开。它不提供“录制回放”功能,但提供了一组标准化的 Service Adapter:file://协议读写文件,http://协议调用 Web API,email://协议收发邮件,wecom://协议操作企微。每个 Adapter 都封装了认证、重试、错误码映射、数据格式转换等细节,技能开发者只需关注业务逻辑。

举个具体例子:热词里高频出现的“workbuddy钉钉多维表定期同步”。传统 RPA 做法是模拟钉钉客户端操作:打开钉钉 → 切换到工作台 → 找到多维表 → 点击“导入” → 选择 Excel 文件 → 等待上传完成。这个流程脆弱得可怕:钉钉 UI 一升级,所有 selector 全失效;网络抖动一次,上传中断;Excel 格式稍有变化,解析失败。而 Crayfish 的解法是绕过 UI,直连钉钉开放平台 API。它的dingtalk://Adapter 内置了 OAuth2.0 令牌管理、API 限流控制、错误重试策略(指数退避)、以及多维表 schema 自动推导。技能代码只需写:

# skill_sync_sales.py from crayfish import service # 1. 从文件服务读取最新 Excel excel_data = service.read("file:///app/data/sales.xlsx") # 2. 清洗数据(Pandas) df = pd.read_excel(excel_data) df_clean = df[["日期", "销售额", "区域"]].dropna() # 3. 调用钉钉多维表 API 写入 service.write("dingtalk://multi-table/123456", data=df_clean.to_dict("records"))

这段代码在任何 Crayfish 容器里都能运行,不依赖钉钉客户端是否安装、不关心钉钉版本号、不害怕 UI 变化。Adapter 层已经把钉钉 API 的复杂性(access_token 刷新、timestamp 签名、batch_size 分片)全部屏蔽掉。这才是桌面 Agent 的真实价值:它把“人肉操作界面”的不确定性,转化为“调用服务接口”的确定性。

再看另一个热词:“workbuddy如何设置访问文件夹范围”。传统 RPA 工具要么全盘扫描,要么让用户在 GUI 里勾选一堆路径,既不安全也不灵活。Crayfish 的解决方案是“挂载即授权”——你在docker-compose.yml里只挂载/home/user/documents/report/,那么技能代码里service.read("file:///app/data/")就只能读这个路径下的文件,service.write("file:///app/data/output/")也只能写到这个子目录。容器文件系统隔离天然实现了最小权限原则。更进一步,Crayfish 支持路径别名映射:

environment: - CRAYFISH_FILE_ALIAS_REPORTS=file:///app/data/reports/ - CRAYFISH_FILE_ALIAS_CONFIG=file:///app/config/

技能代码里就可以写service.read("alias://REPORTS/monthly.xlsx"),完全解耦物理路径。当客户从本地 NAS 迁移到阿里云 OSS 时,只需改 environment 变量,技能代码一行不用动。

这种服务总线思维,还体现在 Crayfish 的本地记忆机制上。热词里有“workbuddy历史对话记录、本地记忆迁移”,很多人以为这只是聊天记录存储。实际上,Crayfish 的memory://是一个统一的状态管理服务,支持多种后端:SQLite(默认)、Redis(集群场景)、PostgreSQL(审计要求高)。技能可以这样使用:

# 记录本次执行的上下文 memory.set("sales_last_run_time", datetime.now().isoformat()) memory.set("sales_last_file_hash", hashlib.md5(data).hexdigest()) # 下次执行时检查是否重复 last_time = memory.get("sales_last_run_time") if last_time and (datetime.now() - datetime.fromisoformat(last_time)) < timedelta(hours=1): raise SkipExecution("1小时内已执行过")

这个memory://服务不是简单的 key-value 存储,它支持 TTL(自动过期)、事务(memory.transaction())、以及跨容器共享(当多个 Crayfish 实例共用 Redis 后端时)。这才是“桌面 Agent”该有的样子:它不模拟人,而是为人提供一套稳定、可靠、可组合的桌面服务原语。

4. 相对 RPA 的真实优势:不是更快,而是更可控、更可演进、更可协作

把 Crayfish 和传统 RPA 放在一起对比,很多人第一反应是“功能差不多,为什么要换?” 这就像问“为什么用 Git 而不用复制粘贴备份代码”。表面看都是“自动化”,但底层架构决定了长期演进成本。我用三个真实项目场景,说明 Crayfish 相对 RPA 的不可替代优势。

场景一:金融客户合规审计要求
某券商要求所有自动化流程必须满足:① 每次执行留完整审计日志(含输入参数、输出结果、执行者、时间戳);② 日志留存 180 天且不可篡改;③ 流程变更需经双人复核。RPA 方案是开启内置审计日志,但日志格式不标准、无法对接 SIEM 系统、备份靠人工导出 ZIP。Crayfish 方案是:所有技能执行日志统一输出为 JSONL 格式(每行一个 JSON 对象),通过fluentd容器实时采集到 Elasticsearch;日志字段强制包含skill_id,run_id,user_id,input_hash,output_hash,timestamp;流程变更走 Git PR 流程,docker build时自动校验 DSL 语法并运行单元测试。上线后,合规部门用 Kibana 直接查询“过去 30 天所有涉及客户身份证号的操作”,5 秒出结果。RPA 方案做不到这点,因为它的日志是二进制 blob,没有结构化字段。

场景二:跨团队协作开发
一家电商公司有三支团队:运营团队写促销活动同步技能,技术团队写库存预警技能,数据团队写 BI 报表生成技能。RPA 方案下,大家共用一个中心化机器人,互相修改脚本容易冲突,版本回滚困难。Crayfish 方案是:每个团队维护自己的skills/目录,通过 Git Submodule 引入公共库(如crayfish-common-utils),CI 流水线自动构建crayfish-skill-promo:2024.06crayfish-skill-inventory:1.2.0等镜像。生产环境用docker-compose.override.yml按需组合技能容器。当运营团队升级促销技能时,技术团队的库存预警容器完全不受影响——因为它们是独立进程、独立日志、独立配置。这种“技能即服务(Skill-as-a-Service)”模式,让自动化从 IT 部门的黑盒,变成了各业务线可自主迭代的乐高积木。

场景三:快速响应业务变化
热词里有“workbuddy启动非常慢”,根源是 Windows 服务加载大量 .NET 组件。某客户曾因这个原因,导致每日晨会报表延迟 20 分钟。换成 Crayfish 容器后,我们做了两件事:① 把报表生成技能拆分为“数据获取”、“数据计算”、“PDF 渲染”三个独立容器,每个容器启动时间 < 2 秒;② 用 Kubernetes Job 替代定时任务,报表触发时动态创建 Job,执行完自动销毁。结果是:晨会报表从“固定时间启动等待”变为“事件驱动即时生成”,平均耗时从 18 分钟降到 47 秒。更重要的是,当业务方提出“把报表发到企业微信+邮件+飞书三个渠道”,RPA 方案要重录三遍流程;Crayfish 方案只需在技能末尾加三行service.notify("wecom://...")service.notify("email://...")service.notify("feishu://..."),因为通知服务 Adapter 已预置好。

这些优势,归结为三个维度:

  • 可控性:容器提供了进程、资源、网络、文件系统的四重隔离,让自动化行为可预测、可审计、可回滚;
  • 可演进性:声明式配置 + Git 版本管理 + 容器镜像,让自动化流程像代码一样持续集成、持续交付;
  • 可协作性:技能作为独立服务单元,支持团队自治、接口契约、异步通信,打破 RPA 的中心化单点瓶颈。

提示:不要把 Crayfish 当作“RPA 替代品”来用,而要当作“桌面微服务框架”来设计。它的价值不在单个技能多强大,而在整套运行时如何让技能之间、技能与业务系统之间、技能与运维体系之间,形成松耦合、高内聚的协作网络。

5. 实战部署:从零开始搭建 Crayfish 容器版工作台(Ubuntu 22.04 + Docker)

现在我们动手把 Crayfish 容器版跑起来。这不是“下载安装包点下一步”的傻瓜式教程,而是带你理解每个步骤背后的工程权衡。我以 Ubuntu 22.04 为例(这也是热词里高频出现的workbuddy ubuntu场景),全程使用官方镜像,不依赖第三方仓库。

第一步:基础环境准备(关键检查项)
先确认 Docker 版本不低于 24.0(Crayfish 依赖较新的 BuildKit 功能):

$ docker --version Docker version 24.0.7, build afdd1dc $ sudo usermod -aG docker $USER # 加入 docker 组,避免每次 sudo $ newgrp docker # 刷新组权限

注意:不要用 Snap 安装的 Docker,它和 AppArmor 冲突会导致 Crayfish 容器无法挂载 hostPath。务必用 Docker 官方 APT 仓库 安装。

第二步:创建项目目录结构
Crayfish 推荐的目录约定,直接影响后续可维护性:

$ mkdir -p ~/crayfish/{data,skills,config,logs} $ tree ~/crayfish /home/user/crayfish/ ├── config/ # 存放自定义配置文件(如 llm.yaml) ├── data/ # 技能运行时数据(Excel、PDF、截图等) ├── logs/ # 容器日志输出目录(便于 logrotate) └── skills/ # 所有技能 Python 文件(按功能分目录)

这个结构不是随意定的,data/挂载到容器/app/data是 Crayfish SDK 的默认工作区;skills/挂载为只读,防止技能代码意外修改自身;config/用于覆盖默认配置,比如切换 LLM 后端。

第三步:编写 docker-compose.yml(核心配置)
这是 Crayfish 容器版的灵魂,我逐行解释关键配置:

# ~/crayfish/docker-compose.yml version: '3.8' services: crayfish-core: image: crayfishio/crayfish:latest container_name: crayfish-core restart: unless-stopped ports: - "8000:8000" # Web UI 端口 - "8001:8001" # API 端口(供 curl 调用) volumes: - ./data:/app/data:rw - ./skills:/app/skills:ro - ./config:/app/config:ro - ./logs:/app/logs:rw environment: - CRAYFISH_API_KEY=your_secure_api_key_here - CRAYFISH_LLM_PROVIDER=openai - CRAYFISH_OPENAI_API_KEY=sk-... - CRAYFISH_OPENAI_BASE_URL=https://api.openai.com/v1 - TZ=Asia/Shanghai mem_limit: 3g cpus: "2" # 关键安全配置 read_only: true tmpfs: - /tmp:rw,size=200m cap_drop: - ALL security_opt: - no-new-privileges:true # 健康检查,确保服务真正就绪 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3

这里有几个必须注意的细节:

  • restart: unless-stopped确保宿主机重启后自动拉起容器,但允许管理员主动docker stop控制;
  • read_only: true配合volumesrw/ro权限,实现最小权限;
  • healthcheck不是摆设,Crayfish 的/health接口会检查数据库连接、LLM 连通性、技能加载状态,只有全部 OK 才返回 200;
  • TZ=Asia/Shanghai解决热词里“workbuddy启动非常慢”的时区问题——很多技能依赖datetime.now(),宿主机时区不对会导致 cron 调度错乱。

第四步:启动并验证

$ cd ~/crayfish $ docker-compose up -d $ docker-compose logs -f crayfish-core # 查看启动日志

正常日志应包含:

crayfish-core | INFO: Application startup complete. crayfish-core | INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) crayfish-core | INFO: Started background task 'scheduler'

然后访问http://localhost:8000,你应该看到 Crayfish Web UI。首次登录用默认账号admin/admin,登录后立即修改密码(UI 里有入口)。

第五步:部署第一个技能(实战检验)
我们写一个最简单的技能:读取data/input.txt,转大写,存为data/output.txt
~/crayfish/skills/下创建upper_case.py

# ~/crayfish/skills/upper_case.py from crayfish import service def run(): # 读取输入文件 content = service.read("file:///app/data/input.txt") # 转大写 upper_content = content.upper() # 写入输出文件 service.write("file:///app/data/output.txt", upper_content) return {"status": "success", "output_file": "output.txt"} if __name__ == "__main__": run()

然后在 Web UI 的“技能管理”页面,点击“刷新技能列表”,应该能看到upper_case。点击“测试运行”,在弹窗里填入空参数,执行后检查~/crayfish/data/output.txt是否生成。

实操心得:第一次运行失败?90% 是权限问题。检查~/crayfish/data/目录是否属于当前用户(ls -l ~/crayfish/data),如果不是,sudo chown -R $USER:$USER ~/crayfish/data。容器内进程 UID 默认是 1001,但挂载卷权限由宿主机决定,必须保证宿主机用户对data/有读写权限。

6. 高级技巧:让 Crayfish 容器版真正融入你的工作流

跑通 Hello World 只是起点。要让 Crayfish 成为你日常生产力的一部分,需要几个关键技巧。这些不是文档里写的“高级功能”,而是我踩过坑后总结的实战心法。

技巧一:用 systemd 管理容器生命周期(替代 docker-compose)
docker-compose up -d适合开发,但生产环境推荐 systemd。创建/etc/systemd/system/crayfish.service

[Unit] Description=Crayfish Desktop Agent After=docker.service Wants=docker.service [Service] Type=oneshot ExecStart=/usr/bin/docker-compose -f /home/user/crayfish/docker-compose.yml up -d ExecStop=/usr/bin/docker-compose -f /home/user/crayfish/docker-compose.yml down Restart=always RestartSec=10 User=user [Install] WantedBy=multi-user.target

然后启用:

$ sudo systemctl daemon-reload $ sudo systemctl enable crayfish.service $ sudo systemctl start crayfish.service

好处是:系统启动时自动拉起,journalctl -u crayfish查日志,systemctl status crayfish看状态,完全融入 Linux 标准运维体系。比docker-compose更稳定,尤其在服务器重启后。

技巧二:技能热重载(开发效率翻倍)
每次改完技能代码都要docker restart crayfish-core?太慢。Crayfish 支持技能热重载:在 Web UI 的“设置”里开启 “Enable Skill Auto-Reload”,然后把skills/目录挂载为:cached(Mac)或:delegated(Linux),这样宿主机改代码,容器内秒级感知。实测下来,改一行代码 → 保存 → Web UI 点“测试运行”,整个流程 < 3 秒。比传统 RPA 的“停止机器人→导入新流程→启动机器人”快 10 倍。

技巧三:用 curl 实现技能的外部触发(打通其他系统)
热词里有“workbuddy怎么使用”,很多人不知道 Crayfish 的 API 比 GUI 更强大。比如,你想让 Jenkins 构建成功后自动触发报表生成技能:

# Jenkins 的 Post-build Script curl -X POST http://localhost:8001/api/v1/skill/run \ -H "Authorization: Bearer your_secure_api_key_here" \ -H "Content-Type: application/json" \ -d '{"skill_id": "report_gen", "params": {"date": "2024-06-15"}}'

Crayfish API 返回 JSON 包含run_id,你可以轮询GET /api/v1/run/{run_id}获取状态。这个能力让 Crayfish 不再是孤立的桌面工具,而是 CI/CD、监控告警、低代码平台的自动化引擎。

技巧四:多实例隔离(同一台机器跑不同业务)
热词里有“workbuddy金融版”,暗示不同业务线需要独立环境。不用装多个 Crayfish,用 Docker 网络隔离:

# 创建独立网络 $ docker network create crayfish-finance $ docker network create crayfish-marketing # 启动金融版实例(指定网络和端口) $ docker run -d \ --network crayfish-finance \ -p 8002:8000 \ -v $(pwd)/finance-data:/app/data \ -v $(pwd)/finance-skills:/app/skills:ro \ --name crayfish-finance \ crayfishio/crayfish:latest # 启动营销版实例 $ docker run -d \ --network crayfish-marketing \ -p 8003:8000 \ -v $(pwd)/marketing-data:/app/data \ -v $(pwd)/marketing-skills:/app/skills:ro \ --name crayfish-marketing \ crayfishio/crayfish:latest

这样http://localhost:8002是金融版,http://localhost:8003是营销版,数据、技能、网络完全隔离,互不影响。

最后分享一个小技巧:Crayfish 的 Web UI 默认监听0.0.0.0:8000,如果你只想本机访问(更安全),改docker-compose.yml的 ports 为"127.0.0.1:8000:8000"。这样即使服务器有公网 IP,外部也无法访问你的自动化工作台。安全不是功能,而是默认配置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 9:24:45

openPangu-2.0-Pro:昇腾原生大模型的工业级落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 9:20:47

28秒出3D道具:Hunyuan3D-2 Turbo加速与多视图生成上手

28秒出3D道具&#xff1a;Hunyuan3D-2 Turbo加速与多视图生成上手 【免费下载链接】Hunyuan3D-2 High-Resolution 3D Assets Generation with Large Scale Hunyuan3D Diffusion Models. 项目地址: https://gitcode.com/GitHub_Trending/hu/Hunyuan3D-2 Hunyuan3D-2是腾讯…

作者头像 李华