diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..a86dff5 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,44 @@ +name: Deploy + +on: + push: + branches: + - main + workflow_dispatch: + +concurrency: + group: production-deploy + cancel-in-progress: false + +permissions: + contents: read + +jobs: + deploy: + name: Deploy to Cloudflare + runs-on: ubuntu-latest + timeout-minutes: 15 + env: + CLOUDFLARE_ACCOUNT_ID: ${{ vars.CLOUDFLARE_ACCOUNT_ID }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.12.0 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Check project + run: npm run check + + - name: Apply D1 migrations + run: npx wrangler d1 migrations apply DB --remote + + - name: Deploy Worker + run: npm run deploy diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 7047770..643b46c 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -24,7 +24,7 @@ ### 部署顺序 1. 检查 Cloudflare 已有 Worker、D1;确认目标应用为本项目,避免覆盖其他项目。不自动读取或配置 Zero Trust。 -2. 复用或创建 `edgessh-accounts`,将真实 `database_id` 写入 `wrangler.toml`。初始全零 ID 只是占位。 +2. 复用或创建 `edgessh-accounts`,将目标环境的真实 `database_id` 写入 `wrangler.toml`;仓库当前配置的是线上数据库。 3. Zero Trust 应用、域名及单管理员 Allow 策略由用户自行配置,本项目部署过程不代为创建或修改。 4. 用户配置 Access 后,分别通过 `wrangler secret put ACCESS_TEAM_DOMAIN` 与 `wrangler secret put ACCESS_AUD` 注入。所有账号、主机与连接 API 均需 Access 保护;`workers.dev` 只允许固定测试 IP 的无敏感信息诊断。缺少这两个 Secret 时可先部署,但受保护 API 会返回 503,不能操作主机或连接 SSH。 5. **只在首次部署时生成密钥**,通过标准输入执行 `wrangler secret put ENCRYPTION_KEY` 注入。不要在命令参数、源码、日志或明文配置里输出密钥。已有 Secret 必须复用,不可随意覆盖。 @@ -33,6 +33,19 @@ 密钥丢失将无法解密现有资料。更换密钥必须设计旧密钥解密、新密钥重加密的迁移,不可直接覆盖 Secret。当前版本不提供自动轮换。更换 Access 团队或身份导致 `sub` 改变时,也需要显式的数据迁移。 +### GitHub Actions + +`.github/workflows/deploy.yml` 在推送到 `main` 或手动触发时依次执行安装、项目检查、远程 D1 迁移与 Worker 部署。生产部署使用并发锁串行执行,避免迁移和 Worker 版本交错。 + +仓库只需配置两个 Actions 值: + +| 名称 | 配置位置 | 要求 | +| --- | --- | --- | +| `CLOUDFLARE_ACCOUNT_ID` | Actions Variable | 目标 Cloudflare 账户 ID | +| `CLOUDFLARE_API_TOKEN` | Actions Secret | 限定到目标账户,并具备 Workers 部署与 D1 迁移权限 | + +三个运行时 Worker Secret 不进入 GitHub Actions。首次部署或主动轮换时仍使用 `wrangler secret put` 单独管理;日常自动部署只复用 Cloudflare 中已有值。 + ## 验收清单(5.6 SOL 执行) - `npm run typecheck`、`npm test`、`npm run build:web`、Wrangler dry-run。 @@ -55,13 +68,13 @@ - 首页为中文;原 SSH 工作台保留中英文切换。 - 国旗使用本地 `flag-icons` SVG(MIT,许可证随静态资源部署),在 Windows 上也显示实际旗帜,不依赖 emoji 字体。 -## 2026-09-18 线上部署记录 +## 2026-09-19 线上部署记录 - 正式入口:`https://ssh.dltwcnm.ccwu.cc` - D1:`edgessh-accounts`(`2c1b7a95-a5d6-4a72-a8d2-4132b74aa268`) - D1 schema:`hosts`、`d1_migrations`;记录数分别为 0、1 -- 活动版本:`18e848ff-31ea-4dda-87de-6759720c72f1`(地球转速 1.5 倍、定位服务回退、强制重新定位与诊断入口) -- Secret 名称:`ENCRYPTION_KEY`、`ACCESS_TEAM_DOMAIN`、`ACCESS_AUD`;本次仅注入两个 Access Secret,未读取或覆盖 `ENCRYPTION_KEY` +- 活动版本:`e587a233-7767-4a3d-ba67-0ba8fa255285` +- Secret 名称:`ENCRYPTION_KEY`、`ACCESS_TEAM_DOMAIN`、`ACCESS_AUD`;本次部署未读取或覆盖任何运行时 Secret - 无会话 Smoke:正式入口 `/` 与 `/api/auth/me` 均返回 Access 302,TLS 正常;未记录重定向地址、Team Domain、AUD、JWT、Cookie 或 Secret 值 - 诊断入口:`workers.dev` 已开启,仅额外公开固定 `8.8.8.8` 的定位链路检查;账号、主机、凭据与 SSH 等接口仍必须通过 Access JWT 校验 - 待验收:需要用户登录 Access 后验收账号 API,并使用真实授权 SSH 目标验收终端、SFTP 与进程面板 diff --git a/README.md b/README.md index fbd1106..166b868 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,17 @@ npm run deploy 完整配置顺序、安全边界与验收清单见 [部署指南](DEPLOYMENT.md)。 +### GitHub Actions 自动部署 + +仓库内置的 `Deploy` workflow 会在推送到 `main` 后自动检查、迁移 D1 并部署,也可在 Actions 页面手动触发。首次使用前,在仓库的 `Settings > Secrets and variables > Actions` 中配置: + +| 名称 | GitHub 配置类型 | 用途 | +| --- | --- | --- | +| `CLOUDFLARE_ACCOUNT_ID` | Variable | Cloudflare 账户 ID | +| `CLOUDFLARE_API_TOKEN` | Secret | 具备 Workers 部署和 D1 迁移权限的 API Token | + +Action 只需要这两项部署凭据。`ACCESS_TEAM_DOMAIN`、`ACCESS_AUD` 与 `ENCRYPTION_KEY` 继续作为 Worker Secret 保存在 Cloudflare,普通部署不会读取或覆盖它们。API Token 属于敏感信息,必须使用 GitHub Secret,不能保存为普通 Variable。 + ## 本地开发 安装依赖并准备本地变量: @@ -175,6 +186,7 @@ npm run dev ```text EdgeSSH/ +├── .github/workflows/ # GitHub Actions 自动部署 ├── frontend/ # 主机总览、地球可视化与 SSH 工作台 ├── src/ │ ├── accounts/ # Access 认证、主机管理与加密存储