解决GitHub Actions部署Laravel到EC2时rsync公钥权限拒绝问题
问题描述
我正在为AWS EC2实例配置GitHub Actions CI/CD流水线,实现Laravel项目代码推送后自动同步到实例。尝试2天仍未解决rsync公钥权限拒绝错误,错误截图如下:
当前使用的.github/workflow/deploy.yml配置如下:
name: Laravel Deployment to AWS EC2 on: push: branches: - master jobs: deploy: name: Deploy Laravel to EC2 runs-on: ubuntu-latest steps: # Checkout the code - name: Checkout Code uses: actions/checkout@v2 # Deploy files to EC2 - name: Deploy to EC2 uses: easingthemes/ssh-deploy@main env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} REMOTE_HOST: ${{ secrets.EC2_HOST }} REMOTE_USER: ${{ secrets.EC2_USERNAME }} TARGET: ${{ secrets.TARGET_DIR }} ARGS: "-o StrictHostKeyChecking=no" # Ensure correct folder permissions - name: Set Folder Ownership on EC2 run: | ssh -o StrictHostKeyChecking=no ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF' sudo chown -R www-data:www-data /var/www/html/my-book-mate EOF # Run Laravel Artisan commands - name: Run Laravel Artisan Commands run: | ssh -o StrictHostKeyChecking=no ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF' cd ${{ secrets.TARGET_DIR }} php artisan migrate --force php artisan cache:clear php artisan config:cache php artisan route:cache EOF
解决方案
1. 检查GitHub Secrets中的私钥格式
- 确保
SSH_PRIVATE_KEY完整包含私钥所有内容,包括开头的-----BEGIN RSA PRIVATE KEY-----和结尾的-----END RSA PRIVATE KEY-----,无多余换行或空格。 - 若使用EC2的.pem密钥,直接复制整个文件内容到Secrets中即可。
2. 验证EC2实例上的公钥配置
- 登录EC2实例,检查
~/.ssh/authorized_keys文件:确认包含对应私钥的公钥内容,且文件权限为600,~/.ssh目录权限为700,执行以下命令修正权限:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - 确保公钥未被注释,格式正确(开头为
ssh-rsa或对应密钥类型)。
3. 检查EC2安全组规则
- 确保EC2安全组允许来自GitHub Actions服务器的SSH连接(端口22)。可临时开放
0.0.0.0/0测试,确认问题后再限制到GitHub官方IP段。
4. 修正ssh-deploy的参数配置
easingthemes/ssh-deploy的ARGS是传递给rsync的参数,SSH相关配置需通过SSH_ARGS环境变量传递,修改Deploy步骤:- name: Deploy to EC2 uses: easingthemes/ssh-deploy@main env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} REMOTE_HOST: ${{ secrets.EC2_HOST }} REMOTE_USER: ${{ secrets.EC2_USERNAME }} TARGET: ${{ secrets.TARGET_DIR }} SSH_ARGS: "-o StrictHostKeyChecking=no"
5. 修复后续SSH步骤的认证问题
- 后续的文件夹权限设置和Artisan命令执行步骤未指定私钥,会导致认证失败。可通过
webfactory/ssh-agent管理密钥,先添加密钥代理步骤:
之后的SSH命令无需额外指定密钥,代理会自动处理认证。- name: Setup SSH Agent uses: webfactory/ssh-agent@v0.7.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
6. 验证目标目录权限
- 确保EC2上的
TARGET_DIR目录对REMOTE_USER有写入权限,手动测试命令:ssh user@ec2-host "mkdir -p /path/to/target && touch /path/to/target/test.txt"
7. 启用详细日志排查
- 在ssh-deploy步骤中添加
VERBOSE: true环境变量,查看更详细的rsync和SSH日志,定位具体错误:- name: Deploy to EC2 uses: easingthemes/ssh-deploy@main env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} REMOTE_HOST: ${{ secrets.EC2_HOST }} REMOTE_USER: ${{ secrets.EC2_USERNAME }} TARGET: ${{ secrets.TARGET_DIR }} SSH_ARGS: "-o StrictHostKeyChecking=no" VERBOSE: true
内容的提问来源于stack exchange,提问作者CoderAatmik
相关产品推荐
相关产品推荐

