【前端必看】手把手教你把 Strapi 5 自动化部署到宝塔,再也不用手动传代码了!

前言

兄弟们,作为一名普通前端,每次写完接口还要自己登录服务器、手动上传代码、装依赖、再重启 PM2,这一套"广播体操"做下来,天都黑了。

今天咱们就花 10 分钟,把这套活儿交给 GitHub Actions 。以后你只管在本地 git push,剩下的脏活累活全让机器人帮你干!

在线文档

在线源码

一、 整体思路(大白话版)

  1. 代码放 GitHub:这大家都会。
  2. GitHub Actions 开工:你一推代码,它就跳出来执行一个脚本。
  3. SSH 远程登录:GitHub 像个"代跑腿"的,拿着你的钥匙,登录你的宝塔服务器。
  4. 服务器干活:拉代码、打包、重启 Strapi,一气呵成。

二、 服务器环境:把"路"铺平

宝塔环境下的 Node 路径比较特殊,SSH 远程登录时经常"失忆"找不到命令。我们要先在服务器终端执行以下代码,建立系统级"路标":

bash 复制代码
# 1. 强行建立全局软链接,确保系统任何时候都能找到它们
ln -sf $(which pnpm) /usr/bin/pnpm
ln -sf $(which node) /usr/bin/node
ln -sf $(which pm2) /usr/bin/pm2

# 2. 检查一下是否成功(应该输出版本号)
pnpm -v
node -v

三、 配置"钥匙"和"锁" (SSH)

1. 生成钥匙对

在服务器里输入:ssh-keygen -t rsa -b 4096一路狂按回车,不要设密码!

2. 把"公钥"给 GitHub 仓库(用于拉代码)

输入 cat ~/.ssh/id_rsa.pub,把内容复制下来。 去 GitHub 仓库 -> Settings -> Deploy keys -> Add deploy key 存进去。

3. 把"私钥"给 GitHub 机器人(用于登录服务器)

输入 cat ~/.ssh/id_rsa完整复制 (必须包含 -----BEGIN...-----END...)。 去 GitHub 仓库 -> Settings -> Secrets and variables -> Actions -> 新建一个名为 SSH_PRIVATE_KEY 的 Secret 存进去。

4. 把"公钥"装进服务器锁心里

在服务器执行:

bash 复制代码
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

四、 核心代码实现

1. PM2 配置文件:ecosystem.config.js

在项目根目录创建,这是生产环境运行的"指挥棒"。

javascript 复制代码
module.exports = {
  apps: [
    {
      name: 'strapi-bag',           // 进程名
      script: 'pnpm',               // 启动程序
      args: 'start',                // 启动参数
      cwd: './apps/backend',        // 后端应用所在目录
      interpreter: 'none',          // 针对 pnpm 命令必须设为 none
      env: {
        NODE_ENV: 'production',     // 生产环境标识
        PORT: 1339,                 // 端口号
      },
      max_memory_restart: '1G',     // 内存溢出保护
    },
  ],
};

2. GitHub 工作流:.github/workflows/deploy.yml

在项目里创建这个文件,这就是那个"代跑腿机器人"的执行说明。

yaml 复制代码
name: Deploy to BT Server

on:
  push:
    branches: [main] # 只有推送到 main 分支时才触发

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: SSH Remote Deployment
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_HOST }}
          username: ${{ secrets.REMOTE_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            # 1. 兼容宝塔面板的 Node 路径加载
            export PATH=$PATH:/usr/local/bin:/usr/bin
            export PATH=$PATH:$(find /www/server/nodejs -maxdepth 3 -type d -name "bin" 2>/dev/null | head -n 1)
            
            # 2. 进入项目目录并拉取代码
            cd ${{ secrets.TARGET_DIR }}
            git pull origin main
            
            # 3. 自动化流水线
            pnpm install --no-frozen-lockfile
            pnpm build
            
            # 4. 重启服务 (加载最新配置)
            pm2 reload ecosystem.config.js || pm2 start ecosystem.config.js

3. Strapi 域名配置:apps/backend/config/server.js

为了让域名访问时不报错,必须加上 url 配置。

javascript 复制代码
module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1339),
  url: env('STRAPI_URL', 'https://api.yourdomain.com'), // 这里填你的真实域名
  app: {
    keys: env.array('APP_KEYS'),
  },
});

五、 宝塔 Nginx 反向代理配置

  1. 建站:在宝塔建一个纯静态站点,绑定域名。

  2. 反代 :站点设置 -> 反向代理 -> 添加。目标 URL 填 http://127.0.0.1:1339

  3. Header 修正 :点击反代设置里的"配置文件",确保有以下这行,否则 HTTPS 下会报错:

    nginx 复制代码
    proxy_set_header X-Forwarded-Proto $scheme;

六、 总结:避坑贴士

  1. 第一次手动来一遍 :先在服务器上手动执行一次 pnpm buildpm2 start ecosystem.config.js
  2. 安全组/防火墙 :记得在宝塔面板和云服务器后台同时放行 1339 端口。
  3. Secrets :GitHub 网页上的 REMOTE_HOST 等变量名必须和 deploy.yml 里写的一模一样。

从此,你的开发流程将变成: 修改代码 -> Git Push -> 喝杯咖啡 -> 部署完成


我是 羊先生,一名在坑里摸爬滚打的前端开发。如果你也想让开发更轻松,欢迎关注我!

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