Astro Blog 项目部署
工作流概览
整体流程分为三步:
- 本地构建:拉取仓库、安装依赖、生成静态文件。
- 本地调试:本地预览确认无误。
- 部署上线:用脚本清空服务器目录并上传最新的
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
浏览器访问站点域名,确认页面与样式正常加载即部署成功。