Docker 容器部署的Nexus 3 实例版本更新
起因
Nexus 3.77.2 以上版本支持免费版本使用外部Postgres 数据库了,故想要升级。
现状
Nexus 3版本为3.68.1,部署在docker 容器中。
部分docker-compose.yaml
内容如下:
services:
nexus:
container_name: nexus3
image: sonatype/nexus3:3.68.1-java11
restart: unless-stopped
volumes:
- "./Nexus/nexus-data/:/nexus-data/"
- "/mnt/tm/Backup/Nexus3/:/nexus-backup/"
env_file:
- ./env_file/TimeZone.env
- ./env_file/nexus3.env
networks:
network-infrastructure:
ipv4_address: 172.18.22.1
aliases:
- infrastructure-nexus3
network-database:
ipv4_address: 172.19.22.1
升级过程
- 将nexus 3 版本升级到3.70.x
- Nexus 由原OrientDB 数据库迁移到内置H2 数据库
- 将Nexus 3 版本升级到3.77.2+
- Nexus 由内置H2 数据库迁移到外置Postgres
Nexus 由原OrientDB 数据库迁移到内置H2 数据库
- 更新Nexus3 版本到
latest-3.70.x
。可以直接升级,将docker-compose.yaml
中版本修改为latest-3.70.x
再启动即可。 - 下载数据库迁移工具。
- 备份数据库后停机
docker stop nexus3
- 执行数据库迁移工具
- 需要java8 或java11 运行环境
- 进入备份文件夹所在目录
- 执行
java -Xmx16G -Xms16G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator-*.jar --migration_type=h2
- 将生成的
nexus.mv.db
文件移动到$data-dir/db
- 如果使用root 用户移动,需要注意
nexus.mv.db
文件属主应为200
。chown 200 $data-dir/db/nexus.mv.db
- 如果使用root 用户移动,需要注意
- 修改
$data-dir/etc/nexus.properties
文件。增加一行nexus.datastore.enabled=true
- 重启nexus
Nexus 由内置H2 数据库迁移到外置Postgres
- 更新Nexus3 版本到最新版本(当前是3.81.1)。可以直接升级,将
docker-compose.yaml
中版本修改为3.81.1
再启动即可。 - 下载数据库迁移工具。
- 运行备份数据库任务后停机
docker stop nexus3
- 将备份后到zip 文件移动到
$data-dir/db
目录 - 初始化postgres 数据库
# 创建用户 CREATE ROLE nexus LOGIN PASSWORD 'string'; # 创建数据库 CREATE DATABASE nexus ENCODING 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE template0 OWNER nexus; # 创建scheme CREATE SCHEMA nexus; # 启用扩展(在nexus 数据库连接下) CREATE EXTENSION pg_trgm SCHEMA public;
- 执行数据库迁移工具
- 需要在
$data-dir/db
目录执行 - 可以使用Java 17 环境
- 执行
java -Xmx16G -Xms16G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator-*.jar --migration_type=h2_to_postgres --db_url="jdbc:postgresql://<database URL>:<port>/nexus?user=postgresUser&password=secretPassword¤tSchema=nexus"
- 上方
<database URL>
、<port>
、postgresUser
、secretPassword
等参数自行修改
- 需要在
- 数据库重建索引。执行SQL:
VACUUM(FULL, ANALYZE, VERBOSE);
- 修改nexus.env 文件,增加以下行,其中PASSWD 等参数需要自行修改
NEXUS_DATASTORE_NEXUS_JDBCURL="jdbc:postgresql://172.19.19.2:5432/nexus?user=nexus&password=PASSWD¤tSchema=nexus" NEXUS_DATASTORE_NEXUS_USERNAME="nexus" NEXUS_DATASTORE_NEXUS_PASSWORD="PASSWD"
- 重启nexus。shell 执行
docker compose up -d
参考文档
Upgrading to Nexus Repository 3.71.0 and Beyond
Migrating to a New Database
Install Nexus Repository with a PostgreSQL Database
Docker 容器部署的Nexus 3 实例版本更新
https://www.persipa.site/2025/xBCT67D3