From c781f3482ce0a0094b047f6bcc3bcdff739e1862 Mon Sep 17 00:00:00 2001 From: karuo Date: Tue, 28 Apr 2026 16:10:34 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20=E5=8D=A1=E8=8B=A5AI=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=202026-04-28=2016:10=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E6=80=BB=E7=B4=A2=E5=BC=95=E4=B8=8E=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E3=80=81=E9=87=91=E4=BB=93=E3=80=81=E5=8D=A1=E6=9C=A8=E3=80=81?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5=E4=BD=9C=E5=8F=B0?= =?UTF-8?q?=20|=20=E6=8E=92=E9=99=A4=20>20MB:=2043=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 31 ++++- .../聊天记录管理/fallback/recent_chats_fallback.json | 82 +++++------ 03_卡木(木)/木叶_视频内容/AutoClip | 1 + 03_卡木(木)/木叶_视频内容/本地_LivePortrait | 1 + 03_卡木(木)/木叶_视频内容/视频切片/SKILL.md | 42 ++++++ .../视频切片/切片动效包装/remotion-captioneer | 1 + .../脚本/continuous_register_success_providers.py | 129 ++++++++++++++++++ 运营中枢/工作台/skills_export.json | 2 +- .../工作台/脚本/docker_mac_autostart_stacks.sh | 13 +- 9 files changed, 256 insertions(+), 46 deletions(-) create mode 160000 03_卡木(木)/木叶_视频内容/AutoClip create mode 160000 03_卡木(木)/木叶_视频内容/本地_LivePortrait create mode 160000 03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer create mode 100644 03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/continuous_register_success_providers.py diff --git a/.gitignore b/.gitignore index 3b979387..bfc0b21b 100644 --- a/.gitignore +++ b/.gitignore @@ -105,10 +105,39 @@ _大文件外置/财务管理_data/chat.snapshot_收集.db 01_卡资(金)/金仓_存储备份/服务器管理/scripts/.venv_aliyun_dns/lib/python3.14/site-packages/cryptography/hazmat/bindings/_rust.abi3.so 01_卡资(金)/金仓_存储备份/服务器管理/scripts/.venv_tat/lib/python3.14/site-packages/cryptography/hazmat/bindings/_rust.abi3.so 01_卡资(金)/金仓_存储备份/聊天记录管理/日志/chat_sync_incremental.log +03_卡木(木)/木叶_视频内容/AutoClip/.git/objects/pack/pack-70a3b297686d837b3fcbc11a649a49aba88a5321.pack +03_卡木(木)/木叶_视频内容/AutoClip/data/projects/3eb11260-ae24-4b35-9363-69f9b063f91d/raw/input.mp4 +03_卡木(木)/木叶_视频内容/AutoClip/data/projects/684757e6-ca47-48d1-b5a8-ac8434f0daa9/raw/input.mp4 +03_卡木(木)/木叶_视频内容/本地_LivePortrait/.git/objects/pack/pack-da92ddd64a7b00fb9646d8028157b06db20d432a.pack +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait/base_models/motion_extractor.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait/base_models/spade_generator.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait/base_models/warping_module.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait/landmark.onnx +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/base_models/motion_extractor.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/base_models/spade_generator.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/base_models/warping_module.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/base_models_v1.1/motion_extractor.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/base_models_v1.1/spade_generator.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/base_models_v1.1/warping_module.pth +03_卡木(木)/木叶_视频内容/本地_LivePortrait/pretrained_weights/liveportrait_animals/xpose.pth 03_卡木(木)/木叶_视频内容/视频切片.zip -03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.cache/webpack/remotion-production-4.0.427/a233e9cccba253c3b0157f54cad843b8/0.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.cache/webpack/remotion-production-4.0.427/2d7789a587366d4de1d7934058623192/0.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.cache/webpack/remotion-production-4.0.438/1c992637525ba0d1715ad818fed6b161/0.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.cache/webpack/remotion-production-4.0.438/1c992637525ba0d1715ad818fed6b161/1.pack 03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.remotion/chrome-headless-shell/mac-x64/chrome-headless-shell-mac-x64/chrome-headless-shell 03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/@rspack/binding-darwin-x64/rspack.darwin-x64.node +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/public/v3_inputs_300s/soul146_01.mp4 +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/public/v3_inputs_300s/soul146_06.mp4 +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/public/v3_inputs_300s/soul146_13.mp4 +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/public/v3_inputs_300s/soul146_14.mp4 +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/10秒视频/public/v3_inputs_300s/soul146_28.mp4 +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/assets/fonts/NotoSerifCJKsc-Bold.otf +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/node_modules/.cache/webpack/remotion-development-4.0.438/017aca0a37345bef08c53faacd322597/0.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/node_modules/.cache/webpack/remotion-development-4.0.438/996b7ed73dc3ed0da8f32169d9229738/0.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/node_modules/.cache/webpack/remotion-development-4.0.438/996b7ed73dc3ed0da8f32169d9229738/3.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/node_modules/.cache/webpack/remotion-production-4.0.438/71a4eb822c0d73cd9a7e39902252f155/0.pack +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/node_modules/.remotion/chrome-headless-shell/mac-x64/chrome-headless-shell-mac-x64/chrome-headless-shell +03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer/node_modules/@rspack/binding-darwin-x64/rspack.darwin-x64.node 03_卡木(木)/木果_项目模板/PPT制作/.venv/lib/python3.14/site-packages/playwright/driver/node 03_卡木(木)/木果_项目模板/PPT制作/脚本/.venv_ppt/lib/python3.14/site-packages/playwright/driver/node # === 自动排除结束 === diff --git a/01_卡资(金)/金仓_存储备份/聊天记录管理/fallback/recent_chats_fallback.json b/01_卡资(金)/金仓_存储备份/聊天记录管理/fallback/recent_chats_fallback.json index 8688b438..948cfa67 100644 --- a/01_卡资(金)/金仓_存储备份/聊天记录管理/fallback/recent_chats_fallback.json +++ b/01_卡资(金)/金仓_存储备份/聊天记录管理/fallback/recent_chats_fallback.json @@ -1,7 +1,47 @@ { -"updated": "2026-04-02T11:38:23.145048+00:00", +"updated": "2026-04-28T06:02:00.312488+00:00", "conversations": [ { +"对话ID": "557be7c6-b260-4896-ae6a-947776bfeb28", +"名称": "腾讯云 API 获取", +"项目": "卡若AI", +"首条消息": "给我腾讯云的api。找卡若ai拿", +"创建时间": "2026-04-28T04:58:07.470000+00:00", +"消息数量": 17 +}, +{ +"对话ID": "cedc944e-d5c5-49d2-ba87-a9f25556a59f", +"名称": "Xmind 应用损坏问题", +"项目": "未分类", +"首条消息": "/Applications/Xmind.app 继续处理", +"创建时间": "2026-04-28T04:43:19.759000+00:00", +"消息数量": 2 +}, +{ +"对话ID": "b3db4335-7766-4dc4-a798-4b942094d825", +"名称": "AI skills and Apple color packaging", +"项目": "未分类", +"首条消息": "把卡路AI相应的Skills包括V0 V0以及苹果的配色的相应的 的内容相应的skill帮我 打一个包方便其他的AI很快速的学习 打个压缩包 所有的前端配色还有V0相关的 把苹果配上", +"创建时间": "2026-04-27T09:51:52.902000+00:00", +"消息数量": 35 +}, +{ +"对话ID": "a006fd83-ccf1-4c68-bf0c-3cdda7eac1ce", +"名称": "Open relay configuration and usage documentation", +"项目": "卡若AI", +"首条消息": "下载open relay 并写一个配置和使用文档", +"创建时间": "2026-04-26T01:18:31.853000+00:00", +"消息数量": 13 +}, +{ +"对话ID": "f531fbe6-a4e7-4830-9b63-28cb7a1c4436", +"名称": "Douyin content download", +"项目": "未分类", +"首条消息": "https://www.douyin.com/user/self?from_tab_name=main&modal_id=7600395096903771363&showSubTab=video&showTab=record 下载抖", +"创建时间": "2026-04-25T00:03:17.049000+00:00", +"消息数量": 157 +}, +{ "对话ID": "7674f983-ce97-46a3-826d-f1150b144b6f", "名称": "腾讯云密钥请求", "项目": "卡若AI", @@ -200,46 +240,6 @@ "首条消息": "3.53 复制打开抖音,看看【银雾的作品】海贼王:终于知道伊姆是谁了!# 伊姆 # 鹰眼 #... https://v.douyin.com/HwSEkdWrIec/ j@p.Qk yTy:/ 10/25 到底是谁?", "创建时间": "2026-03-31T09:40:06.370000+00:00", "消息数量": 212 -}, -{ -"对话ID": "7f808b4f-cc1b-4916-8652-ea9890ab1611", -"名称": "V0 account registration", -"项目": "卡若AI", -"首条消息": "https://v0.app/ref/WQ9P9N 卡若ai 注册v0的账号", -"创建时间": "2026-03-31T09:05:00.276000+00:00", -"消息数量": 4 -}, -{ -"对话ID": "22e60e8d-88a7-4cd5-8446-ffd053de574a", -"名称": "生成一张 过引咖啡和mbti神仙团队的海报图片 了解自己/如何找工作/职业规划 再扩展一些核心关键字做出这张海报", -"项目": "开发", -"首条消息": "生成一张 过引咖啡和mbti神仙团队的海报图片 了解自己/如何找工作/职业规划 再扩展一些核心关键字做出这张海报\n你自己设计方案 以过引咖啡为核心logo 送咖啡,分享有收益等,把这个海报做出来", -"创建时间": "2026-03-31T07:30:08.153000+00:00", -"消息数量": 130 -}, -{ -"对话ID": "d99f62df-2e38-4201-a800-04593018b9d9", -"名称": "Ten heavenly stems and five elements classification", -"项目": "工具维护", -"首条消息": "十天干(甲乙丙丁戊己庚辛壬癸) 用五行分类", -"创建时间": "2026-03-31T06:40:57.404000+00:00", -"消息数量": 3 -}, -{ -"对话ID": "caf51e22-9f37-4353-a670-6f529c124bbb", -"名称": "运营-视频切片-流程优化", -"项目": "Soul创业", -"首条消息": "运营-视频切片流程优化\n/Users/karuo/Documents/个人/卡若AI/03_卡木(木)/木叶_视频内容/视频切片/Soul派对成片工作流_从零到片尾.md", -"创建时间": "2026-03-31T06:16:02.697000+00:00", -"消息数量": 147 -}, -{ -"对话ID": "8b43ca17-423f-4e6e-a728-55fd5ace7bb4", -"名称": "硬盘清理", -"项目": "工具维护", -"首条消息": "清理一下硬盘", -"创建时间": "2026-03-31T04:21:13.153000+00:00", -"消息数量": 39 } ] } \ No newline at end of file diff --git a/03_卡木(木)/木叶_视频内容/AutoClip b/03_卡木(木)/木叶_视频内容/AutoClip new file mode 160000 index 00000000..dafae474 --- /dev/null +++ b/03_卡木(木)/木叶_视频内容/AutoClip @@ -0,0 +1 @@ +Subproject commit dafae474fda1d141e2585b254f3446c037ee345a diff --git a/03_卡木(木)/木叶_视频内容/本地_LivePortrait b/03_卡木(木)/木叶_视频内容/本地_LivePortrait new file mode 160000 index 00000000..49784e87 --- /dev/null +++ b/03_卡木(木)/木叶_视频内容/本地_LivePortrait @@ -0,0 +1 @@ +Subproject commit 49784e879821538ecda5c8e4ca0472f4cb6236cf diff --git a/03_卡木(木)/木叶_视频内容/视频切片/SKILL.md b/03_卡木(木)/木叶_视频内容/视频切片/SKILL.md index 279e0e7a..c6b01162 100644 --- a/03_卡木(木)/木叶_视频内容/视频切片/SKILL.md +++ b/03_卡木(木)/木叶_视频内容/视频切片/SKILL.md @@ -249,6 +249,48 @@ python3 脚本/soul_vertical_crop.py --dir "/path/to/clips_enhanced" --suffix "_ **Soul 竖屏场景**:见 `Soul竖屏切片_SKILL.md` 第九节「AI 生成与 LTX 可选集成」。 **约定**:LTX 生成的片段统一经 soul_enhance(封面+字幕+竖屏)输出,与录播成片一致。 +### 即梦(Dreamina)CLI 集成(新增,默认可用) + +当用户明确提到「即梦 / jimeng / Dreamina」时,允许在本技能内直接走 `jimeng`(已映射到 `dreamina`)做图生视频、文生视频或多模态视频生成,再并入 Soul 成片流程。 + +**本机命令约定**: + +```bash +# 统一入口(本机已安装) +jimeng -h + +# 首次登录(会输出 verification_uri 和 user_code) +jimeng login + +# 余额查询 +jimeng user_credit +``` + +**推荐生产链(即梦生成 → Soul 成片)**: + +```bash +# 1) 生成视频(示例:文生视频) +jimeng text2video --prompt "一个人在舞台上讲创业,镜头稳,写实风格" + +# 2) 记录 submit_id 后轮询结果(异步任务) +jimeng query_result --submit_id "" + +# 3) 下载/定位视频文件后,接入既有增强流程 +python3 soul_enhance.py -c clips/ -l highlights.json -t transcript.srt -o clips_enhanced/ +``` + +**对话框回传规则(强制)**: + +1. 每次即梦提交后,必须回传:命令类型、`submit_id`、`gen_status`、是否扣点。 +2. 每次结果查询后,必须回传:成功/失败、失败原因(如有)、视频可用路径或 URL。 +3. 进入成片后,必须回传:输出目录、最终可发布文件名(如 `*_enhanced.mp4`)。 + +**失败兜底**: + +- 若返回 `AigcComplianceConfirmationRequired`,提示用户先去即梦网页完成一次授权,再重试同命令。 +- 若队列慢,先停止长轮询,改为短轮询(2~5 秒间隔)并持续回传状态。 +- 若即梦不可用,回退 LTX 或原录播切片链路,不中断产出。 + --- ## 📹 通用视频处理 diff --git a/03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer b/03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer new file mode 160000 index 00000000..400f22b3 --- /dev/null +++ b/03_卡木(木)/木叶_视频内容/视频切片/切片动效包装/remotion-captioneer @@ -0,0 +1 @@ +Subproject commit 400f22b3194f308d30ffc76515a3c9be64e3540e diff --git a/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/continuous_register_success_providers.py b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/continuous_register_success_providers.py new file mode 100644 index 00000000..a9c57610 --- /dev/null +++ b/03_卡木(木)/木根_逆向分析/全网AI自动注册/脚本/continuous_register_success_providers.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +""" +持续注册(已成功平台优先)守护脚本 + +目标: +1) 自动识别 accounts.db 中“已成功拿到 API Key”的 provider; +2) 周期性执行 import-accounts + check + sync-site-mongo; +3) 持续把可用 Key 同步到 karuo_site.gateways,供网站实时读取。 +""" + +from __future__ import annotations + +import os +import signal +import sqlite3 +import subprocess +import sys +import time +from datetime import datetime +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +ACCOUNTS_DB = SCRIPT_DIR / "accounts.db" +KEY_POOL_MANAGER = SCRIPT_DIR / "key_pool_manager.py" +SITE_ENV_LOCAL_DEFAULT = Path("/Users/karuo/Documents/开发/3、自营项目/卡若ai网站/site/.env.local") + +STOP = False + + +def _sig_handler(_sig, _frame): + global STOP + STOP = True + print("[success-loop] 收到退出信号,将在本轮结束后退出", flush=True) + + +def load_site_env(path: Path) -> None: + if not path.is_file(): + return + for line in path.read_text(encoding="utf-8").splitlines(): + s = line.strip() + if not s or s.startswith("#") or "=" not in s: + continue + k, v = s.split("=", 1) + k = k.strip() + v = v.strip().strip('"').strip("'") + if k and v and k not in os.environ: + os.environ[k] = v + + +def successful_providers() -> list[str]: + if not ACCOUNTS_DB.exists(): + return [] + with sqlite3.connect(str(ACCOUNTS_DB)) as conn: + rows = conn.execute( + """ + SELECT provider + FROM accounts + WHERE api_key IS NOT NULL AND trim(api_key) <> '' + GROUP BY provider + ORDER BY provider + """ + ).fetchall() + return [str(r[0]) for r in rows if r and r[0]] + + +def run_cmd(args: list[str], extra_env: dict[str, str] | None = None) -> int: + env = os.environ.copy() + if extra_env: + env.update(extra_env) + print(f"[success-loop] >> {' '.join(args)}", flush=True) + p = subprocess.run(args, cwd=str(SCRIPT_DIR), env=env) + return int(p.returncode or 0) + + +def one_round() -> None: + providers = successful_providers() + if providers: + print(f"[success-loop] 已成功平台: {', '.join(providers)}", flush=True) + else: + print("[success-loop] 尚无成功平台,继续执行导入+同步以等待新增", flush=True) + + # 兼容当前 key_pool_manager 版本:走健康检查 + 自动补池 + 同步。 + run_cmd([sys.executable, str(KEY_POOL_MANAGER), "check"]) + # 若历史成功平台包含 cerebras,则尝试自动补池;其它平台由外部注册流程补充到 accounts.db 后再导入。 + if "cerebras" in providers: + run_cmd([sys.executable, str(KEY_POOL_MANAGER), "auto-fill", "-n", "1"]) + run_cmd([sys.executable, str(KEY_POOL_MANAGER), "sync-site-mongo"]) + run_cmd([sys.executable, str(KEY_POOL_MANAGER), "status"]) + + +def main() -> None: + signal.signal(signal.SIGINT, _sig_handler) + signal.signal(signal.SIGTERM, _sig_handler) + + site_env = Path(os.environ.get("KARUO_SITE_ENV_LOCAL", str(SITE_ENV_LOCAL_DEFAULT))) + load_site_env(site_env) + + interval = int(os.environ.get("KARUO_SUCCESS_LOOP_INTERVAL_SEC", "600") or "600") + max_rounds = int(os.environ.get("KARUO_SUCCESS_LOOP_MAX_ROUNDS", "0") or "0") + trust = os.environ.get("KARUO_POOL_IMPORT_TRUST_PROVIDERS", "gemini").strip() + + os.environ["KARUO_POOL_IMPORT_TRUST_PROVIDERS"] = trust + + print( + f"[success-loop] 启动 interval={interval}s max_rounds={max_rounds or '∞'} trust={trust}", + flush=True, + ) + + i = 0 + while not STOP: + i += 1 + if max_rounds and i > max_rounds: + print(f"[success-loop] 达到 MAX_ROUNDS={max_rounds},退出", flush=True) + break + print(f"\n[success-loop] ===== round {i} @ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} =====", flush=True) + try: + one_round() + except Exception as e: + print(f"[success-loop] round {i} 异常: {e}", flush=True) + for _ in range(interval): + if STOP: + break + time.sleep(1) + + print("[success-loop] 已停止", flush=True) + + +if __name__ == "__main__": + main() diff --git a/运营中枢/工作台/skills_export.json b/运营中枢/工作台/skills_export.json index b850d421..5895e2ea 100644 --- a/运营中枢/工作台/skills_export.json +++ b/运营中枢/工作台/skills_export.json @@ -169,7 +169,7 @@ "group": "水", "triggers": "整理文件、外置硬盘", "oneLiner": "文件分类、去重、归档", - "updated": "2026-03-14T10:10:54.709Z" + "updated": "2026-04-25T10:26:02.792Z" }, { "id": "W02", diff --git a/运营中枢/工作台/脚本/docker_mac_autostart_stacks.sh b/运营中枢/工作台/脚本/docker_mac_autostart_stacks.sh index c2be80e1..fa62a1eb 100755 --- a/运营中枢/工作台/脚本/docker_mac_autostart_stacks.sh +++ b/运营中枢/工作台/脚本/docker_mac_autostart_stacks.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Mac 本机:Docker Desktop 登录后兜底——等待引擎就绪后按依赖顺序 docker start。 +# Mac 本机:Docker Desktop 登录后兜底——仅用 open -a Docker,避免 AppleEvent 超时。 # 与 compose 中 restart: always 叠加;策略「引擎已起但容器没落」时补一刀。 set -euo pipefail export PATH="/usr/local/bin:/opt/homebrew/bin:$PATH" @@ -19,8 +19,12 @@ wait_docker() { } if ! wait_docker 120; then - log "Docker 引擎 120s 内未就绪,跳过(请打开 Docker Desktop 或勾选登录时启动)" - exit 0 + log "引擎未就绪,尝试 open -a Docker 再等待..." + open -a Docker >/dev/null 2>&1 || true + if ! wait_docker 180; then + log "Docker 引擎仍未就绪,跳过(请检查 Docker Desktop)" + exit 0 + fi fi log "Docker 就绪,按序启动容器…" @@ -33,16 +37,19 @@ for c in \ datacenter_mysql \ cunkebao-redis \ cunkebao-mysql \ + website-cliproxyapi \ website-shensheshou \ website-wanzhi-web \ website-n8n \ website-douyin-api \ website-feishu-toolbox \ website-karuo-site \ + website-karuo-key-maintainer \ website-openclaw-gateway \ cunkebao-server \ cunkebao-web \ touchkebao-web \ + wantui \ workphone-sdk \ workphone-website \ portainer