一、本篇目标

前七篇走完了 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 分钟
编译 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

本系列文章:

配套文章:

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