Astro Blog 项目部署

工作流概览

整体流程分为三步:

  1. 本地构建:拉取仓库、安装依赖、生成静态文件。
  2. 本地调试:本地预览确认无误。
  3. 部署上线:用脚本清空服务器目录并上传最新的 dist

本地构建

拉取 Git 仓库后,按需修改 config.ts 等配置,然后在项目根目录执行:

pnpm install pnpm build

构建产物为一组静态文件,输出在项目根目录的 dist/ 中。

本项目为纯静态站点(未引入 SSR 适配器),构建结果可直接由 Nginx 托管,服务器无需运行 Node 进程。

本地调试

上线前可在本地启动开发服务器预览:

pnpm run dev

部署到服务器

部署采用「强制全量更新」策略:先清空服务器目标目录,再上传最新的 dist 内容,确保线上与本地完全一致。

下面的 Python 脚本通过 SFTP 完成上传:

需要配置免密登录,请在运行脚本前先测试免密配置是否成功。

# 需要先 pip install paramiko import os import paramiko HOST = "server IP" # 服务器IP USER = "uname" # 登录用户名 KEY_FILE = os.path.expanduser("~/.ssh/id_rsa") REMOTE_DIR = "/var/www/XXXX/html" # Nginx 站点根目录 LOCAL_DIR = "dist" def deploy(): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(HOST, username=USER, key_filename=KEY_FILE) # 1. 清空服务器目标目录(强制全量更新) ssh.exec_command(f"rm -rf {REMOTE_DIR}/*")[1].channel.recv_exit_status() # 2. 递归上传 dist 内容 sftp = ssh.open_sftp() for root, _, files in os.walk(LOCAL_DIR): rel = os.path.relpath(root, LOCAL_DIR).replace("\\", "/") target = REMOTE_DIR if rel == "." else f"{REMOTE_DIR}/{rel}" try: sftp.mkdir(target) except IOError: pass # 目录已存在则忽略 for f in files: sftp.put(os.path.join(root, f), f"{target}/{f}") sftp.close() ssh.close() print("[+] deploy success") if __name__ == "__main__": deploy()

注意事项

  • 执行顺序:务必先 pnpm build 生成最新的 dist,再运行部署脚本。
  • 空窗期:脚本是「先删后传」,删除到上传完成之间存在短暂空窗,期间访问可能 404;个人博客可忽略。
  • 后续优化:可将构建与部署串成一条命令(如 pnpm build && python deploy.py),后续做成完整的发布工作流。

部署后验证

上传完成后,可在服务器重载 Nginx 并访问站点确认:

sudo nginx -t && sudo systemctl reload nginx

浏览器访问站点域名,确认页面与样式正常加载即部署成功。