← 返回博客

静态站容器与生产入口

Astro 静态产物的多阶段镜像、私有预发布与生产 Compose、证书挂载和安全边界。

2026-09-12 约 2 分钟读完

补记于 2026-09-12

本文目录 跳到想读的章节
  1. 构建配置
  2. 启动与验收
  3. 更新与回退

这一组配置只运行 Astro 静态产物。基础 Compose 文件不发布任何主机端口;私有预发布叠加 staging 文件,只允许 ECS 本机通过 127.0.0.1:8080 访问;正式入口叠加 production 文件,发布 80 与 443。两种覆盖文件不能同时叠加。

首次服务器搭建过程见搭建记录,日常更新和排障见ECS 运维手册

构建配置

在 ECS 仓库目录外保存实际配置,例如 /etc/blog-demo/staging.env,权限设为仅部署用户可读。文件内容如下,SITE_URL 换成最终规范域名的源站部分,不要包含路径:

SITE_URL=https://example.invalid
SITE_BASE=/
RELEASE_ID=manual-YYYYMMDD-HHMM

配置文件、SSH 密钥和任何令牌都不能提交到仓库。SITE_URL 会在 Astro 构建时写入 canonical、RSS 和 sitemap;备案期通过隧道预览时,这些绝对链接指向未来域名是预期行为。

生产配置另外需要 TLS_CERT_DIR=/etc/blog-demo/tlsACME_CHALLENGE_DIR=/var/lib/letsencrypt。前者在 ECS 上保存 fullchain.pemprivkey.pem,后者用于 Certbot HTTP-01 自动续期;两者仅以只读方式挂入 Web 容器。证书私钥不进入镜像、发布目录或 Git。

启动与验收

在支持 Compose v2 的 ECS 上执行。部署用户默认不加入 docker 组,以下命令通过 sudo 调用 Docker:

sudo docker compose \
  --env-file /etc/blog-demo/staging.env \
  -f infra/compose.yaml \
  -f infra/compose.staging.yaml \
  config

sudo docker compose \
  --env-file /etc/blog-demo/staging.env \
  -f infra/compose.yaml \
  -f infra/compose.staging.yaml \
  up --build -d

curl --fail --show-error --head http://127.0.0.1:8080/
curl --fail --show-error --head http://127.0.0.1:8080/interests/food/

从自己的电脑建立隧道:

ssh -L 8080:127.0.0.1:8080 DEPLOY_USER@ECS_HOST

随后只在本机打开 http://127.0.0.1:8080/。预发布环境不需要在安全组或主机防火墙新增规则,8080 必须保持公网不可达。生产环境的 80 和 443 只在下述生产配置、TLS 与回滚检查通过后开放。

基础镜像从本机与 ECS 均实测可达的 Public ECR Docker Official Images 镜像读取,并继续固定与 Docker Hub 官方清单相同的 SHA-256 摘要。如果发布时仍无法连接镜像仓库,可在同架构的可信构建机完成镜像构建和验收,使用 docker save 导出、核对 SHA-256 后传入 ECS,再执行 sudo docker load。此时启动命令必须增加 --no-build,防止 Compose 再次访问仓库。手工镜像传输仍只作为受控回退路径。

正式入口只在证书文件存在且 production 配置通过 nginx -t、最终 Host/SNI 冒烟和回滚检查后启用:

sudo docker compose -p blog-demo-production \
  --env-file /etc/blog-demo/production.env \
  -f infra/compose.yaml \
  -f infra/compose.production.yaml \
  config

sudo docker compose -p blog-demo-production \
  --env-file /etc/blog-demo/production.env \
  -f infra/compose.yaml \
  -f infra/compose.production.yaml \
  up -d --no-build

production Nginx 同时服务 doyouhang.livewww.doyouhang.live,HTTP 保留健康检查和 /.well-known/acme-challenge/ 后,把其他请求跳转到对应主机名的 HTTPS。Certbot 成功签发或续期后,由 infra/certbot/deploy-hook.sh 原子更新 /etc/blog-demo/tls 并向运行中的 Web 容器发送 HUP。ICP备案链接由站点页脚展示;公安备案尚未取得时不展示虚假编号。

更新与回退

每次构建为 RELEASE_ID 使用新的、可追踪值。更新前记录当前镜像标签;新容器健康检查通过并完成隧道验收后,才清理旧镜像。出现问题时把配置中的 RELEASE_ID 恢复为上一版本并重新启动,不要在运行容器里手改文件。

读到这里,谢谢你的时间。

如果还想继续读下去,
新的文章和闪念会送进 RSS。

订阅这本档案 ↗