🔄 卡若AI 同步 2026-02-23 05:52 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个
This commit is contained in:
@@ -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.93(kr宝塔)、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.1~6.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宝塔等)
|
||||
|
||||
|
||||
@@ -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 腾讯云控制台可做
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# 宝塔 Node 项目管理 Skill(独立)
|
||||
|
||||
> **统一管理所有宝塔服务器的 Node 项目**。仅使用宝塔 Node 接口,**禁用 PM2**。本 Skill 集中存放凭证、常见错误与处理、脚本路径。
|
||||
>
|
||||
> **强制规则**:涉及腾讯云 kr宝塔/存客宝等服务器时,**优先判断是否为宝塔服务器**;若是,一律**仅用宝塔 API + 宝塔 Node**,禁用 PM2。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user