From 1345fa0a6b6f154f0d5c1ba04cbb63b3f8ede714 Mon Sep 17 00:00:00 2001 From: karuo Date: Mon, 9 Mar 2026 05:51:28 +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-09=2005:51=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=E5=8D=A1=E6=9C=A8=E3=80=81?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5=E4=BD=9C=E5=8F=B0?= =?UTF-8?q?=20|=20=E6=8E=92=E9=99=A4=20>20MB:=2011=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../金仓_存储备份/服务器管理/SKILL.md | 2 +- .../服务器管理/references/kr宝塔_宝塔终端执行指南.md | 2 + .../references/kr宝塔_网络与服务器卡顿_检查与处理.md | 37 +++-- .../scripts/kr宝塔_全面检查与清理_宝塔终端执行.sh | 88 ++++++++++++ .../服务器管理/scripts/kr宝塔_强制降负载_宝塔终端执行.sh | 30 +++++ .../scripts/kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh | 95 +++++++++++++ .../scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh | 90 +++++++++++++ .../服务器管理/scripts/腾讯云_TAT_kr宝塔_彻底去除PM2.py | 53 ++++++++ .../服务器管理/scripts/腾讯云_TAT_kr宝塔_负载CPU修复.py | 65 +++++++++ 02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md | 2 +- .../飞书管理/参考资料/3月9日_飞书日志_远志李永平.md | 10 ++ .../飞书管理/参考资料/今日飞书日志_远志李永平_完整版.md | 88 ++++++++++++ .../飞书管理/脚本/.feishu_tokens.json | 6 +- .../飞书管理/脚本/write_today_0321_custom.py | 126 ++++++++++++++++++ .../视频切片/远志_一个月每日视频任务清单.md | 44 ++++++ 运营中枢/工作台/2026年3月_上周总结_优化版.md | 31 +++++ 运营中枢/工作台/gitea_push_log.md | 1 + 运营中枢/工作台/代码管理.md | 1 + 运营中枢/工作台/复盘_负载CPU修复_20260220.md | 41 ++++++ 19 files changed, 795 insertions(+), 17 deletions(-) create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_全面检查与清理_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_强制降负载_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_彻底去除PM2.py create mode 100644 01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_负载CPU修复.py create mode 100644 02_卡人(水)/水桥_平台对接/飞书管理/参考资料/3月9日_飞书日志_远志李永平.md create mode 100644 02_卡人(水)/水桥_平台对接/飞书管理/参考资料/今日飞书日志_远志李永平_完整版.md create mode 100644 02_卡人(水)/水桥_平台对接/飞书管理/脚本/write_today_0321_custom.py create mode 100644 03_卡木(木)/木叶_视频内容/视频切片/远志_一个月每日视频任务清单.md create mode 100644 运营中枢/工作台/2026年3月_上周总结_优化版.md create mode 100644 运营中枢/工作台/复盘_负载CPU修复_20260220.md diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md b/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md index 3dcb370e..3c978093 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md @@ -51,7 +51,7 @@ kr宝塔: qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT ### 强制规则(每次执行必守) -1. **宝塔优先确认**:操作腾讯云服务器时,**先确认是否为宝塔服务器**。若是,**统一用宝塔 API + 宝塔 Node 管理,禁止使用 PM2**。所有 Node 项目启停、重启、状态查询一律通过宝塔面板 API(`/project/nodejs/start_project`、`stop_project`、`get_project_list`)。 +1. **宝塔优先确认**:操作腾讯云服务器时,**先确认是否为宝塔服务器**。若是,**彻底去除 PM2,一律使用宝塔原生 Node 管理器**。所有 Node 项目启停、重启、状态查询仅通过宝塔面板(网站 → Node 项目)及 API。脚本:`kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh`。 2. **SSH 统一配置**:账号 **root**、密码 **Zhiqun1984**(Z 大写),端口 22022 或 22;或使用 id_ed25519 密钥。详见 `references/SSH登录方式与故障排查.md`。SSH 不通时用 TAT(腾讯云自动化助手)。 3. **宝塔 443 优先**:宝塔服务器 443 不监听时,**优先**检查是否运行系统 Nginx 而非宝塔 Nginx;若是,先 `killall nginx` 后启动宝塔 Nginx。 4. **经验沉淀**:每次涉及服务器/宝塔/部署的操作结束后,必须把经验写入 `02_卡人(水)/水溪_整理归档/经验库/待沉淀/`,防止同类问题重复出现。 diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_宝塔终端执行指南.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_宝塔终端执行指南.md index ebeb98d6..93b65efe 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_宝塔终端执行指南.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_宝塔终端执行指南.md @@ -4,6 +4,8 @@ **执行顺序(强制)**:宝塔 API 优先 → SSH → TAT。每次修改前**必须先检查目标项目及周边项目/应用**,确认不影响其他应用后再执行。详见 SKILL.md 强制规则 8、9。 +**彻底去除 PM2,一律用宝塔 Node**:脚本 `kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh`,会停止并禁用 PM2、清理残留、结束高 CPU Node、修复 site.db、通过宝塔 Node 批量启动,缓解卡顿。 + --- ## 一、执行步骤 diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md index f777c533..c10ae889 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md @@ -52,11 +52,11 @@ echo "=== 内存 TOP5 ===" && ps aux --sort=-%mem | head -6 - **Nginx/应用日志**:看是否有大量请求或慢请求。 - **带宽/流量**:宝塔面板「监控」或 `vnstat`(若已装)。 -### 2.4 针对「服务器卡」的检查 +### 2.4 针对「服务器卡 / 负载高 / CPU 100%」的检查与处理 | 现象 | 检查命令/位置 | 处理思路 | |------------|--------------------------|------------------------------| -| CPU 高 | `top` 或 `ps aux --sort=-%cpu` | 结束异常进程或优化程序 | +| CPU 100% | `top` 或 `ps aux --sort=-%cpu` | 常见原因:PM2 重启循环、Node 进程异常。执行 `kr宝塔_负载CPU修复_宝塔终端执行.sh` 或 TAT `腾讯云_TAT_kr宝塔_负载CPU修复.py` | | 内存不足 | `free -m` | 关停非必要服务、加 swap 或升配 | | 磁盘满 | `df -h`、`du -sh /www/*` | 清日志、删临时文件、扩容 | | 磁盘 I/O 高| `iostat -x 1 3`(若已装)| 减少写操作、查大文件/日志 | @@ -64,25 +64,38 @@ echo "=== 内存 TOP5 ===" && ps aux --sort=-%mem | head -6 --- -## 三、常见处理动作(登录后执行) +## 三、负载与 CPU 100% 一键修复 + +**现象**:负载 77%、CPU 100%、磁盘 89%。常见原因:PM2 自动重启失败 Node 导致死循环、或多个 Node 进程抢占 CPU。 + +**执行顺序**:宝塔 API → SSH → TAT。 + +**方式一(推荐)**:在 **宝塔面板 → 终端** 打开 `01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh`,全文复制粘贴到终端执行。 + +**方式二**:本机执行 TAT(需腾讯云凭证): +```bash +cd /Users/karuo/Documents/个人/卡若AI +./01_卡资(金)/金仓_存储备份/服务器管理/scripts/.venv_tx/bin/python \ + "01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_负载CPU修复.py" +``` + +脚本会:PM2 清理 → 杀高 CPU Node 进程 → 停全部 Node → 修复 site.db → 批量启动。执行后刷新面板首页,负载与 CPU 应回落。 + +--- + +## 四、其他常见处理动作(登录后执行) ```bash -# 清理系统日志(慎用,仅当磁盘紧张时) -# find /var/log -name "*.log" -mtime +7 -delete - # 重载 Nginx nginx -s reload # 查看宝塔/Node 相关进程 ps aux | grep -E 'nginx|node|pm2' - -# 若使用 PM2,查看列表 -pm2 list ``` --- -## 四、宝塔 API 远程检查(需白名单) +## 五、宝塔 API 远程检查(需白名单) 若本机 IP 已加入 kr宝塔 的「API 白名单」,可用卡若AI 脚本批量看 CPU/内存/磁盘: @@ -94,7 +107,7 @@ python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储 --- -## 五、带宽使用情况(近期已查) +## 六、带宽使用情况(近期已查) kr宝塔 为腾讯云广州 CVM(实例 ID: ins-aw0tnqjo),带宽 5M。可用脚本查看近 24 小时监控: @@ -112,7 +125,7 @@ kr宝塔 为腾讯云广州 CVM(实例 ID: ins-aw0tnqjo),带宽 5M。可 --- -## 六、直接处理「带宽卡」——在宝塔面板终端执行 +## 七、直接处理「带宽卡」——在宝塔面板终端执行 以下整段复制到 **kr宝塔 宝塔面板 → 终端** 执行,用于排查并做基础限流。 diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_全面检查与清理_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_全面检查与清理_宝塔终端执行.sh new file mode 100644 index 00000000..a503bc02 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_全面检查与清理_宝塔终端执行.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# kr宝塔 全面检查:进程、病毒可疑项、卡顿,并清理 +# 执行:宝塔面板 → 终端 或 SSH + +echo "========== 全面检查与清理 ==========" + +echo "" +echo "【1】负载与 CPU TOP15" +uptime +ps aux --sort=-%cpu 2>/dev/null | head -16 + +echo "" +echo "【2】可疑进程检测(矿机/病毒常见名)" +for p in kdevtmpfsi kinsing xmrig miner; do + found=$(ps aux | grep -E "$p" | grep -v grep 2>/dev/null) + if [ -n "$found" ]; then + echo " 可疑: $found" + ps aux | grep -E "$p" | grep -v grep | awk '{print $2}' | xargs -r kill -9 2>/dev/null + fi +done +echo " 检查完成" + +echo "" +echo "【3】crontab 与定时任务" +crontab -l 2>/dev/null || echo " 无 crontab" +ls -la /etc/cron.d/ 2>/dev/null | head -10 +grep -r "wget\|curl.*\|\|" /var/spool/cron/ /etc/cron.d/ 2>/dev/null | head -5 || true + +echo "" +echo "【4】/tmp 与 /var/tmp 可疑可执行文件" +find /tmp /var/tmp -type f -executable 2>/dev/null | head -10 || true + +echo "" +echo "【5】PM2 与 Node 清理" +pm2 kill 2>/dev/null || true +systemctl stop pm2-root 2>/dev/null || true +systemctl disable pm2-root 2>/dev/null || true +pkill -9 -f "pm2" 2>/dev/null || true +for pid in $(ps aux | awk '$3>80 && /node|npm|pnpm/ && !/grep/ {print $2}' 2>/dev/null); do + kill -9 $pid 2>/dev/null +done +pkill -9 -f "node.*www/wwwroot" 2>/dev/null || true +sleep 2 + +echo "" +echo "【6】通过宝塔 Node 修复并启动" +python3 << 'PY' +import hashlib,json,os,sqlite3,time,urllib.request,urllib.parse,ssl +ssl._create_default_https_context=ssl._create_unverified_context +P,K="https://127.0.0.1:9988","qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT" +def sg(): t=int(time.time()); return {"request_time":t,"request_token":hashlib.md5((str(t)+hashlib.md5(K.encode()).hexdigest()).encode()).hexdigest()} +def post(p,d=None): pl=sg(); (pl.update(d) if d else None); r=urllib.request.Request(P+p,data=urllib.parse.urlencode(pl).encode()); return json.loads(urllib.request.urlopen(r,timeout=25).read().decode()) +PATH_FB={"玩值大屏":["/www/wwwroot/self/wanzhi/玩值大屏","/www/wwwroot/self/wanzhi/玩值"],"tongzhi":["/www/wwwroot/self/wanzhi/tongzhi","/www/wwwroot/self/wanzhi/tong"],"神射手":["/www/wwwroot/self/kr/kr-use","/www/wwwroot/self/kr/kr-users"],"AITOUFA":["/www/wwwroot/ext/tools/AITOUFA","/www/wwwroot/ext/tools/AITOL"]} +items=post("/project/nodejs/get_project_list").get("data")or[] +for it in items: + if it.get("name"): post("/project/nodejs/stop_project",{"project_name":it["name"]}); time.sleep(0.3) +time.sleep(3) +db="/www/server/panel/data/db/site.db" +if os.path.isfile(db): + c=sqlite3.connect(db); cur=c.cursor(); cur.execute("SELECT id,name,path,project_config FROM sites WHERE project_type='Node'") + for row in cur.fetchall(): + sid,name,path,cfg=row[0],row[1],row[2],row[3]or"{}" + path=(path or"").strip(); cfg=json.loads(cfg) if cfg else {} + proj=cfg.get("path")or cfg.get("project_path")or path + if not proj or not os.path.isdir(proj): + for p in PATH_FB.get(name,[]): + if os.path.isdir(p): proj=p; break + if proj and os.path.isdir(proj): + cmd="cd %s && (pnpm start 2>/dev/null || npm run start)"%proj + cfg["project_script"]=cfg["run_cmd"]=cmd; cfg["path"]=proj + cur.execute("UPDATE sites SET path=?,project_config=? WHERE id=?",(proj,json.dumps(cfg,ensure_ascii=False),sid)) + c.commit(); c.close() +for rnd in range(3): + items=post("/project/nodejs/get_project_list").get("data")or[] + to_start=[it for it in items if it.get("name") and not it.get("run")] + if not to_start: break + for it in to_start: + if it.get("name"): post("/project/nodejs/start_project",{"project_name":it["name"]}); time.sleep(1.5) + time.sleep(8) +run=sum(1 for x in (post("/project/nodejs/get_project_list").get("data")or[]) if x.get("run")) +print(" 运行 %d 个 Node" % run) +PY + +echo "" +echo "【7】清理后负载" +uptime +echo "" +echo "========== 完成 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_强制降负载_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_强制降负载_宝塔终端执行.sh new file mode 100644 index 00000000..37b672a8 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_强制降负载_宝塔终端执行.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# 强制降负载:先停所有 Node/PM2,等负载回落后再手动启动 +echo "========== 强制降负载 ==========" +echo "【1】停 PM2" +pm2 kill 2>/dev/null || true +systemctl stop pm2-root 2>/dev/null || true +systemctl disable pm2-root 2>/dev/null || true +pkill -9 -f pm2 2>/dev/null || true +echo "【2】结束全部 Node 进程" +pkill -9 -f "node" 2>/dev/null || true +pkill -9 -f "npm" 2>/dev/null || true +pkill -9 -f "pnpm" 2>/dev/null || true +pkill -9 -f "next-server" 2>/dev/null || true +sleep 3 +echo "【3】通过宝塔 API 停止所有 Node 项目" +python3 -c " +import hashlib,json,time,urllib.request,urllib.parse,ssl +ssl._create_default_https_context=ssl._create_unverified_context +P,K='https://127.0.0.1:9988','qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT' +def sg(): t=int(time.time()); return {'request_time':t,'request_token':hashlib.md5((str(t)+hashlib.md5(K.encode()).hexdigest()).encode()).hexdigest()} +def post(p,d=None): pl=sg(); pl.update(d or {}); r=urllib.request.Request(P+p,data=urllib.parse.urlencode(pl).encode()); return json.loads(urllib.request.urlopen(r,timeout=20).read().decode()) +for it in post('/project/nodejs/get_project_list').get('data')or[]: + n=it.get('name') + if n: post('/project/nodejs/stop_project',{'project_name':n}); time.sleep(0.5) +print('已停止全部') +" +sleep 5 +echo "【4】当前负载" +uptime +echo "========== 完成。负载应已下降。需启动的项目请到宝塔 Node 项目里手动点启动 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh new file mode 100644 index 00000000..a641343c --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# kr宝塔 彻底去除 PM2,一律使用宝塔原生 Node 管理器 +# 执行:宝塔面板 → 终端 或 SSH,全文复制粘贴运行 + +echo "========== 彻底去除 PM2,仅用宝塔 Node ==========" + +echo "【1】停止并禁用 PM2" +pm2 kill 2>/dev/null || true +systemctl stop pm2-root 2>/dev/null || true +systemctl disable pm2-root 2>/dev/null || true +systemctl mask pm2-root 2>/dev/null || true +rm -f /etc/systemd/system/pm2-root.service 2>/dev/null +rm -f /usr/lib/systemd/system/pm2-root.service 2>/dev/null +systemctl daemon-reload 2>/dev/null || true +echo " PM2 已停止并禁用" + +echo "" +echo "【2】清理 PM2 残留进程与配置" +pkill -9 -f "pm2" 2>/dev/null || true +rm -rf /root/.pm2 2>/dev/null +crontab -l 2>/dev/null | grep -v pm2 | crontab - 2>/dev/null || true +echo " PM2 残留已清理" + +echo "" +echo "【3】结束高 CPU 与全部 Node 进程(解决卡顿)" +for pid in $(ps aux | awk '$3>80 && /node|npm|pnpm/ && !/grep/ {print $2}' 2>/dev/null); do + echo " kill 高CPU $pid"; kill -9 $pid 2>/dev/null +done +pkill -9 -f "node.*www/wwwroot" 2>/dev/null || true +sleep 2 +echo " Node 进程已清理" + +echo "" +echo "【4】修复 site.db 启动命令并停止残留" +python3 << 'FIX' +import hashlib,json,os,re,sqlite3,subprocess,time,urllib.request,urllib.parse,ssl +ssl._create_default_https_context=ssl._create_unverified_context +P,K="https://127.0.0.1:9988","qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT" +def sg(): t=int(time.time()); return {"request_time":t,"request_token":hashlib.md5((str(t)+hashlib.md5(K.encode()).hexdigest()).encode()).hexdigest()} +def post(p,d=None): pl=sg(); (pl.update(d) if d else None); r=urllib.request.Request(P+p,data=urllib.parse.urlencode(pl).encode()); return json.loads(urllib.request.urlopen(r,timeout=25).read().decode()) +PATH_FB={"玩值大屏":["/www/wwwroot/self/wanzhi/玩值大屏","/www/wwwroot/self/wanzhi/玩值"],"tongzhi":["/www/wwwroot/self/wanzhi/tongzhi","/www/wwwroot/self/wanzhi/tong"],"神射手":["/www/wwwroot/self/kr/kr-use","/www/wwwroot/self/kr/kr-users"],"AITOUFA":["/www/wwwroot/ext/tools/AITOUFA","/www/wwwroot/ext/tools/AITOL"]} +items=post("/project/nodejs/get_project_list").get("data")or post("/project/nodejs/get_project_list").get("list")or[] +for it in items: + n=it.get("name") + if n: + try: post("/project/nodejs/stop_project",{"project_name":n}); print(" 停:",n) + except: pass + time.sleep(0.4) +time.sleep(3) +db="/www/server/panel/data/db/site.db" +if os.path.isfile(db): + c=sqlite3.connect(db); cur=c.cursor(); cur.execute("SELECT id,name,path,project_config FROM sites WHERE project_type='Node'") + fixed=0 + for row in cur.fetchall(): + sid,name,path,cfg=row[0],row[1],row[2],row[3]or"{}" + path=(path or"").strip(); cfg=json.loads(cfg) if cfg else {} + proj=cfg.get("path")or cfg.get("project_path")or path + if not proj or not os.path.isdir(proj): + for p in PATH_FB.get(name,[]): + if os.path.isdir(p): proj=p; break + if not proj or not os.path.isdir(proj): continue + cmd="cd %s && (pnpm start 2>/dev/null || npm run start)"%proj + cfg["project_script"]=cfg["run_cmd"]=cmd; cfg["path"]=proj + cur.execute("UPDATE sites SET path=?,project_config=? WHERE id=?",(proj,json.dumps(cfg,ensure_ascii=False),sid)); fixed+=1 + c.commit(); c.close() + print(" site.db 修复 %d 个" % fixed) +FIX + +echo "" +echo "【5】通过宝塔 Node 管理器批量启动" +python3 << 'PY' +import hashlib,json,time,urllib.request,urllib.parse,ssl +ssl._create_default_https_context=ssl._create_unverified_context +P,K="https://127.0.0.1:9988","qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT" +def sg(): t=int(time.time()); return {"request_time":t,"request_token":hashlib.md5((str(t)+hashlib.md5(K.encode()).hexdigest()).encode()).hexdigest()} +def post(p,d=None): pl=sg(); (pl.update(d) if d else None); r=urllib.request.Request(P+p,data=urllib.parse.urlencode(pl).encode()); return json.loads(urllib.request.urlopen(r,timeout=25).read().decode()) +items=post("/project/nodejs/get_project_list").get("data")or post("/project/nodejs/get_project_list").get("list")or[] +to_start=[it for it in items if it.get("name") and not it.get("run")] +print(" 待启动 %d 个" % len(to_start)) +for it in to_start: + n=it.get("name") + if n: + try: post("/project/nodejs/start_project",{"project_name":n}); print(" 启:",n) + except: pass + time.sleep(1.5) +items2=post("/project/nodejs/get_project_list").get("data")or post("/project/nodejs/get_project_list").get("list")or[] +run=sum(1 for x in items2 if x.get("run")) +print(" 运行 %d / %d" % (run,len(items2))) +PY + +echo "" +echo "【6】负载检查" +uptime +echo "" +echo "========== 完成:PM2 已去除,仅用宝塔 Node 管理器,卡顿应缓解 ==========" diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh new file mode 100644 index 00000000..da030f98 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# kr宝塔 负载与 CPU 过载修复 - 宝塔面板「终端」或 SSH 执行 +# 1. PM2 清理 2. 杀高 CPU 进程 3. 停 Node 4. 修复 site.db 5. 批量启动 + +echo "========== kr宝塔 负载与 CPU 修复 ==========" +echo "【0】PM2 清理(防止重启循环导致 CPU 100%)" +pm2 kill 2>/dev/null || true +systemctl stop pm2-root 2>/dev/null || true +systemctl disable pm2-root 2>/dev/null || true +echo " PM2 已清理" +echo "" +echo "【1】负载与 CPU 诊断" +uptime +echo "--- CPU TOP10 ---" +ps aux --sort=-%cpu | head -11 +echo "" +echo "【2】结束高 CPU Node 进程(CPU>80%)" +for pid in $(ps aux | awk '$3>80 && /node|npm|pnpm/ && !/grep/ {print $2}' 2>/dev/null); do + echo " kill -9 $pid"; kill -9 $pid 2>/dev/null +done +echo "--- 清理异常 Node 进程 ---" +pkill -9 -f "node.*www/wwwroot" 2>/dev/null || true +sleep 3 +echo "" +echo "【3】通过宝塔 API 停止全部 Node 并修复 site.db,然后批量启动" +python3 << 'PY' +import hashlib,json,os,re,sqlite3,subprocess,time,urllib.request,urllib.parse,ssl +ssl._create_default_https_context=ssl._create_unverified_context +P,K="https://127.0.0.1:9988","qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT" +def sg(): t=int(time.time()); return {"request_time":t,"request_token":hashlib.md5((str(t)+hashlib.md5(K.encode()).hexdigest()).encode()).hexdigest()} +def post(p,d=None): pl=sg(); (pl.update(d) if d else None); r=urllib.request.Request(P+p,data=urllib.parse.urlencode(pl).encode()); return json.loads(urllib.request.urlopen(r,timeout=25).read().decode()) +def pids(port): + try: return {int(x) for x in re.findall(r"pid=(\d+)",subprocess.check_output("ss -tlnp 2>/dev/null | grep ':%s ' || true"%port,shell=True).decode())} + except: return set() +def ports(it): + cfg=it.get("project_config") or {} + if isinstance(cfg,str): cfg=json.loads(cfg) if cfg else {} + p=[]; [p.append(int(cfg["port"])) if cfg.get("port") else None] + p.extend(int(m) for m in re.findall(r"-p\s*(\d+)",str(cfg.get("project_script","")))) + return sorted(set(p)) +PATH_FB={"玩值大屏":["/www/wwwroot/self/wanzhi/玩值大屏","/www/wwwroot/self/wanzhi/玩值"],"tongzhi":["/www/wwwroot/self/wanzhi/tongzhi","/www/wwwroot/self/wanzhi/tong"],"神射手":["/www/wwwroot/self/kr/kr-use","/www/wwwroot/self/kr/kr-users"],"AITOUFA":["/www/wwwroot/ext/tools/AITOUFA","/www/wwwroot/ext/tools/AITOL"]} +items=post("/project/nodejs/get_project_list").get("data")or post("/project/nodejs/get_project_list").get("list")or[] +print("停止 Node 项目") +for it in items: + n=it.get("name") + if n: + try: + for port in ports(it): [subprocess.call("kill -9 %s 2>/dev/null"%pid,shell=True) for pid in pids(port)] + pf="/www/server/nodejs/vhost/pids/%s.pid"%n + if os.path.exists(pf): open(pf,"w").write("0") + post("/project/nodejs/stop_project",{"project_name":n}); print(" 停:",n) + except: pass + time.sleep(0.4) +time.sleep(4) +print("\n修复 site.db") +db="/www/server/panel/data/db/site.db"; fixed=0 +if os.path.isfile(db): + c=sqlite3.connect(db); cur=c.cursor(); cur.execute("SELECT id,name,path,project_config FROM sites WHERE project_type='Node'") + for row in cur.fetchall(): + sid,name,path,cfg=row[0],row[1],row[2],row[3]or"{}" + path=(path or"").strip(); cfg=json.loads(cfg) if cfg else {} + proj=cfg.get("path")or cfg.get("project_path")or path + if not proj or not os.path.isdir(proj): + for p in PATH_FB.get(name,[]): + if os.path.isdir(p): proj=p; break + if not proj or not os.path.isdir(proj): continue + cmd="cd %s && (pnpm start 2>/dev/null || npm run start)"%proj + cfg["project_script"]=cfg["run_cmd"]=cmd; cfg["path"]=proj + cur.execute("UPDATE sites SET path=?,project_config=? WHERE id=?",(proj,json.dumps(cfg,ensure_ascii=False),sid)); fixed+=1 + print(" 修复:",name,"->",proj) + c.commit(); c.close() +print(" 共修复 %d 个"%fixed) +print("\n批量启动 Node") +for rnd in range(3): + items=post("/project/nodejs/get_project_list").get("data")or post("/project/nodejs/get_project_list").get("list")or[] + to_start=[it for it in items if it.get("name") and not it.get("run")] + if not to_start: print(" 全部已运行"); break + print(" 第%d轮: %d 个"%(rnd+1,len(to_start))) + for it in to_start: + n=it.get("name") + if n: + try: post("/project/nodejs/start_project",{"project_name":n}); print(" 启:",n) + except: pass + time.sleep(1.5) + time.sleep(10) +items2=post("/project/nodejs/get_project_list").get("data")or post("/project/nodejs/get_project_list").get("list")or[] +run=sum(1 for x in items2 if x.get("run")) +print("\n运行 %d / %d"%(run,len(items2))) +print("========== 完成 ==========") +PY diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_彻底去除PM2.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_彻底去除PM2.py new file mode 100644 index 00000000..11b5d494 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_彻底去除PM2.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""TAT:kr宝塔 彻底去除 PM2,仅用宝塔 Node 管理器""" +import base64, os, re, sys, time +KR_INSTANCE_ID, REGION = "ins-aw0tnqjo", "ap-guangzhou" +SCRIPT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "kr宝塔_彻底去除PM2_仅用宝塔Node_宝塔终端执行.sh") + +def _creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + p = os.path.join(d, "运营中枢", "工作台", "00_账号与API索引.md") + if os.path.isfile(p): + t = open(p).read() + sid = skey = None + for L in t.splitlines(): + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", L, re.I) + if m and "AKID" in m.group(1): sid = m.group(1).strip() + m = re.search(r"SecretKey\s*\|\s*`([^`]+)`", L, 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") + d = os.path.dirname(d) + return None, None + +def main(): + sid, skey = _creds() + if not sid or not skey: print("❌ 未配置凭证"); return 1 + with open(SCRIPT, "r", encoding="utf-8") as f: + shell = f.read() + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + cred = credential.Credential(sid, skey) + cli = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(shell.encode("utf-8")).decode() + req.InstanceIds = [KR_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 120 + req.CommandName = "kr宝塔_彻底去除PM2" + r = cli.RunCommand(req) + print("✅ TAT 已下发") + time.sleep(100) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name, f.Values = "invocation-id", [r.InvocationId] + req2.Filters = [f] + for t in (cli.DescribeInvocationTasks(req2).InvocationTaskSet or []): + tr = getattr(t, "TaskResult", None) + if tr and getattr(tr, "Output", None): + try: print(base64.b64decode(tr.Output).decode("utf-8", errors="replace")) + except: pass + return 0 + +if __name__ == "__main__": sys.exit(main()) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_负载CPU修复.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_负载CPU修复.py new file mode 100644 index 00000000..7cdfcafe --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_负载CPU修复.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""TAT:kr宝塔 负载与 CPU 过载修复(PM2 清理 + 杀高 CPU Node + 停/修/启 Node)""" +import base64, os, re, sys, time + +KR_INSTANCE_ID, REGION = "ins-aw0tnqjo", "ap-guangzhou" +SCRIPT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "kr宝塔_负载CPU修复_宝塔终端执行.sh") + + +def _creds(): + d = os.path.dirname(os.path.abspath(__file__)) + for _ in range(6): + p = os.path.join(d, "运营中枢", "工作台", "00_账号与API索引.md") + if os.path.isfile(p): + t = open(p).read() + sid = skey = None + for L in t.splitlines(): + m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", L, re.I) + if m and "AKID" in m.group(1): sid = m.group(1).strip() + m = re.search(r"SecretKey\s*\|\s*`([^`]+)`", L, 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") + d = os.path.dirname(d) + return None, None + + +def main(): + sid, skey = _creds() + if not sid or not skey: + print("❌ 未配置凭证"); return 1 + with open(SCRIPT_PATH, "r", encoding="utf-8") as f: + shell = f.read() + from tencentcloud.common import credential + from tencentcloud.tat.v20201028 import tat_client, models + cred = credential.Credential(sid, skey) + cli = tat_client.TatClient(cred, REGION) + req = models.RunCommandRequest() + req.Content = base64.b64encode(shell.encode("utf-8")).decode() + req.InstanceIds = [KR_INSTANCE_ID] + req.CommandType = "SHELL" + req.Timeout = 120 + req.CommandName = "kr宝塔_负载CPU修复" + r = cli.RunCommand(req) + print("✅ TAT inv:", r.InvocationId) + time.sleep(100) + req2 = models.DescribeInvocationTasksRequest() + f = models.Filter() + f.Name, f.Values = "invocation-id", [r.InvocationId] + req2.Filters = [f] + r2 = cli.DescribeInvocationTasks(req2) + for t in (r2.InvocationTaskSet or []): + print("状态:", getattr(t, "TaskStatus", "")) + tr = getattr(t, "TaskResult", None) + if tr: + out = getattr(tr, "Output", tr.__dict__.get("Output", "")) + if out: + try: + print(base64.b64decode(out).decode("utf-8", errors="replace")) + except Exception: + print(str(out)[:2000]) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md b/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md index 2f6a0e9d..4b32333c 100755 --- a/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md +++ b/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md @@ -41,7 +41,7 @@ python3 /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/水桥_平台 **Token 自动获取(无 token 时)**:写今日日志(如 `write_today_with_summary.py`)时,若未配置当月(如 3 月)文档 token,脚本会**自动通过飞书 API** 用 2 月文档所在知识空间列出节点、匹配标题含「3月」的文档,将 token 写入 `.feishu_month_wiki_tokens.json` 后继续写入,无需手动配置。若自动获取失败(如空间内无 3 月文档),再提示用命令行:`python3 feishu_token_cli.py set-march-token <从飞书地址栏复制的 token>`。 -**Token 出现问题时的处理**:若出现「获取文档失败」或「token 无效」,一律用命令行处理:先 `get-access-token` 确保登录有效,再 `set-march-token <正确 token>` 写入当月文档 token;写日志脚本会优先使用本地已保存的 token,确保能写入飞书。 +**Token 出现问题时的处理**:若出现「获取文档失败」或「token 无效」或 **Token 过期**,**一律直接执行**(不询问用户):`python3 feishu_token_cli.py get-access-token` 刷新;再视情况 `set-march-token <正确 token>` 写入当月文档 token;写日志脚本会优先使用本地已保存的 token,确保能写入飞书。 **今日日志 + 配图**:`write_today_with_summary.py` 写入成功后会自动生成一张「今日进度」图(本月 12%、距目标 88% 等)并上传插入到当日飞书文档;若插入图片 API 报错,图片会保存在 `参考资料/今日进度_XX.png`,可手动拖入飞书文档。 diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/3月9日_飞书日志_远志李永平.md b/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/3月9日_飞书日志_远志李永平.md new file mode 100644 index 00000000..4aca3889 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/3月9日_飞书日志_远志李永平.md @@ -0,0 +1,10 @@ +# 3月9日 飞书日志 +## 远志(玩值) +- 视频剪辑→切片→分发全网,目标 500/日 +- SOP 与视频切片做好 +## 李永平 +- 一场创业实验、yongpxu-soul 分支 +## 后台数据 +- 神射手 / 玩值电竞 见项目与端口注册表 +## Token 过期 +- 执行:python3 feishu_token_cli.py get-access-token diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/今日飞书日志_远志李永平_完整版.md b/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/今日飞书日志_远志李永平_完整版.md new file mode 100644 index 00000000..3195e119 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/今日飞书日志_远志李永平_完整版.md @@ -0,0 +1,88 @@ +# 今日飞书日志(远志+李永平+后台+上周总结) + +> 若 3 月 token 未配置,可复制下文到飞书 3 月文档「今日日期」下粘贴。 +> **Token 过期**:直接执行 `python3 feishu_token_cli.py get-access-token`,无需询问。 + +--- + +## [重要紧急] 远志(玩值) + +**T(目标)** +- 视频剪辑相关内容做成切片 → 分发到全网 +- 目标:每天发 500 个视频 +- SOP 与视频切片流程做好;接下来一个月每天要做的事列出清单 + +**N(过程)** +- 源自远志安排:整体视频剪辑→切片→分发;以量取胜,发视频+切片为核心动作 + +**T(思考)** +- 切片 SOP 标准化后,可规模化执行;一个月每日任务清单便于追踪与复盘 + +**W(工作)** +- [ ] 完善视频切片 SOP(剪辑→切片→分发) +- [ ] 制定接下来一个月每天视频任务清单 +- [ ] 执行切片并分发到全网(目标 500/日) + +**F(反馈)** +- [ ] SOP 进行中 +- [ ] 每日任务清单待输出 +- [ ] 500 视频/日 → 当日完成度 X% + +--- + +## [重要紧急] 李永平 + +**T(目标)** +- 永平交接「一场创业实验」+ yongpxu-soul 分支同步 + +**N(过程)** +- 2/26 永平交接已启动;分支与开发进度跟进 + +**T(思考)** +- 保持沟通,确保交接顺畅 + +**W(工作)** +- [ ] 一场创业实验 网站/小程序进度跟进 +- [ ] yongpxu-soul 分支同步与联调 + +**F(反馈)** +- [ ] 交接与分支 进行中 + +--- + +## [重要不紧急] 卡若(后台数据、上周总结、Token) + +**T(目标)** +- 后台数据链接整理与可访问性确认 +- 上周 3 月总结检查与优化,写清进度 +- Token 过期:直接执行命令处理 + +**N(过程)** +- 后台数据:神射手 kr-users.quwanzhi.com、玩值电竞 localhost:3001,见项目与端口注册表 +- Token 过期 → 执行:`python3 feishu_token_cli.py get-access-token` + +**T(思考)** +- Token 过期无需询问,直接命令刷新;上周总结优化便于周复盘闭环 + +**W(工作)** +- [ ] 后台数据链接登记/验证 +- [ ] 上周 3 月总结检查并优化进度 +- [ ] 飞书日志写入 + +**F(反馈)** +- [x] 后台数据链接 见 00_账号与API索引、项目与端口注册表 +- [ ] 上周总结 已检查优化 +- [x] Token 已刷新 + +--- + +## 后台数据链接(快速参考) + +| 项目 | 地址 | 说明 | +|------|------|------| +| 神射手 | kr-users.quwanzhi.com | 详见项目与端口注册表 | +| 玩值电竞 | http://localhost:3001 | Docker 部署,神射手目录启动 | +| 玩值大屏 | localhost:3034 | 项目目录 docker compose up -d | +| n8n | http://localhost:5678 | 工作流,website 编排 | + +详见:`运营中枢/工作台/项目与端口注册表.md`、`00_账号与API索引.md` diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json index 8044632f..f7c26a17 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json @@ -1,6 +1,6 @@ { - "access_token": "u-dZ4TwealBfGHhTqZmvw2tjlh143xghWpN0GaFQk026kF", - "refresh_token": "ur-c9yS96TNR75rI8FLTUzhmwlh1I31ghOPMMGaJB4027lF", + "access_token": "u-elKtEXTr14dr_RNRKQJh6Plh1I31ghgjW0GaYAg0231V", + "refresh_token": "ur-d79XTR1w55DGDdJ2C8aGijlh3A11ghOXh0GaURg022lU", "name": "飞书用户", - "auth_time": "2026-03-06T13:09:11.605836" + "auth_time": "2026-03-09T05:48:48.008966" } \ No newline at end of file diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/write_today_0321_custom.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/write_today_0321_custom.py new file mode 100644 index 00000000..60318c76 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/write_today_0321_custom.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +""" +今日飞书日志(3月21日定制):远志视频切片500/日、李永平、后台数据、上周3月总结优化、Token过期处理 +""" +import sys +from datetime import datetime +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +sys.path.insert(0, str(SCRIPT_DIR)) + +from auto_log import get_token_silent, write_log, open_result, resolve_wiki_token_for_date + + +def build_tasks_today(): + """今日:远志、李永平、后台数据、上周总结、Token 处理""" + today = datetime.now() + date_str = f"{today.month}月{today.day}日" + + return [ + { + "person": "远志(玩值)", + "events": ["视频剪辑→切片→分发全网", "每天500视频目标", "SOP与视频切片"], + "quadrant": "重要紧急", + "t_targets": [ + "视频剪辑相关内容做成切片 → 分发到全网", + "目标:每天发 500 个视频", + "SOP 与视频切片流程做好;接下来一个月每天要做的事列出清单", + ], + "n_process": [ + "源自远志安排:整体视频剪辑→切片→分发;以量取胜,发视频+切片为核心动作", + ], + "t_thoughts": [ + "切片 SOP 标准化后,可规模化执行;一个月每日任务清单便于追踪与复盘", + ], + "w_work": [ + "完善视频切片 SOP(剪辑→切片→分发)", + "制定接下来一个月每天视频任务清单", + "执行切片并分发到全网(目标 500/日)", + ], + "f_feedback": [ + "SOP 进行中 🔄", + "每日任务清单待输出 🔄", + "500 视频/日 → 当日完成度 X% 🔄", + ], + }, + { + "person": "李永平", + "events": ["一场创业实验", "yongpxu-soul 分支"], + "quadrant": "重要紧急", + "t_targets": [ + "永平交接「一场创业实验」+ yongpxu-soul 分支同步", + ], + "n_process": [ + "2/26 永平交接已启动;分支与开发进度跟进", + ], + "t_thoughts": ["保持沟通,确保交接顺畅"], + "w_work": [ + "一场创业实验 网站/小程序进度跟进", + "yongpxu-soul 分支同步与联调", + ], + "f_feedback": [ + "交接与分支 进行中 🔄", + ], + }, + { + "person": "卡若", + "events": ["后台数据链接", "上周3月总结", "Token 过期处理"], + "quadrant": "重要不紧急", + "t_targets": [ + "后台数据链接整理与可访问性确认", + "上周 3 月总结检查与优化,写清进度", + "Token 过期:直接执行命令处理", + ], + "n_process": [ + "后台数据:神射手 kr-users.quwanzhi.com、玩值电竞 localhost:3001,见项目与端口注册表", + "Token 过期 → 执行:python3 feishu_token_cli.py get-access-token", + ], + "t_thoughts": [ + "Token 过期无需询问,直接命令刷新;上周总结优化便于周复盘闭环", + ], + "w_work": [ + "后台数据链接登记/验证", + "上周 3 月总结检查并优化进度", + "飞书日志写入", + ], + "f_feedback": [ + "后台数据链接 见 00_账号与API索引、项目与端口注册表 ✅", + "上周总结 已检查优化 🔄", + "Token 已刷新 ✅", + ], + }, + ] + + +def main(): + today = datetime.now() + date_str = f"{today.month}月{today.day}日" + print("=" * 50) + print(f"📝 写入今日飞书日志(远志+李永平+后台+上周总结):{date_str}") + print("=" * 50) + + token = get_token_silent() + if not token: + print("❌ 无法获取飞书 Token,请执行:python3 feishu_token_cli.py get-access-token") + sys.exit(1) + + tasks = build_tasks_today() + target_wiki_token = resolve_wiki_token_for_date(date_str) + ok = write_log(token, date_str, tasks, target_wiki_token, overwrite=True) + if ok: + open_result(target_wiki_token) + print(f"✅ {date_str} 飞书日志已更新") + sys.exit(0) + print("❌ 写入失败") + ref_path = SCRIPT_DIR.parent / "参考资料" / f"{date_str}_飞书日志_远志李永平.md" + ref_path.parent.mkdir(parents=True, exist_ok=True) + # 生成可粘贴的 Markdown 备用 + lines = [f"# {date_str} 飞书日志\n", "## 远志(玩值)\n", "- 视频剪辑→切片→分发全网,目标 500/日\n", "- SOP 与视频切片做好\n", "## 李永平\n", "- 一场创业实验、yongpxu-soul 分支\n", "## 后台数据\n", "- 神射手 / 玩值电竞 见项目与端口注册表\n", "## Token 过期\n", "- 执行:python3 feishu_token_cli.py get-access-token\n"] + ref_path.write_text("".join(lines), encoding="utf-8") + print(f"💡 可复制 {ref_path} 内容到飞书 3 月文档粘贴") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/03_卡木(木)/木叶_视频内容/视频切片/远志_一个月每日视频任务清单.md b/03_卡木(木)/木叶_视频内容/视频切片/远志_一个月每日视频任务清单.md new file mode 100644 index 00000000..8e5f0d11 --- /dev/null +++ b/03_卡木(木)/木叶_视频内容/视频切片/远志_一个月每日视频任务清单.md @@ -0,0 +1,44 @@ +# 远志 · 一个月每日视频任务清单(模板) + +> 源自远志安排:视频剪辑→切片→分发全网,目标 **每天 500 个视频**。 +> SOP 见 `Soul竖屏切片_SKILL.md` 等;本清单按日拆解,便于执行与复盘。 + +--- + +## 每日固定动作(500 视频/日) + +| 序号 | 动作 | 数量/时长 | 说明 | +|------|------|-----------|------| +| 1 | 剪辑母片 | 视素材而定 | 粗剪/精剪,输出可切片素材 | +| 2 | 切片生成 | 目标 500 条/日 | Soul 竖屏/四屏等多尺寸 | +| 3 | 分发上传 | 500 条 | 抖音/快手/视频号/小红书等全网平台 | +| 4 | 数据记录 | 1 次 | 当日发布数、完播率等关键指标 | + +--- + +## 一周示例(按日) + +| 日期 | 剪辑任务 | 切片目标 | 分发平台 | 完成度 | +|------|----------|----------|----------|--------| +| 周一 | 母片 X 条 | 500 | 全平台 | X% | +| 周二 | 母片 X 条 | 500 | 全平台 | X% | +| 周三 | 母片 X 条 | 500 | 全平台 | X% | +| 周四 | 母片 X 条 | 500 | 全平台 | X% | +| 周五 | 母片 X 条 | 500 | 全平台 | X% | +| 周六 | 母片 X 条 | 500 | 全平台 | X% | +| 周日 | 母片 X 条 | 500 | 全平台 | X% | + +--- + +## 一个月节奏建议 + +- **第 1 周**:SOP 跑通、工具链稳定,目标 300/日 +- **第 2 周**:提速至 450/日 +- **第 3~4 周**:稳定 500/日,优化爆款率 + +--- + +## 关联文档 + +- 视频切片 SKILL:`03_卡木(木)/木叶_视频内容/视频切片/Soul竖屏切片_SKILL.md` +- 飞书日志:远志任务见当日飞书日志 diff --git a/运营中枢/工作台/2026年3月_上周总结_优化版.md b/运营中枢/工作台/2026年3月_上周总结_优化版.md new file mode 100644 index 00000000..a1234eb7 --- /dev/null +++ b/运营中枢/工作台/2026年3月_上周总结_优化版.md @@ -0,0 +1,31 @@ +# 2026 年 3 月 · 上周总结(优化版) + +> 依据 2 月末~3 月上周飞书日志与进度整理,写清进度便于周复盘闭环。 + +--- + +**[卡若复盘](2026-03-09)** + +**🎯 目标·结果·达成率** +上周(3/2~3/8):远志视频切片安排启动、李永平交接推进、飞书日志与 Token 流程固化;进度写清,达成率约 85%。 + +**📌 过程** +1. **2 月末延续**:永平交接「一场创业实验」+ yongpxu-soul 分支;一人公司 5%、玩值电竞 25%;飞书日志每日迭代 100%。 +2. **3 月初**:远志视频剪辑→切片→分发全网目标明确(500/日);SOP 与视频切片流程待输出;后台数据链接见项目与端口注册表。 +3. **Token 与日志**:Token 过期直接执行 `get-access-token` 已固化;3 月文档 token 未配置时,可复制今日飞书日志完整版到飞书粘贴。 + +**💡 反思** +1. 做得好的:远志 500 视频/日目标清晰;Token 过期处理规则已写入 Skill,无需询问。 +2. 可改进的:视频切片 SOP 与「接下来一个月每天任务清单」待产出;3 月文档 token 需配置后自动写入。 + +**📝 总结** +上周以远志(视频切片 500/日)、李永平(一场创业实验/分支)、后台数据与 Token 流程为主线;下周重点:SOP 输出、每日任务清单、3 月 token 配置。 + +**▶ 下一步执行** +- 远志:SOP + 一个月每日任务清单 + 执行切片 500/日 +- 李永平:一场创业实验/yongpxu-soul 分支推进 +- 卡若:配置 3 月 token、飞书日志持续迭代 + +--- + +*路径:运营中枢/工作台/2026年3月_上周总结_优化版.md* diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 6dad6dbd..9518a03a 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -253,3 +253,4 @@ | 2026-03-08 08:27:32 | 🔄 卡若AI 同步 2026-03-08 08:27 | 更新:金仓Gitea脚本与配置、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-08 09:02:30 | 🔄 卡若AI 同步 2026-03-08 09:02 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-08 09:14:27 | 🔄 卡若AI 同步 2026-03-08 09:14 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-08 10:53:09 | 🔄 卡若AI 同步 2026-03-08 10:53 | 更新:卡土、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index fc192d8c..8df8f97f 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -256,3 +256,4 @@ | 2026-03-08 08:27:32 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-08 08:27 | 更新:金仓Gitea脚本与配置、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-08 09:02:30 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-08 09:02 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-08 09:14:27 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-08 09:14 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-08 10:53:09 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-08 10:53 | 更新:卡土、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | diff --git a/运营中枢/工作台/复盘_负载CPU修复_20260220.md b/运营中枢/工作台/复盘_负载CPU修复_20260220.md new file mode 100644 index 00000000..945d1ec8 --- /dev/null +++ b/运营中枢/工作台/复盘_负载CPU修复_20260220.md @@ -0,0 +1,41 @@ +# 复盘:kr宝塔 负载与 CPU 过载处理 + +**[卡若复盘]**(**2026-02-20 16:00**) + +--- + +## 🎯 目标·结果·达成率 + +目标:处理 kr宝塔 负载 77%、CPU 100%、磁盘 89% 的过载问题。结果:已完成分析并执行 SSH + TAT 双通道修复脚本;新增 `kr宝塔_负载CPU修复_宝塔终端执行.sh` 与 TAT 版,参考文档已更新。达成率:执行 100%,具体效果需你在面板首页刷新确认负载与 CPU 是否回落。 + +--- + +## 📌 过程 + +1. 按 SKILL 强制顺序(宝塔 API → SSH → TAT)与前置检查要求,对负载与 CPU 做诊断评估。 +2. 分析:CPU 100% 常见原因为 PM2 自动重启失败 Node 导致死循环、或异常 Node 进程占用;负载 77% 与 CPU 满核相关;磁盘 89% 需后续单独清理。 +3. 创建 `kr宝塔_负载CPU修复_宝塔终端执行.sh`:PM2 清理 → 杀高 CPU Node(CPU>80%)→ pkill 异常 node 进程 → 停全部 Node → 修复 site.db → 批量启动。 +4. 已依次执行 SSH 与 TAT 修复(两者 exit 0);本环境无法捕获远程输出。 +5. 更新 `kr宝塔_网络与服务器卡顿_检查与处理.md`,新增「三、负载与 CPU 100% 一键修复」章节,补充脚本路径与 TAT 调用方式。 + +--- + +## 💡 反思 + +1. 负载/CPU 过载优先排查 PM2 与 Node 进程,KR 宝塔历史上曾因 PM2 重启循环导致 CPU 100%,脚本已加入 PM2 kill 与 disable。 +2. 本环境无法看到 SSH/TAT 的机内输出,是否生效需你在宝塔首页刷新确认;若未回落,请在宝塔终端手动执行脚本。 +3. 磁盘 89% 需后续单独处理(清日志、临时文件等),本次聚焦 CPU 与负载。 + +--- + +## 📝 总结 + +kr宝塔 CPU 100%、负载 77% 的根因多为 PM2 重启循环或 Node 进程异常。已创建并执行负载 CPU 修复脚本(SSH + TAT),并在参考文档中新增一键修复说明。请在面板刷新确认;若仍高,于宝塔终端执行 `kr宝塔_负载CPU修复_宝塔终端执行.sh`。 + +--- + +## ▶ 下一步执行 + +1. 刷新宝塔面板首页,查看负载与 CPU 是否回落至正常范围。 +2. 若仍 100%:宝塔 → 终端 → 打开 `scripts/kr宝塔_负载CPU修复_宝塔终端执行.sh`,全文复制粘贴执行。 +3. 磁盘 89%:可后续执行 `du -sh /www/* /var/log/*` 排查大目录,再清理日志或临时文件(见参考文档)。