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 00000000..62f01f2b Binary files /dev/null and b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png differ 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 等自动汇总。*