如何通过Github Workflows实现代码自动部署到Dreamhost服务器
首先明确:为GitHub Actions生成专属SSH密钥对实现自动部署是当前自动化场景的标准安全实践,只要做好权限收敛,完全符合安全最佳实践,不需要开发者手动双推代码,整套流程完全以GitHub为核心触发。
核心流程
main分支收到代码推送时,GitHub Actions通过专属SSH密钥鉴权连接Dreamhost服务器,用rsync全量/增量同步代码,可按需追加服务重启、构建等自定义步骤。
具体配置步骤
1. 生成GitHub Actions专用SSH密钥对
在本地终端执行以下命令生成无密码的ed25519密钥对(自动化场景使用的密钥不能设置passphrase):
ssh-keygen -t ed25519 -C "github-actions-dreamhost-deploy" -f ./gh-dreamhost-deploy-key
执行完成后当前目录会生成两个文件:
gh-dreamhost-deploy-key:私钥,需严格保密,后续仅存入GitHub加密密钥存储gh-dreamhost-deploy-key.pub:公钥,可公开配置到服务器信任列表
2. 将公钥配置到Dreamhost服务器
通过SSH登录你Dreamhost账户下对应站点的普通部署用户(不要使用root用户,遵循最小权限原则),执行以下命令配置公钥信任:
# 进入SSH配置目录,不存在则创建 mkdir -p ~/.ssh # 将本地gh-dreamhost-deploy-key.pub的完整内容追加到授权文件末尾 echo "粘贴你本地gh-dreamhost-deploy-key.pub的全部内容" >> ~/.ssh/authorized_keys # 配置正确的文件权限,权限不符合会导致SSH鉴权失败 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
安全提示:可以在Dreamhost面板中将该用户的访问范围限制为站点根目录,不要开放整台服务器的操作权限,即使密钥出现泄露也能将影响范围降到最低。后续如果要废弃部署能力,直接从
authorized_keys中删除对应公钥即可立刻失效。
3. 将私钥存入GitHub仓库加密Secrets
打开对应GitHub仓库的设置页,进入「Secrets and variables → Actions」,新建仓库密钥:
- 名称填
DREAMHOST_SSH_PRIVATE_KEY - 值填本地
gh-dreamhost-deploy-key文件的全部内容,需包含开头的-----BEGIN OPENSSH PRIVATE KEY-----和结尾的-----END OPENSSH PRIVATE KEY-----
该密钥由GitHub加密存储,仅在Actions运行时临时注入,日志输出会自动脱敏,不存在明文泄露风险。
4. 编写GitHub Actions工作流配置
在本地仓库中新建文件路径.github/workflows/deploy-dreamhost.yml,写入以下配置,根据注释替换成你自己的服务器信息:
name: Deploy to Dreamhost # 触发条件:main分支收到push事件时执行 on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: 拉取最新仓库代码 uses: actions/checkout@v4 - name: 启动SSH代理并加载私钥 uses: webfactory/ssh-agent@v0.8.0 with: ssh-private-key: ${{ secrets.DREAMHOST_SSH_PRIVATE_KEY }} - name: 配置Dreamhost主机信任 run: | mkdir -p ~/.ssh # 替换成你自己的Dreamhost服务器地址/IP ssh-keyscan 你的Dreamhost服务器地址 >> ~/.ssh/known_hosts chmod 644 ~/.ssh/known_hosts - name: 同步代码到Dreamhost站点目录 run: | rsync -avz --delete \ # 按需添加排除项,不同步不需要部署的文件 --exclude '.git' \ --exclude '.github' \ --exclude '.env.local' \ --exclude 'node_modules' \ ./ 替换为你的Dreamhost部署用户名@替换为你的Dreamhost服务器地址:替换为你站点在服务器的绝对路径/ # 如果是动态站点需要重启服务,在下方追加对应命令即可,例如PHP站点可以执行touch tmp/restart.txt触发服务重载 # ssh 替换为你的Dreamhost部署用户名@替换为你的Dreamhost服务器地址 "需要执行的服务操作命令"
配置说明:Dreamhost的站点根目录一般格式为
/home/你的部署用户名/你的站点域名/,服务器地址可以在Dreamhost主机管理面板查到。
5. 验证部署流程
将配置文件提交并推送到GitHub的main分支,即可自动触发第一次部署,你可以在仓库的Actions标签页查看运行日志,显示绿色成功标识即代表部署完成。后续所有协作者只需要正常提交代码、合并PR到main分支,就会自动完成同步,不需要单独操作服务器。
常见优化项
- 如果需要构建步骤(比如前端项目打包、Node.js依赖安装),可以在rsync同步前添加对应的构建步骤,将构建产物同步到服务器即可
- 可以给rsync添加
--dry-run参数先测试同步路径是否正确,避免误删服务器文件 - 不要在仓库中存储生产环境密钥等敏感配置,这类配置可以直接放在Dreamhost服务器的站点目录中,通过exclude规则避免被同步覆盖
内容的提问来源于stack exchange,提问作者cameronpoe

