You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决GitHub Actions部署Laravel到EC2时rsync公钥权限拒绝问题

问题描述

我正在为AWS EC2实例配置GitHub Actions CI/CD流水线,实现Laravel项目代码推送后自动同步到实例。尝试2天仍未解决rsync公钥权限拒绝错误,错误截图如下:
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管理密钥,先添加密钥代理步骤:
    - name: Setup SSH Agent
      uses: webfactory/ssh-agent@v0.7.0
      with:
        ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
    
    之后的SSH命令无需额外指定密钥,代理会自动处理认证。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:23:16