一、本篇目标
前七篇走完了 JeecgBoot 3.9.5 的完整部署:
- 第 1 篇:升级决策
- 第 2 篇:环境准备与数据盘
- 第 3 篇:Redis 7.4 源码编译
- 第 4 篇:Nginx 1.28 源码编译
- 第 5 篇:PostgreSQL 17 源码编译 + pgvector + SQL 转换
- 第 6 篇:JeecgBoot 3.9.5 后端编译部署
- 第 7 篇:JeecgBoot 3.9.5 前端编译部署
本篇是收官篇,解决最后一个问题:
如果系统崩了、机器换了、要重新部署,能不能不重复踩坑?
答案是:可以。本篇把所有部署成果归档到/data/packages,写一套一键备份与恢复脚本。系统重装后,从归档包解压即可恢复全套环境。
最终目标:
备份:/data/packages/jeecgboot-full-backup-YYYYMMDD.tar.gz 恢复:解压 -> 跑 restore.sh -> 全套服务自动就绪二、归档设计原则
2.1 归档什么,不归档什么
| 类型 | 归档 | 原因 |
|---|---|---|
| 源码包(PG/Redis/Nginx/Node) | ✅ | 重装无需重新下载 |
| 编译产物(jar、dist) | ✅ | 免去重新编译 |
| 配置(nginx.conf、systemd unit) | ✅ | 恢复后直接可用 |
| 工具链(yml-tools) | ✅ | 配置生成的源头 |
| SQL 脚本(含授权) | ✅ | 数据库初始化必需 |
| 数据库数据文件(pgdata) | ❌ | 太大,用pg_dump单独备份 |
| 日志(/data/logs) | ❌ | 无需归档 |
| node_modules | ❌ | 可重装 |
核心逻辑:归档「环境」,不归档「数据」。数据用pg_dump单独处理。
2.2 归档目录结构
统一放/data/packages/:
/data/packages/ ├── postgresql17/ │ └── postgresql-17.10.tar.bz2 ├── pgvector/ │ └── pgvector-0.8.6.tar.gz ├── redis/ │ └── redis-7.4.x.tar.gz ├── nginx/ │ └── nginx-1.28.x.tar.gz ├── nodejs/ │ └── node-v22.23.3-linux-x64.tar.xz ├── jeecg/ │ ├── jeecg-boot-3.9.5-src.tar.gz │ ├── jeecgboot-vue3-3.9.5-src.tar.gz │ └── jeecg-system-start-3.9.5.jar ├── yml-tools/ │ └── ...(yml 配置工具链) ├── jeecgboot-pg-tools/ │ └── ...(开源工具链) ├── sql/ │ ├── jeecgboot-postgresql.sql │ └── grant_pg.sql ├── DEPLOY-STATUS.md └── README-RESTORE.md2.3 归档三类内容
| 分类 | 内容 | 恢复方式 |
|---|---|---|
| 二进制归档 | PG、Redis、Nginx、Node 源码 | 解压 + 编译 + 安装 |
| 配置归档 | yml-tools、nginx.conf、systemd unit | 直接拷贝 |
| 产物归档 | jar、dist、SQL | 直接使用 |
三、写归档脚本
3.1 创建归档目录
mkdir-p/data/packages/{postgresql17,pgvector,redis,nginx,nodejs,jeecg,sql}# 拷贝源码包cp/data/packages/postgresql17/postgresql-17.10.tar.bz2 /data/packages/postgresql17/2>/dev/nullcp/data/packages/pgvector/pgvector-0.8.6.tar.gz /data/packages/pgvector/2>/dev/nullcp/data/packages/redis/redis-*.tar.gz /data/packages/redis/2>/dev/nullcp/data/packages/nginx/nginx-*.tar.gz /data/packages/nginx/2>/dev/nullcp/tmp/node-v22.23.3-linux-x64.tar.xz /data/packages/nodejs/2>/dev/null# 拷贝 jarcp/usr/local/jeecg/backend/jeecg-system-start-3.9.5.jar /data/packages/jeecg/# 拷贝 SQLcp/usr/local/src/JeecgBoot/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/sql/jeecgboot-postgresql.sql /data/packages/sql/2>/dev/nullcp/data/packages/yml-tools/grant_pg.sql /data/packages/sql/2>/dev/null# 拷贝工具链cp-rf/data/packages/yml-tools /data/packages/jeecgboot-pg-tools /data/packages/3.2 归档源码目录
源码目录太大,只归档编译后的关键内容:
cd/usr/local/src/JeecgBoottar-czf/data/packages/jeecg/jeecg-boot-3.9.5-src.tar.gz\--exclude='*/target'\--exclude='*/node_modules'\jeecg-boot/tar-czf/data/packages/jeecg/jeecgboot-vue3-3.9.5-src.tar.gz\--exclude='node_modules'\--exclude='dist'\jeecgboot-vue3/3.3 归档前端产物
cd/usr/local/jeecgtar-czf/data/packages/jeecg/frontend-dist.tar.gz frontend/3.4 归档 systemd unit
mkdir-p/data/packages/systemdcp/etc/systemd/system/postgresql-17.service /data/packages/systemd/cp/etc/systemd/system/redis.service /data/packages/systemd/cp/etc/systemd/system/nginx.service /data/packages/systemd/cp/etc/systemd/system/jeecg.service /data/packages/systemd/3.5 归档 Nginx 配置
mkdir-p/data/packages/nginx-confcp-rf/usr/local/nginx/conf/nginx.conf /data/packages/nginx-conf/cp-rf/usr/local/nginx/conf/vhost /data/packages/nginx-conf/四、打包整个归档
cd/data/packagesDATE=$(date+%Y%m%d)tar-czfjeecgboot-full-backup-${DATE}.tar.gz\--exclude='*.tar.gz'\postgresql17/ pgvector/ redis/ nginx/ nodejs/\jeecg/ sql/ yml-tools/ jeecgboot-pg-tools/\systemd/ nginx-conf/ DEPLOY-STATUS.mdls-lhjeecgboot-full-backup-${DATE}.tar.gz期望:
jeecgboot-full-backup-20261010.tar.gz 约 1.5G~3G五、写恢复脚本
5.1 恢复脚本结构
mkdir-p/data/packages/restorecat>/data/packages/restore/restore.sh<<'RESTORE_EOF' #!/bin/bash # ============================================================ # JeecgBoot 部署恢复脚本 # 用途:从归档包恢复全套环境 # 用法:./restore.sh # ============================================================ set -e PACKAGES_DIR="/data/packages" SRC_DIR="/usr/local/src" LOG_FILE="/data/packages/restore/restore.log" log() { echo "[$(date '+%H:%M:%S')] $*" | tee -a "$LOG_FILE"; } log "===== 恢复开始 =====" # ---------- 1. 恢复源码 ---------- log "1. 恢复源码包..." mkdir -p $SRC_DIR cd $SRC_DIR [ ! -f "$PACKAGES_DIR/postgresql17/postgresql-17.10.tar.bz2" ] && \ log " ⚠️ 缺 postgresql tar.bz2" [ ! -f "$PACKAGES_DIR/redis/redis-7.4.*.tar.gz" ] && \ log " ⚠️ 缺 redis tar.gz" log " 源码包就绪,等待手工编译" # ---------- 2. 恢复 PostgreSQL 编译产物 ---------- log "2. 恢复 PostgreSQL..." if [ ! -d /usr/local/pgsql ]; then cd $SRC_DIR tar -xjf $PACKAGES_DIR/postgresql17/postgresql-17.10.tar.bz2 cd postgresql-17.10 ./configure --prefix=/usr/local/pgsql \ --with-openssl --with-zlib --with-icu \ --with-libxml --with-libxslt --with-ldap \ --with-pam --with-systemd --with-perl --with-python \ --enable-nls 2>&1 | tee -a "$LOG_FILE" make -j$(nproc) 2>&1 | tee -a "$LOG_FILE" make install 2>&1 | tee -a "$LOG_FILE" cd contrib make -j$(nproc) make install log " ✅ PostgreSQL 编译完成" fi # ---------- 3. 恢复 Redis ---------- log "3. 恢复 Redis..." if [ ! -d /usr/local/redis ]; then cd $SRC_DIR tar -xzf $PACKAGES_DIR/redis/redis-*.tar.gz cd redis-* make -j$(nproc) make PREFIX=/usr/local/redis install log " ✅ Redis 编译完成" fi # ---------- 4. 恢复 Nginx ---------- log "4. 恢复 Nginx..." if [ ! -d /usr/local/nginx ]; then cd $SRC_DIR tar -xzf $PACKAGES_DIR/nginx/nginx-*.tar.gz cd nginx-* ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module --with-http_v2_module \ --with-http_gzip_static_module --with-stream 2>&1 | tee -a "$LOG_FILE" make -j$(nproc) make install log " ✅ Nginx 编译完成" # 恢复配置 cp -f $PACKAGES_DIR/nginx-conf/nginx.conf /usr/local/nginx/conf/ mkdir -p /usr/local/nginx/conf/vhost cp -rf $PACKAGES_DIR/nginx-conf/vhost/* /usr/local/nginx/conf/vhost/ fi # ---------- 5. 恢复 Node.js ---------- log "5. 恢复 Node.js..." if [ ! -d /usr/local/node22 ]; then mkdir -p /usr/local/node22 tar -xJf $PACKAGES_DIR/nodejs/node-v*-linux-x64.tar.xz \ -C /usr/local/node22 --strip-components=1 log " ✅ Node.js 恢复完成" fi # ---------- 6. 恢复数据目录 ---------- log "6. 创建数据目录..." mkdir -p /data/pgdata /data/logs/{pgsql,nginx,jeecg,redis} useradd -m pgsql 2>/dev/null || true useradd -m jeecg 2>/dev/null || true useradd -m nginx 2>/dev/null || true chown -R pgsql:pgsql /data/pgdata /data/logs/pgsql chown -R nginx:nginx /data/logs/nginx chown -R jeecg:jeecg /data/logs/jeecg # ---------- 7. 恢复 systemd ---------- log "7. 恢复 systemd unit..." cp -f $PACKAGES_DIR/systemd/*.service /etc/systemd/system/ systemctl daemon-reload # ---------- 8. 恢复后端 ---------- log "8. 恢复后端..." mkdir -p /usr/local/jeecg/backend cp -f $PACKAGES_DIR/jeecg/jeecg-system-start-3.9.5.jar /usr/local/jeecg/backend/ chown -R jeecg:jeecg /usr/local/jeecg/backend/ # ---------- 9. 恢复前端 ---------- log "9. 恢复前端..." mkdir -p /usr/local/jeecg/frontend cd /usr/local/jeecg tar -xzf $PACKAGES_DIR/jeecg/frontend-dist.tar.gz chown -R jeecg:jeecg /usr/local/jeecg/frontend chmod -R o+rX /usr/local/jeecg/frontend # ---------- 10. 恢复工具链 ---------- log "10. 恢复工具链..." cp -rf $PACKAGES_DIR/yml-tools /data/packages/ cp -rf $PACKAGES_DIR/jeecgboot-pg-tools /data/packages/ log "===== 恢复完成 =====" log "" log "后续手工步骤:" log " 1. initdb 初始化数据库:" log " su -s /bin/bash pgsql -c \"/usr/local/pgsql/bin/initdb -D /data/pgdata ...\"" log " 2. 导入 SQL:" log " su -s /bin/bash pgsql -c \"psql -h /tmp -U pgsql -d jeecg_boot -f $PACKAGES_DIR/sql/jeecgboot-postgresql.sql\"" log " 3. 授权:" log " su -s /bin/bash pgsql -c \"psql -h /tmp -U pgsql -d jeecg_boot -f $PACKAGES_DIR/sql/grant_pg.sql\"" log " 4. 启用服务:" log " systemctl enable --now postgresql-17 redis nginx jeecg" log " 5. 前端配置环境变量后重跑:" log " cd /data/packages/jeecgboot-pg-tools && ./deploy.sh" RESTORE_EOFchmod+x /data/packages/restore/restore.shbash-n/data/packages/restore/restore.sh&&echo"语法 OK"5.2 数据库独立备份
数据不归档,用pg_dump定期备份:
cat>/data/packages/restore/dump-db.sh<<'DUMP_EOF' #!/bin/bash # 数据库逻辑备份 DATE=$(date +%Y%m%d-%H%M%S) BACKUP_DIR="/data/backup/db" mkdir -p $BACKUP_DIR su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/pg_dump \ -h /tmp -U pgsql -d jeecg_boot \ -F c -f $BACKUP_DIR/jeecg_boot-$DATE.dump" ls -lh $BACKUP_DIR/jeecg_boot-$DATE.dump # 保留最近 30 份 find $BACKUP_DIR -name '*.dump' -mtime +30 -delete DUMP_EOFchmod+x /data/packages/restore/dump-db.sh恢复数据库:
su-s/bin/bash pgsql-c"/usr/local/pgsql/bin/pg_restore \ -h /tmp -U pgsql -d jeecg_boot \ /data/backup/db/jeecg_boot-YYYYMMDD-HHMMSS.dump"六、恢复验证清单
恢复后逐项检查:
echo"===== 1. PostgreSQL ====="systemctl status postgresql-17 --no-pager|head-3ss-lntp|grep5432echoecho"===== 2. Redis ====="systemctl status redis --no-pager|head-3redis-clipingechoecho"===== 3. Nginx ====="systemctl status nginx --no-pager|head-3ss-lntp|grep:80echoecho"===== 4. 后端 ====="systemctl status jeecg --no-pager|head-3ss-lntp|grep8080curl-sIhttp://127.0.0.1:8080/jeecg-boot/doc.html|head-1echoecho"===== 5. 前端 ====="curl-sIhttp://127.0.0.1/|head-1echoecho"===== 6. 数据库表 ====="PGPASSWORD=your_pg_password /usr/local/pgsql/bin/psql\-h127.0.0.1-Ujeecg-djeecg_boot\-c"SELECT count(*) FROM pg_tables WHERE schemaname='public';"期望:全部 OK,表数量 143。
七、恢复耗时预估
| 步骤 | 耗时 |
|---|---|
| 解压归档 | 2 分钟 |
| 编译 PostgreSQL | 5 分钟 |
| 编译 Redis | 2 分钟 |
| 编译 Nginx | 2 分钟 |
| 恢复 Node.js | 30 秒 |
| initdb + 导入 SQL | 2 分钟 |
| 启动服务 | 1 分钟 |
| 合计 | 约 15 分钟 |
对比第一次部署的 2 天,恢复约 15 分钟。
八、DEPLOY-STATUS.md 模板
归档时同步更新状态文档:
cat>/data/packages/DEPLOY-STATUS.md<<'EOF' # JeecgBoot 3.9.5 部署状态 ## 版本 - JeecgBoot: 3.9.5 - PostgreSQL: 17.10 - Redis: 7.4.x - Nginx: 1.28.x - Node.js: 22.23.3 - pnpm: 10.34.6 - JDK: 17 ## 路径 - 源码: /usr/local/src/JeecgBoot - 后端 jar: /usr/local/jeecg/backend/jeecg-system-start-3.9.5.jar - 前端 dist: /usr/local/jeecg/frontend - 数据库: /data/pgdata - 日志: /data/logs - 工具链: /data/packages/yml-tools - 归档: /data/packages ## 服务 | 服务 | 端口 | systemd | |---|---|---| | PostgreSQL | 5432 | postgresql-17 | | Redis | 6379 | redis | | Nginx | 80 | nginx | | 后端 | 8080 | jeecg | ## 默认账号 - 前端: admin / 123456 - PG: jeecg / your_pg_password ## 归档 - 全量: /data/packages/jeecgboot-full-backup-YYYYMMDD.tar.gz - 数据库: /data/backup/db/jeecg_boot-*.dump EOF九、系列总结
八篇文章,从零到生产可用:
| 篇 | 内容 | 关键产出 |
|---|---|---|
| 1 | 升级决策 | 为什么选 3.9.5 |
| 2 | 环境准备 | 数据盘规划 |
| 3 | Redis 编译 | 内核参数调优 |
| 4 | Nginx 编译 | 反向代理 |
| 5 | PostgreSQL 编译 | pgvector + SQL 转换 |
| 6 | 后端编译部署 | LiteFlow + PG 授权 |
| 7 | 前端编译部署 | pnpm 踩坑 + Nginx vhost |
| 8 | 归档恢复 | 一键备份恢复 |
踩坑总览:
| 坑 | 篇 |
|---|---|
| Redis 内核参数 | 3 |
| Nginx --with-stream | 4 |
| PG 17 不需要 --enable-thread-safety | 5 |
| pgvector 华为云是 SPA | 5 |
| PG 15+ public schema 授权 | 5、6 |
| LiteFlow dataSourceName 报错 | 6 |
| Node.js 版本不足导致 rolldown 缺失 | 7 |
| pnpm 12 供应链策略 | 7 |
| SPA 刷新 404 | 7 |
开源产出:
- 工具链:https://gitee.com/dboru/jeecgboot-pg-tools
- SQL 转换:https://gitee.com/dboru/jeecgboot-pg-converter
最终成果:
- 部署耗时:2 天 → 恢复 15 分钟
- SQL 转换:143 张表,0 错误
- 全套信创环境:openEuler 24.03 + PostgreSQL 17 + Redis 7.4 + Nginx 1.28
本系列结束。
十、下一系列预告
这个系列走完了 JeecgBoot 在信创环境的完整部署,从选型、编译、调优到归档恢复。
但部署只是起点。系统跑起来之后,真正要做的是用它做出业务系统。
下一系列:资产管理系统开发
从下一篇开始,进入一个全新的系列:
基于 JeecgBoot 的资产管理系统开发实战
核心理念:
- 不写重复代码,用低代码 + 在线表单快速搭建业务模块
- 不造轮子,复用 JeecgBoot 权限、字典、工作流能力
- 不做黑盒,每一步决策、每一个坑都写出来
仓库已开源:
Gitee:https://gitee.com/dboru(资产管理相关仓库见主页)
下一篇会先讲清楚三件事:
- 为什么选 JeecgBoot 而不是从零开发
- 资产管理系统要解决什么问题
- 整体架构与开发路线图
敬请关注。
项目地址:
- JeecgBoot PostgreSQL 工具链:https://gitee.com/dboru/jeecgboot-pg-tools
- SQL 转换工具:https://gitee.com/dboru/jeecgboot-pg-converter
- 个人主页:https://gitee.com/dboru
本系列文章:
- 第 1 篇:为什么从 3.8.3 升级到 3.9.5
- 第 2 篇:环境准备与数据盘规划
- 第 3 篇:Redis 7.4 源码编译与内核参数调优
- 第 4 篇:Nginx 1.28 源码编译与反向代理配置
- 第 5 篇:PostgreSQL 17 源码编译 + pgvector + SQL 转换
- 第 6 篇:JeecgBoot 3.9.5 后端编译部署
- 第 7 篇:JeecgBoot 3.9.5 前端编译部署
- 第 8 篇:部署归档与一键恢复(本文)
配套文章:
- JeecgBoot 3.9.5 MySQL 脚本一键转 PostgreSQL 完整方案