你现在看到的这个博客,部署在一台已经承载了二十多个服务的阿里云 ECS 上。本文是完整实录——包括每一处约束是怎么影响设计的。

现场约束

侦察(只读)得到的事实:

事实 影响
ECS:Ubuntu 24.04,2核8G,cn-beijing,nginx 1.24 直装在宿主机 博客应该复用这个 nginx,静态托管,零新增常驻进程
机器上已有 n8n、code-review-agent 等二十余个服务 不能动现有配置,新站点必须是独立的 server block
域名 jocab.xyz 已解析到该机,siyuan/openproject 两个子域名是既有模式 博客用 blog.jocab.xyz 子域名,与惯例一致
没有 SSH 密钥,但有阿里云 CLI(root) 用云助手 RunCommand 执行服务器端命令
80 端口已在跑 nginx 并对外服务,443 安全组已放行但未启用 直接加 server block + certbot 签证书

部署流水线

没有 CI/CD,没有 GitHub Actions,流水线只有三段:

本地 hugo build
   │  tar.gz
   ▼
阿里云 OSS(私有 bucket,中转)
   │  服务器从 OSS「内网 endpoint」拉取——不走公网、免流量费、秒级
   ▼
ECS:解压到 /var/www/blog + nginx server block + certbot HTTPS

为什么用 OSS 中转

云助手 RunCommand 的命令内容有 16KB 上限,塞不进几 MB 的静态站点;而服务器直接从 GitHub 拉取在境内网络不可靠。OSS 内网 endpoint 是唯一既快又稳的通道——这是典型的"用平台既有能力换工程复杂度"。

服务器端做了什么

# 1. 站点文件
mkdir -p /var/www/blog
tar -xzf site.tar.gz -C /var/www/blog

# 2. 独立 server block(不动既有配置)
cat > /etc/nginx/sites-available/blog.jocab.xyz <<'EOF'
server {
    listen 80;
    server_name blog.jocab.xyz;
    root /var/www/blog/public;
    index index.html;
}
EOF
ln -sf /etc/nginx/sites-available/blog.jocab.xyz /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

# 3. HTTPS
apt install -y certbot python3-certbot-nginx
certbot --nginx -d blog.jocab.xyz

certbot --nginx 会自动改写 server block 加上 443 监听和 80→443 跳转,续期由 systemd timer 自动完成。

安全与回滚设计

  • 最小侵入:只新增文件(sites-available/blog.jocab.xyz、/var/www/blog),不修改任何既有 server block;改前备份
  • 完全可回滚:回滚 = 删 symlink + 删目录 + 删 DNS 记录 + 删 OSS bucket,四个动作,机器上其他服务无感知
  • HTTPS 是标配:2026 年没有理由裸 HTTP

一条命令再发布

仓库里留了 deploy.sh:重新构建 → 上传 OSS → 云助手触发服务器拉取。写完 Markdown,一条命令,新文章上线。


下一篇,讲讲这条流水线背后更大的话题:如何把 AI Agent 当资深工程师用。