{"id":831,"date":"2026-08-09T06:40:47","date_gmt":"2026-08-08T22:40:47","guid":{"rendered":"https:\/\/book.yuekegu.com\/index.php\/2026\/08\/09\/toonflow-%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97-%e5%9b%9b%e7%a7%8d%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f%e8%af%a6%e8%a7%a3\/"},"modified":"2026-08-09T06:40:47","modified_gmt":"2026-08-08T22:40:47","slug":"toonflow-%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97-%e5%9b%9b%e7%a7%8d%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/book.yuekegu.com\/index.php\/2026\/08\/09\/toonflow-%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97-%e5%9b%9b%e7%a7%8d%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f%e8%af%a6%e8%a7%a3\/","title":{"rendered":"Toonflow \u90e8\u7f72\u6307\u5357 \u2014\u2014 \u56db\u79cd\u90e8\u7f72\u65b9\u5f0f\u8be6\u89e3"},"content":{"rendered":"<p>\ufeff# Toonflow \u90e8\u7f72\u6307\u5357<\/p>\n<p>Toonflow \u662f\u4e00\u6b3e AI \u77ed\u5267\u6f2b\u5267\u5de5\u5177\uff0c\u5229\u7528 AI \u6280\u672f\u5c06\u5c0f\u8bf4\u81ea\u52a8\u8f6c\u5316\u4e3a\u5267\u672c\uff0c\u5e76\u7ed3\u5408 AI \u751f\u6210\u7684\u56fe\u7247\u548c\u89c6\u9891\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u77ed\u5267\u521b\u4f5c\u3002<\/p>\n<blockquote>\n<p>\u7248\u672c\uff1av1.1.8 | \u8bb8\u53ef\uff1aApache-2.0 | \u9ed8\u8ba4\u8d26\u53f7\uff1a\\\u0007dmin\\ \/ \\\u0007dmin123\\<\/p>\n<\/blockquote>\n<hr \/>\n<h2 id=\"1\">1. \u9879\u76ee\u6982\u89c8<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u9879\u76ee<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u6e90\u7801\u4ed3\u5e93<\/td>\n<td><a href=\"https:\/\/github.com\/HBAI-Ltd\/Toonflow-app\">https:\/\/github.com\/HBAI-Ltd\/Toonflow-app<\/a><\/td>\n<\/tr>\n<tr>\n<td>\u6280\u672f\u6808<\/td>\n<td>Node.js 24.x, TypeScript 5.x, Express 5, SQLite, Vercel AI SDK, Socket.IO, Electron 40, Sharp<\/td>\n<\/tr>\n<tr>\n<td>\u9ed8\u8ba4\u7aef\u53e3<\/td>\n<td>10588<\/td>\n<\/tr>\n<tr>\n<td>\u5305\u7ba1\u7406\u5668<\/td>\n<td>Yarn v1<\/td>\n<\/tr>\n<tr>\n<td>\u6784\u5efa\u5de5\u5177<\/td>\n<td>esbuild<\/td>\n<\/tr>\n<tr>\n<td>\u524d\u7aef<\/td>\n<td>\u9884\u6784\u5efa\u9759\u6001\u6587\u4ef6 (data\/web\/)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"_1\">\u76ee\u5f55\u7ed3\u6784<\/h3>\n<p><code>Toonflow-app\/<br \/>\n\u251c\u2500\u2500 src\/                  # \u540e\u7aef TypeScript \u6e90\u7801<br \/>\n\u2502   \u251c\u2500\u2500 app.ts            # \u5165\u53e3\u6587\u4ef6<br \/>\n\u2502   \u251c\u2500\u2500 routes\/           # API \u8def\u7531<br \/>\n\u2502   \u2514\u2500\u2500 ...<br \/>\n\u251c\u2500\u2500 scripts\/<br \/>\n\u2502   \u251c\u2500\u2500 main.ts           # Electron \u4e3b\u8fdb\u7a0b<br \/>\n\u2502   \u2514\u2500\u2500 build.ts          # esbuild \u6784\u5efa\u811a\u672c<br \/>\n\u251c\u2500\u2500 data\/<br \/>\n\u2502   \u251c\u2500\u2500 serve\/app.js      # \u7f16\u8bd1\u540e\u7684\u751f\u4ea7\u5165\u53e3<br \/>\n\u2502   \u251c\u2500\u2500 web\/              # \u9884\u6784\u5efa\u524d\u7aef\u9759\u6001\u6587\u4ef6<br \/>\n\u2502   \u251c\u2500\u2500 models\/           # ONNX \u5411\u91cf\u6a21\u578b<br \/>\n\u2502   \u251c\u2500\u2500 skills\/           # AI Agent \u6280\u80fd\u63d0\u793a\u8bcd<br \/>\n\u2502   \u2514\u2500\u2500 vendor\/           # AI \u4f9b\u5e94\u5546\u914d\u7f6e<br \/>\n\u251c\u2500\u2500 Dockerfile<br \/>\n\u251c\u2500\u2500 electron-builder.yml<br \/>\n\u2514\u2500\u2500 package.json<\/code><\/p>\n<hr \/>\n<h2 id=\"2\">2. \u73af\u5883\u8981\u6c42<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u4f9d\u8d56<\/th>\n<th>\u7248\u672c\u8981\u6c42<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Node.js<\/td>\n<td>&gt;= 23.11.1\uff08\u63a8\u8350 24.x\uff09<\/td>\n<\/tr>\n<tr>\n<td>Yarn<\/td>\n<td>v1\uff08Classic\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u5185\u5b58<\/td>\n<td>&gt;= 2GB<\/td>\n<\/tr>\n<tr>\n<td>\u78c1\u76d8<\/td>\n<td>&gt;= 10GB\uff08\u542b\u6a21\u578b\u6587\u4ef6\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"3-docker\">3. Docker \u90e8\u7f72<\/h2>\n<h3 id=\"_2\">\u6784\u5efa\u955c\u50cf<\/h3>\n<p><code>\bash<br \/>\ngit clone https:\/\/github.com\/HBAI-Ltd\/Toonflow-app.git<br \/>\ncd Toonflow-app<br \/>\ndocker build -t toonflow .<\/code><\/p>\n<p>Dockerfile \u57fa\u4e8e \\<br \/>\node:24-bookworm-slim\\\uff0c\u5b89\u88c5 Python3 + make + g++ \u7528\u4e8e\u7f16\u8bd1 native \u6a21\u5757\uff0c\u81ea\u52a8\u5254\u9664 Electron \u4f9d\u8d56\u3002<\/p>\n<h3 id=\"_3\">\u8fd0\u884c\u5bb9\u5668<\/h3>\n<p><code>\bash<br \/>\ndocker run -d --name toonflow -p 10588:10588 -v toonflow-data:\/app\/data --restart unless-stopped toonflow<\/code><\/p>\n<h3 id=\"_4\">\u751f\u4ea7\u6a21\u5f0f<\/h3>\n<p><code>\bash<br \/>\ndocker run -d --name toonflow -p 10588:10588 -e NODE_ENV=prod -v toonflow-data:\/app\/data --restart unless-stopped toonflow yarn start<\/code><\/p>\n<hr \/>\n<h2 id=\"4\">4. \u4e91\u670d\u52a1\u5668\u624b\u52a8\u90e8\u7f72<\/h2>\n<h3 id=\"nodejs-24x-yarn\">\u5b89\u88c5 Node.js 24.x + Yarn<\/h3>\n<p><code>\bash<br \/>\ncurl -fsSL https:\/\/deb.nodesource.com\/setup_24.x | bash -<br \/>\napt-get install -y nodejs<br \/>\ncorepack enable<\/code><\/p>\n<h3 id=\"_5\">\u514b\u9686\u3001\u5b89\u88c5\u3001\u6784\u5efa<\/h3>\n<p><code>\bash<br \/>\ngit clone https:\/\/github.com\/HBAI-Ltd\/Toonflow-app.git<br \/>\ncd Toonflow-app<br \/>\nyarn install<br \/>\nyarn build<\/code><\/p>\n<h3 id=\"pm2\">PM2 \u8fd0\u884c<\/h3>\n<p>\u5b89\u88c5 PM2 \u5e76\u521b\u5efa \\pm2.json\\\uff0c\u7136\u540e\uff1a<\/p>\n<p><code>\bash<br \/>\npm2 start pm2.json<br \/>\npm2 save<br \/>\npm2 startup<\/code><\/p>\n<hr \/>\n<h2 id=\"5-electron\">5. \u684c\u9762\u5e94\u7528\uff08Electron\uff09<\/h2>\n<h3 id=\"_6\">\u6784\u5efa\u5b89\u88c5\u5305<\/h3>\n<p><code>\bash<br \/>\nyarn build<br \/>\nyarn dist:win    # Windows .exe<br \/>\nyarn dist:mac    # macOS .dmg<br \/>\nyarn dist:linux  # Linux .AppImage<\/code><\/p>\n<h3 id=\"_7\">\u5f00\u53d1\u6a21\u5f0f<\/h3>\n<p><code>\bash<br \/>\nyarn dev:gui       # Electron + \u540e\u7aef<br \/>\nyarn dev:gui-vite  # \u5e26 Vite \u70ed\u66f4\u65b0<\/code><\/p>\n<hr \/>\n<h2 id=\"6-github-actions-cicd\">6. GitHub Actions CI\/CD<\/h2>\n<p>\u63a8\u9001 \\main\\\/\\dev\\ \u5206\u652f\u81ea\u52a8\u89e6\u53d1 6 \u5e73\u53f0\u5e76\u884c\u6784\u5efa\u6d4b\u8bd5\u3002\u63a8\u9001 \\\u000b*\\ \u6807\u7b7e\u81ea\u52a8\u53d1\u5e03 Release\uff1a<\/p>\n<p><code>\bash<br \/>\ngit tag v1.1.8<br \/>\ngit push origin v1.1.8<\/code><\/p>\n<hr \/>\n<h2 id=\"7\">7. \u73af\u5883\u53d8\u91cf<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u53d8\u91cf<\/th>\n<th>\u8bf4\u660e<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\\NODE_ENV\\<\/td>\n<td>\\prod\\ \u751f\u4ea7 \/ \\dev\\ \u5f00\u53d1<\/td>\n<td>\\dev\\<\/td>\n<\/tr>\n<tr>\n<td>\\PORT\\<\/td>\n<td>\u670d\u52a1\u7aef\u53e3<\/td>\n<td>\\10588\\<\/td>\n<\/tr>\n<tr>\n<td>\\OSSURL\\<\/td>\n<td>\u9759\u6001\u8d44\u6e90 URL<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>\\VITE_DEV\\<\/td>\n<td>\u8bbe\u4e3a \\1\\ \u542f\u7528 Vite \u70ed\u66f4\u65b0<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"8\">8. \u5e38\u89c1\u95ee\u9898<\/h2>\n<p><strong>better-sqlite3 \u7f16\u8bd1\u5931\u8d25<\/strong>\uff1a\u5b89\u88c5 python3 make g++\u3002<\/p>\n<p><strong>Docker \u6784\u5efa\u6162<\/strong>\uff1a\u4f7f\u7528\u56fd\u5185\u955c\u50cf\u6e90\uff08Dockerfile \u5df2\u914d\u7f6e npmmirror.com\uff09\u3002<\/p>\n<p><strong>\u4fee\u6539\u7aef\u53e3<\/strong>\uff1a\\PORT=8080 yarn start\\\u3002<\/p>\n<p><strong>\u6570\u636e\u5907\u4efd<\/strong>\uff1a\u5b9a\u671f\u5907\u4efd \\data\/\\ \u76ee\u5f55\uff0c\u5c24\u5176\u662f *.sqlite\\ \u6570\u636e\u5e93\u6587\u4ef6\u3002<\/p>\n<hr \/>\n<blockquote>\n<p>\u66f4\u591a\u4fe1\u606f\u8bf7\u8bbf\u95ee <a href=\"https:\/\/github.com\/HBAI-Ltd\/Toonflow-app\">Toonflow GitHub \u4ed3\u5e93<\/a><\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\ufeff# Toonflow \u90e8\u7f72\u6307\u5357 Toonflow \u662f\u4e00\u6b3e AI \u77ed\u5267\u6f2b\u5267\u5de5\u5177\uff0c\u5229\u7528 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[],"class_list":["post-831","post","type-post","status-publish","format-standard","hentry","category-mathai"],"_links":{"self":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts\/831","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=831"}],"version-history":[{"count":0,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/posts\/831\/revisions"}],"wp:attachment":[{"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/media?parent=831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/categories?post=831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/book.yuekegu.com\/index.php\/wp-json\/wp\/v2\/tags?post=831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}