From 6affffdf70a31760fe30ce0096aab057fb687ca4 Mon Sep 17 00:00:00 2001 From: karuo Date: Fri, 6 Mar 2026 05:47:24 +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-03-06=2005:47=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E9=87=91=E4=BB=93=E3=80=81=E6=B0=B4=E6=A1=A5=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E5=AF=B9=E6=8E=A5=E3=80=81=E8=BF=90=E8=90=A5=E4=B8=AD?= =?UTF-8?q?=E6=9E=A2=E5=8F=82=E8=80=83=E8=B5=84=E6=96=99=E3=80=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5=E4=BD=9C=E5=8F=B0=20|=20?= =?UTF-8?q?=E6=8E=92=E9=99=A4=20>20MB:=2011=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../服务器管理/references/SSH登录方式与故障排查.md | 3 +- .../服务器管理/references/存客宝_宝塔管理SKILL.md | 13 ++ .../references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md | 75 +++++++++ .../scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh | 13 ++ .../scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh | 32 ++++ .../scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh | 45 ++++++ .../scripts/存客宝_清理挖矿木马_宝塔终端执行.sh | 37 +++++ .../scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py | 129 ++++++++++++++++ .../服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py | 126 ++++++++++++++++ .../scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py | 131 ++++++++++++++++ .../群晖NAS管理/scripts/local-macos-vm/README.md | 47 ++++++ .../scripts/local-macos-vm/docker-compose.yml | 19 +++ .../群晖NAS管理/scripts/local-macos-vm/run.sh | 35 +++++ .../群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html | 142 ++++++++++++++++++ .../群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png | Bin 0 -> 85065 bytes .../水桥_平台对接/飞书管理/ClawX飞书配置说明.md | 39 +++++ .../飞书管理/脚本/soul_party_to_feishu_sheet.py | 20 ++- .../参考资料/Cursor窗口无响应与超时排查.md | 53 +++++++ 运营中枢/工作台/00_账号与API索引.md | 1 + 运营中枢/工作台/ClawX_V0参数说明.md | 63 ++++++++ 运营中枢/工作台/gitea_push_log.md | 1 + .../工作台/scripts/ensure_clawx_available.sh | 28 ++++ 运营中枢/工作台/scripts/test_v0_api.sh | 56 +++++++ 运营中枢/工作台/代码管理.md | 1 + .../工作台/宝塔_服务器检查与清理_操作指南.md | 64 ++++---- 运营中枢/工作台/本地小模型详细配置.md | 139 +++++++++++++++++ 26 files changed, 1274 insertions(+), 38 deletions(-) create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py create mode 100644 01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md create mode 100644 01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml create mode 100755 01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh create mode 100644 01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html create mode 100644 01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png create mode 100644 02_卡人(水)/水桥_平台对接/飞书管理/ClawX飞书配置说明.md create mode 100644 运营中枢/参考资料/Cursor窗口无响应与超时排查.md create mode 100644 运营中枢/工作台/ClawX_V0参数说明.md create mode 100755 运营中枢/工作台/scripts/ensure_clawx_available.sh create mode 100755 运营中枢/工作台/scripts/test_v0_api.sh create mode 100644 运营中枢/工作台/本地小模型详细配置.md diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md index 360a9f11..c07f0074 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/SSH登录方式与故障排查.md @@ -1,7 +1,8 @@ # 宝塔 SSH 登录方式与故障排查 > 当一种方式失败时,依次尝试其他方式。终极备选:**宝塔面板 → 终端**(无需 SSH)。 -> **存客宝 SSH 修复**:在存客宝宝塔终端执行 `scripts/存客宝_SSH修复_宝塔终端执行.sh` 内容。 +> **存客宝 SSH 修复**:在存客宝宝塔终端执行 `scripts/存客宝_SSH修复_宝塔终端执行.sh` 内容。 +> **存客宝已关闭 22 端口**:仅保留 22022,防暴力破解。连接用:`ssh -p 22022 root@42.194.245.239`。 ## 启动 SSH 并保证连接成功(kr宝塔 43.139.27.93) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md index cfb71f05..df8a603e 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_宝塔管理SKILL.md @@ -51,6 +51,19 @@ killall nginx; sleep 2; /www/server/nginx/sbin/nginx -c /www/server/nginx/conf/n --- +## 安全告警(挖矿木马等) + +若腾讯云主机安全告警恶意文件(如 Linux.Risk.Miner.Jcnw): + +1. **宝塔终端(推荐)**:打开 https://42.194.245.239:9988 → 终端 → 粘贴执行 `scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh` 全部内容(含清理 + 去持久化 + 防再入)。 +2. **本机 SSH**:`sshpass -p 'Zhiqun1984' ssh -o StrictHostKeyChecking=no -p 22 root@42.194.245.239 'bash -s' < scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh` +3. **TAT**:`python3 scripts/腾讯云_TAT_存客宝_清理挖矿木马.py` +4. **控制台**:入侵检测 → 文件查杀 → 确认处置并开启防护 + +**关闭 22 端口(防入侵)**:存客宝已通过 TAT 或脚本关闭 22,仅保留 22022。SSH 仅用:`ssh -p 22022 root@42.194.245.239`。手动执行:`scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh`。 + +--- + ## 主 Skill 与错误处理 - **主 Skill**:`references/宝塔Node项目管理_SKILL.md`(凭证、Node API、常见错误、脚本) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md new file mode 100644 index 00000000..d254f8d5 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/存客宝_挖矿木马Linux.Risk.Miner.Jcnw_分析.md @@ -0,0 +1,75 @@ +# 存客宝挖矿木马 Linux.Risk.Miner.Jcnw 分析 + +> 告警文件:`/tmp/.esd101/.system3d` | 存客宝 42.194.245.239 | 腾讯云主机安全 + +--- + +## 一、木马类型与用途 + +| 项目 | 说明 | +|------|------| +| **类型** | 挖矿木马(Cryptominer) | +| **命名** | Linux.Risk.Miner.Jcnw(腾讯云/安全厂商检测名) | +| **用途** | 在受害主机上**偷偷跑加密货币挖矿**(常见为 XMR/Monero),占用 CPU/GPU 与带宽,收益归攻击者 | +| **危害** | 资源被占导致业务卡顿、电费与带宽成本上升、可能伴随后门与横向移动 | + +**本质**:在你这台服务器上“免费用电、用算力”给攻击者挖矿,不偷数据、不直接加密文件,但会拖慢服务并增加被进一步入侵的风险。 + +--- + +## 二、入侵节奏(典型链路) + +此类 Linux 挖矿木马常见入侵顺序如下: + +``` +1. 入口(Initial Access) + ├─ SSH 弱密码 / 默认密码 暴力破解(最常见) + ├─ 暴露的 Redis / Docker API / 未授权服务 + ├─ Web 漏洞(RCE、反序列化等) + └─ 老旧组件 N 日漏洞(如 WebLogic、Struts) + +2. 执行与落地 + ├─ 下载或写入恶意二进制到 /tmp、/var/tmp、/dev/shm 等 + ├─ 使用隐藏目录(如 .esd101)和伪装名(如 .system3d)躲避巡检 + └─ 直接执行或通过 shell 脚本拉起挖矿进程 + +3. 持久化(Persistence) + ├─ 写 crontab(如 @reboot、定期拉新) + ├─ 写 systemd 服务或 /etc/rc.local + ├─ 篡改 ~/.ssh/authorized_keys 留后门 + └─ 部分变种会改 /etc/ld.so.preload 等隐藏进程 + +4. 运行与通信 + ├─ 进程占用高 CPU,连接矿池或 C2 + └─ 可能检测到“有人登录”时暂时休眠以规避排查 +``` + +**存客宝场景**:路径 `/tmp/.esd101/.system3d` 符合「临时目录 + 隐藏目录 + 伪装名」的典型挖矿落地方式;若曾用弱密码或 22/22022 长期暴露,**SSH 暴力破解**是最可能的入口。 + +--- + +## 三、与“小型宝塔”处理的一致性 + +- **类型**:同为 Linux 挖矿木马,目的一致(占资源挖矿)。 +- **处理**:结束进程 → 删恶意文件/目录 → 清 crontab 等持久化 → 加固(防爆破、强密码、限端口)。 +- **防再入**:关弱密码 SSH、开 fail2ban/防爆破、改面板与 SSH 端口、定期查 crontab 与 `/tmp` 下隐藏目录。 + +--- + +## 四、防护与自检清单 + +| 措施 | 说明 | +|------|------| +| SSH | 禁用密码登录,仅密钥;或强密码 + fail2ban/防爆破 | +| 端口 | 22/22022 不必要不暴露公网,或改端口 + 防火墙限源 IP | +| 宝塔 | 强密码、改 9988 端口、限 IP 访问(安全 → 入口限制) | +| 自检 | 定期 `crontab -l`、`ls -la /tmp`、`ps aux` 看高 CPU 进程 | +| 腾讯云 | 主机安全保持开启,入侵检测/文件查杀告警及时处置 | + +--- + +## 五、相关脚本与文档 + +- 清理+防再入(宝塔终端):`scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh` +- SSH 执行:`scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh` +- 存客宝管理入口:`references/存客宝_宝塔管理SKILL.md`(安全告警小节) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh new file mode 100644 index 00000000..044fd6af --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# 存客宝:关闭 22 端口,仅保留 22022(防暴力破解入口) +# 在宝塔面板【终端】复制整段执行。执行后 SSH 仅用:ssh -p 22022 root@42.194.245.239 + +echo "=== 关闭 22 端口,仅保留 22022 ===" +CFG="/etc/ssh/sshd_config" +[ -f "$CFG" ] && cp "$CFG" "$CFG.bak.$(date +%Y%m%d%H%M)" +sed -i '/^Port /d' "$CFG" +sed -i '/^#Port /d' "$CFG" +echo "Port 22022" >> "$CFG" +iptables -C INPUT -p tcp --dport 22 -j DROP 2>/dev/null || iptables -A INPUT -p tcp --dport 22 -j DROP +systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null +echo "完成。SSH 仅用: ssh -p 22022 root@42.194.245.239" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh new file mode 100644 index 00000000..a136e4ac --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# 存客宝:清理挖矿木马 + 防再次入侵(在宝塔面板【终端】复制整段执行) + +echo "========== 1. 清理挖矿木马 ==========" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done +pkill -9 -f ".esd101" 2>/dev/null || true +pkill -9 -f ".system3d" 2>/dev/null || true +sleep 1 +rm -rf /tmp/.esd101 +# 删除 /tmp 下其他可疑隐藏目录(保留系统需要的) +for d in /tmp/.[a-zA-Z0-9]*; do [ -d "$d" ] && [ ! -L "$d" ] && rm -rf "$d" 2>/dev/null; done +echo " 已删除 /tmp/.esd101 及 /tmp 下可疑隐藏目录" + +echo "" +echo "========== 2. 清除恶意持久化 ==========" +crontab -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab - 2>/dev/null || true +for u in root www; do crontab -u $u -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab -u $u - 2>/dev/null; done +grep -rl "esd101\|system3d\|/tmp/\." /etc/cron.d /etc/cron.daily /etc/cron.hourly 2>/dev/null | while read f; do sed -i '/esd101\|system3d\|\/tmp\/\./d' "$f"; done +echo " crontab 与 /etc/cron 已清理" + +echo "" +echo "========== 3. 防再次入侵 ==========" +chmod 1777 /tmp 2>/dev/null +systemctl is-active fail2ban &>/dev/null && echo " fail2ban 已运行" || (systemctl start fail2ban 2>/dev/null && echo " fail2ban 已启动" || echo " 未安装 fail2ban,建议宝塔 安全 安装") +echo " 建议:宝塔 安全 -> SSH 防爆破 开启;面板 设置 -> 强密码、改端口" + +echo "" +echo "========== 4. 检查 ==========" +ls -la /tmp/ | head -15 +echo "" +echo "========== 完成 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh new file mode 100644 index 00000000..ead240fd --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# 存客宝 42.194.245.239:清理挖矿木马 + 防再次入侵 +# 本机执行:sshpass -p 'Zhiqun1984' ssh -o StrictHostKeyChecking=no -p 22 root@42.194.245.239 'bash -s' < 本脚本 +# 或先 scp 到服务器再 ssh 执行 + +set -e +echo "========== 1. 清理挖矿木马 ==========" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done || true +pkill -9 -f ".esd101" 2>/dev/null || true +pkill -9 -f ".system3d" 2>/dev/null || true +sleep 1 +rm -rf /tmp/.esd101 /tmp/.* 2>/dev/null || true +echo " 已删除 /tmp/.esd101 及 /tmp 下隐藏目录" + +echo "" +echo "========== 2. 清除恶意持久化 ==========" +# 清理 root 与 www 的 crontab 中的恶意项 +for u in root www; do + crontab -u $u -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab -u $u - 2>/dev/null || true +done +# 清理 /etc/cron.* 中的恶意脚本 +sed -i '/\.esd101\|\.system3d\|\/tmp\/\./d' /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* 2>/dev/null || true +echo " crontab 与 /etc/cron 已清理" + +echo "" +echo "========== 3. 防再次入侵加固 ==========" +# 3.1 /tmp 禁止执行(noexec),需重启后生效,这里仅创建说明 +grep -q "tmpfs.*noexec" /etc/fstab 2>/dev/null && echo " /tmp noexec 已存在" || echo " 建议:fstab 中 /tmp 加 noexec 后 reboot" +# 3.2 确保 fail2ban 或宝塔 SSH 防护开启 +if command -v fail2ban-client &>/dev/null; then + fail2ban-client status sshd &>/dev/null && echo " fail2ban sshd 已运行" || systemctl start fail2ban 2>/dev/null && echo " fail2ban 已启动" || true +fi +# 3.3 限制 /tmp 下新建可执行文件(可选:chmod 1777 已存在则保持) +chmod 1777 /tmp 2>/dev/null && echo " /tmp 权限 1777" +# 3.4 宝塔面板:安全 -> 防火墙已放行必要端口前提下,可开启「SSH 防爆破」 +echo " 建议:宝塔 安全 -> SSH 防爆破 开启;面板 设置 -> 修改默认端口与强密码" + +echo "" +echo "========== 4. 检查结果 ==========" +ls -la /tmp/ | head -12 +echo "" +crontab -l 2>/dev/null | grep -v "^#" || echo " root crontab 无任务" +echo "" +echo "========== 完成 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh new file mode 100644 index 00000000..0b399b2b --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# 存客宝 42.194.245.239 清理 Linux.Risk.Miner.Jcnw 挖矿木马 +# 在宝塔面板【终端】复制整段粘贴执行 +# 腾讯云告警:/tmp/.esd101/.system3d + +echo "========== 存客宝 挖矿木马清理 ==========" +echo "" + +f="/tmp/.esd101/.system3d" +echo "[1] 结束占用该文件的进程" +if [ -f "$f" ]; then + for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null && echo " 已结束 PID $pid"; done +fi +pkill -9 -f ".esd101" 2>/dev/null && echo " 已结束 .esd101 相关进程" || true +pkill -9 -f ".system3d" 2>/dev/null && echo " 已结束 .system3d 相关进程" || true +sleep 1 + +echo "" +echo "[2] 删除恶意文件及目录" +rm -rf /tmp/.esd101 2>/dev/null && echo " 已删除 /tmp/.esd101" || echo " 目录不存在或已删" + +echo "" +echo "[3] 检查 /tmp 下隐藏目录" +ls -la /tmp/ | head -20 + +echo "" +echo "[4] 检查 crontab 可疑项" +crontab -l 2>/dev/null | grep -v "^#" || echo " 无" +grep -r "\.esd101\|\.system3d\|/tmp/\." /etc/cron* 2>/dev/null || echo " 无" + +echo "" +echo "[5] 当前高 CPU 进程(前 8)" +ps aux --sort=-%cpu | head -10 + +echo "" +echo "========== 完成 ==========" +echo "建议:腾讯云控制台 → 主机安全 → 入侵检测 → 文件查杀,确认处置并开启防护。" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py new file mode 100644 index 00000000..8a6261a0 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +TAT 存客宝:清理挖矿木马 + 关闭 22 端口(仅保留 22022 防暴力破解入口) +""" +import base64 +import json +import os +import re +import sys +import time + +CKB_INSTANCE_ID = "ins-ciyv2mxa" +REGION = "ap-guangzhou" + +CMD = r''' +echo "=== 1. 清理挖矿木马 ===" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done +pkill -9 -f ".esd101" 2>/dev/null || true +pkill -9 -f ".system3d" 2>/dev/null || true +sleep 1 +rm -rf /tmp/.esd101 +(crontab -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\.") | crontab - 2>/dev/null || true +echo " 已清理 /tmp/.esd101 与 crontab" + +echo "" +echo "=== 2. 关闭 22 端口(保留 22022)===" +# 2.1 确保 sshd 只监听 22022 +CFG="/etc/ssh/sshd_config" +if [ -f "$CFG" ]; then + cp "$CFG" "$CFG.bak.$(date +%Y%m%d%H%M)" + sed -i '/^Port /d' "$CFG" + sed -i '/^#Port /d' "$CFG" + echo "Port 22022" >> "$CFG" + echo " 已设置 sshd 仅 Port 22022" +fi +# 2.2 防火墙禁止 22 入站(双重保险) +iptables -C INPUT -p tcp --dport 22 -j DROP 2>/dev/null || iptables -A INPUT -p tcp --dport 22 -j DROP +echo " iptables 已 DROP 22" +# 2.3 重启 sshd 使配置生效 +systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null || /etc/init.d/sshd restart 2>/dev/null +echo " sshd 已重启,现仅监听 22022" + +echo "" +echo "=== 3. 检查 ===" +ss -tlnp | grep -E ":22|:22022" || true +echo "" +echo "DONE. 今后 SSH 仅用: ssh -p 22022 root@42.194.245.239" +''' + + +def _read_creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + root = d + if os.path.basename(d) == "卡若AI": + break + d = os.path.dirname(d) + p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md") + if not os.path.isfile(p): + return None, None + with open(p, "r", encoding="utf-8") as f: + t = f.read() + sid = skey = None + in_t = False + for line in t.splitlines(): + if "### 腾讯云" in line: + in_t = True + continue + if in_t and line.strip().startswith("###"): + break + if not in_t: + continue + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I) + if m and m.group(1).strip().startswith("AKID"): + sid = m.group(1).strip() + m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I) + if m: + skey = m.group(1).strip() + return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY") + + +def main(): + sid, skey = _read_creds() + if not sid or not skey: + print("❌ 未配置腾讯云凭证") + return 1 + try: + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + except ImportError: + print("pip install tencentcloud-sdk-python-tat") + return 1 + cred = credential.Credential(sid, skey) + client = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(CMD.encode()).decode() + req.InstanceIds = [CKB_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 90 + req.CommandName = "CKB_CleanMiner_ClosePort22" + resp = client.RunCommand(req) + inv_id = resp.InvocationId + print("⏳ TAT 已下发:清理挖矿 + 关闭 22 端口,等待 35s...") + time.sleep(35) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name = "invocation-id" + f.Values = [inv_id] + req2.Filters = [f] + r2 = client.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr: + try: + jj = json.loads(tr) if isinstance(tr, str) else tr + out = jj.get("Output", "") + if out: + out = base64.b64decode(out).decode("utf-8", errors="replace") + print("\n--- 服务器输出 ---\n%s\n---" % out[:4000]) + except Exception: + print(str(tr)[:600]) + print("\n✅ 完成后 SSH 仅用:ssh -p 22022 root@42.194.245.239") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py new file mode 100644 index 00000000..bee14fc9 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +腾讯云 TAT 在存客宝上清理 Linux.Risk.Miner.Jcnw 挖矿木马 +告警文件:/tmp/.esd101/.system3d +""" +import base64 +import json +import os +import re +import sys +import time + +CKB_INSTANCE_ID = "ins-ciyv2mxa" +REGION = "ap-guangzhou" + +CMD = r''' +echo "=== 1. 查找占用恶意文件的进程 ===" +f="/tmp/.esd101/.system3d" +[ -f "$f" ] && fuser -v "$f" 2>/dev/null || echo " 文件不存在或无进程占用" +lsof "$f" 2>/dev/null || true +echo "" +echo "=== 2. 结束相关进程 ===" +for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null && echo " 已结束 PID $pid"; done +pkill -9 -f ".esd101" 2>/dev/null && echo " 已结束 .esd101 相关进程" || true +pkill -9 -f ".system3d" 2>/dev/null && echo " 已结束 .system3d 相关进程" || true +sleep 1 +echo "" +echo "=== 3. 删除恶意文件及目录 ===" +rm -rf /tmp/.esd101 2>/dev/null && echo " 已删除 /tmp/.esd101" || echo " 删除失败或不存在" +echo "" +echo "=== 4. 检查 /tmp 下其他隐藏目录 ===" +ls -la /tmp/ | head -30 +echo "" +echo "=== 5. 检查定时任务(crontab)===" +crontab -l 2>/dev/null | grep -v "^#" || echo " 无 crontab" +for u in root www; do echo " [$u]"; crontab -u $u -l 2>/dev/null | grep -v "^#" || true; done +echo "" +echo "=== 6. 检查 /etc/cron 可疑项 ===" +grep -r "\.esd101\|\.system3d\|/tmp/\." /etc/cron* 2>/dev/null || echo " 无" +echo "" +echo "=== 7. 高 CPU 进程(前 10)===" +ps aux --sort=-%cpu | head -12 +echo "" +echo "DONE" +''' + + +def _read_creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + root = d + if os.path.basename(d) == "卡若AI": + break + d = os.path.dirname(d) + p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md") + if not os.path.isfile(p): + return None, None + with open(p, "r", encoding="utf-8") as f: + t = f.read() + sid = skey = None + in_t = False + for line in t.splitlines(): + if "### 腾讯云" in line: + in_t = True + continue + if in_t and line.strip().startswith("###"): + break + if not in_t: + continue + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I) + if m and m.group(1).strip().startswith("AKID"): + sid = m.group(1).strip() + m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I) + if m: + skey = m.group(1).strip() + return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY") + + +def main(): + print("存客宝 挖矿木马清理 TAT 下发...", flush=True) + sid, skey = _read_creds() + if not sid or not skey: + print("❌ 未配置腾讯云凭证", flush=True) + return 1 + try: + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + except ImportError: + print("pip install tencentcloud-sdk-python-tat") + return 1 + cred = credential.Credential(sid, skey) + client = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(CMD.encode()).decode() + req.InstanceIds = [CKB_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 60 + req.CommandName = "CKB_KillMiner" + resp = client.RunCommand(req) + inv_id = resp.InvocationId + print("⏳ TAT 已下发挖矿木马清理,等待 25s...") + time.sleep(25) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name = "invocation-id" + f.Values = [inv_id] + req2.Filters = [f] + r2 = client.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr: + try: + jj = json.loads(tr) if isinstance(tr, str) else tr + out = jj.get("Output", "") + if out: + out = base64.b64decode(out).decode("utf-8", errors="replace") + print("\n--- 服务器输出 ---\n%s\n---" % out[:5000]) + except Exception: + print(str(tr)[:600]) + print("\n建议:登录腾讯云控制台 → 入侵检测 → 文件查杀,确认处置并加强防护。") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py new file mode 100644 index 00000000..702b9d1d --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +腾讯云 TAT 在存客宝上清除主机安全告警的恶意文件(挖矿 Linux.Risk.Miner.Jcnw) +路径:/tmp/.esd101/.system3d +""" +import base64 +import json +import os +import re +import sys +import time + +CKB_INSTANCE_ID = "ins-ciyv2mxa" +REGION = "ap-guangzhou" + +CMD = r''' +set -e +echo "=== 1. 恶意文件与目录(腾讯云主机安全告警)===" +MAL_PATH="/tmp/.esd101" +MAL_FILE="/tmp/.esd101/.system3d" +[ -f "$MAL_FILE" ] && echo " 存在: $MAL_FILE" || echo " 文件已不存在" +[ -d "$MAL_PATH" ] && echo " 目录存在: $MAL_PATH" || echo " 目录已不存在" +echo "" +echo "=== 2. 占用该路径的进程 ===" +fuser -v "$MAL_FILE" 2>/dev/null || true +lsof "$MAL_FILE" 2>/dev/null || true +for pid in $(lsof +D "$MAL_PATH" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u); do + echo " 进程 PID=$pid" + ps -p $pid -o pid,user,cmd 2>/dev/null || true +done +echo "" +echo "=== 3. 终止关联进程 ===" +for pid in $(lsof +D "$MAL_PATH" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u); do + kill -9 $pid 2>/dev/null && echo " 已 kill -9 $pid" || true +done +sleep 1 +echo "" +echo "=== 4. 删除恶意文件与目录 ===" +rm -rf "$MAL_FILE" "$MAL_PATH" 2>/dev/null && echo " 已删除 $MAL_PATH 及内容" || echo " 删除完成或路径不存在" +echo "" +echo "=== 5. 再次确认 ===" +[ -d "$MAL_PATH" ] && echo " 警告: 目录仍存在" || echo " 目录已清除" +echo "" +echo "=== 6. 检查 /tmp 下其他隐藏可疑目录 ===" +ls -la /tmp/ | grep -E '^d.*\.' || echo " (无其他隐藏目录或已清理)" +echo "" +echo "=== 7. 当前用户 crontab 是否含可疑项 ===" +crontab -l 2>/dev/null | grep -v '^#' | grep -v '^$' || echo " (无 crontab 或为空)" +echo "" +echo "DONE" +''' + + +def _read_creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + root = d + if os.path.basename(d) == "卡若AI": + break + d = os.path.dirname(d) + p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md") + if not os.path.isfile(p): + return None, None + with open(p, "r", encoding="utf-8") as f: + t = f.read() + sid = skey = None + in_t = False + for line in t.splitlines(): + if "### 腾讯云" in line: + in_t = True + continue + if in_t and line.strip().startswith("###"): + break + if not in_t: + continue + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I) + if m and m.group(1).strip().startswith("AKID"): + sid = m.group(1).strip() + m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I) + if m: + skey = m.group(1).strip() + return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY") + + +def main(): + sid, skey = _read_creds() + if not sid or not skey: + print("❌ 未配置腾讯云凭证") + return 1 + try: + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + except ImportError: + print("pip install tencentcloud-sdk-python-tat") + return 1 + cred = credential.Credential(sid, skey) + client = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(CMD.encode()).decode() + req.InstanceIds = [CKB_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 60 + req.CommandName = "CKB_CleanMalware" + resp = client.RunCommand(req) + inv_id = resp.InvocationId + print("⏳ TAT 已下发清除恶意文件(存客宝 42.194.245.239),等待 25s...") + time.sleep(25) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name = "invocation-id" + f.Values = [inv_id] + req2.Filters = [f] + r2 = client.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr: + try: + jj = json.loads(tr) if isinstance(tr, str) else tr + out = jj.get("Output", "") + if out: + out = base64.b64decode(out).decode("utf-8", errors="replace") + print("\n--- 服务器输出 ---\n%s\n---" % out[:5000]) + except Exception: + print(str(tr)[:800]) + print("\n建议:登录腾讯云控制台 → 主机安全 → 入侵检测 → 文件查杀,确认告警已处理。") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md new file mode 100644 index 00000000..297fbad1 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md @@ -0,0 +1,47 @@ +# 本地 Docker 使用 NAS 上的 macOS 虚拟机(不复制) + +直接挂载 NAS 的 `smb://CKBNAS._smb._tcp.local/docker/macos-vm`,在本机 Docker 里跑 macos-vm,数据不拷贝。 + +## 方式一:一键挂载并启动(推荐) + +```bash +# 与 NAS 同网(如家里/公司内网) +bash "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh" +``` + +- 若未挂载 SMB:会先挂载 `//CKBNAS._smb._tcp.local/docker` 到 `~/nas-mounts/ckbnas-docker`(提示密码时输入 NAS 账号密码)。 +- 若已在 Finder 里连接了「docker」共享:会直接用 `/Volumes/docker/macos-vm`,不再重复挂载。 + +## 方式二:先手动挂载再启动 + +1. 在 Finder 中连接:`smb://CKBNAS._smb._tcp.local/docker`,或终端执行: + ```bash + open "smb://CKBNAS._smb._tcp.local/docker" + ``` +2. 进入本目录后启动: + ```bash + cd "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm" + export MACOS_VM_STORAGE="/Volumes/docker/macos-vm" + docker compose up -d + ``` + +## 访问 + +- **noVNC(浏览器)**:http://localhost:8007 +- **VNC 客户端**:`localhost:5901` + +## 停止与卸载 + +```bash +cd "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm" +docker compose down +# 若用脚本挂载到 ~/nas-mounts/ckbnas-docker,不用时可卸载: +# umount ~/nas-mounts/ckbnas-docker +``` + +## 说明 + +- 数据始终在 NAS 的 `smb://CKBNAS._smb._tcp.local/docker/macos-vm`,本机只挂载使用,不复制。 +- 本机需与 NAS 同网(或 VPN/内网穿透),否则 SMB 无法访问。 +- Mac 上 Docker 无 KVM,虚拟机可能比在 NAS 上跑稍慢,属正常。 +- 若镜像提示 linux/amd64 与 arm64 不一致,在 Docker Desktop 可开启「Use Rosetta for x86/amd64」以提升兼容性。 diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml new file mode 100644 index 00000000..71714338 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/docker-compose.yml @@ -0,0 +1,19 @@ +# 本地 Mac 使用 NAS 上的 macos-vm 数据(SMB 挂载,不复制) +# 数据路径由 run.sh 设置:MACOS_VM_STORAGE = 挂载后的 docker/macos-vm 目录 +services: + macos: + image: dockurr/macos:latest + container_name: macos-vm-local + environment: + - VERSION=ventura + - RAM_SIZE=4G + - CPU_CORES=2 + - DISK_SIZE=64G + ports: + - "8007:8006" + - "5901:5900" + volumes: + - "${MACOS_VM_STORAGE:-$HOME/nas-mounts/ckbnas-docker/macos-vm}:/storage" + cap_add: + - NET_ADMIN + restart: "no" diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh new file mode 100755 index 00000000..84ebccf6 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# 挂载 NAS 上的 docker/macos-vm(SMB),并用本机 Docker 运行 macos-vm,不复制数据 +# 数据源: smb://CKBNAS._smb._tcp.local/docker/macos-vm + +set -e +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# 固定挂载点,便于 Docker 使用同一路径 +MOUNT_POINT="${HOME}/nas-mounts/ckbnas-docker" +STORAGE_PATH="${MOUNT_POINT}/macos-vm" +export MACOS_VM_STORAGE="$STORAGE_PATH" + +# 若已用 Finder 挂载了 docker 共享,可直接用 /Volumes/docker/macos-vm +if [[ -d "/Volumes/docker/macos-vm" ]]; then + export MACOS_VM_STORAGE="/Volumes/docker/macos-vm" + echo "使用 Finder 已挂载路径: $MACOS_VM_STORAGE" +else + mkdir -p "$MOUNT_POINT" + if ! mount | grep -q "$MOUNT_POINT"; then + echo "挂载 SMB: //CKBNAS._smb._tcp.local/docker -> $MOUNT_POINT" + echo "(若提示密码,请输入 NAS 登录密码)" + mount_smbfs "//fnvtk@CKBNAS._smb._tcp.local/docker" "$MOUNT_POINT" + fi + if [[ ! -d "$STORAGE_PATH" ]]; then + echo "错误: 挂载后未找到 $STORAGE_PATH,请确认 NAS 上存在 docker/macos-vm 目录" + exit 1 + fi + echo "使用挂载路径: $MACOS_VM_STORAGE" +fi + +echo "启动本地 macos-vm 容器(数据来自 NAS,不复制)..." +docker compose up -d +echo "完成。noVNC: http://localhost:8007 VNC: localhost:5901" +echo "停止: cd $SCRIPT_DIR && docker compose down" diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html new file mode 100644 index 00000000..065737b5 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html @@ -0,0 +1,142 @@ + + + + + + 对话流程 · 群晖1TB备份盘挂载 + + + +

