# prod101 DIB 数智桥站点 Docker 发布手册 ## 1. 适用范围 本文用于将 `C:\dev\dib-platform\site` 下的 DIB 数智桥静态站点发布到 prod101。 本发布方式只使用独立 Docker 容器和独立公网端口: ```text http://101.42.19.26:18082/ ``` 不要把本静态站点挂到 Supabase Kong 的 `8000` 入口;不要新增 `/dib-site/`、`/docs/` 等 Kong 路由,除非另有明确变更评审。 ## 2. 线上基线 | 项目 | 值 | | --- | --- | | 服务器 | `101.42.19.26` | | SSH 入口 | `ssh prod-101` | | 容器名 | `dib-site-web` | | 镜像 | `nginx:1.27-alpine` | | 公网端口 | `18082` | | 容器端口 | `80` | | 部署目录 | `/data/dib-site` | | 静态资源目录 | `/data/dib-site/dist` | | Docker 配置 | `/data/dib-site/docker-compose.yml` | | Nginx 配置 | `/data/dib-site/nginx.conf` | 仓库内发布配置位于: ```text C:\dev\dib-platform\deploy\prod101\dib-site ``` ## 3. 发布前检查 先在本地运行静态验证: ```powershell node site\verify-site.mjs git diff --check ``` 确认发布配置不包含 `8000`、Kong 或 Supabase 网络接入: ```powershell rg -n "8000|kong|supabase_default|/dib-site" deploy\prod101\dib-site site ``` 如果 `rg` 无命中,说明当前站点发布仍是独立端口模式。 ## 4. 打包 发布包需要同时包含 `site` 静态文件和 `docs` 文档目录,否则页面材料链接会失效。 ```powershell $package = Join-Path $env:TEMP 'dib-site-prod101.tar.gz' if (Test-Path $package) { Remove-Item -LiteralPath $package -Force } tar -czf $package --exclude './assets/dib-architecture-hero*.png' --exclude 'assets/dib-architecture-hero*.png' -C site . -C .. docs Get-FileHash $package -Algorithm SHA256 ``` 说明:`site/assets/dib-architecture-hero*.png` 是临时生成图片,不纳入网站发布包。 ## 5. 上传 ```powershell scp $env:TEMP\dib-site-prod101.tar.gz prod-101:/tmp/ scp deploy\prod101\dib-site\docker-compose.yml deploy\prod101\dib-site\nginx.conf prod-101:/tmp/ ``` ## 6. 服务器端发布 ### 6.1 PowerShell 调远端 Bash 注意事项 PowerShell 会先解释本地命令字符串,再把内容交给 SSH。远端 Bash 中常见的 `$()`、管道、重定向和引号嵌套,可能在本地就被误解释。 不要把复杂远端发布逻辑写成一行: ```powershell ssh prod-101 "ts=$(date +%Y%m%d%H%M%S); if [ $(find /data/dib-site/dist | wc -l) -gt 0 ]; then ..." ``` 这类命令容易出现两类问题: 1. `$(date +%Y%m%d%H%M%S)` 被 PowerShell 当成本地命令替换处理。 2. `wc`、`grep`、重定向或引号被拆到本地环境中执行。 推荐三种方式: 1. 使用 `scripts\publish-dib-site-prod101.ps1`,由脚本生成远端 Bash 脚本并上传执行。 2. 先进入 `ssh prod-101`,再在远端交互式执行 Bash 命令。 3. 将远端 Bash 脚本作为独立文件上传到 `/tmp` 后执行。 后续会话优先使用脚本入口。脚本要求 PowerShell 7,不要使用 Windows PowerShell 5 执行: ```powershell pwsh -NoProfile -File scripts\publish-dib-site-prod101.ps1 ``` 该命令只做本地验证和打包,不会触碰 prod101。确认需要发布时再显式添加 `-Deploy`: ```powershell pwsh -NoProfile -File scripts\publish-dib-site-prod101.ps1 -Deploy ``` ### 6.2 手工发布步骤 如果不使用脚本,建议在远端 Bash 中执行发布步骤,避免 PowerShell 把远端命令里的 `$()` 提前解释。 ```bash ssh prod-101 set -e ts=$(date +%Y%m%d%H%M%S) mkdir -p /data/dib-site/backups /data/dib-site/dist if [ -d /data/dib-site/dist ] && [ "$(find /data/dib-site/dist -mindepth 1 -maxdepth 1 | wc -l)" -gt 0 ]; then mv /data/dib-site/dist /data/dib-site/backups/dist-$ts mkdir -p /data/dib-site/dist fi tar -xzf /tmp/dib-site-prod101.tar.gz -C /data/dib-site/dist cp /tmp/docker-compose.yml /data/dib-site/docker-compose.yml cp /tmp/nginx.conf /data/dib-site/nginx.conf cd /data/dib-site docker compose up -d --force-recreate ``` 说明:发布流程会把 `/data/dib-site/dist` 整个目录移动到备份目录后重新创建。Docker bind mount 在容器创建时绑定目录,若不强制重建容器,旧容器可能继续服务已移动到备份目录的旧 `dist`。 ## 7. 防火墙与安全组 Docker 端口映射成功不等于公网可访问。需要确认服务器防火墙或云安全组已经放行: ```text TCP 18082 ``` 区分两类验收: ```bash curl -fsS -I http://127.0.0.1:18082/ ``` ```powershell Invoke-WebRequest -Uri http://101.42.19.26:18082/ -UseBasicParsing -TimeoutSec 20 ``` ## 8. 发布后验收 检查容器状态: ```bash docker ps --filter name=dib-site-web --format '{{.Names}}|{{.Status}}|{{.Ports}}' ``` 检查首页: ```powershell $r = Invoke-WebRequest -Uri http://101.42.19.26:18082/ -UseBasicParsing -TimeoutSec 20 $r.StatusCode $r.Content.Contains('DIB 数智桥') $r.Content.Contains('brand-text') $r.Content.Contains('id="workflow"') ``` 检查时间轴数据: ```powershell $r = Invoke-WebRequest -Uri http://101.42.19.26:18082/data/timeline.json -UseBasicParsing -TimeoutSec 20 $r.StatusCode $r.Content.Contains('确认 DIB 顶层平台定位') ``` 检查文档链接: ```powershell $r = Invoke-WebRequest -Uri http://101.42.19.26:18082/docs/architecture/dib-platform-overall-architecture-blueprint.md -UseBasicParsing -TimeoutSec 20 $r.StatusCode ``` 确认未改 Supabase Kong: ```bash grep -n -E 'dib-site|/dib-site|dib-site-web|/docs/' /data/supabase/volumes/api/kong.yml || true ``` 正常情况下不应有命中。 ## 9. 临时文件清理 发布完成并验收通过后,清理上传到 `/tmp` 的临时文件: ```bash rm -f /tmp/dib-site-prod101.tar.gz /tmp/docker-compose.yml /tmp/nginx.conf /tmp/kong-route.yml ``` 其中 `/tmp/kong-route.yml` 只可能来自误准备的 Kong 路由文件;本发布方式不使用它。 ## 10. 回滚 如果发布前已经备份旧版本,回滚步骤如下: ```bash ssh prod-101 cd /data/dib-site docker compose down mv /data/dib-site/dist /data/dib-site/backups/dist-bad-$(date +%Y%m%d%H%M%S) mv /data/dib-site/backups/dist- /data/dib-site/dist docker compose up -d ``` 回滚后仍需执行第 8 节验收。 ## 11. 经验要点 1. 独立站点优先走独立端口,避免改共享 Kong 入口。 2. 页面材料链接依赖 `docs` 目录,打包时必须包含。 3. PowerShell 调远端 Bash 时,复杂命令优先使用 `pwsh -NoProfile -File scripts\publish-dib-site-prod101.ps1`,或进入 `ssh prod-101` 后执行。 4. 公网不通时先区分容器本机可访问、端口映射、防火墙或安全组三个层面。 5. 发布后清理 `/tmp`,避免后续误判存在未应用配置。