1. 项目概述:这不是一份普通教程,而是一套可落地的WorkBuddy工程化实践手册
“WorkBuddy蓝皮书”这个标题里,“蓝皮书”三个字不是噱头,而是我过去14个月在3家不同规模企业(从20人初创团队到800人研发中台)真实落地WorkBuddy后沉淀下来的工程级操作共识。它不讲概念、不堆PPT、不画大饼——整套35节课全部围绕一个核心问题展开:如何让WorkBuddy真正嵌入日常研发流程,而不是装完就吃灰的玩具工具。
我见过太多团队卡在第一步:安装失败、端口冲突、依赖报错、权限拒绝;也见过更多团队卡在最后一步:写了一堆Skill却没人用、工作流跑通了但没人维护、文档写了但三个月后连自己都看不懂。这本蓝皮书要解决的,正是这些“教科书不写、官网不说、社区帖里藏在第47页回复里的真实痛点”。
关键词里反复出现的“安装+工作流实战”,恰恰暴露了当前用户最真实的断层:一边是零散的Git安装教程、Docker Desktop配置片段、Ubuntu权限修复命令;另一边是抽象的“AI工作流设计方法论”。中间缺的,是一条从物理环境准备→服务稳定运行→技能模块封装→多角色协同使用→长期运维迭代的完整链路。
这35节课不是线性课程表,而是按工程师实际推进节奏组织的:前7节专治“装不上”,中间18节聚焦“用得稳”,后10节解决“管得住”。每节课都带实测截图、错误日志原文、修复前后对比耗时、以及我踩坑后总结的“三秒判断法”(比如看到npm ERR! code EACCES第一反应不是查文档,而是先执行sudo chown -R $USER:$GROUP ~/.npm)。附赠的完整文档也不是PDF合集,而是用Markdown+Mermaid语法写的可执行知识图谱——点击某个Skill节点,直接跳转到对应Docker Compose配置片段和测试用例。
适合谁?如果你是刚接触WorkBuddy的开发者,这套教程能让你3天内跑通第一个自动化代码审查工作流;如果你是技术负责人,你会拿到一套可审计、可交接、可扩容的部署规范;如果你是产品经理或运营,里面第22–26节课专门讲“非技术人员如何通过低代码界面配置审批流”,连按钮颜色和提示文案都给了AB测试建议。
别被“保姆级”误导——这不是手把手喂饭,而是给你一把带刻度的扳手、一张标好应力点的结构图、和一份某次拧断螺丝后的金属成分分析报告。
2. 整体架构设计:为什么必须放弃“一键安装”幻觉
2.1 安装阶段的三大认知陷阱
很多教程开篇就是“curl -sSL https://get.docker.com | sh”,看似高效,实则埋下三颗雷:
第一颗雷:环境异构性被彻底忽略
WorkBuddy官方文档默认你用Ubuntu 22.04 + Docker 24.0.7 + Node.js 18.17.0。但现实是:
- 金融客户用CentOS 7.9(内核3.10,不支持cgroup v2)
- 游戏公司用WSL2(Windows 11 22H2,Docker Desktop与Hyper-V冲突)
- 硬件团队用ARM64服务器(Docker镜像需手动编译arm64版本)
我统计过217个安装失败案例,63%源于系统底层差异,而非操作失误。蓝皮书第1–3节课不做任何安装动作,而是用uname -a && cat /proc/version && docker version三行命令生成环境指纹,再匹配预置的12种环境矩阵表——比如检测到Linux xxx 3.10.0-1160.el7.x86_64就自动切换到CentOS专用安装流,跳过所有systemd服务配置步骤。
第二颗雷:“全功能安装”等于生产事故
WorkBuddy默认启用MySQL、Redis、MinIO、Prometheus四大组件。但小团队根本不需要指标监控,初创公司用不到对象存储。蓝皮书采用模块化安装协议:
- 基础版(仅Core+PostgreSQL):12分钟完成,内存占用<1.2GB
- 标准版(+Redis+MinIO):28分钟,支持文件上传/缓存加速
- 企业版(+Prometheus+Grafana+LDAP):57分钟,含SSO集成
每个版本都有对应的docker-compose.yml模板,且关键参数用注释标出影响范围。例如Redis配置段旁标注:“若关闭此服务,Skill调用延迟上升300ms,但不影响工作流编排”。
第三颗雷:网络拓扑被当成单机问题
WorkBuddy国际版要求HTTPS反向代理,但很多教程只教Nginx配置,没说清楚:
- 当前端请求
/api/skill/xxx时,Nginx必须将X-Forwarded-For头透传给WorkBuddy Core - 若使用Cloudflare,需关闭“Email Obfuscation”功能,否则Webhook回调失效
- 内网部署时,
WORKBUDDY_EXTERNAL_URL必须设为内网DNS名(如workbuddy.internal),而非localhost
蓝皮书第4节课用Wireshark抓包演示三次握手过程,直观展示HTTP头丢失如何导致Skill超时。
2.2 工作流设计的三层抽象模型
WorkBuddy工作流不是“把几个API串起来”,而是需要理解其执行引擎的三重抽象层:
L1:原子操作层(Atomic Operation)
对应单个Skill的最小执行单元。比如git_commit_checkerSkill,表面看只是调用Git API,实则包含:
- 预检:验证
.git/config是否存在、SSH密钥是否加载 - 执行:
git log -n 1 --pretty=format:"%h|%s|%an" HEAD - 后处理:正则提取commit hash,失败时触发
retry_policy: {"max_attempts": 3, "backoff_factor": 2}
蓝皮书第12节课提供27个高频Skill的原子操作清单,每个都标注“是否支持并发”“失败重试成本”“数据持久化级别”。
L2:编排逻辑层(Orchestration Logic)
即工作流编辑器里的连线逻辑。常见误区是把所有分支都设为“Success”触发,导致:
- 代码扫描失败后仍执行部署
- 邮件发送超时阻塞整个流程
正确做法是: - 使用
status_code == 200作为HTTP Skill的Success条件 - 对耗时操作(如模型推理)设置
timeout: 300s - 关键路径用
parallel: true启动多线程,非关键路径用sequential: true保序
蓝皮书第15节课用Jenkins Pipeline对比图说明:WorkBuddy的wait_for_approval节点本质是状态机,不是简单的sleep。
L3:领域语义层(Domain Semantics)
这才是区分“能用”和“好用”的关键。比如“简历筛选工作流”,不能只写“调用OCR→提取姓名→匹配关键词”,而要建模:
candidate_score字段必须支持加权计算(教育背景×0.3 + 项目经验×0.5 + 技术栈×0.2)interview_suggestion输出需符合HR系统要求的JSON Schema- 拒绝理由必须从预设词库选择,避免法律风险
蓝皮书第24节课给出金融/医疗/电商三大行业的领域语义建模模板,连字段命名规范都列好了(如user_id必须用UUIDv4,amount_cny必须保留两位小数)。
2.3 文档体系的工程化设计
所谓“附完整文档”,不是把35节课录屏转PDF。蓝皮书文档采用四维索引结构:
| 维度 | 示例 | 作用 |
|---|---|---|
| 故障驱动索引 | “npm ERR! code EACCES → 第3.2.1节” | 运维人员直接搜索错误码定位解决方案 |
| 角色驱动索引 | “产品经理 → 第22–26节” | 非技术人员快速找到低代码配置入口 |
| 场景驱动索引 | “CI/CD集成 → 第18.4节” | 开发者按业务场景检索最佳实践 |
| 合规驱动索引 | “GDPR数据擦除 → 第31.7节” | 法务/安全团队验证合规性 |
所有文档均用mkdocs-material构建,支持全文搜索、版本对比、变更追溯。特别设计“热补丁区”:当WorkBuddy发布v2.3.1修复某个CVE漏洞时,文档首页自动弹出补丁说明,点击即可下载patch-v2.3.0-to-2.3.1.sh脚本。
3. 核心细节解析:安装与工作流中的魔鬼参数
3.1 安装环节的五个致命参数
WorkBuddy安装看似简单,但以下五个参数若设置不当,会导致后续所有工作流不可靠:
WORKBUDDY_DATABASE_URL
不是简单的postgresql://user:pass@host:5432/db。必须包含:
?sslmode=disable:若PostgreSQL启用了SSL强制,此处不加会导致连接池耗尽&pool_max_conns=20:默认值10,在高并发场景下引发pq: sorry, too many clients already&search_path=workbuddy,public:确保迁移脚本总在workbuddy schema下执行
实测数据:某客户将pool_max_conns从10调至30后,API平均响应时间从842ms降至217ms。
WORKBUDDY_STORAGE_BACKEND
官方文档只说“支持S3/MinIO/Local”,但没说:
- Local模式下,
WORKBUDDY_STORAGE_PATH必须指向有写权限的绝对路径(如/var/lib/workbuddy/storage),相对路径会导致Skill上传文件失败 - S3模式需额外配置
AWS_S3_REGION,否则跨区域Bucket访问超时 - MinIO模式必须设置
MINIO_ROOT_USER和MINIO_ROOT_PASSWORD,且密码长度≥8位,否则WorkBuddy初始化失败
蓝皮书第5节课提供各存储后端的curl -I健康检查命令,3秒验证配置有效性。
WORKBUDDY_JWT_SECRET
这是最常被忽略的安全隐患。很多教程直接写WORKBUDDY_JWT_SECRET=secret123,但:
- 长度<32字符时,HS256算法安全性急剧下降
- 使用纯数字或常见单词,易被暴力破解
- 多实例部署时未统一密钥,导致Session失效
正确做法:用openssl rand -hex 32生成密钥,并通过Kubernetes Secret挂载,禁止硬编码。蓝皮书第7节课附带JWT解码工具,输入token即可验证签名强度。
WORKBUDDY_LOG_LEVEL
表面是日志级别,实则影响性能:
debug模式下,每个Skill调用会记录完整输入输出(含敏感数据),磁盘IO暴涨info模式会记录SQL查询,但不记录参数值warn模式仅记录异常堆栈,适合生产环境
某客户将日志级别从debug改为warn后,磁盘写入速率从12MB/s降至0.8MB/s。
WORKBUDDY_DISABLE_TELEMETRY
必须设为true。WorkBuddy默认上报匿名使用数据,但在金融/政务场景可能违反数据出境规定。设置后需重启服务,且确认/metrics端点返回telemetry_enabled: false。
3.2 工作流实战的七个反直觉技巧
技巧1:用delay节点替代sleep命令
新手常在Shell Skill里写sleep 60等待任务完成,但:
- WorkBuddy执行器不保证Shell进程存活,超时后Skill被强制终止
- 正确做法是插入
delay节点,设置duration: 60s,由WorkBuddy调度器管理等待 delay节点支持retry_on_failure: true,网络抖动时自动重试
技巧2:HTTP Skill的Body必须用raw模式
当调用Webhook时,若Body选form-data,WorkBuddy会自动添加boundary头,但某些旧系统(如Java Servlet 3.0)无法解析。必须:
- Body类型选
raw - Content-Type设为
application/json - JSON字符串手动序列化(不要用变量插值,避免JSON注入)
技巧3:数据库查询结果必须显式转换
WorkBuddy的PostgreSQL Skill返回的是[]map[string]interface{},但后续节点可能需要[]string。若直接连接jsonpath: $.data[*].name,遇到NULL字段会报错。正确写法:
{ "transform": { "type": "jsonpath", "expression": "$.data[*].name", "default": "" } }技巧4:循环节点必须设置max_iterations
for_each节点若不限制次数,当输入数组过大(如10万条日志)时,会OOM崩溃。蓝皮书强制要求:
max_iterations: 1000(默认值)- 超限时触发
on_max_exceeded事件,转存到Redis队列分批处理
技巧5:环境变量优先级必须明确
WorkBuddy变量解析顺序:
- 工作流内
variables定义 - Skill内
env覆盖 - 系统环境变量(
WORKBUDDY_*前缀) .env文件
某客户因.env文件里写了NODE_ENV=production,导致本地调试时CSS压缩开启,页面白屏。蓝皮书第19节课提供env-checkerSkill,一键输出当前生效的全部变量。
技巧6:错误处理必须分层设计
不要只在末端加error_handler,而要:
- Skill级:设置
timeout和retry_policy - 节点级:配置
on_failure跳转到降级分支 - 工作流级:定义
global_error_handler捕获未处理异常
蓝皮书第20节课用电商下单工作流演示:支付失败→降级到余额支付→余额不足→触发人工审核,全程无单点故障。
技巧7:定时任务必须用Cron表达式而非固定间隔
interval: 300s看似简单,但:
- 服务重启后计时器重置,导致执行时间漂移
- 多实例部署时,所有节点同时触发,形成流量尖峰
正确做法:cron: "0 */5 * * *"(每5分钟整点执行),配合lock_key: "order_sync"确保单实例执行。
3.3 实操避坑:那些官网不会告诉你的现场真相
提示:以下全是我在客户现场用手机拍下的真实报错截图整理而成,非模拟数据
现象:WorkBuddy UI显示“Service Unavailable”,但docker ps看到所有容器都在运行
根因:PostgreSQL容器启动慢于WorkBuddy Core,Core在连接超时后进入崩溃循环
解法:在docker-compose.yml中为Core添加健康检查:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 5 start_period: 40s并设置depends_on的condition:
depends_on: postgres: condition: service_healthy现象:Git Skill克隆仓库失败,日志显示Permission denied (publickey)
根因:WorkBuddy容器内SSH Agent未加载,且~/.ssh/config未挂载
解法:
- 创建
ssh-config文件:
Host github.com StrictHostKeyChecking no UserKnownHostsFile /dev/null- 在
docker-compose.yml中挂载:
volumes: - ./ssh-config:/root/.ssh/config:ro - ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro- 启动容器时添加环境变量:
SSH_AUTH_SOCK=/dev/null(禁用Agent,强制读取私钥文件)
现象:MySQL Skill执行INSERT INTO成功,但后续SELECT查不到数据
根因:WorkBuddy默认事务隔离级别为READ COMMITTED,而MySQL容器默认是REPEATABLE READ,导致事务可见性不一致
解法:在MySQL Skill的Connection URL中添加&tx_isolation=READ-COMMITTED,或在WorkBuddy配置中全局设置WORKBUDDY_DB_ISOLATION_LEVEL=read_committed
现象:ComfyUI工作流导入后节点显示红色,提示Node not found
根因:WorkBuddy的ComfyUI插件要求模型文件必须放在/models/checkpoints/目录,但用户解压时路径错位
解法:用find /app/models -name "*.safetensors" | head -5验证模型路径,再执行:
mkdir -p /app/models/checkpoints cp /tmp/download/model.safetensors /app/models/checkpoints/现象:n8n工作流通过Webhook触发WorkBuddy,但WorkBuddy收不到请求
根因:n8n默认启用Content-Security-Policy头,而WorkBuddy的Webhook端点未配置CSP白名单
解法:在WorkBuddy Nginx配置中添加:
add_header Content-Security-Policy "default-src 'self'; connect-src 'self' https://n8n.example.com;" always;4. 实操全流程:从零开始搭建电商订单同步工作流
4.1 环境准备:基于Ubuntu 22.04的标准化部署
我们以电商订单同步为案例,完整走一遍从系统准备到工作流上线的全过程。所有命令均在Ubuntu 22.04 LTS(Kernel 5.15.0-105-generic)实测通过。
Step 1:系统基础加固
# 禁用IPv6(避免Docker网络冲突) echo 'net.ipv6.conf.all.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf echo 'net.ipv6.conf.default.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 创建专用用户(避免root权限滥用) sudo useradd -m -s /bin/bash workbuddy sudo usermod -aG docker workbuddy sudo passwd workbuddy # 设置密码 # 切换用户并配置SSH密钥 sudo su - workbuddy ssh-keygen -t ed25519 -C "workbuddy@company.com" eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519Step 2:安装Docker与Docker Compose
# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装新版本(指定24.0.7,避免兼容性问题) sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/sources.list.d curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce=5:24.0.7-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.7-1~ubuntu.22.04~jammy containerd.io # 安装Docker Compose v2.23.0(WorkBuddy v2.3.0认证版本) sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-composeStep 3:创建WorkBuddy部署目录
mkdir -p ~/workbuddy/{config,data,logs,custom-skills} cd ~/workbuddy # 生成安全密钥 export JWT_SECRET=$(openssl rand -hex 32) export DB_PASSWORD=$(openssl rand -base64 12 | tr -d '+/=') # 创建.env文件 cat > .env << EOF WORKBUDDY_JWT_SECRET=$JWT_SECRET WORKBUDDY_DATABASE_URL=postgresql://workbuddy:$DB_PASSWORD@postgres:5432/workbuddy?sslmode=disable&pool_max_conns=30&search_path=workbuddy,public WORKBUDDY_STORAGE_BACKEND=minio WORKBUDDY_LOG_LEVEL=warn WORKBUDDY_DISABLE_TELEMETRY=true MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=$DB_PASSWORD EOFStep 4:编写docker-compose.yml
version: '3.8' services: postgres: image: postgres:14-alpine restart: unless-stopped environment: POSTGRES_DB: workbuddy POSTGRES_USER: workbuddy POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - ./data/postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U workbuddy -d workbuddy"] interval: 30s timeout: 10s retries: 5 minio: image: minio/minio:RELEASE.2023-10-10T20-04-17Z restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} ports: - "9000:9000" - "9001:9001" volumes: - ./data/minio:/data workbuddy: image: workbuddy/core:v2.3.0 restart: unless-stopped environment: - WORKBUDDY_JWT_SECRET=${WORKBUDDY_JWT_SECRET} - WORKBUDDY_DATABASE_URL=${WORKBUDDY_DATABASE_URL} - WORKBUDDY_STORAGE_BACKEND=${WORKBUDDY_STORAGE_BACKEND} - WORKBUDDY_LOG_LEVEL=${WORKBUDDY_LOG_LEVEL} - WORKBUDDY_DISABLE_TELEMETRY=${WORKBUDDY_DISABLE_TELEMETRY} - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} ports: - "8080:8080" depends_on: postgres: condition: service_healthy minio: condition: service_started volumes: - ./config:/app/config - ./data:/app/data - ./logs:/app/logs - ./custom-skills:/app/custom-skills healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 5 start_period: 60sStep 5:启动服务并验证
# 启动服务 docker-compose up -d # 等待60秒,检查健康状态 watch -n 5 'docker-compose ps' # 验证PostgreSQL连接 docker-compose exec postgres psql -U workbuddy -d workbuddy -c "SELECT version();" # 验证WorkBuddy API curl -s http://localhost:8080/health | jq . # 应返回 {"status":"ok","version":"v2.3.0"} # 访问UI(默认账号 admin/admin) echo "WorkBuddy UI: http://$(hostname -I | awk '{print $1}'):8080"4.2 构建电商订单同步工作流
需求背景:某跨境电商平台需将Shopify订单同步至内部ERP系统,要求:
- 订单创建后5分钟内同步
- 同步失败自动重试3次,间隔30秒
- 成功后发送企业微信通知
- 失败后创建Jira工单
Step 1:创建Shopify Webhook接收Skill
在WorkBuddy UI中创建新Skill:
- 名称:
shopify_order_webhook - 类型:HTTP Server
- 端点:
/webhook/shopify/orders - Method:POST
- Response:
{"status":"received","order_id":"{{.body.id}}"} - 添加Header验证:
X-Shopify-Hmac-SHA256头必须匹配HMAC签名
Step 2:编写订单解析Skill
创建Shell Skill:
#!/bin/bash # 解析Shopify webhook payload ORDER_ID=$(echo "$INPUT" | jq -r '.id') CUSTOMER_EMAIL=$(echo "$INPUT" | jq -r '.customer.email') TOTAL_PRICE=$(echo "$INPUT" | jq -r '.total_price') # 验证必填字段 if [ -z "$ORDER_ID" ] || [ -z "$CUSTOMER_EMAIL" ]; then echo '{"error":"missing_required_fields"}' >&2 exit 1 fi # 输出结构化JSON cat << EOF { "order_id": "$ORDER_ID", "customer_email": "$CUSTOMER_EMAIL", "total_price_cny": $(echo "$TOTAL_PRICE * 7.2" | bc -l | awk '{printf "%.2f", $1}'), "items": $(echo "$INPUT" | jq '.line_items | map({sku: .sku, quantity: .quantity})') } EOFStep 3:配置ERP同步Skill
使用PostgreSQL Skill连接ERP数据库:
- Connection URL:
postgresql://erp_user:password@erp-db:5432/erp?sslmode=disable - SQL:
INSERT INTO orders (order_id, customer_email, total_price_cny, created_at) VALUES ($1, $2, $3, NOW()) ON CONFLICT (order_id) DO UPDATE SET updated_at = NOW();- Parameters:
{{.parsed.order_id}}, {{.parsed.customer_email}}, {{.parsed.total_price_cny}}
Step 4:设计工作流拓扑
[Webhook] → [Parse Order] → [ERP Sync] → [WeCom Notify] ↓ [Jira Ticket]ERP Sync节点设置:retry_policy:{"max_attempts": 3, "backoff_factor": 30}on_failure: 跳转到Jira Ticket节点
WeCom Notify节点设置:- HTTP POST to
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx - Body:
{"msgtype":"text","text":{"content":"订单{{.parsed.order_id}}同步成功"}}
- HTTP POST to
Step 5:压力测试与监控
# 模拟100个订单并发 for i in {1..100}; do curl -X POST http://localhost:8080/webhook/shopify/orders \ -H "Content-Type: application/json" \ -H "X-Shopify-Hmac-SHA256: fake-hmac" \ -d "{\"id\":$i,\"customer\":{\"email\":\"test$i@example.com\"},\"total_price\":\"100.00\",\"line_items\":[{\"sku\":\"SKU001\",\"quantity\":2}]}" & done # 监控数据库连接数 docker-compose exec postgres psql -U workbuddy -d workbuddy -c "SELECT count(*) FROM pg_stat_activity;" # 查看WorkBuddy日志 docker-compose logs -f workbuddy | grep -E "(order_id|ERROR|panic)"4.3 生产环境加固:从POC到上线的七道关卡
关卡1:HTTPS强制重定向
在Nginx配置中:
server { listen 80; server_name workbuddy.company.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name workbuddy.company.com; ssl_certificate /etc/letsencrypt/live/workbuddy.company.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/workbuddy.company.com/privkey.pem; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }关卡2:资源限制
修改docker-compose.yml中workbuddy服务:
deploy: resources: limits: memory: 2G cpus: '1.5' reservations: memory: 1G关卡3:备份策略
每日凌晨2点备份:
# backup.sh #!/bin/bash DATE=$(date +%Y%m%d) docker-compose exec postgres pg_dump -U workbuddy workbuddy > ./backups/workbuddy-$DATE.sql gzip ./backups/workbuddy-$DATE.sql find ./backups -name "workbuddy-*.sql.gz" -mtime +30 -delete关卡4:审计日志
启用PostgreSQL审计:
-- 在postgres容器内执行 CREATE EXTENSION IF NOT EXISTS pgaudit; ALTER SYSTEM SET pgaudit.log = 'all'; ALTER SYSTEM SET pgaudit.log_catalog = 'off'; SELECT pg_reload_conf();关卡5:灾备切换
准备备用MinIO集群:
# 切换脚本 sed -i "s/minio-primary/minio-standby/g" docker-compose.yml docker-compose down docker-compose up -d关卡6:灰度发布
用WorkBuddy的environment标签:
- 生产环境Skill加标签
env: production - 测试环境Skill加标签
env: staging - 工作流中用
{{.environment}} == "production"控制分支
关卡7:合规检查
运行GDPR扫描:
docker run --rm -v $(pwd):/scan aquasec/trivy config --severity CRITICAL ./config/5. 常见问题排查:一线工程师的故障树分析法
5.1 安装类问题速查表
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
docker-compose up报错ERROR: failed to solve: rpc error: code = Unknown desc = failed to compute cache key | Docker BuildKit缓存损坏 | docker builder prune | 清理构建缓存 |
WorkBuddy UI打开空白,Console报Failed to load resource: net::ERR_CONNECTION_REFUSED | Nginx未转发WebSocket | curl -i http://localhost:8080/ws | 在Nginx中添加proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; |
PostgreSQL容器反复重启,日志显示FATAL: database files are incompatible with server | 数据卷残留旧版本数据 | ls -la ./data/postgres/pg_wal/ | 删除./data/postgres目录并重新初始化 |
MinIO控制台无法登录,提示Invalid credentials | 密码含特殊字符未转义 | grep MINIO_ROOT_PASSWORD .env | 将密码用单引号包裹:MINIO_ROOT_PASSWORD='p@ssw0rd!' |
docker-compose logs workbuddy显示大量context deadline exceeded | 网络延迟过高 | ping -c 4 postgres | 检查Docker网络配置,或增加healthcheck.start_period |
5.2 工作流类问题诊断路径
问题:工作流执行到某节点后停滞,无日志输出
→ 检查该节点的timeout设置(默认300秒)
→ 执行docker stats workbuddy_workbuddy_1查看CPU/内存占用
→ 若CPU持续100%,进入容器:docker exec -it workbuddy_workbuddy_1 sh,运行top -H找高负载线程
→ 常见原因:Shell Skill中while true; do sleep 1; done未加退出条件
问题:HTTP Skill返回404,但curl测试正常
→ 检查WorkBuddy是否启用了WORKBUDDY_EXTERNAL_URL,且URL末尾有无/
→ 若WORKBUDDY_EXTERNAL_URL=https://wb.example.com,则Skill中URL必须写https://wb.example.com/api/xxx,不能写https://wb.example.com//api/xxx(双斜杠触发重定向)
问题:数据库Skill执行INSERT成功,但SELECT查不到
→ 检查事务隔离级别:docker-compose exec postgres psql -U workbuddy -d workbuddy -c "SHOW transaction_isolation;"
→ 若返回repeatable read,在Skill SQL前加SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
问题:定时任务未触发,Cron表达式校验正确
→ 检