🚀 GitHub Actions + SSH 自动部署教程
你有自己的服务(博客网站等)在跑吗?部署个Jenkins比手动上线还麻烦?你想实现push代码后自动部署上线服务?
本文档将指导你如何配置 GitHub Actions + SSH 实现自动部署功能:
🧾 一、部署前提
- • 你有一台公网可访问的服务器(如阿里云、腾讯云、Vultr 等)
- • 你可以使用 SSH 登录服务器(已开放 SSH 端口)
- • 项目已上传至 GitHub 仓库(例如:
https://github.com/yourname/yourrepo
)
🗝️ 二、生成 SSH 密钥
在 本地终端 执行以下命令,生成专用于部署的密钥:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-action-deploy -C "github-action"
会生成两个文件:
- • 私钥(用于 GitHub Actions):
~/.ssh/github-action-deploy
- • 公钥(用于服务器授权):
~/.ssh/github-action-deploy.pub
🧩 三、配置服务器 SSH 授权
将公钥添加到服务器的 ~/.ssh/authorized_keys
文件中:
cat ~/.ssh/github-action-deploy.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
确保你可以用私钥连接服务器(测试):
ssh -i ~/.ssh/github-action-deploy root@服务器IP -p 你的端口号
🛡️ 四、添加 GitHub Secrets
进入你的仓库 → Settings → Secrets and variables → Actions,添加以下 Secrets:
名称 |
值(说明) |
|
你的服务器 IP 地址或域名 |
|
(可选)SSH 端口号,如非 22,必须添加(如 2222) |
|
登录服务器用户名,如 root |
|
上面生成的私钥内容(github-action-deploy 文件) |
📌 复制私钥内容时注意包含完整:
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
⚙️ 五、编写服务器端部署脚本 restart.sh
在你的项目目录(如 /project/hanyinfo
)创建文件:
#!/bin/bash
# 1. 停掉旧服务(根据项目实际情况调整)
pkill -f "python app.py"
# 2. 拉取最新代码
git pull origin main
# 3. 启动服务(确保运行在后台)
nohup python3 app.py > log.txt 2>&1 &
✅ 注意:
文件需赋予执行权限:
chmod +x restart.sh
🧾 六、创建 GitHub Actions Workflow 文件
在你的项目根目录下,创建:
mkdir -p .github/workflows
nano .github/workflows/deploy.yml
内容如下:
name: Auto Deploy on Push
on:
push:
branches:
- main # 监听 main 分支推送
jobs:
deploy:
runs-on: ubuntu-latest
environment: production # 如果你使用了环境 Secrets,必须指定
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT || 22 }} # 如未设置,默认 22
script: |
cd /project/hanyinfo # 替换为你服务器上项目的路径
./restart.sh
🧪 七、测试部署流程
git add .github/workflows/deploy.yml
git commit -m "add auto deploy workflow"
git push origin main
✅ 推送完成后,进入 GitHub → Actions 页面 → 查看部署日志是否成功。
🧯 八、常见问题排查
问题 |
可能原因 |
解决方案 |
i/o timeout |
SSH 被防火墙或安全组拦截 |
放行服务器的 SSH 端口(云平台控制台) |
Permission denied |
私钥不匹配 |
确认服务器上的公钥正确,且私钥无误 |
.sh: not found |
脚本权限或路径错误 |
检查路径是否准确,并 |
没有触发 Actions |
分支名不匹配 |
确认 push 到的是 main(或你配置的分支) |
✅ 示例目录结构参考
myproject/
├── app.py
├── restart.sh
├── .github/
│ └── workflows/
│ └── deploy.yml
✅ 小贴士
- • 建议使用部署专用 SSH 密钥,避免泄漏日常使用的登录密钥
- • 建议在服务器端配置虚拟环境或 Docker,确保依赖一致
- • 如果需要部署多个环境(测试、预发布、生产),可使用 Environment + 条件触发器实现多分支部署
🎉 至此,你已完成 GitHub Actions + SSH 自动部署系统的全部配置!