diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md b/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md index fed33609..982468fa 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md @@ -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宝塔等) diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md index 9084da30..e3a9b640 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md @@ -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 腾讯云控制台可做 diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/宝塔Node项目管理_SKILL.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/宝塔Node项目管理_SKILL.md index 4b653631..1c8ce5b3 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/references/宝塔Node项目管理_SKILL.md +++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/宝塔Node项目管理_SKILL.md @@ -1,6 +1,8 @@ # 宝塔 Node 项目管理 Skill(独立) > **统一管理所有宝塔服务器的 Node 项目**。仅使用宝塔 Node 接口,**禁用 PM2**。本 Skill 集中存放凭证、常见错误与处理、脚本路径。 +> +> **强制规则**:涉及腾讯云 kr宝塔/存客宝等服务器时,**优先判断是否为宝塔服务器**;若是,一律**仅用宝塔 API + 宝塔 Node**,禁用 PM2。 --- diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py index b6b155ea..617bbbcd 100644 --- a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py @@ -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 diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_修复souladmin_500.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_修复souladmin_500.py new file mode 100644 index 00000000..1054c944 --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_kr宝塔_修复souladmin_500.py @@ -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()) diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/mount_diskstation_1tb.sh b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/mount_diskstation_1tb.sh new file mode 100755 index 00000000..a78dcdba --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/mount_diskstation_1tb.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# ============================================ +# 家里 DiskStation 1TB 共享 - 外网挂载到 Finder 侧栏「位置」 +# 挂载后可直接存文件,Finder 拷贝时会显示速率 +# 外网通过 frp 端口 4452 访问 SMB(需先在 NAS 添加 frpc 配置) +# ============================================ + +NAS_HOST="opennas2.quwanzhi.com" +NAS_PORT="4452" +NAS_USER="admin" +# 密码:与 DSM 登录一致 +NAS_PASS="zhiqun1984" +# 共享名:DSM 中的共享文件夹名,常见为 共享、homes +SHARE="共享" +MOUNT_POINT="$HOME/DiskStation-1TB" + +# 已挂载则先卸载 +if mount | grep -q "DiskStation-1TB"; then + echo "正在卸载旧挂载..." + umount "$MOUNT_POINT" 2>/dev/null + sleep 1 +fi + +mkdir -p "$MOUNT_POINT" +echo "正在挂载家里 DiskStation (${NAS_HOST}:${NAS_PORT})..." +mount_smbfs "//${NAS_USER}:${NAS_PASS}@${NAS_HOST}:${NAS_PORT}/${SHARE}" "$MOUNT_POINT" 2>&1 + +if mount | grep -q "DiskStation-1TB"; then + echo "挂载成功: $MOUNT_POINT" + echo "添加到 Finder 侧栏:在 Finder 中把「DiskStation-1TB」拖到侧栏「位置」下即可" + echo "直接往里拷贝文件,Finder 会显示传输速率" + open "$MOUNT_POINT" +else + echo "挂载失败。请确认:1) 家里 NAS frpc 已添加 SMB 4452 端口 2) NAS_PASS 正确 3) 共享名为 ${SHARE}" + exit 1 +fi diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/双NAS区分_公司CKB与家里Station.md b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/双NAS区分_公司CKB与家里Station.md index 56808a04..bb6d9fbd 100644 --- a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/双NAS区分_公司CKB与家里Station.md +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/双NAS区分_公司CKB与家里Station.md @@ -74,6 +74,9 @@ | **MariaDB** | 3306 | **33062** | opennas2.quwanzhi.com:33062 | | **Telnet** | 23 | **2302** | opennas2.quwanzhi.com:2302 | | **DSM(HTTP域名)** | 5000 | **80** | http://opennas2.quwanzhi.com | +| **SMB 文件共享** | 445 | **4452** | smb://opennas2.quwanzhi.com:4452/共享 | + +> SMB 需在 frpc.ini 中手动添加 `[home-nas-smb]` 段,见 `家里DiskStation_外网挂载1TB到Finder侧栏.md`。 --- diff --git a/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/家里DiskStation_外网挂载1TB到Finder侧栏.md b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/家里DiskStation_外网挂载1TB到Finder侧栏.md new file mode 100644 index 00000000..b383276a --- /dev/null +++ b/01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/家里DiskStation_外网挂载1TB到Finder侧栏.md @@ -0,0 +1,81 @@ +# 家里 DiskStation 1TB 共享 · 外网挂载到 Finder 侧栏「位置」 + +外网像本地硬盘一样访问 DiskStation 的 1TB 共享,出现在 Finder 侧栏,拷贝时显示速率。 + +--- + +## 一、前置:添加 SMB 外网穿透(仅需一次) + +家里 NAS 的 frpc 默认**未**开放 SMB。需在 DSM 或 SSH 添加: + +### 方法 A:SSH 添加(在家时) + +```bash +# 连接家里 NAS +ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o Ciphers=+aes128-cbc,3des-cbc,aes256-cbc \ + admin@192.168.110.29 + +# 在 frpc.ini 末尾追加(共享名若为「共享」用 %E5%85%B1%E4%BA%AB,通常直接用共享的英文名) +echo ' +# SMB 文件共享(外网端口 4452 → NAS 445) +[home-nas-smb] +type = tcp +local_ip = 127.0.0.1 +local_port = 445 +remote_port = 4452 +' >> /volume1/homes/admin/frpc/frpc.ini + +# 重启 frpc +/volume1/homes/admin/frpc/start_frpc.sh +``` + +### 方法 B:直接编辑 frpc.ini + +1. DSM → **文件服务** 或 **控制面板**,找到 frpc 相关说明 +2. 或 SSH 登录后:`vi /volume1/homes/admin/frpc/frpc.ini` +3. 在 `[common]` 之后、其它 `[xxx]` 块后追加: + +```ini +# SMB 文件共享(外网 4452 → NAS 445) +[home-nas-smb] +type = tcp +local_ip = 127.0.0.1 +local_port = 445 +remote_port = 4452 +``` + +4. 保存后执行:`/volume1/homes/admin/frpc/start_frpc.sh` + +> **端口说明**:4452 与 CKB 的 4450 区分,避免冲突。若 frps 上 4452 被占,可改为 4453 等。 + +--- + +## 二、挂载到 Finder 侧栏 + +### 方式 A:Finder 连接(推荐) + +1. Finder → **前往** → **连接服务器**(⌘K) +2. 输入:`smb://opennas2.quwanzhi.com:4452/共享` + - 共享名若不是「共享」,改为 DSM 里实际名称(如 `homes`、`TimeMachine`) +3. 连接,输入 DSM 账号密码,勾选「在钥匙串中记住」 +4. 挂载后拖到 Finder 侧栏「位置」即可固定 + +### 方式 B:脚本挂载 + +```bash +/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/mount_diskstation_1tb.sh +``` + +挂载点:`~/DiskStation-1TB`,在 Finder 中拖到侧栏「位置」固定。 + +--- + +## 三、传输速率 + +Finder 往该共享拷贝文件时,会显示进度和速率(与本地磁盘一致)。 + +--- + +## 四、开机自动挂载(可选) + +将脚本加入 **系统设置 → 通用 → 登录项**,或使用 LaunchAgent 在登录时执行挂载脚本。 diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 7497017d..b8ccecae 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -97,3 +97,4 @@ | 2026-02-22 14:59:42 | 🔄 卡若AI 同步 2026-02-22 14:59 | 更新:金仓、卡木、运营中枢工作台 | 排除 >20MB: 8 个 | | 2026-02-22 15:08:03 | 🔄 卡若AI 同步 2026-02-22 15:07 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个 | | 2026-02-22 16:00:09 | 🔄 卡若AI 同步 2026-02-22 16:00 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个 | +| 2026-02-22 19:02:34 | 🔄 卡若AI 同步 2026-02-22 19:02 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 9c20b23f..7000966c 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -100,3 +100,4 @@ | 2026-02-22 14:59:42 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-22 14:59 | 更新:金仓、卡木、运营中枢工作台 | 排除 >20MB: 8 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-02-22 15:08:03 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-22 15:07 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-02-22 16:00:09 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-22 16:00 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-02-22 19:02:34 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-22 19:02 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 8 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |