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

如何通过GitHub Actions正确部署.NET Core应用至Ubuntu VPS?

解决方案

一、修复rsync权限拒绝问题

你遇到的权限错误,本质是部署用户对服务器上/var/www/meal_prep目录及文件无写入、删除权限,可通过两种方式解决:

1. 调整服务器目录所有权

在Ubuntu服务器执行以下命令,将目标目录的所有权转移给部署用户:

sudo chown -R [你的部署用户名]:[你的部署用户组] /var/www/meal_prep

替换括号内的实际用户名和用户组(通常用户名和组名一致),之后再用原工作流部署,rsync即可正常操作文件。

2. 借助临时目录绕过权限限制

如果不想修改目录所有权,可先将文件同步到部署用户有权限的临时目录,再用sudo同步到目标路径:

- name: Sync to server temp folder
  uses: burnett01/rsync-deployments@7.0.1
  with:
    switches: -avzr --delete
    path: ./publish/
    remote_path: /tmp/meal_prep_temp/
    remote_host: ${{ secrets.HOST }}
    remote_user: ${{ secrets.USERNAME }}
    remote_key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Sync temp folder to target with sudo
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.HOST }}
    username: ${{ secrets.USERNAME }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    script: |
      echo "${{ secrets.SUDO_PASSWORD }}" | sudo -S rsync -avzr --delete /tmp/meal_prep_temp/ /var/www/meal_prep/
      sudo rm -rf /tmp/meal_prep_temp/

二、修复后续部署无更新问题

你用appleboy/ssh-action的脚本存在逻辑错误:$publishFolder是在远程服务器解析的,而GitHub Actions runner的publish目录不在远程服务器上,导致rsync没有实际同步文件。

推荐使用专门的rsync部署action(如burnett01/rsync-deployments),它会直接从runner推送文件到远程,无需在远程执行复杂脚本。

三、推荐的完整工作流

结合权限处理与正确同步逻辑,最终配置如下:

steps:
- name: Checkout code
  uses: actions/checkout@v4

- name: Set up .NET
  uses: actions/setup-dotnet@v4
  with:
    dotnet-version: '8.0.x'

- name: Restore dependencies
  run: dotnet restore

- name: Build
  run: dotnet build --configuration Release --no-restore

- name: Publish
  run: dotnet publish --configuration Release --no-build --output ./publish

- name: Deploy to Server using rsync
  uses: burnett01/rsync-deployments@7.0.1
  with:
    switches: -avzr --delete
    path: ./publish/
    remote_path: /var/www/meal_prep/
    remote_host: ${{ secrets.HOST }}
    remote_user: ${{ secrets.USERNAME }}
    remote_key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Restart Service
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.HOST }}
    username: ${{ secrets.USERNAME }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    script: |
      echo "${{ secrets.SUDO_PASSWORD }}" | sudo -S systemctl restart meal_prep

注意:rsync路径末尾的斜杠表示同步目录内的内容,而非目录本身,避免目标目录下多出一层publish文件夹。

内容的提问来源于stack exchange,提问作者Rasik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:03:19