Sonatype Nexus je univerzální uložiště pro APT, NPM, Docker a spoustu dalších balíčků. Funguje cloudově, dá se i selfhostovat.
Pokud hledáte privátní uložiště, doporučuje Nexus vyzkoušet. Pokud byste ho snad chtěli vykoušet provozovat v Dockeru, což osobně delám už zhruba 5 let, tak můžete vyzkoušet můj předpřipravný Docker image. Řeší pár specialit, jako třeba oprávnění, takže nemusíte nic řešit.
docker run \
-it \
--rm \
-p 8081:8081 \
-v $(pwd)/data:/nexus-data \
dockette/nexus:3.71.0-java17-ubi
Od verze 3.71.0 došlo celkem k revoluci, kdy interně kompletně odstranili OrientDB a podporovaná databáze je pouze H2 a nebo Postgres. Postgres bohužel až v placené verzi.
Od Sonatype existuje celkem dobře popsaný migrační manuál. Kdo by přesto tápal jak to provést, hodím sem pár tipů.
Zdroje
- Migrační manuál → https://help.sonatype.com/en/migrating-to-a-new-database.html
- Migrátor → https://help.sonatype.com/en/orientdb-downloads.html
- Issues → https://github.com/sonatype/nexus-public/issues/451, https://github.com/sonatype/nexus-public/issues/452, https://github.com/sonatype/nexus-public/issues/449
Kroky
- Aktualizovat Nexus na poslední verzi 3.70.x.
- Provést manuální zálohu (Admin → Tasks → Admin - Export databases for backup).
- Nastavit location např. na
/nexus-data/db-backup
. - Stopnout běžící Nexus (ale to je asi jasný, že jo).
- Stáhnout příslušný migrátor. Pozor na to, aby to byla verze 3.70.x.
- Stáhnout do složky, kde máte data a nebo
docker-compose.yml
. - Spustit Nexus s přepsaným entrypointem. Ať můžeme spustit migrátor.
- Spustíme docker kontejner.
- Ve složce
/nexus-data/db-backup
, kde máme uložené zálohy z předchozího kroku, spustíme migrátor. - Výstupní soubor
/nexus-data/db-backup/nexus.mv.db
přesuneme do/nexus-data/db/nexus.mv.db
a nastavíme oprávněnísudo chown 200:200 nexus.mv.db
. - Upravíme
/nexus-data/etc/nexus.properties
soubor. - Et voilà, máme hotovo. Spustíme Sonatype Nexus standardním způsobem.
sudo curl -L https://download.sonatype.com/nexus/nxrm3-migrator/nexus-db-migrator-3.70.1-03.jar -o nexus-db-migrator.jar
docker run \
-it \
--rm \
-v $(pwd)/data/nexus:/nexus-data \
-u root \
--entrypoint bash \
dockette/nexus:3.71.0-java17-ubi
java \
-Xmx16G \
-Xms16G \
-XX:+UseG1GC \
-XX:MaxDirectMemorySize=28672M \
-jar nexus-db-migrator.jar \
--migration_type=h2
nexus.datastore.enabled=true
Troubleshooting
Verze 3.71.x má aktuálně problém s autoincrementem v H2 databázi. Lze to jednoduše vyřešit přes script.
- Vytvořit
migrator.sh
script. - Spustit Nexus s přepsaným entrypointem.
#!/bin/bash
NEXUS_BIN=/opt/sonatype/nexus
NEXUS_DATA=/nexus-data
h2sql() {
echo "> $@" >&2
java -cp "$NEXUS_BIN"/system/com/h2database/h2/*/h2-*.jar org.h2.tools.Shell -url jdbc:h2:"$NEXUS_DATA"/db/nexus -sql "$@"
}
schema=$(h2sql "SCRIPT NODATA")
echo "$schema" | while read line; do
if [[ $line =~ ^CREATE\ CACHED\ TABLE\ \"PUBLIC\"\.\"([^\"]+)\" ]]; then
tbl="${BASH_REMATCH[1]}"
elif [[ $line =~ ^\"([^\"]+)\"\ .*\ GENERATED\ BY\ DEFAULT ]]; then
col="${BASH_REMATCH[1]}"
h2sql "ALTER TABLE $tbl ALTER COLUMN $col RESTART WITH SELECT max($col) + 1 FROM $tbl"
fi
done
docker run \
-it \
--rm \
-v $(pwd)/data/nexus:/nexus-data \
-v $(pwd)/migrator.sh:/migrator.sh \
-u root \
--entrypoint bash \
dockette/nexus:3.71.0-java17-ubi
Spustit sh
migrator.sh
a výstup bude zhruba následovný.
Doufám, že vám Nexus bude sloužit dobře. Dejte vědet.