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

作者:知航驿站日期:2025/12/21

前言

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

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

在线文档

在线源码

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

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

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

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

1# 1. 强行建立全局软链接,确保系统任何时候都能找到它们
2ln -sf $(which pnpm) /usr/bin/pnpm
3ln -sf $(which node) /usr/bin/node
4ln -sf $(which pm2) /usr/bin/pm2
5
6# 2. 检查一下是否成功(应该输出版本号)
7pnpm -v
8node -v
9

三、 配置“钥匙”和“锁” (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. 把“公钥”装进服务器锁心里

在服务器执行:

1cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
3

四、 核心代码实现

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

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

1module.exports = {
2  apps: [
3    {
4      name: 'strapi-bag',           // 进程名
5      script: 'pnpm',               // 启动程序
6      args: 'start',                // 启动参数
7      cwd: './apps/backend',        // 后端应用所在目录
8      interpreter: 'none',          // 针对 pnpm 命令必须设为 none
9      env: {
10        NODE_ENV: 'production',     // 生产环境标识
11        PORT: 1339,                 // 端口号
12      },
13      max_memory_restart: '1G',     // 内存溢出保护
14    },
15  ],
16};
17

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

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

1name: Deploy to BT Server
2
3on:
4  push:
5    branches: [main] # 只有推送到 main 分支时才触发
6
7jobs:
8  deploy:
9    runs-on: ubuntu-latest
10    steps:
11      - name: SSH Remote Deployment
12        uses: appleboy/ssh-action@master
13        with:
14          host: ${{ secrets.REMOTE_HOST }}
15          username: ${{ secrets.REMOTE_USER }}
16          key: ${{ secrets.SSH_PRIVATE_KEY }}
17          script: |
18            # 1. 兼容宝塔面板的 Node 路径加载
19            export PATH=$PATH:/usr/local/bin:/usr/bin
20            export PATH=$PATH:$(find /www/server/nodejs -maxdepth 3 -type d -name "bin" 2>/dev/null | head -n 1)
21            
22            # 2. 进入项目目录并拉取代码
23            cd ${{ secrets.TARGET_DIR }}
24            git pull origin main
25            
26            # 3. 自动化流水线
27            pnpm install --no-frozen-lockfile
28            pnpm build
29            
30            # 4. 重启服务 (加载最新配置)
31            pm2 reload ecosystem.config.js || pm2 start ecosystem.config.js
32

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

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

1module.exports = ({ env }) => ({
2  host: env('HOST', '0.0.0.0'),
3  port: env.int('PORT', 1339),
4  url: env('STRAPI_URL', 'https://api.yourdomain.com'), // 这里填你的真实域名
5  app: {
6    keys: env.array('APP_KEYS'),
7  },
8});
9

五、 宝塔 Nginx 反向代理配置

  1. 建站:在宝塔建一个纯静态站点,绑定域名。
  2. 反代:站点设置 -> 反向代理 -> 添加。目标 URL 填 http://127.0.0.1:1339
  3. Header 修正:点击反代设置里的“配置文件”,确保有以下这行,否则 HTTPS 下会报错:
1proxy_set_header X-Forwarded-Proto $scheme;  

六、 总结:避坑贴士

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

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


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


【前端必看】手把手教你把 Strapi 5 自动化部署到宝塔,再也不用手动传代码了!》 是转载文章,点击查看原文


相关推荐


Webpack打包机制与Babel转译原理深度解析
老前端的功夫2025/12/13

Webpack打包机制与Babel转译原理深度解析 引言:现代前端构建工具的核心原理 Webpack和Babel是现代前端开发不可或缺的两个核心工具。Webpack解决了模块化、资源管理和打包优化的难题,而Babel则确保了JavaScript代码的浏览器兼容性。理解它们的底层原理不仅有助于更好地配置和使用这些工具,还能在遇到复杂问题时快速定位和解决。 一、Webpack打包机制深度解析 1.1 Webpack核心概念与架构设计 Webpack的整体架构: // Webpack 的核心抽象概念


web3区块链-小镇店铺的 “借力办事”:call 与 delegatecall 的区别与联系Web3-智能合约-整数溢出攻击:“凭空造币”的秘密
想ai抽2025/12/4

加密小镇上有两家店: A 店(水果店):老板是 Alice,有自己的账本(合约存储),记录着 “苹果库存”(存储变量uint256 public appleStock = 100;),但没学会 “盘点库存”“修改库存” 的方法;B 店(管理咨询店):老板是 Bob,专门帮人做库存管理,有两套核心 “操作手册”(合约函数): checkStock():读取自己账本上的库存,返回数值;addStock(uint256 num):把自己账本上的库存增加num个。 A 店想复用 B 店的方法


[服务器][教程]EC2开启自定义端口
踏雪Vernon2025/12/30

网上很多教程并没有说这一点。直接就说新建安全组之后就可以用了。 很坑,我一直以为我的服务器服务搭建的有问题。因为即使端口开了,端口没有对应的服务用端口扫描也是显示无连接的!! 1. 新建安全组规则 进入“实例”页面中找到“安全组”。新建一个安全组 新建之后如下所示。 新建之后,并不是直接就可以用了。而是要进行绑定!这个一定要注意!!! 2. 修改安全组规则 点击实例之后,选择“操作”,更改安全组 之后在这里选择刚才创建的安全组即可。其他的VPC应该也是类似的。 被网上的教程坑了。大家注意甄


SPI通信:从原理到工程实践
我太浮躁2026/1/8

文章目录 1、概述2、什么是SPI?2.1 SPI的特点是什么? 3、SPI的历史发展3.1 SPI诞生3.2 为什么是SPI?3.3 SPI的一路升级3.3.1 标准 SPI (Standard SPI)3.3.2 Dual SPI & Quad SPI (QSPI)3.3.3 Octal SPI (OSPI) / xSPI3.3.4 eSPI (Enhanced SPI) 4、协议架构及通信原理4.1 SPI功能层级划分(非官方,但实用便于理解)4.1.1 物理层 :四线制结


Objective-C 核心语法深度解析:基本类型、集合类与代码块实战指南
奋斗理想2026/1/16

详细讲解:Objective-C 基本类型、集合类和代码块 一、基本类型详解 1.1 主要基本类型 // MyTypes.m #import <Foundation/Foundation.h> void demonstrateBasicTypes() { NSLog(@"========== 基本类型演示 =========="); // 1. BOOL 类型(实际上是 signed char) BOOL isOpen = YES; // YES = 1,


怎么理解 HttpServletRequest @Autowired注入
それども2026/1/24

在你的代码中,@Autowired(required = false) private HttpServletRequest req 的 required = false 是多余的,甚至可能带来潜在问题。以下是详细分析: 1. 为什么 required = false 是多余的? (1) HttpServletRequest 的特殊性 由 Servlet 容器(如 Tomcat)管理:HttpServletRequest 是 Web 请求的上下文对象,在 Servlet 环境中必然存在(

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客