☰
openEuler 24.03 部署 JeecgBoot 3.9.5 归档:一键备份与恢复实战
2026/10/11 4:30:44 网站建设 项目流程

一、本篇目标

前七篇走完了 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.md

2.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 分钟
编译 PostgreSQL5 分钟
编译 Redis2 分钟
编译 Nginx2 分钟
恢复 Node.js30 秒
initdb + 导入 SQL2 分钟
启动服务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环境准备数据盘规划
3Redis 编译内核参数调优
4Nginx 编译反向代理
5PostgreSQL 编译pgvector + SQL 转换
6后端编译部署LiteFlow + PG 授权
7前端编译部署pnpm 踩坑 + Nginx vhost
8归档恢复一键备份恢复

踩坑总览:

坑篇
Redis 内核参数3
Nginx --with-stream4
PG 17 不需要 --enable-thread-safety5
pgvector 华为云是 SPA5
PG 15+ public schema 授权5、6
LiteFlow dataSourceName 报错6
Node.js 版本不足导致 rolldown 缺失7
pnpm 12 供应链策略7
SPA 刷新 4047

开源产出:

  • 工具链: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(资产管理相关仓库见主页)

下一篇会先讲清楚三件事:

  1. 为什么选 JeecgBoot 而不是从零开发
  2. 资产管理系统要解决什么问题
  3. 整体架构与开发路线图

敬请关注。


项目地址:

  • 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 完整方案

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询