# 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('