{"id":833,"date":"2026-08-10T00:40:09","date_gmt":"2026-08-09T16:40:09","guid":{"rendered":"https:\/\/book.yuekegu.com\/index.php\/2026\/08\/10\/clawswarm-%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97\/"},"modified":"2026-08-10T00:40:09","modified_gmt":"2026-08-09T16:40:09","slug":"clawswarm-%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97","status":"publish","type":"post","link":"https:\/\/book.yuekegu.com\/index.php\/2026\/08\/10\/clawswarm-%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97\/","title":{"rendered":"ClawSwarm \u90e8\u7f72\u6307\u5357"},"content":{"rendered":"<p># ClawSwarm \u90e8\u7f72\u6307\u5357<\/p>\n<p>ClawSwarm \u662f\u4e00\u4e2a\u5f00\u6e90\u7fa4\u4f53\u667a\u80fd\u534f\u4f5c\u7f16\u6392\u7cfb\u7edf\uff0c\u628a\u591a\u4e2a\u5177\u5907\u4e0d\u540c\u4e13\u957f\u7684 AI Agent \u5f15\u5165\u540c\u4e00\u4e2a\u7fa4\u804a\u8fdb\u884c\u534f\u4f5c\u3002\u9879\u76ee\u57fa\u4e8e Python 3.12+ FastAPI \u540e\u7aef + Vue 3 \u524d\u7aef\uff0c\u901a\u8fc7 Docker \u6216\u624b\u52a8\u65b9\u5f0f\u90e8\u7f72\u3002<\/p>\n<p>&#8211; \u7248\u672c\uff1av1.0.x<br \/>\n&#8211; \u8bb8\u53ef\u8bc1\uff1aGPL-3.0<br \/>\n&#8211; \u9ed8\u8ba4\u8d26\u53f7\uff1aadmin \/ admin123456<\/p>\n<p>&#8212;<\/p>\n<p>## 1. \u9879\u76ee\u6982\u89c8<\/p>\n<p>| \u9879\u76ee | \u8bf4\u660e |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|<br \/>\n| \u6280\u672f\u6808 | Python 3.12+, FastAPI, SQLAlchemy, Uvicorn \/ Vue 3, Vite, TypeScript, Element Plus \/ OpenClaw Plugin (TypeScript) |<br \/>\n| \u9ed8\u8ba4\u7aef\u53e3 | 18080 |<br \/>\n| \u5305\u7ba1\u7406\u5668 | npm (\u524d\u7aef), pip (\u540e\u7aef) |<br \/>\n| \u6784\u5efa\u5de5\u5177 | Vite (\u524d\u7aef), tsup (\u63d2\u4ef6) |<\/p>\n<p>### \u76ee\u5f55\u7ed3\u6784<\/p>\n<p>&#8220;`<br \/>\nClawSwarm\/<br \/>\n\u251c\u2500\u2500 scheduler-server\/      # \u540e\u7aef Python FastAPI \u670d\u52a1<br \/>\n\u2502   \u251c\u2500\u2500 src\/               # API \u8def\u7531\u3001\u6a21\u578b\u3001\u670d\u52a1\u5c42<br \/>\n\u2502   \u251c\u2500\u2500 run_dev.py         # \u672c\u5730\u5f00\u53d1\u542f\u52a8\u811a\u672c<br \/>\n\u2502   \u251c\u2500\u2500 .env.dev           # \u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e<br \/>\n\u2502   \u2514\u2500\u2500 requirements.txt   # Python \u4f9d\u8d56<br \/>\n\u251c\u2500\u2500 web-client\/            # \u524d\u7aef Vue 3 + Vite \u5e94\u7528<br \/>\n\u2502   \u251c\u2500\u2500 src\/               # Vue \u7ec4\u4ef6\u3001\u9875\u9762\u3001\u8def\u7531<br \/>\n\u2502   \u251c\u2500\u2500 vite.config.ts     # Vite \u914d\u7f6e\uff08\u542b API \u4ee3\u7406\uff09<br \/>\n\u2502   \u2514\u2500\u2500 package.json       # Node \u4f9d\u8d56<br \/>\n\u251c\u2500\u2500 channel\/               # OpenClaw \u63d2\u4ef6<br \/>\n\u2502   \u251c\u2500\u2500 src\/               # TypeScript \u6e90\u7801<br \/>\n\u2502   \u251c\u2500\u2500 skills\/            # \u6280\u80fd\u63d0\u793a\u8bcd<br \/>\n\u2502   \u2514\u2500\u2500 openclaw.plugin.json<br \/>\n\u251c\u2500\u2500 Dockerfile             # \u751f\u4ea7\u955c\u50cf\u6784\u5efa<br \/>\n\u251c\u2500\u2500 Dockerfile.base        # \u57fa\u7840\u955c\u50cf\u6784\u5efa<br \/>\n\u2514\u2500\u2500 docker-compose.yml     # Docker Compose \u793a\u4f8b<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## 2. \u73af\u5883\u8981\u6c42<\/p>\n<p>| \u4f9d\u8d56 | \u7248\u672c\u8981\u6c42 |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;&#8212;|<br \/>\n| Python | >= 3.12 |<br \/>\n| Node.js | >= 22.x |<br \/>\n| Docker | 24+\uff08\u5bb9\u5668\u90e8\u7f72\uff09 |<br \/>\n| \u5185\u5b58 | >= 1GB |<br \/>\n| \u78c1\u76d8 | >= 5GB |<\/p>\n<p>&#8212;<\/p>\n<p>## 3. Docker \u90e8\u7f72\uff08\u63a8\u8350\uff09<\/p>\n<p>### \u5feb\u901f\u542f\u52a8\uff08\u4f7f\u7528\u5df2\u53d1\u5e03\u955c\u50cf\uff09<\/p>\n<p>&#8220;`bash<br \/>\ndocker run -d &#8211;name=clawswarm &#8211;restart=always -p 18080:18080 -v ~\/.claw-team:\/opt\/clawswarm 1panel\/clawswarm:latest<br \/>\n&#8220;`<\/p>\n<p>&#8211; \u9ed8\u8ba4\u7aef\u53e3 18080\uff0c\u5982\u9700\u4fee\u6539\u53ef\u6620\u5c04\u5176\u4ed6\u4e3b\u673a\u7aef\u53e3<br \/>\n&#8211; \u6570\u636e\u5377\u6302\u8f7d\u5230 \/opt\/clawswarm\uff0c\u5305\u542b SQLite \u6570\u636e\u5e93\u6587\u4ef6 app.db<br \/>\n&#8211; \u57fa\u7840\u955c\u50cf\u62c9\u53d6\u81ea ghcr.io\/1panel-dev\/clawswarm-base<\/p>\n<p>### \u81ea\u884c\u6784\u5efa\u955c\u50cf<\/p>\n<p>\u6784\u5efa\u57fa\u7840\u955c\u50cf\uff1a<br \/>\n&#8220;`bash<br \/>\ndocker build -t clawswarm-base -f Dockerfile.base .<br \/>\n&#8220;`<\/p>\n<p>\u6784\u5efa\u5b8c\u6574\u5e94\u7528\u955c\u50cf\uff1a<br \/>\n&#8220;`bash<br \/>\ndocker build &#8211;build-arg BASE_IMAGE=clawswarm-base:latest &#8211;build-arg DOCKER_IMAGE_TAG=v1.0.x &#8211;build-arg BUILD_AT=$(date +%Y-%m-%dT%H:%M) &#8211;build-arg GITHUB_COMMIT=$(git rev-parse &#8211;short HEAD) -t clawswarm .<br \/>\n&#8220;`<\/p>\n<p>### Docker Compose<\/p>\n<p>&#8220;`yaml<br \/>\nservices:<br \/>\n  clawswarm:<br \/>\n    image: 1panel\/clawswarm:latest<br \/>\n    ports:<br \/>\n      &#8211; &#8220;18080:18080&#8221;<br \/>\n    volumes:<br \/>\n      &#8211; clawswarm-data:\/opt\/clawswarm<br \/>\n    restart: unless-stopped<\/p>\n<p>volumes:<br \/>\n  clawswarm-data:<br \/>\n&#8220;`<\/p>\n<p>### \u73af\u5883\u53d8\u91cf<\/p>\n<p>| \u53d8\u91cf | \u8bf4\u660e | \u9ed8\u8ba4\u503c |<br \/>\n|&#8212;&#8212;|&#8212;&#8212;|&#8212;&#8212;&#8211;|<br \/>\n| APP_HOST | \u76d1\u542c\u5730\u5740 | 0.0.0.0 |<br \/>\n| APP_PORT | \u670d\u52a1\u7aef\u53e3 | 18080 |<br \/>\n| DATABASE_URL | \u6570\u636e\u5e93\u8fde\u63a5 | sqlite:\/\/\/\/opt\/clawswarm\/app.db |<br \/>\n| DATA_DIR | \u6570\u636e\u76ee\u5f55 | \/opt\/clawswarm |<br \/>\n| WEB_DIST_DIR | \u524d\u7aef\u9759\u6001\u6587\u4ef6\u76ee\u5f55 | \/opt\/clawswarm-web |<br \/>\n| CHANNEL_ALLOW_INSECURE_TLS | \u5141\u8bb8\u4e0d\u5b89\u5168 TLS\uff08\u8054\u8c03\uff09 | 0 |<br \/>\n| LOCAL_AGENT_MOCK_ENABLED | \u542f\u7528\u672c\u5730\u6a21\u62df Agent | 0 |<br \/>\n| DEFAULT_LOGIN_USERNAME | \u9ed8\u8ba4\u7ba1\u7406\u5458\u7528\u6237\u540d | admin |<br \/>\n| DEFAULT_LOGIN_PASSWORD | \u9ed8\u8ba4\u7ba1\u7406\u5458\u5bc6\u7801 | admin123456 |<\/p>\n<p>&#8212;<\/p>\n<p>## 4. \u4e91\u670d\u52a1\u5668\u624b\u52a8\u90e8\u7f72<\/p>\n<p>### \u5b89\u88c5 Python 3.12 + Node.js 22<\/p>\n<p>&#8220;`bash<br \/>\napt update<br \/>\napt install -y python3 python3-pip python3-venv<br \/>\ncurl -fsSL https:\/\/deb.nodesource.com\/setup_22.x | bash &#8211;<br \/>\napt install -y nodejs<br \/>\n&#8220;`<\/p>\n<p>### \u514b\u9686\u3001\u5b89\u88c5\u3001\u6784\u5efa<\/p>\n<p>&#8220;`bash<br \/>\ngit clone https:\/\/github.com\/dajjwwx\/ClawSwarm.git<br \/>\ncd ClawSwarm<\/p>\n<p>cd scheduler-server &#038;&#038; pip install -r requirements.txt &#038;&#038; cd ..<br \/>\ncd web-client &#038;&#038; npm install &#038;&#038; npm run build &#038;&#038; cd ..<br \/>\n&#8220;`<\/p>\n<p>### \u8fd0\u884c\u670d\u52a1<\/p>\n<p>&#8220;`bash<br \/>\ncd scheduler-server<br \/>\nexport WEB_DIST_DIR=\/path\/to\/web-client\/dist<br \/>\npython -m uvicorn src.main:app &#8211;host 0.0.0.0 &#8211;port 18080<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## 5. \u672c\u5730\u5f00\u53d1\u6a21\u5f0f<\/p>\n<p>### \u540e\u7aef\u542f\u52a8<\/p>\n<p>&#8220;`bash<br \/>\ncd scheduler-server &#038;&#038; python run_dev.py<br \/>\n&#8220;`<\/p>\n<p>&#8211; \u9ed8\u8ba4\u8fd0\u884c\u5728 http:\/\/127.0.0.1:8080<br \/>\n&#8211; \u8bfb\u53d6 .env.dev \u914d\u7f6e\u6587\u4ef6<br \/>\n&#8211; SQLite \u6570\u636e\u5e93\u81ea\u52a8\u521b\u5efa\u5728 .\/data\/app.db<br \/>\n&#8211; \u9ed8\u8ba4\u5f00\u542f LOCAL_AGENT_MOCK_ENABLED=1\uff08\u65e0\u9700 OpenClaw \u5373\u53ef\u6d4b\u8bd5\uff09<\/p>\n<p>### \u524d\u7aef\u542f\u52a8<\/p>\n<p>&#8220;`bash<br \/>\ncd web-client<br \/>\nnpm install<br \/>\nnpm run dev<br \/>\n&#8220;`<\/p>\n<p>&#8211; \u9ed8\u8ba4\u8fd0\u884c\u5728 http:\/\/localhost:5173<br \/>\n&#8211; Vite \u81ea\u52a8\u4ee3\u7406 \/api \u548c \/ws \u5230\u540e\u7aef<br \/>\n&#8211; \u5728 web-client\/.env \u4e2d\u8bbe\u7f6e VITE_DEV_API_PROXY_TARGET=http:\/\/127.0.0.1:8080<\/p>\n<p>&#8212;<\/p>\n<p>## 6. OpenClaw \u63d2\u4ef6\u5b89\u88c5<\/p>\n<p>### \u81ea\u52a8\u5b89\u88c5<\/p>\n<p>&#8220;`bash<br \/>\nopenclaw plugins install @1panel-dev\/clawswarm<br \/>\nopenclaw plugins enable clawswarm<br \/>\n&#8220;`<\/p>\n<p>### \u624b\u52a8\u5b89\u88c5\uff08\u9650\u6d41\u65f6\u5907\u7528\uff09<\/p>\n<p>&#8220;`bash<br \/>\ncd \/tmp<br \/>\nPKG=$(npm pack @1panel-dev\/clawswarm)<br \/>\nmkdir -p \/tmp\/clawswarm-pkg<br \/>\ncd \/tmp\/clawswarm-pkg<br \/>\ntar xzf \/tmp\/$PKG<br \/>\ncp -r \/tmp\/clawswarm-pkg\/package \/home\/node\/.openclaw\/extensions\/clawswarm<br \/>\ncd \/home\/node\/.openclaw\/extensions\/clawswarm<br \/>\nnpm install &#8211;omit=dev<br \/>\n&#8220;`<\/p>\n<p>### \u914d\u7f6e\u5bf9\u63a5<\/p>\n<p>1. \u5728 ClawSwarm Web \u754c\u9762\u8fdb\u5165 OpenClaw \u9875\u9762<br \/>\n2. \u521b\u5efa\u6216\u7f16\u8f91\u5b9e\u4f8b<br \/>\n3. \u586b\u5199 OpenClaw URL \u548c Gateway Token<br \/>\n4. \u4fdd\u5b58\u540e\uff0c\u590d\u5236\u751f\u6210\u7684 OpenClaw JSON \u914d\u7f6e<br \/>\n5. \u5c06\u6b64\u914d\u7f6e\u5408\u5e76\u5230 OpenClaw \u7684 ~\/.openclaw\/openclaw.json<br \/>\n6. \u91cd\u542f Gateway\uff1aopenclaw gateway restart<\/p>\n<p>&#8212;<\/p>\n<p>## 7. GitHub Actions CI\/CD<\/p>\n<p>### \u57fa\u7840\u955c\u50cf<br \/>\nWorkflow build-and-push-base.yml\uff0c\u63a8\u9001\u5230 ghcr.io\/1panel-dev\/clawswarm-base\uff0c\u57fa\u4e8e python:3.12-slim\u3002<\/p>\n<p>### \u5e94\u7528\u955c\u50cf<br \/>\nWorkflow build-and-push.yml\uff0c\u652f\u6301 linux\/amd64 \u548c linux\/arm64 \u591a\u67b6\u6784\uff0c\u5206 testing \u548c production \u4e24\u4e2a\u8d26\u53f7\u901a\u9053\u3002<\/p>\n<p>### Channel \u63d2\u4ef6\u53d1\u5e03<br \/>\nWorkflow publish-channel.yml\uff0c\u4ece beta \u5206\u652f\u53d1\u5e03 beta \u6807\u7b7e\uff0c\u4ece channel \u5206\u652f\u53d1\u5e03 latest \u6807\u7b7e\uff08\u9700\u624b\u52a8\u786e\u8ba4\uff09\u3002\u81ea\u52a8\u6821\u9a8c package.json \u548c openclaw.plugin.json \u7248\u672c\u4e00\u81f4\u6027\u3002<\/p>\n<p>&#8212;<\/p>\n<p>## 8. \u5e38\u89c1\u95ee\u9898<\/p>\n<p>**SQLite \u6570\u636e\u5e93\u4f4d\u7f6e**\uff1a\u6570\u636e\u9ed8\u8ba4\u5b58\u50a8\u5728\u6302\u8f7d\u5377\u7684 \/opt\/clawswarm\/app.db\uff0c\u5b9a\u671f\u5907\u4efd\u6b64\u6587\u4ef6\u3002<\/p>\n<p>**\u4fee\u6539\u9ed8\u8ba4\u7aef\u53e3**\uff1a\u901a\u8fc7\u73af\u5883\u53d8\u91cf APP_PORT \u4fee\u6539\uff0c\u5982 APP_PORT=8080\u3002<\/p>\n<p>**\u5fd8\u8bb0\u7ba1\u7406\u5458\u5bc6\u7801**\uff1a\u5220\u9664 app.db \u540e\u91cd\u542f\u670d\u52a1\u4f1a\u81ea\u52a8\u91cd\u5efa\uff0c\u6062\u590d\u9ed8\u8ba4\u5bc6\u7801 admin123456\u3002<\/p>\n<p>**CORS \u95ee\u9898\uff08\u672c\u5730\u5f00\u53d1\uff09**\uff1a\u540e\u7aef\u5df2\u914d\u7f6e\u5141\u8bb8 localhost:5173 \u548c 127.0.0.1:5173 \u7684\u8de8\u57df\u8bf7\u6c42\u3002<\/p>\n<p>**OpenClaw \u63d2\u4ef6\u4e0d\u663e\u793a**\uff1a\u786e\u8ba4 openclaw.plugin.json \u4e2d\u5b58\u5728 channelConfigs.clawswarm \u914d\u7f6e\u6bb5\u3002<\/p>\n<p>&#8212;<\/p>\n<p>> \u66f4\u591a\u4fe1\u606f\u8bf7\u8bbf\u95ee\u9879\u76ee\u4ed3\u5e93\uff1ahttps:\/\/github.com\/dajjwwx\/ClawSwarm<\/p>\n","protected":false},"excerpt":{"rendered":"<p># ClawSwarm \u90e8\u7f72\u6307\u5357 ClawSwarm \u662f\u4e00\u4e2a\u5f00\u6e90\u7fa4\u4f53\u667a\u80fd\u534f\u4f5c\u7f16\u6392\u7cfb\u7edf [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-833","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts\/833","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/comments?post=833"}],"version-history":[{"count":0,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts\/833\/revisions"}],"wp:attachment":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/media?parent=833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/categories?post=833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/tags?post=833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}