从服务器 SSH 密钥配置到 GitHub Actions Workflow 编写,完整实现代码提交后自动部署 Next.js 应用,让你的项目实现持续集成与持续部署(CI/CD)。
在传统部署流程中,每次修改代码后,我们通常需要手动登录服务器,执行 git pull、安装依赖、构建项目以及重启服务。
这种方式不仅效率低,而且容易因为人为操作导致部署错误。
自动部署(Continuous Deployment,持续部署)可以让整个流程自动化:
开发者 | | git push ↓ GitHub Repository | | Trigger GitHub Actions ↓ GitHub Runner | | SSH Connect ↓ Ubuntu Server | | execute deploy.sh ↓ Next.js Application
当代码提交到 main 分支后,GitHub Actions 会自动连接服务器,并执行部署脚本。
一个简单可靠的 Next.js 自动部署架构如下:
Host ├── GitHub Repository │ ├── GitHub Actions │ | │ | SSH │ ↓ └── Ubuntu Server | ├── /var/www/personal-website ├── deploy.sh ├── npm install ├── npm run build └── pm2 restart
其中:
首先进入服务器:
ssh ubuntu@your-server-ip
生成专用于 GitHub Actions 的密钥:
ssh-keygen -t ed25519 -C "github-actions" -f ~/.ssh/github_actions
生成后会得到两个文件:
~/.ssh/ ├── github_actions # 私钥 └── github_actions.pub # 公钥
其中:
查看公钥:
cat ~/.ssh/github_actions.pub
复制内容,然后添加:
cat ~/.ssh/github_actions.pub >> ~/.ssh/authorized_keys
测试:
ssh -i ~/.ssh/github_actions localhost
如果可以免密码登录,说明 SSH 配置成功。
进入 GitHub 仓库:
Settings ↓ Secrets and variables ↓ Actions
添加三个 Repository secrets:
SERVER_HOST SERVER_USER SERVER_SSH_KEY
示例:
SERVER_HOST=服务器公网IP SERVER_USER=ubuntu SERVER_SSH_KEY=-----BEGIN OPENSSH PRIVATE KEY-----
注意:
SSH_KEY 必须是私钥,不是 .pub 文件。
服务器项目目录:
/var/www/personal-website
创建:
touch deploy.sh
内容:
#!/bin/bash set -e cd /var/www/personal-website echo "Pull latest code" git pull origin main echo "Install dependencies" npm install echo "Generate Prisma Client" npx prisma generate echo "Build Next.js" npm run build echo "Restart PM2" pm2 restart personal-website echo "Deploy finished"
增加执行权限:
chmod +x deploy.sh
测试:
./deploy.sh
项目根目录创建:
.github/workflows/deploy.yml
内容:
name: Deploy on: push: branches: - main workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - name: Deploy Server uses: appleboy/ssh-action@v1.2.2 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} script: | cd /var/www/personal-website ./deploy.sh
提交代码:
git add . git commit -m "test deploy" git push origin main
进入 GitHub:
Actions ↓ Deploy
可以看到:
Queued ↓ Running ↓ Completed
部署成功后,服务器上的 PM2 会自动重新加载最新代码。
错误:
Permission denied (publickey)
检查:
错误:
Permission denied
解决:
chmod +x deploy.sh
查看:
pm2 list
确认名称:
pm2 restart personal-website
生产环境还可以进一步优化:
通过 GitHub Actions + SSH + deploy.sh + PM2,我们实现了一套完整的 Next.js 自动部署流程。
以后只需要:
git push
服务器即可自动完成代码更新、依赖安装、项目构建以及服务重启。
这就是现代 Web 项目中常见的 CI/CD 工作流。
暂无评论,留下第一条声音吧。