
一、本篇目标前七篇走完了 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\--excludenode_modules\--excludedist\jeecgboot-vue3/3.3 归档前端产物cd/usr/local/jeecgtar-czf/data/packages/jeecg/frontend-dist.tar.gz frontend/3.4 归档 systemd unitmkdir-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.5G3G五、写恢复脚本5.1 恢复脚本结构mkdir-p/data/packages/restorecat/data/packages/restore/restore.shRESTORE_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 21 | tee -a $LOG_FILE make -j$(nproc) 21 | tee -a $LOG_FILE make install 21 | 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 21 | 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-components1 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 orX /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_EOFchmodx /data/packages/restore/restore.shbash-n/data/packages/restore/restore.shecho语法 OK5.2 数据库独立备份数据不归档用pg_dump定期备份cat/data/packages/restore/dump-db.shDUMP_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_EOFchmodx /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. 数据库表 PGPASSWORDyour_pg_password /usr/local/pgsql/bin/psql\-h127.0.0.1-Ujeecg-djeecg_boot\-cSELECT count(*) FROM pg_tables WHERE schemanamepublic;期望全部 OK表数量 143。七、恢复耗时预估步骤耗时解压归档2 分钟编译 PostgreSQL5 分钟编译 Redis2 分钟编译 Nginx2 分钟恢复 Node.js30 秒initdb 导入 SQL2 分钟启动服务1 分钟合计约 15 分钟对比第一次部署的 2 天恢复约 15 分钟。八、DEPLOY-STATUS.md 模板归档时同步更新状态文档cat/data/packages/DEPLOY-STATUS.mdEOF # 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.52环境准备数据盘规划3Redis 编译内核参数调优4Nginx 编译反向代理5PostgreSQL 编译pgvector SQL 转换6后端编译部署LiteFlow PG 授权7前端编译部署pnpm 踩坑 Nginx vhost8归档恢复一键备份恢复踩坑总览坑篇Redis 内核参数3Nginx --with-stream4PG 17 不需要 --enable-thread-safety5pgvector 华为云是 SPA5PG 15 public schema 授权5、6LiteFlow dataSourceName 报错6Node.js 版本不足导致 rolldown 缺失7pnpm 12 供应链策略7SPA 刷新 4047开源产出工具链https://gitee.com/dboru/jeecgboot-pg-toolsSQL 转换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 权限、字典、工作流能力不做黑盒每一步决策、每一个坑都写出来仓库已开源Giteehttps://gitee.com/dboru资产管理相关仓库见主页下一篇会先讲清楚三件事为什么选 JeecgBoot 而不是从零开发资产管理系统要解决什么问题整体架构与开发路线图敬请关注。项目地址JeecgBoot PostgreSQL 工具链https://gitee.com/dboru/jeecgboot-pg-toolsSQL 转换工具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 完整方案