openEuler 24.03 部署 JeecgBoot 3.9.5 归档:一键备份与恢复实战
·
一、本篇目标
前七篇走完了 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/null
cp /data/packages/pgvector/pgvector-0.8.6.tar.gz /data/packages/pgvector/ 2>/dev/null
cp /data/packages/redis/redis-*.tar.gz /data/packages/redis/ 2>/dev/null
cp /data/packages/nginx/nginx-*.tar.gz /data/packages/nginx/ 2>/dev/null
cp /tmp/node-v22.23.3-linux-x64.tar.xz /data/packages/nodejs/ 2>/dev/null
# 拷贝 jar
cp /usr/local/jeecg/backend/jeecg-system-start-3.9.5.jar /data/packages/jeecg/
# 拷贝 SQL
cp /usr/local/src/JeecgBoot/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/sql/jeecgboot-postgresql.sql /data/packages/sql/ 2>/dev/null
cp /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/JeecgBoot
tar -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/jeecg
tar -czf /data/packages/jeecg/frontend-dist.tar.gz frontend/
3.4 归档 systemd unit
mkdir -p /data/packages/systemd
cp /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-conf
cp -rf /usr/local/nginx/conf/nginx.conf /data/packages/nginx-conf/
cp -rf /usr/local/nginx/conf/vhost /data/packages/nginx-conf/
四、打包整个归档
cd /data/packages
DATE=$(date +%Y%m%d)
tar -czf jeecgboot-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.md
ls -lh jeecgboot-full-backup-${DATE}.tar.gz
期望:
jeecgboot-full-backup-20261010.tar.gz 约 1.5G~3G
五、写恢复脚本
5.1 恢复脚本结构
mkdir -p /data/packages/restore
cat > /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_EOF
chmod +x /data/packages/restore/restore.sh
bash -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_EOF
chmod +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 -3
ss -lntp | grep 5432
echo
echo "===== 2. Redis ====="
systemctl status redis --no-pager | head -3
redis-cli ping
echo
echo "===== 3. Nginx ====="
systemctl status nginx --no-pager | head -3
ss -lntp | grep :80
echo
echo "===== 4. 后端 ====="
systemctl status jeecg --no-pager | head -3
ss -lntp | grep 8080
curl -sI http://127.0.0.1:8080/jeecg-boot/doc.html | head -1
echo
echo "===== 5. 前端 ====="
curl -sI http://127.0.0.1/ | head -1
echo
echo "===== 6. 数据库表 ====="
PGPASSWORD=your_pg_password /usr/local/pgsql/bin/psql \
-h 127.0.0.1 -U jeecg -d jeecg_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 篇:部署归档与一键恢复(本文)
配套文章:
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)