🔄 卡若AI 同步 2026-02-23 05:52 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个

This commit is contained in:
2026-02-23 05:52:47 +08:00
parent 35eb6d5db5
commit 2709ab2ea0
10 changed files with 229 additions and 15 deletions

View File

@@ -1,7 +1,7 @@
---
name: 服务器管理
description: 宝塔服务器统一管理与自动化部署
triggers: 服务器、宝塔、部署、SSL、HTTPS、Nginx、PM2、内网穿透、域名、kr-ai、ngrok
description: 宝塔服务器统一管理与自动化部署。核心规则:宝塔服务器优先判断,仅用宝塔 API + 宝塔 Node禁用 PM2。
triggers: 服务器、宝塔、部署、SSL、HTTPS、Nginx、内网穿透、域名、kr-ai、ngrok
owner: 金仓
group: 金
version: "1.0"
@@ -51,11 +51,12 @@ kr宝塔: qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT
### 强制规则(每次执行必守)
1. **SSH 统一配置**:账号 **root**、密码 **Zhiqun1984**Z 大写),端口 22022 或 22或使用 id_ed25519 密钥。详见 `references/SSH登录方式与故障排查.md`
2. **宝塔 443 优先**:宝塔服务器 443 不监听时,**优先**检查是否运行系统 Nginx 而非宝塔 Nginx若是`killall nginx` 后启动宝塔 Nginx。详见 Q0、`_经验库/已整理/运维经验/宝塔443不监听_系统nginx与宝塔nginx优先排查.md`
3. **经验沉淀**:每次涉及服务器/宝塔/部署的操作结束后,必须把经验写入 `02_卡人/水溪_整理归档/经验库/待沉淀/`,防止同类问题重复出现
4. **Skill 迭代**:每次有新的配置、教训、流程变更时,必须同步更新本 SKILL.md 或 references保证下次调用时信息一致
5. **卡若AI 复盘**每次任务结束必须用卡若AI 复盘格式收尾(目标·结果·达成率、过程、反思、总结、下一步)
1. **宝塔服务器优先判断**:涉及腾讯云 43.139.27.93kr宝塔、42.194.245.239(存客宝)等服务器时,**优先判断是否为宝塔服务器**;若是,一律**仅用宝塔 API + 宝塔 Node** 操作,**禁用 PM2**
2. **SSH 统一配置**:账号 **root**、密码 **Zhiqun1984**Z 大写),端口 22022 或 22或使用 id_ed25519 密钥。详见 `references/SSH登录方式与故障排查.md`
3. **宝塔 443 优先**:宝塔服务器 443 不监听时,**优先**检查是否运行系统 Nginx 而非宝塔 Nginx若是`killall nginx` 后启动宝塔 Nginx。详见 Q0、`_经验库/已整理/运维经验/宝塔443不监听_系统nginx与宝塔nginx优先排查.md`
4. **经验沉淀**:每次涉及服务器/宝塔/部署的操作结束后,必须把经验写入 `02_卡人/水溪_整理归档/经验库/待沉淀/`,防止同类问题重复出现
5. **Skill 迭代**:每次有新的配置、教训、流程变更时,必须同步更新本 SKILL.md 或 references保证下次调用时信息一致
6. **卡若AI 复盘**每次任务结束必须用卡若AI 复盘格式收尾(目标·结果·达成率、过程、反思、总结、下一步)。
---
@@ -179,7 +180,7 @@ bash scripts/存客宝_lytiao_Docker部署.sh
- **SSH**`ssh -p 22022 -i "服务器管理项目/Steam/id_ed25519" root@43.139.27.93`(私钥须 `chmod 600`
- 本机快速检查:`ping 43.139.27.93``nc -zv 43.139.27.93 22022`
- 服务器内诊断与限流:在 **宝塔面板终端** 执行文档「六」中 6.16.3 命令(连接数、按 IP 统计、Nginx 限速)。
- **502 修复(soul.quwanzhi.com/admin**API 方式运行 `scripts/kr宝塔_宝塔API_修复502.py`(需 API 白名单);或到 kr宝塔 **宝塔面板 → 终端** 执行 `nginx -t && nginx -s reload`在「Node 项目」中重启 soul 相关项目。详见文档 6.6。
- **502/500 修复souladmin.quwanzhi.com**:仅用宝塔 API。本机执行 `kr宝塔_宝塔API_修复502.py`(需将本机 IP 加入 API 白名单);或 TAT 执行 `腾讯云_TAT_kr宝塔_修复souladmin_500.py`。soul.quwanzhi.com/admin 已停用。详见文档 6.6。
### 6. 常用诊断命令kr宝塔等

View File

@@ -216,19 +216,23 @@ python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储
# 1. 重载 Nginx
nginx -t && nginx -s reload
# 2. 重启 soul 相关 Node/PM2按你实际项目名调整
pm2 list
pm2 restart soul # 或 souladmin、soul-api 等
# 若用宝塔「Node 项目」管理,请在面板里对该站点点击「重启」
# 2. 重启 soul 相关 Node(仅用宝塔 API禁用 PM2
# 本机执行 kr宝塔_宝塔API_修复502.py需 API 白名单或宝塔面板「Node 项目」中对该站点点击「重启」
```
**方式三SSH**(当连接可用时)
```bash
ssh -p 22022 -i "服务器管理/Steam/id_ed25519" root@43.139.27.93 "nginx -s reload; pm2 restart soul"
ssh -p 22022 -i "服务器管理/Steam/id_ed25519" root@43.139.27.93 "nginx -s reload"
# 然后通过宝塔 API 或面板重启 Node 项目(禁用 PM2
```
修复后刷新 soul.quwanzhi.com/admin 查看是否恢复。
修复后刷新 soul.quwanzhi.com/admin 或 souladmin.quwanzhi.com 查看是否恢复。
**souladmin.quwanzhi.com 500 Internal Server Error**(域名由 Admin 点区域管制):
- **原因**:后端 Node 未运行或崩溃。soul.quwanzhi.com/admin 已停用,现用 souladmin.quwanzhi.com。
- **处理**:仅用宝塔 API 修复。本机执行 `kr宝塔_宝塔API_修复502.py`(需先将当前公网 IP 加入 kr宝塔 面板「设置 → API 接口」白名单);或 TAT 执行 `腾讯云_TAT_kr宝塔_修复souladmin_500.py`(服务器内调 127.0.0.1 无需白名单)。
### 6.7 腾讯云控制台可做

View File

@@ -1,6 +1,8 @@
# 宝塔 Node 项目管理 Skill独立
> **统一管理所有宝塔服务器的 Node 项目**。仅使用宝塔 Node 接口,**禁用 PM2**。本 Skill 集中存放凭证、常见错误与处理、脚本路径。
>
> **强制规则**:涉及腾讯云 kr宝塔/存客宝等服务器时,**优先判断是否为宝塔服务器**;若是,一律**仅用宝塔 API + 宝塔 Node**,禁用 PM2。
---

View File

@@ -89,7 +89,7 @@ def main():
print(" 请求异常:", e)
print("\n" + "=" * 56)
print("请刷新 soul.quwanzhi.com/admin 查看是否恢复。若仍 502请到宝塔面板检查该站点「反向代理」上游是否运行或重启对应 Node/PM2 项目")
print("请刷新 souladmin.quwanzhi.com 查看是否恢复soul.quwanzhi.com/admin 已停用)")
print("=" * 56)
return 0

View File

@@ -0,0 +1,85 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""TAT修复 souladmin.quwanzhi.com 500 - 重启 Nginx + soul 相关 Node"""
import base64, json, os, re, sys, time
KR_INSTANCE_ID, REGION = "ins-aw0tnqjo", "ap-guangzhou"
SHELL = r'''#!/bin/bash
echo "【1】宝塔"
! ss -tlnp 2>/dev/null | grep -q ':9988 ' && /etc/init.d/bt start 2>/dev/null; sleep 5
echo "【2】重启 Nginx"
nginx -t 2>/dev/null && nginx -s reload 2>/dev/null || /etc/init.d/nginx reload 2>/dev/null || true
echo "【3】重启 soul 相关 Node宝塔 API"
PYTHONUNBUFFERED=1 python3 -u -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(u,d=None): pl=sg(); (pl.update(d) if d else None); r=urllib.request.Request(P+u,data=urllib.parse.urlencode(pl).encode()); return json.loads(urllib.request.urlopen(r,timeout=15).read().decode())
items=post('/project/nodejs/get_project_list').get('data')or post('/project/nodejs/get_project_list').get('list')or[]
soul_proj=[x for x in items if x.get('name') and ('soul' in (x.get('name')or'').lower() or 'souladmin' in (x.get('name')or'').lower())]
if not soul_proj:
soul_proj=[x for x in items if x.get('name')]
print('soul 相关: 无,重启全部 Node',len(soul_proj),'')
else:
print('soul 相关:',[x.get('name') for x in soul_proj])
for it in soul_proj:
n=it.get('name')
try:
post('/project/nodejs/stop_project',{'project_name':n}); time.sleep(1)
r=post('/project/nodejs/start_project',{'project_name':n})
ok=r.get('status') or '成功' in str(r.get('msg',''))
print(n,':','OK' if ok else 'FAIL')
except Exception as e: print(n,': ERR',str(e)[:40])
time.sleep(2)
print('完成')
" 2>&1
'''
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
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 = 45
req.CommandName = "kr宝塔_修复souladmin_500"
r = cli.RunCommand(req)
print("✅ TAT inv:", r.InvocationId)
time.sleep(35)
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 []):
print("状态:", getattr(t, "TaskStatus", ""))
tr = getattr(t, "TaskResult", None)
if tr:
out = getattr(tr, "Output", tr.__dict__.get("Output", ""))
if out:
print(base64.b64decode(out).decode("utf-8", errors="replace"))
return 0
if __name__ == "__main__": sys.exit(main())