Nuxt 3 项目自动化部署到宝塔服务器全攻略 (GitHub Actions + rsync)

本指南详细介绍了如何利用 GitHub Actions 持续集成工具,将 Nuxt 3 项目(静态生成 SSG 模式)自动化部署到宝塔面板服务器。


插件介绍

nuxt-web-plugin 是一款面向 Nuxt 3/4 的全能增强插件,旨在提升开发体验(DX)并为应用提供坚实的基础能力。

核心特性:

  • 🔐 深度安全防护: 集成 AES-GCM 对称加密、RSA 非对称加密及 SHA-256 哈希算法,支持加密存储(Storage/Cookie)。
  • 🛰️ 智能请求封装 : 基于 $fetch 的统一网络层,内置 自动去重 (Dedupe)短时缓存 (Cache)并发锁 (Lock),有效防止重复请求。
  • 🖼️ 页面水印系统: 动态 Canvas 水印,支持防篡改监测(Anti-Tamper),保护页面内容版权。
  • 🔍 SEO & 设备检测: 自动元标签生成与移动端/平板/桌面端精准识别。
  • 🎨 玻璃拟态布局: 内置一套现代化的插件控制台模板,完美支持 Tailwind 暗色模式。

一、 准备工作

1.1 服务器环境

  • 确保服务器已安装 宝塔面板
  • 在宝塔面板中创建一个 静态网站(或 PHP 网站,但我们只需其静态能力)。
  • 记住你的网站根目录,例如:/www/wwwroot/nuxt.haiwb.com

1.2 生成 SSH 密钥对

在你的本地终端或服务器执行以下命令(建议在服务器执行):

bash 复制代码
# 生成密钥对 (ed25519 算法更安全且简短)
ssh-keygen -t ed25519 -C "github-actions-deploy"
  1. 公钥 (.pub) : 将内容复制并添加到服务器的 ~/.ssh/authorized_keys 文件中。
  2. 私钥: 将内容完整复制,下一步使用。

二、 GitHub 仓库配置

进入你的 GitHub 项目仓库,点击 Settings -> Secrets and variables -> Actions,点击 New repository secret 添加以下变量:

变量名 说明 示例值
SERVER_SSH_KEY 刚才生成的 私钥 内容 -----BEGIN OPENSSH PRIVATE KEY----- ...
SERVER_HOST 服务器公网 IP 或域名 1.2.3.4nuxt.haiwb.com
SERVER_USER SSH 登录名 root (建议使用有权限的普通用户)
SERVER_TARGET 宝塔面板中的网站根目录 /www/wwwroot/nuxt.haiwb.com

三、 编写工作流文件

在项目根目录创建 .github/workflows/deploy-playground.yml 文件:

yaml 复制代码
name: Deploy Playground to Baota

on:
  push:
    branches: [main] # 仅在代码推送到 main 分支时触发
  workflow_dispatch:  # 支持在 GitHub Actions 页面手动点击运行

jobs:
  deploy-to-baota:
    name: Upload to Server
    runs-on: ubuntu-latest

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

      - name: Setup pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 9
          run_install: false

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 24 # 关键:Node 版本需匹配项目要求 (v24.4.1+)
          cache: 'pnpm'

      - name: Install Dependencies
        run: pnpm install --no-frozen-lockfile

      - name: Build Playground (Static)
        run: |
          # 准备模块环境
          pnpm run dev:prepare
          cd playground
          # 生成静态文件 (SSG)
          npx nuxi generate 
          echo "Build Output Check:"
          ls -R .output/public/ # 打印构建结果,方便排查路径问题

      - name: Deploy to Server
        uses: easingthemes/ssh-deploy@main
        with:
          # SSH 私钥
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
          # 远程主机信息
          REMOTE_HOST: ${{ secrets.SERVER_HOST }}
          REMOTE_USER: ${{ secrets.SERVER_USER }}
          TARGET: ${{ secrets.SERVER_TARGET }}
          # 部署源目录 (Nuxt 3 SSG 产物路径)
          SOURCE: "playground/.output/public/"
          # rsync 参数: r(递归), l(链接), g(组), o(所有者), D(设备), z(压缩), v(详细), c(校验), --delete(删除多余文件)
          ARGS: "-rlgoDzvc -i --delete"
          # 关键排坑:排除服务器系统锁定的文件,否则会报 Operation not permitted (rsync code 23)
          EXCLUDE: "/.user.ini, /.htaccess, /.well-known/, /cgi-bin/"

四、 核心避坑指南 (Troubleshooting)

4.1 Node 引擎版本报错

错误信息 : Unsupported engine: wanted: {"node":">=24.4.1"} 原因 : 项目 package.json 限制了高版本 Node,而 GitHub Actions 默认环境较低。 对策 : 在 actions/setup-node 步骤中明确指定 node-version: 24

4.2 预渲染死链报错

错误信息 : Exiting due to prerender errors 原因 : Nuxt 3 在 generate 过程中会检查所有链接,如果发现指向 /docs 等不存在的内部路径会报错。 对策:

  1. nuxt.config.ts 中配置 nitro: { prerender: { failOnError: false } }
  2. 将外部链接或独立部署的链接改为绝对路径(如 https://...)。

4.3 rsync exited with code 23

错误信息 : unlink(.user.ini) failed: Operation not permitted (1) 原因 : 宝塔面板会自动在网站目录创建 .user.ini 并锁定(i 权限)。rsync 尝试删除该文件以便同步时会被拦截。 对策 : 在部署脚本中使用 EXCLUDE 配置将其排除掉。


五、 Nginx 伪静态设置 (非常重要)

为了让 Nuxt 的客户端路由正常工作,请在宝塔面板的网站设置 -> 伪静态 中添加以下内容:

nginx 复制代码
location / {
  # 优先寻找文件和目录,找不到则 fallback 到 index.html 让 Vue 处理路由
  try_files $uri $uri/ /index.html;
}
相关推荐
小星运维日记16 小时前
2026年五大自动化运维系统测评:企业运维如何突破效率瓶颈?
自动化运维·自动化运维平台·自动化运维系统·自动化运维中心·自动化运维产品
用户0591562441253 天前
# Go语言 Windows 桌面自动化实战:从零开始掌握 winput
自动化运维
小胖体育生3 天前
Ansible Playbook编写全教程:从入门到实战(附完整案例+最佳实践)
自动化运维
极客小云6 天前
【[Python自动化] 我写了一个工具,一键将几百个Word/PDF简历自动汇总到Excel,早早下班!】
自动化运维
draking10 天前
从 3 小时到 15 分钟:我们的发布效率提升 10 倍之路
自动化运维
智能运维指南12 天前
信创深化期ITSM选型:打破流程割裂,锁定全栈适配的智能方案
自动化运维·aiops·it管理·itsm·itsm厂商
饼饼饼14 天前
从 0 到 1:前端 CI/CD 实战(第二篇:用Docker 部署 GitLab)
前端·自动化运维
唐叔在学习15 天前
用python实现类AI自动执行终端指令
后端·python·自动化运维
智能运维指南16 天前
2025四大自动化运维系统选型全景:核心能力与场景适配深度解析
自动化运维·自动化运维平台·it巡检·国产自动化运维厂商·自动化运维中心