适用人群:
这篇文章写给那些已经买了服务器、注册了域名,却还在手动用FTP上传文件、每次更新网站都要打开面板点来点去的站长们,如果你觉得“部署”这件事总是让你头疼,或者你刚学会用Git管理代码,想体验一把“代码推送即上线”的爽感,那么接下来的内容就是为你准备的。
从零开始,用GitHub Actions实现网站自动部署,告别手动FTP上传
第一步:理清“自动部署”到底在干什么
很多人一听到“自动化”就发怵,其实原理很简单,想象一下你以前的操作流程:
- 本地写好代码
- 打开FTP客户端
- 选中文件,上传
- 如果文件多了,还要等半天
- 万一漏传一个,网站就崩了
GitHub Actions自动部署,本质就是替你完成第2到第5步,你只需要把代码推送到GitHub仓库,GitHub就会自动触发一个“工作流”,这个工作流会帮你把最新的代码拉到服务器上,然后该重启重启,该清理缓存清理缓存。
第二步:完整建站流程,一个环节都不能少
服务器环境准备
不管你是用宝塔面板、OnePanel还是裸机Linux,请先确认以下三点已经就绪:
- SSH登录:确保你能用root或者一个有sudo权限的用户通过SSH连接服务器,不要用密码登录,强烈建议配置SSH密钥,这一步遇到问题,后面全部白搭。
- Web服务运行:Nginx或Apache已安装并启动,如果你用宝塔,确保网站已经创建成功,并且能通过IP或域名正常访问。
- 网站目录权限:确认你的GitHub Actions工作流要操作的目标目录,比如
/var/www/html,所属用户组对你用来SSH的用户有写入权限。
域名与DNS解析
这一步最容易出幺蛾子,请记住一个铁律:一定要在正式用自动化部署之前,先把域名解析搞定。
- 在域名注册商后台,把A记录指向你的服务器IP。
- 如果你用CDN(Cloudflare等),把代理状态暂时关闭,等部署稳定后再开启,否则GitHub Actions检测不到你的真实服务器IP。
- 耐心等待DNS生效(通常几分钟到一小时不等),用
ping yourdomain.com确认解析成功。
程序代码与Git仓库
把你的网站程序(不管是静态HTML、PHP项目还是Node.js应用)初始化为Git仓库,推送到GitHub。
这里有个常见误区:不要把整个服务器目录当成Git仓库,你应该在本地开发机上维护一个干净的代码库,服务器上只存放生产环境的代码。
配置GitHub Actions工作流文件
在你的项目根目录创建.github/workflows/deploy.yml如下(以部署到Nginx服务器为例):
name: 自动部署到服务器
on:
push:
branches: [ main ] # 监听main分支的推送
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 拉取最新代码
uses: actions/checkout@v3
- name: 通过rsync同步到服务器
uses: easingthemes/ssh-deploy@main
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-avz --delete"
SOURCE: "./"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
这里有个关键知识点:secrets是什么?它是GitHub仓库里的环境变量加密存储,你需要到仓库的 Settings -> Secrets and variables -> Actions 里添加以下内容:
SSH_PRIVATE_KEY:你的服务器私钥(注意是私钥,不是公钥)REMOTE_HOST:服务器IP或域名REMOTE_USER:SSH用户名REMOTE_TARGET:网站文件存放的绝对路径,比如/var/www/your-site
首次手动触发测试
配置好之后,不要直接push,先手动去GitHub仓库的Actions页面,找到这个workflow,点击“Run workflow”测试一次,如果失败,看报错日志:
- Permission denied (publickey):私钥不匹配或权限不对。
- rsync: connection unexpectedly closed:服务器防火墙没开22端口,或者SSH配置拒绝了密钥认证。
- No such file or directory:目标路径写错了,或者目录不存在。
第三步:各环节配置要点,一条一条过
服务器面板端
如果你用宝塔面板,请在面板里创建一个网站,把根目录指向你未来要放的文件夹,不要勾选“防跨站攻击”否则rsync可能因为权限问题失败,在面板的SSH管理里,确认你添加了公钥。
域名解析
强烈建议用Cloudflare做DNS托管,免费还带CDN加速,但注意:如果你的服务器IP是动态的,或者你是家庭宽带的服务器,务必关闭Cloudflare的“橙色云朵”代理模式,否则GitHub Actions无法直接SSH连接。
程序配置
如果用的是PHP或Node项目,永远不要在服务器上手动修改文件,一旦你手动改了,下一次自动部署时--delete参数会把你的修改删掉,要么把修改体现在代码里提交Git,要么把变动内容写成配置文件存到仓库之外。
第四步:常见踩坑提醒(都是血泪)
坑1:rsync删除了不该删的文件
--delete参数会让远程目录与本地完全一致,如果你在服务器上直接放了一些日志文件或用户上传的图片,但没有在本地代码里,它们会被删除,解决方案:把用户上传目录(比如/uploads)放到网站根目录之外,或者用.gitignore排除。
坑2:密钥权限不对
你在GitHub仓库里填写的私钥,要求必须是没有密码的,如果你的私钥设置了密码,请重新生成一个专门的部署密钥:
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""
然后把公钥加到服务器的~/.ssh/authorized_keys里。
坑3:环境变量被错误公开
千万不要把服务器密码、密钥直接写在代码里,所有敏感信息必须用GitHub Secrets,一旦泄露,你的服务器就被别人接管了。
坑4:Node应用没有自动重启
如果你部署的是Node.js项目,rsync只会更新文件,不会重启进程,你需要额外加一个步骤,在同步完成后执行:
- name: 重启应用
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
pm2 restart all # 或者 systemctl restart your-service
最后一步:验证并享受自动化
push一次代码到main分支,然后去浏览器刷新你的网站,如果一切顺利,你的代码应该在几秒钟内就已经部署到了服务器,第一次成功后,你会忍不住想:以前那些手动上传的日子,到底是怎么熬过来的?
从今天开始,每次你写完代码,只需要git push,剩下的交给GitHub Actions,你的网站自动上线,你的时间留给更重要的事情。



发表评论