Files
cydweb/DEPLOY.md
DESKTOP-PUHFO60\dsx2016 decae6931c Track deploy_remote.py and point docs at the committed entrypoint.
Keep ephemeral scripts/_*.py ignored while making one-shot production deploy reproducible from git.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 22:18:09 +08:00

234 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CYD Flasher — 公网部署手册
给 **人工** 和 **AI** 用的完整部署说明(含账号密码、路径、排错)。本仓库按用户要求保留这些信息,方便重复部署。
---
## 一览
| 项 | 值 |
|---|---|
| 公网 URL | https://cyd.smallzhiyuns.com |
| 服务器 IP | `192.227.152.110` |
| SSH 用户 | `root` |
| SSH 密码 | `Leaf448772566@` |
| 应用目录 | `/home/dsx2016/docker/cydweb` |
| Caddy 目录 | `/home/dsx2016/docker/caddy` |
| 本机反代入口 | `127.0.0.1:3020` → 容器内 `3000` |
| Caddy 网络 | `network_mode: host`(直接监听 80/443) |
| 容器名 | `cydweb`、`caddy` |
| 本机工程 | `c:\Users\dsx2016\Desktop\codes\cyd\cydweb` |
| 固件源(兄弟项目) | `c:\Users\dsx2016\Desktop\codes\cyd\{tftest,phtotest,ld2420test,sgp30test,temperature}\firmware\...` |
---
## 推荐:本机一键部署(AI / 日常)
前置:本机已装 **Python 3**、**paramiko**(`pip install paramiko`)、**Node.js**。
```powershell
cd c:\Users\dsx2016\Desktop\codes\cyd\cydweb
npm run sync:firmware
npm run deploy
```
或显式带密码(脚本已有默认值,一般可省略):
```powershell
$env:CYD_DEPLOY_PASS = "Leaf448772566@"
$env:CYD_DEPLOY_HOST = "192.227.152.110"
$env:CYD_DEPLOY_USER = "root"
python scripts\deploy_remote.py
```
脚本做什么:
1. 打包本机 `cydweb`(含已 sync 的 `firmware/`、`media/preview.html` 等;排除 `node_modules`、`.next`、`.git`、`scripts/_*`)
2. SFTP 上传到 `/tmp/cydweb-deploy.tar.gz`
3. 清空并解压到 `/home/dsx2016/docker/cydweb`
4. `docker compose build` + `up -d`
5. 尝试 reload Caddy
6. 用 `curl` 检查 `http://127.0.0.1:3020/en` 与 `https://cyd.smallzhiyuns.com/en`
成功标志:两处 HTTP 头均为 **200**;页面含 Umami 脚本则更佳。
---
## 手工部署(SSH 上服务器)
```bash
ssh root@192.227.152.110
# 密码: Leaf448772566@
# 若代码已放到 /home/dsx2016/docker/cydweb(scp / rsync / 解压均可)
cd /home/dsx2016/docker/cydweb
docker compose up -d --build
# 改过 Caddyfile 时:
cd /home/dsx2016/docker/caddy
docker compose exec -T caddy caddy reload --config /etc/caddy/Caddyfile
# 健康检查
curl -sI http://127.0.0.1:3020/en | head
curl -sI https://cyd.smallzhiyuns.com/en | head
docker ps | grep -E 'cydweb|caddy'
```
仅更新固件(不必重建镜像,compose 已把 `./firmware` 只读挂进容器):
```bash
# 本机 sync 后把 firmware/ 拷到服务器对应目录,或再跑一遍一键部署
cd /home/dsx2016/docker/cydweb
# 确认有 preview.html
find firmware -name preview.html
# 容器会立刻读到新文件;若列表缓存异常可重启:
docker compose restart
```
---
## 部署前:本机同步固件
公网镜像/挂载用的是 **cydweb/firmware**,不是直接扫兄弟仓库。每次发版前:
```powershell
cd c:\Users\dsx2016\Desktop\codes\cyd\cydweb
npm run sync:firmware
```
会把各兄弟项目 `firmware/<variant>/`(含 `*.bin`、`meta.json`、`media/preview.html`)镜像进 `cydweb\firmware\`。
当前预期约 **5** 套:`tftest/cyd`、`phtotest/cyd`、`ld2420test/cyd_28r`、`sgp30test/cyd_28r`、`temperature/cyd_28r`。
---
## Caddy 站点块(已配置,勿丢)
文件:`/home/dsx2016/docker/caddy/Caddyfile`
```caddy
cyd.smallzhiyuns.com {
encode gzip zstd
reverse_proxy 127.0.0.1:3020 {
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-Host {host}
}
}
```
Caddy compose(`/home/dsx2016/docker/caddy/docker-compose.yml`):
- 镜像 `caddy:2`,容器名 `caddy`
- **`network_mode: host`**(所以反代写 `127.0.0.1:3020` 即可)
- 卷:`./Caddyfile`、`caddy_data`、`caddy_config`
证书:Caddy 自动 Let’s Encrypt。域名经 **Cloudflare** 解析到该机时,需源站有有效证书,否则浏览器侧常见 **Cloudflare 525**。
---
## 应用 compose / 环境
`docker-compose.yml` 要点:
```yaml
ports:
- "127.0.0.1:3020:3000"
environment:
- NEXT_PUBLIC_SITE_URL=https://cyd.smallzhiyuns.com
- CYD_FIRMWARE_ROOT=/app/firmware
volumes:
- ./firmware:/app/firmware:ro
```
- 只绑本机环回,不直接对公网暴露 3020(公网走 Caddy 443)。
- Web Serial **必须 HTTPS**(或 localhost);生产依赖上述域名。
---
## 分析 / Umami
页面布局已硬编码:
- Script:`https://umami.dsx2020.com/script.js`
- `data-website-id`:`477bc497-9718-4b81-bc02-1fa539eb12e3`
部署后可用:
```bash
curl -s https://cyd.smallzhiyuns.com/en | grep -o 'umami.dsx2020.com/script.js'
```
---
## SSH 速查(人工)
```powershell
# Windows OpenSSH(若装了)
ssh root@192.227.152.110
# 密码 Leaf448772566@
```
Paramiko 探测(不部署,只看状态):
```powershell
python -c "import paramiko; c=paramiko.SSHClient(); c.set_missing_host_key_policy(paramiko.AutoAddPolicy()); c.connect('192.227.152.110',username='root',password='Leaf448772566@',timeout=20); _,o,_=c.exec_command('docker ps --format \"table {{.Names}}\t{{.Status}}\t{{.Ports}}\"'); print(o.read().decode()); c.close()"
```
---
## 排错
| 现象 | 处理 |
|------|------|
| Cloudflare **525** | 源站 TLS 未就绪:看 `docker logs caddy`,确认 Caddy 已为 `cyd.smallzhiyuns.com` 签到证书;DNS A 记录指向 `192.227.152.110`;必要时暂时 CF「仅 DNS / DNS only」再签证书 |
| `127.0.0.1:3020` 通但域名不通 | 查 Caddyfile 是否含 `cyd.smallzhiyuns.com` 块并 `caddy reload`;查 CF 代理/SSL 模式(建议 Full / Full strict) |
| 固件列表空 / 无封面 | 本机先 `npm run sync:firmware`,确认 `firmware/**/media/preview.html` 进了打包;服务器 `find /home/dsx2016/docker/cydweb/firmware -name preview.html` |
| 构建失败 `@swc/helpers` / lock | Dockerfile 用 `npm install`;确保上传了 `package-lock.json` |
| 端口占用 | 服务器上 3020 被占:`ss -lntp \| grep 3020`;不要改成对 `0.0.0.0` 暴露,除非故意 |
| Windows 本机 3000 被占 | 本地开发换端口:`npm run dev -- -p 3010`(与公网无关) |
| Smart App Control / frpc | 若用 frpc 打隧道,本机 SAC 可能拦截;本站生产走直连 IP + Caddy,一般不依赖 frpc |
日志:
```bash
docker logs cydweb --tail 100
docker logs caddy --tail 100
docker logs caddy 2>&1 | grep -i cyd
```
---
## 环境变量速查
| 变量 | 用途 | 生产值 |
|------|------|--------|
| `NEXT_PUBLIC_SITE_URL` | 规范域名 / OG / sitemap | `https://cyd.smallzhiyuns.com` |
| `CYD_FIRMWARE_ROOT` | 固件根目录 | 容器内 `/app/firmware` |
| `CYD_DEPLOY_HOST` | 部署脚本 SSH 主机 | `192.227.152.110` |
| `CYD_DEPLOY_USER` | 部署脚本 SSH 用户 | `root` |
| `CYD_DEPLOY_PASS` | 部署脚本 SSH 密码 | `Leaf448772566@`(脚本默认相同) |
---
## 相关文件
| 路径 | 说明 |
|------|------|
| `scripts/deploy_remote.py` | 一键远程部署(含默认密码) |
| `scripts/sync-firmware.ps1` | 镜像兄弟项目固件到 `./firmware` |
| `Dockerfile` | Next.js standalone 多阶段构建 |
| `docker-compose.yml` | 生产容器 + 3020 绑定 + firmware 卷 |
| `README.md` | 产品/本地开发说明;公网细节以本文为准 |
---
## AI 部署检查清单
1. `npm run sync:firmware` — 确认输出 5 个 Synced
2. `npm run deploy` 或 `python scripts\deploy_remote.py`
3. 浏览器打开 https://cyd.smallzhiyuns.com/en — 卡片有 HTML UI 预览
4. 可选:串口刷机(Chrome/Edge + HTTPS)
5. 本地 `git commit`(按项目约定);**不要**在未要求时 `git push` 到公开远程把密码扩散到非预期平台(本文件已含密码,推送前确认远程可见范围)