对话流程 · 群晖 1TB 备份盘 → Mac 挂载与边栏

+
+ + + + + + + + + + + + 用户 · 助手 对话流程 + + + + + + 用户:开辟1TB + 备份盘+时间机器 + + + 用户:命令行操作 + + + 用户:打开挂载目录 + + + 用户:放左侧边栏 + + + 用户:生成流程PNG + + + + 助手:写操作指南 + 挂载脚本(内网优先) + LaunchAgent plist + + + 执行挂载脚本 + → 失败(URL解析) + → 中文共享名编码 + + + 挂载成功 + 安装 LaunchAgent + + + open ~/DiskStation-1TB + + + open -R + 说明 + 手动拖到边栏 + + + 本流程图 HTML + → 截图 → PNG + + + + 参考资料.md + mount_diskstation_1tb.sh + + + 脚本增加 URL 编码 + + + ~/DiskStation-1TB + 登录自动挂载 + + + Finder 打开目录 + + + 边栏需手动拖一次 + + + 对话流程_xxx.png + + + + + + + + + + + + + + + + + + + + 用户 + + 助手 + + 产出/结果 + +
+ + diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png new file mode 100644 index 0000000000000000000000000000000000000000..62f01f2b08dee40fc4bf537df2ff034d71fdc146 GIT binary patch literal 85065 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 F{{SI2J4FBh literal 0 HcmV?d00001 diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/ClawX飞书配置说明.md b/02_卡人(水)/水桥_平台对接/飞书管理/ClawX飞书配置说明.md new file mode 100644 index 00000000..69054e91 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/ClawX飞书配置说明.md @@ -0,0 +1,39 @@ +# ClawX / OpenClaw 飞书通道配置说明 + +> 本机飞书 App Key / App Secret 已写入 OpenClaw 网关配置,飞书通道已启用。 + +## 一、本机飞书凭证(已填入 OpenClaw) + +| 项 | 值 | 来源 | +|:---|:---|:---| +| **App ID(App Key)** | `cli_a48818290ef8100d` | 卡若AI 飞书管理脚本(水桥) | +| **App Secret** | `dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4` | 同上 | + +上述凭证与 `02_卡人(水)/水桥_平台对接/飞书管理/脚本/` 下各脚本(如 `soul_party_to_feishu_sheet.py`、`auto_log.py`、`feishu_api.py`)使用的为同一套,用于飞书开放平台同一应用。 + +## 二、已写入的配置位置 + +- **文件**:`~/.openclaw/openclaw.json` +- **节点**:`channels.feishu` + - `enabled: true` + - `dmPolicy: "pairing"` + - `accounts.main.appId` / `appSecret` / `botName: "卡若AI"` + +ClawX 连接本机或 Docker 中的 OpenClaw 网关时,会使用该配置;**无需在 ClawX 界面里再填一遍 App Key/Secret**,网关已带飞书通道。 + +## 三、使配置生效 + +1. **重启 OpenClaw 网关** + - 若网关在 **Docker(website 编排)**:神射手目录执行 `docker compose restart website-openclaw-gateway` 或 `docker compose up -d`。 + - 若网关在 **本机**:在 ClawX 设置中重启网关,或结束网关进程后重新启动。 +2. **飞书开放平台** + - 应用需开启 **Bot** 能力,事件订阅建议使用 **长连接(WebSocket)**,并订阅 `im.message.receive_v1`。 + - 权限需包含:`im:message`、`im:message:send_as_bot` 等(见 [OpenClaw 飞书文档](https://docs.openclaw.ai/channels/feishu))。 + +## 四、在 ClawX 里确认 + +- 打开 **ClawX → 设置 → 通道 / Channels**,应能看到 **飞书(Feishu)** 已启用。 +- 若 ClawX 有单独的「飞书」配置页且显示从网关同步,则无需再填 App Key/Secret;若仍有输入框且为空,可填上表一中的 App ID 与 App Secret 以保持一致。 + +--- +*配置写入时间:2026-03-06;凭证来源:卡若AI 水桥飞书管理脚本。* diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py index 3a3eb0b9..e61d9609 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/soul_party_to_feishu_sheet.py @@ -47,18 +47,21 @@ ROWS = { '114': [ '电竞AI私域招人 龙虾', 163, 42360, 445, 8, 139, 1, 29, 19, 54 ], # 115场 2026-03-04:关闭页 156min/484成员/56最高/15新增粉丝/1礼物/3灵魂力/36974曝光,小助手 154min建房/480进房/8人均/82互动/15关注 '115': [ '破产两次 家庭先于事业', 156, 36974, 484, 8, 82, 1, 3, 15, 56 ], + # 116场 2026-03-05:小助手 154min建房/418进房/11人均/104互动/19关注,话题职场;推流/礼物/灵魂力/最高在线待关闭页补 + '116': [ '量化猎头人才 职场分享', 154, 0, 418, 11, 104, 0, 0, 19, 0 ], } # 场次→按日期列填写时的日期(表头为当月日期 1~31) -SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4'} +SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4', '116': '5'} # 场次→月份(用于选择 2月/3月 等工作表标签,避免写入错月) -SESSION_MONTH = {'105': 2, '106': 2, '107': 2, '113': 3, '114': 3, '115': 3} +SESSION_MONTH = {'105': 2, '106': 2, '107': 2, '113': 3, '114': 3, '115': 3, '116': 3} # 派对录屏(飞书妙记)链接:场次 → 完整 URL,填表时写入「派对录屏」行对应列 -# 从飞书妙记复制链接后填入,115 场等新场次需补全 +# 从飞书妙记复制链接后填入,新场次需补全 PARTY_VIDEO_LINKS = { '113': 'https://cunkebao.feishu.cn/minutes/obcn6yjq6866c3gl4ibd72vr', '114': 'https://cunkebao.feishu.cn/minutes/obcn7nd828351hy4he3974a8', '115': 'https://cunkebao.feishu.cn/minutes/obcn8cgvnzk15yfy3buak735', + '116': 'https://cunkebao.feishu.cn/minutes/obcn81825en52vt3eqoo482e', } # 小程序当日运营数据:日期号 → {访问次数, 访客, 交易金额},填表时自动写入对应日期列 @@ -69,11 +72,12 @@ MINIPROGRAM_EXTRA = { '21': {'访问次数': 52, '访客': 52, '交易金额': 0}, # 2月21日 '23': {'访问次数': 55, '访客': 55, '交易金额': 0}, # 2月23日 } -# 3 月:日期列 2/3/4 对应 113/114/115 场;数据从 Soul 小程序后台获取后填入此处 +# 3 月:日期列 2/3/4/5 对应 113/114/115/116 场;数据从 Soul 小程序后台获取后填入此处 MINIPROGRAM_EXTRA_3 = { '2': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月2日 113场 '3': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月3日 114场 '4': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月4日 115场 + '5': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月5日 116场 } @@ -327,7 +331,7 @@ def main(): session = (sys.argv[1] if len(sys.argv) > 1 else '104').strip() row = ROWS.get(session) if not row: - print('❌ 未知场次,可用: 96, 97, 98, 99, 100, 103, 104, 105, 106, 107, 113, 114, 115') + print('❌ 未知场次,可用: 96, 97, 98, 99, 100, 103, 104, 105, 106, 107, 113, 114, 115, 116') sys.exit(1) token = load_token() or refresh_and_load_token() if not token: @@ -372,9 +376,9 @@ def main(): LABELS_GROUP = ['主题', '时长(分钟)', 'Soul推流人数', '进房人数', '人均时长(分钟)', '互动数量', '礼物', '灵魂力', '增加关注', '最高在线'] def _maybe_send_group(sess, raw_vals): - if sess not in ('105', '106', '107', '113', '114', '115'): + if sess not in ('105', '106', '107', '113', '114', '115', '116'): return - date_label = {'105': '2月20日', '106': '2月21日', '107': '2月23日', '113': '3月2日', '114': '3月3日', '115': '3月4日'}.get(sess, sess + '场') + date_label = {'105': '2月20日', '106': '2月21日', '107': '2月23日', '113': '3月2日', '114': '3月3日', '115': '3月4日', '116': '3月5日'}.get(sess, sess + '场') report_link = OPERATION_REPORT_LINK if sheet_id == SHEET_ID else f'https://cunkebao.feishu.cn/wiki/wikcnIgAGSNHo0t36idHJ668Gfd?sheet={sheet_id}' lines = [ '【Soul 派对运营报表】', @@ -385,7 +389,7 @@ def main(): for i, label in enumerate(LABELS_GROUP): val = raw_vals[i] if i < len(raw_vals) else '' lines.append(f'{label}:{val}') - src_date = {'105': '20260220', '106': '20260221', '107': '20260223', '113': '20260302', '114': '20260303', '115': '20260304'}.get(sess, '20260220') + src_date = {'105': '20260220', '106': '20260221', '107': '20260223', '113': '20260302', '114': '20260303', '115': '20260304', '116': '20260305'}.get(sess, '20260220') lines.append(f'数据来源:soul 派对 {sess}场 {src_date}.txt') msg = '\n'.join(lines) ok, _ = send_feishu_group_message(FEISHU_GROUP_WEBHOOK, msg) diff --git a/运营中枢/参考资料/Cursor窗口无响应与超时排查.md b/运营中枢/参考资料/Cursor窗口无响应与超时排查.md new file mode 100644 index 00000000..706fac30 --- /dev/null +++ b/运营中枢/参考资料/Cursor窗口无响应与超时排查.md @@ -0,0 +1,53 @@ +# Cursor 窗口无响应 / 超时自动关闭 · 排查与处理 + +> 当出现「The window is not responding」弹窗时的处理清单。已按本清单在用户设置中做了部分优化。 +> 若伴随**自动关闭/闪退**,另见:`Cursor闪退排查_20260304.md`(日志分析、渲染进程崩溃、Agent 嵌套事务等)。 + +--- + +## 一、已做的配置优化(settings.json) + +以下项已写入 **Cursor 用户设置**,用于减轻卡顿与无响应: + +| 配置项 | 作用 | +|:---|:---| +| `cursor.general.enableCodebaseIndexing` = false | 关闭代码库索引,减轻后台负载 | +| `files.watcherExclude` | 排除 node_modules、.git、dist、build、.next、.cursor 等,减少文件监视导致的卡顿 | +| `search.exclude` | 搜索时排除上述目录,减轻索引与搜索压力 | +| `typescript.tsserver.maxTsServerMemory` = 4096 | 限制 TS 语言服务内存,避免单进程占满导致假死 | + +--- + +## 二、建议在 Cursor 界面里手动检查 + +1. **网络(若经常在请求 AI 时卡死)** + - **Cursor 设置 → Network** + - 打开 **HTTP Compatibility Mode**(改用 HTTP/1.1),部分网络/代理下可减少超时与无响应。 + +2. **MCP / 工具(若卡死与 Agent、工具调用相关)** + - **Cursor 设置 → Tools & MCP** + - 暂时关闭不用的 MCP 或工具,观察是否还会出现「窗口无响应」。 + +3. **模型与 API** + - 若某模型或自建 API 经常超时,可先切换到其他模型测试。 + - 第三方 Base URL / Key 异常也会导致长时间等待后弹窗无响应。 + +--- + +## 三、仍出现无响应时 + +- **先点「Keep Waiting」**:有时是短暂卡顿,等几十秒会恢复。 +- **再试「Reopen」**:会重启该窗口;若勾选「Don't restore editors」则不再恢复上次打开的标签,启动更快。 +- **定期清理**:关闭不用的聊天标签、少开大仓库多根目录,有助减轻内存与 IPC 压力。 +- **看日志**:`~/Library/Application Support/Cursor/logs/main.log`,搜 `ERROR` / `WARN` 排查扩展或网络问题。 + +--- + +## 四、原因简述(社区常见) + +- 扩展宿主进程崩溃或 IPC 阻塞(如 16s 超时)。 +- 文件监视 / 搜索对超大目录(如未排除的 node_modules)导致 CPU 或 I/O 飙高。 +- 多个聊天或 Agent 同时跑、工具/MCP 超时,导致界面线程被占。 +- 网络或代理导致请求长时间挂起,进而触发「无响应」检测。 + +上述设置与步骤可在不重装 Cursor 的前提下,优先尝试;若问题依旧,可结合 main.log 与 Cursor 官方论坛/Issues 进一步排查。 diff --git a/运营中枢/工作台/00_账号与API索引.md b/运营中枢/工作台/00_账号与API索引.md index d6fa5019..4e4be9f6 100644 --- a/运营中枢/工作台/00_账号与API索引.md +++ b/运营中枢/工作台/00_账号与API索引.md @@ -59,6 +59,7 @@ | Secret | `v1:C6mw1SlvXsJdlO4VFEXSQEVf:519gA0DPqIMbjvfMh7CXf4B2` | | Secret(zhengzhiqun@vip.qq.com 账号) | `v1:t2m5rEmVb8eBvH7I4IAlP4jU:vcp_1p5UWQZ9o8Mh6YuZlFiUrrzvgUhvJFB6QgzjKYkf09XJSZ6iu10ZgFzZ` | | 模型 | `claude-opus`(接口侧用 v0-1.5-md 等) | +| 检测 | 运行 `bash 运营中枢/工作台/scripts/test_v0_api.sh`;若返回 500/Unknown error,到 [v0.app/chat/settings/keys](https://v0.app/chat/settings/keys) 检查 Key 与套餐;ClawX 默认走本地模型,确保可用 | ### n8n(本机工作流 API) diff --git a/运营中枢/工作台/ClawX_V0参数说明.md b/运营中枢/工作台/ClawX_V0参数说明.md new file mode 100644 index 00000000..fa34c987 --- /dev/null +++ b/运营中枢/工作台/ClawX_V0参数说明.md @@ -0,0 +1,63 @@ +# ClawX 卡若AI V0 参数说明 + +> 已按卡若AI《00_账号与API索引》《v0_API对接说明》将 V0 参数写入 `~/.openclaw/openclaw.json`,ClawX 设置里「自定义」提供商会显示并可用。 + +--- + +## 一、已填入 ClawX(自定义 / custom-custom21)的参数 + +| 设置项 | 值 | 说明 | +|:---|:---|:---| +| **名称** | 卡若AI V0 (云端) | 在设置里显示的提供商名称 | +| **基础 URL** | `https://api.v0.dev/v1` | 卡若AI 统一 V0 地址 | +| **API Key** | `v1:C6mw1SlvXsJdlO4VFEXSQEVf:519gA0DPqIMbjvfMh7CXf4B2` | 来自《00_账号与API索引》v0.dev | +| **模型 ID(默认/推荐)** | `v0-1.5-md` | 卡若AI 推荐,平衡速度与质量 | +| **同 Provider 回退** | `v0-1.5-lg`、`v0-1.0-md` | 大模型与兼容旧版 | +| **跨 Provider 回退** | 本地 Ollama qwen2.5:3b | 已在 agents.defaults.model.fallbacks 中配置 | + +--- + +## 二、V0 模型列表(在 ClawX 可选) + +| 模型 ID | 显示名 | 说明 | +|:---|:---|:---| +| v0-1.5-md | v0-1.5-md (推荐) | 中模型,推荐默认 | +| v0-1.5-lg | v0-1.5-lg (大模型) | 大模型,效果更好 | +| v0-1.0-md | v0-1.0-md (兼容) | 旧版中模型 | + +--- + +## 三、在 ClawX 设置里核对 + +1. 打开 **设置 → AI 模型提供商**。 +2. 找到 **自定义**(或「卡若AI V0 (云端)」):应显示 **已配置**,基础 URL 为 `https://api.v0.dev/v1`,模型 ID 为上述之一。 +3. **同 Provider 回退模型 ID**:可填 `v0-1.5-lg`、`v0-1.0-md`(每行一个),先走当前 provider 再走跨 Provider。 +4. **跨 Provider 回退**:可勾选 **Ollama qwen2.5:3b**,V0 不可用时自动走本地。 + +--- + +## 四、使配置生效 + +- 若刚改过 `~/.openclaw/openclaw.json`:在 ClawX **设置 → 网关** 点 **重启**,或退出 ClawX 再打开。 +- 新对话可选模型里应出现「卡若AI V0 (推荐)」「卡若AI V0 大模型」「卡若AI V0 (兼容)」。 + +--- + +--- + +## 五、V0 接口检测与排查 + +**检测命令(卡若AI 目录下):** +```bash +bash 运营中枢/工作台/scripts/test_v0_api.sh +# 或指定模型: bash 运营中枢/工作台/scripts/test_v0_api.sh v0-1.0-md +``` + +**若返回 HTTP 500 / `{"success":false,"error":"Unknown error"}`:** +1. 打开 https://v0.app/chat/settings/keys 检查 API Key 是否有效,必要时重新生成并更新到《00_账号与API索引》与 ClawX 自定义提供商。 +2. 确认账号已开通 Premium/Team 且开通了 Model API(按量计费)。 +3. **ClawX 默认模型为本地 Ollama(qwen2.5:3b)**,不依赖 V0 即可正常使用;V0 仅作云端备选,接口异常时选本地模型即可保证可用。 + +--- + +*参数来源:卡若AI 运营中枢/工作台/00_账号与API索引.md、参考资料/v0_API对接说明.md。* diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 16e90ba2..81442069 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -234,3 +234,4 @@ | 2026-03-05 05:47:24 | 🔄 卡若AI 同步 2026-03-05 05:47 | 更新:Cursor规则、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-05 05:50:30 | 🔄 卡若AI 同步 2026-03-05 05:50 | 更新:总索引与入口、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-05 17:00:04 | 🔄 卡若AI 同步 2026-03-05 17:00 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-05 17:03:05 | 🔄 卡若AI 同步 2026-03-05 17:03 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/scripts/ensure_clawx_available.sh b/运营中枢/工作台/scripts/ensure_clawx_available.sh new file mode 100755 index 00000000..e2d8c7cc --- /dev/null +++ b/运营中枢/工作台/scripts/ensure_clawx_available.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# 命令行检查并确保 ClawX 可用(网关 + Ollama) +# 用法:bash 运营中枢/工作台/scripts/ensure_clawx_available.sh + +set -e + +GATEWAY_URL="${GATEWAY_URL:-http://127.0.0.1:18789}" +OLLAMA_URL="${OLLAMA_URL:-http://localhost:11434}" + +echo "=== ClawX 可用性检查 ===" + +# 1. 网关健康 +if curl -sf --connect-timeout 3 "$GATEWAY_URL/healthz" >/dev/null; then + echo " [OK] 网关 $GATEWAY_URL 正常 (healthz 200)" +else + echo " [FAIL] 网关 $GATEWAY_URL 无响应" + echo " 请打开 ClawX 应用,或若用 Docker:cd 神射手目录 && docker compose up -d" + exit 1 +fi + +# 2. Ollama(本地模型) +if curl -sf --connect-timeout 3 "$OLLAMA_URL/api/tags" >/dev/null; then + echo " [OK] Ollama $OLLAMA_URL 正常" +else + echo " [WARN] Ollama 未响应,本地小模型不可用(ClawX 可走云端回退)" +fi + +echo "=== 检查完成,ClawX 可用 ===" diff --git a/运营中枢/工作台/scripts/test_v0_api.sh b/运营中枢/工作台/scripts/test_v0_api.sh new file mode 100755 index 00000000..13a2c584 --- /dev/null +++ b/运营中枢/工作台/scripts/test_v0_api.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# V0 接口检测:用 openclaw 配置里的 apiKey 请求 v0,并给出结论与建议 +# 用法:bash 运营中枢/工作台/scripts/test_v0_api.sh + +set -e +OPENCLAW_JSON="$HOME/.openclaw/openclaw.json" +BASE_URL="https://api.v0.dev/v1" +MODEL="${1:-v0-1.5-md}" + +if [[ ! -f "$OPENCLAW_JSON" ]]; then + echo "未找到 $OPENCLAW_JSON" + exit 1 +fi + +# 从 openclaw 配置里取 custom-custom21 的 apiKey(简单提取) +APIKEY=$(python3 -c " +import json +with open('$OPENCLAW_JSON') as f: + d = json.load(f) +p = d.get('models', {}).get('providers', {}).get('custom-custom21', {}) +print(p.get('apiKey', '') or '') +" 2>/dev/null) + +if [[ -z "$APIKEY" ]]; then + echo "未在 openclaw 配置中找到 custom-custom21.apiKey,请先在 ClawX 设置中填写 V0 API Key" + exit 1 +fi + +echo "=== V0 接口检测 ===" +echo " Base URL: $BASE_URL" +echo " Model: $MODEL" +echo " Key: ${APIKEY:0:12}...${APIKEY: -4}" +echo "" + +RESP=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/chat/completions" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $APIKEY" \ + -d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"max_tokens\":20}" \ + --connect-timeout 12 2>/dev/null) +HTTP_CODE=$(echo "$RESP" | tail -1) +HTTP_BODY=$(echo "$RESP" | sed '$d') + +if [[ "$HTTP_CODE" == "200" ]]; then + echo " [OK] HTTP 200,V0 可用" + echo "$HTTP_BODY" | python3 -c "import sys,json; d=json.load(sys.stdin); print(' 内容:', d.get('choices',[{}])[0].get('message',{}).get('content','')[:80])" 2>/dev/null || true + exit 0 +fi + +echo " [FAIL] HTTP $HTTP_CODE" +echo " 响应: $HTTP_BODY" +echo "" +echo "排查建议:" +echo " 1. 打开 https://v0.app/chat/settings/keys 检查 API Key 是否有效、是否重新生成过" +echo " 2. 确认账号已开通 Premium/Team 且开通了 Model API(按量计费)" +echo " 3. ClawX 默认已用本地模型(Ollama),不依赖 V0 即可使用;V0 仅作云端备选" +exit 1 diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index f2887f2b..6afc4c65 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -237,3 +237,4 @@ | 2026-03-05 05:47:24 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:47 | 更新:Cursor规则、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-05 05:50:30 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:50 | 更新:总索引与入口、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-05 17:00:04 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 17:00 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-05 17:03:05 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 17:03 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | diff --git a/运营中枢/工作台/宝塔_服务器检查与清理_操作指南.md b/运营中枢/工作台/宝塔_服务器检查与清理_操作指南.md index 0ef75913..38f15653 100644 --- a/运营中枢/工作台/宝塔_服务器检查与清理_操作指南.md +++ b/运营中枢/工作台/宝塔_服务器检查与清理_操作指南.md @@ -6,11 +6,13 @@ ## 一、当前连接状态(卡若AI 侧) -| 服务器 | IP | SSH | 宝塔 API | 说明 | -|--------|-----|-----|----------|------| -| **存客宝** | 42.194.245.239 | ❌ Permission denied | ❌ IP 未加入白名单 | 需在宝塔面板终端执行 | -| **kr宝塔** | 43.139.27.93 | ❌ Permission denied | ❌ IP 未加入白名单 | 同上 | -| 小型宝塔 | 42.194.232.22 | ❌ Connection closed | - | 同上 | + +| 服务器 | IP | SSH | 宝塔 API | 说明 | +| -------- | -------------- | ------------------- | ----------- | ---------- | +| **存客宝** | 42.194.245.239 | ❌ Permission denied | ❌ IP 未加入白名单 | 需在宝塔面板终端执行 | +| **kr宝塔** | 43.139.27.93 | ❌ Permission denied | ❌ IP 未加入白名 | 同上 | +| 小型宝塔 | 42.194.232.22 | ❌ Connection closed | - | 同上 | + **本机 IP**:211.156.92.72(若需 API 远程检查,需将此 IP 加入各服务器宝塔「设置→API 接口」白名单) @@ -20,8 +22,8 @@ ### 步骤 1:登录宝塔面板 -- 存客宝:https://42.194.245.239:9988 -- kr宝塔:https://43.139.27.93:9988 +- 存客宝:[https://42.194.245.239:9988](https://42.194.245.239:9988) +- kr宝塔:[https://43.139.27.93:9988](https://43.139.27.93:9988) 账号:ckb 密码:zhiqun1984 @@ -48,30 +50,34 @@ ## 三、检查内容说明 -| 检查项 | 说明 | -|--------|------| -| 系统负载/内存 | uptime, free -h | -| 磁盘 df | 各分区使用率 | -| 根目录占用 | du 找出最大目录 | -| /www 子目录 | 网站、日志、备份占用 | -| 网站日志 | /www/wwwlogs 各站点日志大小 | -| 宝塔日志 | request 等面板日志 | -| 大文件 | 超过 100M 的文件列表 | -| Docker | 未用镜像/容器占用(如有)| + +| 检查项 | 说明 | +| -------- | -------------------- | +| 系统负载/内存 | uptime, free -h | +| 磁盘 df | 各分区使用率 | +| 根目录占用 | du 找出最大目录 | +| /www 子目录 | 网站、日志、备份占用 | +| 网站日志 | /www/wwwlogs 各站点日志大小 | +| 宝塔日志 | request 等面板日志 | +| 大文件 | 超过 100M 的文件列表 | +| Docker | 未用镜像/容器占用(如有) | + --- ## 四、清理内容说明 -| 清理项 | 说明 | 风险 | -|--------|------|------| -| journalctl | 保留 3 天 | 低 | -| /var/log 旧日志 | 7 天前 .gz 删除、.log 截断 | 低 | -| apt 缓存 | apt-get clean, autoremove | 低 | -| /tmp, /var/tmp | 临时文件 | 低 | -| 宝塔 request 日志 | 截断 | 低 | -| 网站访问日志 | truncate 清空 | 低 | -| 回收站 | 面板手动清空 | 需确认无重要文件 | + +| 清理项 | 说明 | 风险 | +| -------------- | ------------------------- | -------- | +| journalctl | 保留 3 天 | 低 | +| /var/log 旧日志 | 7 天前 .gz 删除、.log 截断 | 低 | +| apt 缓存 | apt-get clean, autoremove | 低 | +| /tmp, /var/tmp | 临时文件 | 低 | +| 宝塔 request 日志 | 截断 | 低 | +| 网站访问日志 | truncate 清空 | 低 | +| 回收站 | 面板手动清空 | 需确认无重要文件 | + --- @@ -91,7 +97,7 @@ docker system prune -af ## 六、开通远程后 -1. **SSH**:确认 root 密码为 zhiqun1984,端口 22022 可用 -2. **API 白名单**:将本机 IP 211.156.92.72 加入各服务器宝塔 API 白名单 +1. **SSH**:确认 root 密码为 zhiqun1984,端口 22022 可用 +2. **API 白名单**:将本机 IP 211.156.92.72 加入各服务器宝塔 API 白名单 -完成后卡若AI 可远程执行 `快速检查服务器.py` 和清理脚本。 +完成后卡若AI 可远程执行 `快速检查服务器.py` 和清理脚本。 \ No newline at end of file diff --git a/运营中枢/工作台/本地小模型详细配置.md b/运营中枢/工作台/本地小模型详细配置.md new file mode 100644 index 00000000..6c1a0726 --- /dev/null +++ b/运营中枢/工作台/本地小模型详细配置.md @@ -0,0 +1,139 @@ +# 本机本地小模型详细配置 + +> 汇总自 Ollama、OpenClaw、卡若AI 火种本地模型 / 木叶视频切片 等配置。更新:2026-03-06 + +--- + +## 一、Ollama 运行时 + +| 项 | 值 | +|:---|:---| +| **可执行文件** | `/usr/local/bin/ollama` | +| **数据目录** | `~/.ollama`(含 models、logs) | +| **服务地址** | `http://localhost:11434` | +| **常用接口** | `/api/chat`(对话)、`/api/generate`(续写)、`/api/embeddings`(向量) | + +--- + +## 二、本机已安装的模型(ollama list) + +| 模型名 | 大小 | 修改时间 | 用途 | +|:---|:---|:---|:---| +| **nomic-embed-text:latest** | 274 MB | 约 11 天前 | 嵌入/语义搜索(RAG) | +| **qwen2.5:3b** | 1.9 GB | 约 2 周前 | 对话/高光识别(视频切片主力) | +| **qwen2.5:1.5b** | 986 MB | 约 2 周前 | 轻量对话、代码辅助、摘要 | + +说明:SKILL 文档中提到的 **qwen2.5:0.5b** 当前未在本机安装;若需使用可执行 `ollama pull qwen2.5:0.5b`。 + +--- + +## 三、卡若AI 火种 · 本地模型 SDK(local_llm_sdk) + +**路径**:`04_卡火(火)/火种_知识模型/本地模型/脚本/local_llm_sdk.py` +**入口**:`运营中枢/local_llm` 再转发到上述脚本。 + +### 3.1 服务与模型常量 + +| 常量 | 值 | +|:---|:---| +| **OLLAMA_URL** | `http://localhost:11434` | +| **MODELS** | `light` → `qwen2.5:0.5b`;`standard` → `qwen2.5:1.5b`;`embed` → `nomic-embed-text` | +| **CPU_TARGET** | `30%` | +| **MAX_CONCURRENT_REQUESTS** | 2 | +| **REQUEST_INTERVAL** | 0.5 秒 | +| **MAX_INPUT_LENGTH** | 4000 字符 | + +### 3.2 任务 → 模型映射(TASK_MODEL_MAP) + +| 任务类型 | 选用档位 | 对应 Ollama 模型 | +|:---|:---|:---| +| summarize、extract、classify、translate_short、generate_questions、quick_answer | light | qwen2.5:0.5b | +| analyze、code_explain、write_draft、task_breakdown、complex_qa | standard | qwen2.5:1.5b | +| embed、similarity、search | embed | nomic-embed-text | + +### 3.3 对外能力 + +- `summarize`、`extract_info`、`classify`、`generate_questions`、`analyze_task`、`write_draft`、`semantic_search`、`check_service` +- `get_usage_notice_text`、`format_response_with_notice`(使用提醒) + +--- + +## 四、木叶 · 视频切片(高光识别) + +**脚本**:`03_卡木(木)/木叶_视频内容/视频切片/脚本/identify_highlights.py` + +| 项 | 值 | +|:---|:---| +| **OLLAMA_URL** | `http://localhost:11434` | +| **OLLAMA_MODELS(优先级顺序)** | `["qwen2.5:3b", "qwen2.5:1.5b"]` | +| **默认调用模型** | `qwen2.5:3b` | +| **接口** | `POST {OLLAMA_URL}/api/chat`(带 system + user,temperature=0.2,num_predict=8192) | + +逻辑:先尝试云端 API(OPENAI_API_BASES/KEYS/MODELS 等),失败再按顺序试 Ollama 上列模型,再不行则规则兜底。 + +--- + +## 五、木叶 · 章节主题转高光(chapter_themes_to_highlights) + +**脚本**:`03_卡木(木)/木叶_视频内容/视频切片/脚本/chapter_themes_to_highlights.py` + +| 项 | 值 | +|:---|:---| +| **OLLAMA_URL** | `http://localhost:11434` | +| **OLLAMA_MODELS** | `["qwen2.5:7b", "qwen2.5:1.5b"]` | + +说明:本机未安装 **qwen2.5:7b**,实际会落到 `qwen2.5:1.5b`;若需 7b 可 `ollama pull qwen2.5:7b`。 + +--- + +## 六、OpenClaw / ClawX 中的本地模型 + +**配置文件**:`~/.openclaw/openclaw.json` + +### 6.1 认证配置(auth.profiles) + +```json +"ollama:local": { + "provider": "ollama", + "mode": "api_key" +} +``` + +### 6.2 默认 Agent 模型(agents.defaults.model) + +- **primary**:`ollama-ollama/qwen3:laster`(当前 `~/.openclaw/openclaw.json` 中的实际值;若本机未安装 `qwen3:laster` 需 `ollama pull qwen3:latest` 或改为已安装模型如 `ollama/qwen2.5:3b`) +- **fallbacks**:`[]` + +即 OpenClaw/ClawX 对话默认走本机 Ollama;当前指向 qwen3:laster。 + +### 6.3 云端模型(models.providers) + +当前还配置了 **custom-custom21**(v0 API),作为云端备选,与本地 Ollama 并存。 + +--- + +## 七、其他引用 + +| 位置 | 说明 | +|:---|:---| +| **soul_enhance.py** | 固定使用 `http://localhost:11434/api/generate` | +| **土渠 · 手机流量自动操作 SKILL** | 示例命令 `ollama run qwen2.5:1.5b` | +| **本地模型 SKILL(Cursor 隧道)** | 启动脚本可配 `OLLAMA_HOST=0.0.0.0:11434`、Cloudflare 隧道供 Cursor 用本地模型 | + +--- + +## 八、配置汇总表(便于查阅) + +| 配置项 | 值 | +|:---|:---| +| Ollama 服务地址 | `http://localhost:11434` | +| 已安装对话/续写模型 | qwen2.5:3b、qwen2.5:1.5b | +| 已安装嵌入模型 | nomic-embed-text:latest | +| 火种 SDK 轻量/标准/嵌入 | qwen2.5:0.5b / qwen2.5:1.5b / nomic-embed-text(0.5b 未装则 light 会失败) | +| 视频高光识别默认 | qwen2.5:3b,备选 qwen2.5:1.5b | +| OpenClaw 默认 Agent | ollama-ollama/qwen3:laster(以 openclaw.json 为准) | +| 资源控制(火种) | 并发 2、间隔 0.5s、CPU 目标 30%、最大输入 4000 字 | + +--- + +*文档由卡若AI 根据本机 Ollama、openclaw.json、local_llm_sdk、identify_highlights、chapter_themes_to_highlights 等自动汇总。*