docs(memory): status.xpcool.com 切换 HTTPS 完成,沉淀 SSH 远程部署坑位
This commit is contained in:
parent
3a5beaf963
commit
f2bbcd28d1
@ -1,5 +1,7 @@
|
|||||||
# 2026-09-13
|
# 2026-09-13
|
||||||
|
|
||||||
|
2026-09-13 | CFG | status.xpcool.com 切换 HTTPS:腾讯云 DV 证书落到 /data/nginx/ssl/status.xpcool.com/(key 600),80→301→443 生效,公网验证 ssl_verify=0、证书有效期至 2026-12-12
|
||||||
|
2026-09-13 | FIX | 沉淀 SSH 远程部署两个坑:多行脚本经 ssh.exe 传参会因括号导致 bash 语法错误;多文件 scp 静默丢文件 → 改为「本地 .sh + 单文件 scp + 幂等脚本」
|
||||||
2026-09-13 | CFG | status.xpcool.com:新增 nginx 反代配置(先 HTTP,含 WebSocket 透传),nginx -t 通过并已 reload
|
2026-09-13 | CFG | status.xpcool.com:新增 nginx 反代配置(先 HTTP,含 WebSocket 透传),nginx -t 通过并已 reload
|
||||||
2026-09-13 | DEP | 部署 Uptime Kuma 2.5.3 监控面板:容器 `uptime-kuma`,127.0.0.1:3001,数据 `/data/uptime-kuma`,内存限 512m,healthy
|
2026-09-13 | DEP | 部署 Uptime Kuma 2.5.3 监控面板:容器 `uptime-kuma`,127.0.0.1:3001,数据 `/data/uptime-kuma`,内存限 512m,healthy
|
||||||
2026-09-13 | DOC | MEMORY.md 瘦身:生产部署/安全加固/工具链坑位拆到同目录 DEPLOY.md;新增「站点与容器清单」表
|
2026-09-13 | DOC | MEMORY.md 瘦身:生产部署/安全加固/工具链坑位拆到同目录 DEPLOY.md;新增「站点与容器清单」表
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
> MEMORY.md 只保留规则与索引。
|
> MEMORY.md 只保留规则与索引。
|
||||||
|
|
||||||
## 生产部署(腾讯云 193.112.118.168,SSH 22025/xxcool,Docker+宿主机 Nginx)
|
## 生产部署(腾讯云 193.112.118.168,SSH 22025/xxcool,Docker+宿主机 Nginx)
|
||||||
- 站点落点:前端静态 → `/data/www/<域名>/`;nginx 配置 → `/data/nginx/conf.d/<域名>.conf`(80→301→443 + 反代/静态);证书 → `/data/nginx/ssl/<域名>/<域名>_bundle.crt|.key`(本地源:`E:\xxcool\ssl\<域名>_nginx/`)。
|
- 站点落点:前端静态 → `/data/www/<域名>/`;nginx 配置 → `/data/nginx/conf.d/<域名>.conf`(80→301→443 + 反代/静态);证书 → `/data/nginx/ssl/<域名>/<域名>_bundle.crt|.key`(**本地源:`E:\CentOS\ssl\<域名>_nginx/`**,2026-09-13 核对;证书只放 `_bundle.crt`+`.key`,`.csr`/`.pem` 一并留存便于比对)。
|
||||||
- service 后端容器:`service.xpcool.com:new`,`127.0.0.1:10100:10100`,网络 `xpcool-net`,env:`GF_GCFG_ENV=prod` + `DB_DSN=mysql:service:xxx@tcp(xpcool-mysql:3306)/service?...`(**必须带 mysql: 类型前缀**)+ `JWT_SECRET`;容器内必须有 `manifest/config/config.yaml`(基础配置),否则 GF 启动报「找不到 config」;构建目录 `/data/deploy/projects/service.xpcool.com/`(main + manifest/config + resource,Dockerfile 用 COPY manifest/config 整体拷贝)。
|
- service 后端容器:`service.xpcool.com:new`,`127.0.0.1:10100:10100`,网络 `xpcool-net`,env:`GF_GCFG_ENV=prod` + `DB_DSN=mysql:service:xxx@tcp(xpcool-mysql:3306)/service?...`(**必须带 mysql: 类型前缀**)+ `JWT_SECRET`;容器内必须有 `manifest/config/config.yaml`(基础配置),否则 GF 启动报「找不到 config」;构建目录 `/data/deploy/projects/service.xpcool.com/`(main + manifest/config + resource,Dockerfile 用 COPY manifest/config 整体拷贝)。
|
||||||
- DB:`xpcool-mysql` 容器(root 密码见该容器 env),库名 `service`,种子执行顺序 003→004→004b→007(服务器表结构旧,必须先 003 加列;导入用 `sudo sh -c 'docker exec -i xpcool-mysql mysql ... < file'` 宿主机重定向)。
|
- DB:`xpcool-mysql` 容器(root 密码见该容器 env),库名 `service`,种子执行顺序 003→004→004b→007(服务器表结构旧,必须先 003 加列;导入用 `sudo sh -c 'docker exec -i xpcool-mysql mysql ... < file'` 宿主机重定向)。
|
||||||
- 权限映射:admin_menu type=2 行的 path 必须匹配实际路由(现为 `POST /api/service/admin/...`,见 manifest/sql/007_menu_permissions_v3.sql)。
|
- 权限映射:admin_menu type=2 行的 path 必须匹配实际路由(现为 `POST /api/service/admin/...`,见 manifest/sql/007_menu_permissions_v3.sql)。
|
||||||
@ -29,6 +29,9 @@
|
|||||||
- 测入站**不要用 ping**:Windows 默认拦 ICMPv6/ICMP 入站,必须用 TCP 端口测试。
|
- 测入站**不要用 ping**:Windows 默认拦 ICMPv6/ICMP 入站,必须用 TCP 端口测试。
|
||||||
- 国内测速:Cloudflare 端点不可用;用 **Ookla 官方 CLI**(`install.speedtest.net` 可直连下载)。
|
- 国内测速:Cloudflare 端点不可用;用 **Ookla 官方 CLI**(`install.speedtest.net` 可直连下载)。
|
||||||
- 本机网络备注:家里的宽带是**运营商级 NAT(CGNAT,第 2 跳 100.64.0.1)**,无公网 IPv4;但有**公网 IPv6**(`240e:338:263:3600::/64`)。以太网被判定为 Public 网络档。
|
- 本机网络备注:家里的宽带是**运营商级 NAT(CGNAT,第 2 跳 100.64.0.1)**,无公网 IPv4;但有**公网 IPv6**(`240e:338:263:3600::/64`)。以太网被判定为 Public 网络档。
|
||||||
|
- **经 `ssh.exe` 执行多行脚本会踩转义坑(2026-09-13 实测)**:把多行 here-string 直接当参数传给 `ssh.exe`,远程 bash 解析到 `(` 等字符会报 `syntax error near unexpected token '('`,**而且报错前的行已经执行了**,导致状态半途而废(证书只搬了一半)。**可靠做法**:本地写 `.sh` 文件(用 `-replace "`r`n","`n"` 强制 LF + `WriteAllText` UTF-8 无 BOM)→ **单独** `scp` 上传 → `ssh "chmod +x /tmp/x.sh && /tmp/x.sh"` 执行。注意 `echo <b64> | base64 -d | bash` 会被 PowerShell 工具安全策略直接拦截("Spawning a non-PowerShell shell")。
|
||||||
|
- **多源文件 `scp` 不可靠(2026-09-13 实测)**:一次 `scp a b c d e host:/tmp/` 只落地了其中 2 个,且**没有任何报错**。**每次只 scp 一个文件**;脚本内用 `for` + `[ -f ]` 判断做幂等补齐,避免重复上传。
|
||||||
|
- **远程脚本一律写成幂等**(`if [ -f ]` 判断后再 `mv -f`),因为 SSH 调用可能被沙箱拦截/用户误拒而中断,重跑不能出错。
|
||||||
|
|
||||||
## 站点与容器清单(2026-09-13 核对)
|
## 站点与容器清单(2026-09-13 核对)
|
||||||
> 服务器 193.112.118.168,容器均为 `restart unless-stopped`;除特别标注外只监听 `127.0.0.1`,由宿主机 nginx 反代。
|
> 服务器 193.112.118.168,容器均为 `restart unless-stopped`;除特别标注外只监听 `127.0.0.1`,由宿主机 nginx 反代。
|
||||||
@ -52,4 +55,6 @@
|
|||||||
- 启动参数:`--restart unless-stopped -p 127.0.0.1:3001:3001 -e TZ=Asia/Shanghai -v /data/uptime-kuma:/app/data --memory 512m`。服务器内存仅 3.7G 且 **swap=0**,必须限内存,避免 OOM 波及同机其他容器。
|
- 启动参数:`--restart unless-stopped -p 127.0.0.1:3001:3001 -e TZ=Asia/Shanghai -v /data/uptime-kuma:/app/data --memory 512m`。服务器内存仅 3.7G 且 **swap=0**,必须限内存,避免 OOM 波及同机其他容器。
|
||||||
- **v2 首次启动是「选择数据库」引导页**(逻辑在 `/app/server/setup-database.js`,读 `data/db-config.json`),选 SQLite 即可,之后进入创建管理员账号页。Uptime Kuma **没有找回密码入口**,密码丢失只能改数据库/清 2FA,务必记牢。
|
- **v2 首次启动是「选择数据库」引导页**(逻辑在 `/app/server/setup-database.js`,读 `data/db-config.json`),选 SQLite 即可,之后进入创建管理员账号页。Uptime Kuma **没有找回密码入口**,密码丢失只能改数据库/清 2FA,务必记牢。
|
||||||
- nginx 反代**必须透传 WebSocket**(`proxy_http_version 1.1` + `Upgrade`/`Connection` 头),否则面板无限重连、状态刷不出来。
|
- nginx 反代**必须透传 WebSocket**(`proxy_http_version 1.1` + `Upgrade`/`Connection` 头),否则面板无限重连、状态刷不出来。
|
||||||
|
- **证书**:腾讯云免费 DV,CN/SAN 均为 `status.xpcool.com`,**有效期仅 3 个月(至 2026-12-12),到期必须重新申请并替换**;落点 `/data/nginx/ssl/status.xpcool.com/`(crt/pem/csr 644、key 600),本地源 `E:\CentOS\ssl\status.xpcool.com_nginx\`。部署时用 `openssl x509 -pubkey | md5` 与 `openssl pkey -pubout | md5` 比对,确认证书与私钥配套。
|
||||||
|
- 访问形态:`http:// → 301 → https://`;公网实测 `ssl_verify=0`、响应约 0.45s(2026-09-13)。
|
||||||
- nginx 配置模板见 `.workbuddy/tmp/status.xpcool.com.conf`。
|
- nginx 配置模板见 `.workbuddy/tmp/status.xpcool.com.conf`。
|
||||||
|
|||||||
@ -1,11 +1,28 @@
|
|||||||
# status.xpcool.com 服务监控面板(Uptime Kuma 2.5.3)
|
# status.xpcool.com 服务监控面板(Uptime Kuma 2.5.3)
|
||||||
# 反代后端容器 uptime-kuma:127.0.0.1:3001
|
# 反代后端容器 uptime-kuma:127.0.0.1:3001
|
||||||
# 2026-09-13 首次部署:先以 HTTP 提供(便于完成初始化与验证)
|
# 2026-09-13 部署;证书为腾讯云免费 DV 证书(本地源 E:\CentOS\ssl\status.xpcool.com_nginx\)
|
||||||
# 待腾讯云免费证书到位后,改为「80 -> 301 -> 443」标准形态
|
|
||||||
|
|
||||||
|
# HTTP -> HTTPS 跳转
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name status.xpcool.com;
|
server_name status.xpcool.com;
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name status.xpcool.com;
|
||||||
|
|
||||||
|
ssl_certificate /data/nginx/ssl/status.xpcool.com/status.xpcool.com_bundle.crt;
|
||||||
|
ssl_certificate_key /data/nginx/ssl/status.xpcool.com/status.xpcool.com.key;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
|
||||||
|
# 面板内存有各类通知凭据,附加基础安全响应头
|
||||||
|
add_header Strict-Transport-Security "max-age=31536000" always;
|
||||||
|
add_header X-Content-Type-Options nosniff always;
|
||||||
|
add_header X-Frame-Options SAMEORIGIN always;
|
||||||
|
|
||||||
# 面板依赖 WebSocket 实时推送状态,必须透传 Upgrade 头,否则页面无限重连
|
# 面板依赖 WebSocket 实时推送状态,必须透传 Upgrade 头,否则页面无限重连
|
||||||
location / {
|
location / {
|
||||||
@ -17,7 +34,7 @@ server {
|
|||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
# 心跳/长轮询连接保持时间,避免面板偶发掉线
|
# 长连接保持时间,避免面板偶发掉线
|
||||||
proxy_read_timeout 300s;
|
proxy_read_timeout 300s;
|
||||||
proxy_send_timeout 300s;
|
proxy_send_timeout 300s;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user