Nexus 2.14.0

De EjnTricks

A partir de la version 2.14.0, l'installation de Nexus est réalisée en tant que service, avec le serveur d'application embarqué. Cette installation est inspiré du mode d'installation décrit sur l'article d'installation en service.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Viewer icon.png Objectifs

L'installation de la distribution bundle, version 2.14.0, va être installée sur une plateforme Ubuntu avec les spécificités suivantes :

  • Exécution avec un compte nexus;
  • Configuration du fichier "PID" dans un répertoire sous /run/nexus;
  • Externalisation de fichiers en vue des mises à jour.


Study icon.png Etude

L'installation faite va mettre en place trois "répertoires", sous /var/opt/nexus pour cet article, afin de séparer la version installée, les fichiers communs à toutes les versions (plugins, configuration) et un lien pour référencer la version active. Pour l'installation de la version 2.14.0, cela donne :

  • /var/opt/nexus/2.14.0-01 : Contient les binaires de la version 2.14.0;
  • /var/opt/nexus/common : Contient tous les fichiers communs, comme les plugins utilisés;
  • /var/opt/nexus/installed : Lien vers la version utilisée, soit /var/opt/nexus/2.14.0-01.


User-icon.png Compte de service

Cette installation ayant pour but d'être exécutée sous la forme d'un service, le compte root va être employé et ce n'est pas très sécurisé. Or il est possible de spécifier un compte utilisateur dans le script de démarrage de l'application. A l'instar d'application comme Tomcat, un compte technique est mis en place et sera exploité.

Attention le bash /bin/false est généralement utilisé pour les comptes de service. Du fait de l'implémentation du script de démarrage, il est nécessaire que le bash associé au compte soit un "vrai" bash, dans ce cas /bin/bash.

Le compte de service ne nécessite aucun répertoire home, et un groupe de même nom est créé.

#sudo adduser --shell /bin/bash  --system --no-create-home --group nexus
Ajout de l'utilisateur système « nexus » (UID 116) ...
Ajout du nouveau groupe « nexus » (GID 128) ...
Ajout du nouvel utilisateur « nexus » (UID 116) avec pour groupe d'appartenance « nexus » ...
Le répertoire personnel « /home/nexus » n'a pas été créé.


Download-icon.png System-Install-icon.png Téléchargement et installation

L'application est téléchargée et installée dans le répertoire /var/opt/nexus préalablement créé.

#sudo mkdir /var/opt/nexus
#sudo wget -O /tmp/nexus-2.14.0-01-bundle.tar.gz https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.0-01-bundle.tar.gz
#sudo tar -C /var/opt/nexus -xzf /tmp/nexus-2.14.0-01-bundle.tar.gz
#sudo mv /var/opt/nexus/nexus-2.14.0-01 /var/opt/nexus/2.14.0-01
#sudo chown -R nexus:nexus /var/opt/nexus
#sudo chmod -R go-rwx /var/opt/nexus

La distribution est donc déployée dans le répertoire /var/opt/nexus/2.14.0-01, qui représente la version mise en place.


Multiples-icon.png Gestion des versions

Le déploiement de nouvelles versions doit être le plus simple possible. Les scripts de service ne doivent pas contenir l'emplacement de l'instance, qui dans le cas de l'article contient le numéro de version, mais plutôt un lien générique qui sera modifié. Ce lien est créé sous /var/opt/nexus/installed.

#sudo ln -s /var/opt/nexus/2.14.0-01 /var/opt/nexus/installed
#sudo chown -h nexus:nexus /var/opt/nexus/installed


Share-icon.png Fichiers communs

Afin d'éviter la reprise des fichiers de paramétrages lors des montées de versions, les fichiers sont externalisés dans un répertoire /var/opt/nexus/common.

#sudo mkdir -p /var/opt/nexus/common/bin/jsw/conf
#sudo mkdir -p /var/opt/nexus/common/conf
#sudo chown -R nexus:nexus /var/opt/nexus/common
#sudo cp -p /var/opt/nexus/2.14.0-01/bin/jsw/conf/* /var/opt/nexus/common/bin/jsw/conf
#sudo cp -p /var/opt/nexus/2.14.0-01/conf/* /var/opt/nexus/common/conf

Ce répertoire externalisé est ensuite lié dans la distribution.

#sudo rm -rf /var/opt/nexus/2.14.0-01/bin/jsw/conf
#sudo ln -s /var/opt/nexus/common/bin/jsw/conf /var/opt/nexus/2.14.0-01/bin/jsw/conf
#sudo chown -h nexus:nexus /var/opt/nexus/2.14.0-01/bin/jsw/conf
#sudo rm -rf /var/opt/nexus/2.14.0-01/conf
#sudo ln -s /var/opt/nexus/common/conf /var/opt/nexus/2.14.0-01/conf
#sudo find /var/opt/nexus/common -type d -exec chmod 0700 {} \;
#sudo find /var/opt/nexus/common -type f -exec chmod 0600 {} \;
#sudo chown -h nexus:nexus /var/opt/nexus/2.14.0-01/conf

Les contenus des répertoires sont alors le suivant :

#sudo ll /var/opt/nexus/2.14.0-01
total 40
drwxr-xr-x 6 nexus nexus  4096 nov.   2 11:41 ./
drwxr-xr-x 5 nexus nexus  4096 nov.   1 12:15 ../
drwxr-xr-x 3 nexus nexus  4096 nov.   1 12:19 bin/
lrwxrwxrwx 1 nexus nexus    26 nov.   2 11:41 conf -> /var/opt/nexus/common/conf/
drwxr-xr-x 2 nexus nexus  4096 nov.   1 12:10 lib/
-rw-r--r-- 1 nexus nexus 11006 sept. 17 21:33 LICENSE.txt
lrwxrwxrwx 1 nexus nexus    14 nov.   1 12:26 logs -> /var/log/nexus/
drwxr-xr-x 4 nexus nexus  4096 nov.   1 12:10 nexus/
-rw-r--r-- 1 nexus nexus   782 sept. 17 21:33 NOTICE.txt
drwxr-xr-x 4 nexus nexus  4096 nov.   2 11:31 tmp/

#sudo ll /var/opt/nexus/2.14.0-01/bin/jsw
total 56
drwxr-xr-x 14 nexus nexus 4096 nov.   2 11:39 ./
drwxr-xr-x  3 nexus nexus 4096 nov.   1 12:19 ../
lrwxrwxrwx  1 nexus nexus   34 nov.   2 11:39 conf -> /var/opt/nexus/common/bin/jsw/conf/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 lib/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 license/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 linux-ppc-64/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 linux-x86-32/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 linux-x86-64/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 macosx-universal-32/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 macosx-universal-64/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 solaris-sparc-32/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 solaris-sparc-64/
drwxr-xr-x  3 nexus nexus 4096 nov.   1 12:10 solaris-x86-32/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 windows-x86-32/
drwxr-xr-x  2 nexus nexus 4096 nov.   1 12:10 windows-x86-64/


Icon-log.png Fichiers log

Par défaut, les logs sont placés dans le répertoire logs de l’instance Nexus :

  • /var/opt/nexus/sonatype-work/nexus/logs/nexus.log
  • /var/opt/nexus/sonatype-work/nexus/logs/request.log
  • /var/opt/nexus/2.14.0-01/logs/wrapper.log

La définition de ces emplacements se situe dans différentes configurations.

  • Fichier /var/opt/nexus/2.14.0-01/conf/logback-access.xml pour le fichier /var/opt/nexus/sonatype-work/nexus/logs/request.log :
  <appender name="request.logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>${nexus-work}/logs/request.log</File>
    <Append>true</Append>
    <encoder class="org.sonatype.nexus.bootstrap.log.AccessPatternLayoutEncoder">
      <pattern>%clientHost %l %user [%date] "%requestURL" %statusCode %bytesSent %elapsedTime</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${nexus-work}/logs/request-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
      <maxHistory>90</maxHistory>
    </rollingPolicy>
  </appender>

  <appender-ref ref="request.logfile"/>
  • Fichier /var/opt/nexus/2.14.0-01/bin/jsw/conf/wrapper.conf pour le fichier /var/opt/nexus/2.14.0-01/logs/wrapper.log :
# Set up JSW logging
wrapper.logfile=logs/wrapper.log
wrapper.logfile.format=PM
wrapper.logfile.loglevel=INFO
wrapper.logfile.maxsize=10m
wrapper.logfile.maxfiles=10


Afin de centraliser les logs, les messages sont redirigés vers /var/log/nexus en mettant en place des liens symboliques. Ceci permet de ne pas modifier les fichiers de configurations, limitant les modifications lors des futures montées de version.

#sudo mkdir -p /var/log/nexus
#sudo chown nexus:adm /var/log/nexus
#sudo rmdir /var/opt/nexus/2.14.0-01/logs
#sudo ln -s /var/log/nexus /var/opt/nexus/2.14.0-01/logs
#sudo chown -h nexus:nexus /var/opt/nexus/2.14.0-01/logs
#sudo ln -s /var/log/nexus /var/opt/nexus/sonatype-work/nexus/logs
#sudo chown -h nexus:nexus /var/opt/nexus/sonatype-work/nexus/logs


Icon-Configuration-Settings.png Variable système

L'application utilise une fonctionnalité propre à Java afin de stocker les préférences utilisateurs, ce qui s'effectue dans le répertoire Home de l'utilisateur. Comme le script est exécuté avec un compte technique, créé sans Home, le message d'erreur suivant est présent dans le fichier de log.

2015-07-28 14:54:11,192+0200 WARN  [Timer-1] admin java.util.prefs - Could not lock User prefs.  Unix error code 2.
2015-07-28 14:54:11,193+0200 WARN  [Timer-1] admin java.util.prefs - Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.

Un répertoire est alors créé pour être utilisé comme le home, sous /var/opt/nexus/sonatype-work.

#sudo mkdir -p /var/opt/nexus/sonatype-work/home
#sudo chown nexus:nexus /var/opt/nexus/sonatype-work/home

Puis, il faut modifier le fichier de paramétrage de l'application, qui a été externalisé sous /var/opt/nexus/common/bin/jsw/conf/wrapper.conf, en ajoutant l’argument -Duser.home=/var/opt/nexus/sonatype-work/home aux paramètres d'exécution.

# Additional JVM parameters (tune if needed, but match the sequence of numbers!)
wrapper.java.additional.1=-XX:MaxPermSize=192m
wrapper.java.additional.2=-Djava.io.tmpdir=./tmp
wrapper.java.additional.3=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.4=-Dcom.sun.jndi.ldap.connect.pool.protocol="plain ssl"
wrapper.java.additional.4.stripquotes=TRUE
#wrapper.java.additional.5=-Xdebug
#wrapper.java.additional.6=-Xnoagent
#wrapper.java.additional.7=-Djava.compiler=NONE
#wrapper.java.additional.8=-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#wrapper.java.additional.9=-XX:+HeapDumpOnOutOfMemoryError
wrapper.java.additional.5=-Duser.home=/var/opt/nexus/sonatype-work/home


Update icon.png Montées de version

Pour cette mise à jour, l'instance passe d'une application déployée sous Tomcat vers le service. Il est donc nécessaire de reprendre les fichiers temporaires / travail de l'instance pour être disponible depuis le service.

Stop-icon.png Arrêt Tomcat

L'instance en service remplacement le déploiement sous Tomcat. Il est donc nécessaire d'arrêter celui-ci et de supprimer l'instance.

#sudo service tomcat8 stop

Share-icon.png Répertoire de travail

Nexus utilise le répertoire sonatype-work pour son fonctionnement. Lors du déploiement sous Tomcat, celui-ci est placé dans le répertoire /usr/share/tomcat8/sonatype-work. Le contenu est donc copié dans le nouvel emplacmeent, soit /var/opt/nexus/sonatype-work, avec modification du propriétaire des fichiers.

#sudo cp -R /usr/share/tomcat8/sonatype-work/nexus/* /var/opt/nexus/sonatype-work/nexus/
#sudo chown -R nexus:nexus /var/opt/nexus/sonatype-work/nexus/*

Icon-log.png Fichier logs

Les logs étaient créées avec le compte d'exécution de Tomcat, soit tomcat8. L'exécution du service est exécuté à l'aide du compte nexus et il est donc nécessaire de modifier les droits d'accès des fichiers.

#sudo chown -R nexus:nexus /var/log/nexus

Delete-file-icon.png Suppression anciens fichiers

Les précédentes installations étaient réalisées par un déploiement sous Tomcat. L'ancienne instance et l'espace de travail peuvent être supprimés suite à cette nouvelle organisation.

#sudo rm -rf /usr/share/tomcat8/sonatype-work
#sudo rm -rf /var/lib/tomcat8/webapps/nexus
#sudo rm -rf /var/lib/tomcat8/work/Catalina/localhost/nexus
#sudo rm -rf /var/lib/tomcat8/work/Catalina/localhost/sonatype-work

Configuration-icon.png Publication Apache

Les précédentes versions étaient déployées sur un serveur Tomcat et mis à disposition sous Apache. Or, l'instance étant déployée dans son propre serveur d'application, le numéro des port est spécifique, et historiquement placé à 8081. Dans le cadre de cette installation, l'instance est disponible sur cette machine avec la configuration Apache suivante.

        ProxyPass /nexus http://localhost:8080/nexus
        ProxyPassReverse /nexus http://localhost:8080/nexus
        <Proxy http://localhost:8080/nexus>
                Order allow,deny
                Allow from all
        </Proxy>

Or avec cette nouvelle installation, l'instance est à présente indépendante et la configuration Apache devient :

        ProxyPass /nexus http://localhost:8081/nexus
        ProxyPassReverse /nexus http://localhost:8081/nexus
        <Proxy http://localhost:8081/nexus>
                Order allow,deny
                Allow from all
        </Proxy>


Start-icon.png Installation service

Run-icon.png Service init.d

Historiquement, les services Linux sont déclarés dans le répertoire /etc/init.d. Il suffit de créer le fichier /etc/init.d/nexus pour référencer Nexus en tant que service, avec le contenu suivant.

#!/bin/sh
#
# rc file for Nexus
#
# chkconfig: 345 96 10
# description: Nexus system (www.sonatype.org/nexus/)
#
### BEGIN INIT INFO
# Provides: nexus
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Nexus
# Description: Nexus system (www.sonatype.org/nexus/)
### END INIT INFO

/var/opt/nexus/installed/bin/nexus $*

exit $?

Le fichier doit être exécutable.

#sudo chmod 755 /etc/init.d/nexus

Le service est installé avec les paramètres par défaut.

#sudo update-rc.d nexus defaults

L’utilisation de systemd nécessite de recharger les configurations générées.

#sudo systemctl daemon-reload

Warning-icon.png Attention, en utilisant ce principe, il faut modifier le script de démarrage afin d'indiquer le compte d'exécution. De plus, une modification est réalisée pour s'assurer que le répertoire /run/nexus est disponible lors du démarrage. Le fichier /var/opt/nexus/installed/bin/nexus est modifié ainsi.

# NOTE - This will set the user which is used to run the Wrapper as well as
#  the JVM and is not useful in situations where a privileged resource or
#  port needs to be allocated prior to the user being changed.
#RUN_AS_USER=
RUN_AS_USER=nexus

# Application
APP_NAME="nexus"
APP_LONG_NAME="Nexus OSS"

# Priority at which to run the wrapper.  See "man nice" for valid priorities.
#  nice is only used if a priority is specified.
PRIORITY=

# Location of the pid file.
#PIDDIR="."
PIDDIR="/run/nexus"
if [ ! -d "$PIDDIR" ]; then
        mkdir -p "$PIDDIR"
        [ -z "$RUN_AS_USER" ] || chown "$RUN_AS_USER:$RUN_AS_USER" "$PIDDIR"
fi

Start-icon.png Service systemd

Le système init.d est progressivement remplacé par l’outil systemd qui utilise un autre système de configuration. Il suffit de créer le fichier /lib/systemd/system/nexus.service avec le contenu suivant.

[Unit]
Description=Nexus

[Service]
RuntimeDirectory=nexus
Type=forking
User=nexus
Group=nexus
ExecStart=/var/opt/nexus/installed/bin/nexus start
ExecStop=/var/opt/nexus/installed/bin/nexus stop
ExecReload=/var/opt/nexus/installed/bin/nexus restart
PIDFile=/run/nexus/nexus.pid
Restart=always

[Install]
WantedBy=multi-user.target

Warning-icon.png Avec l'utilisation du Java Service Wrapper, un sous processus est démarré. Le script nexus se termine après exécution. Donc il est important de spécifier la valeur forking dans le paramètre Type. Ainsi systemd ne considérera pas que le service s'est arrêté.

Avec le type forking, il est généralement conseillé d'indiquer l'emplacement du fichier PID, qui est configuré dans la variable PIDFile. Attention, cet emplacement doit être en accord avec la configuration de PIDDIR dans le script de démarrage.

Afin d'être homogène avec une plateforme Linux, le répertoire pour le fichier PID est spécifié à /run/nexus dans le fichier /var/opt/nexus/installed/bin/nexus.

# Location of the pid file.
#PIDDIR="."
PIDDIR="/run/nexus"

Contrairement à la méthode avec init.d, il n'est pas nécessaire de s'assurer de l'existance du répertoire. En effet, la valeur nexus de la variable RuntimeDirectory, dans la configuration du service, indique à systemd de s'en assurer.

Il est nécessaire de recharger les configurations générées.

#sudo systemctl daemon-reload

Puis le service doit être activé.

#sudo systemctl enable nexus
Created symlink /etc/systemd/system/multi-user.target.wants/nexus.service → /lib/systemd/system/nexus.service.


Strategy-icon.png Stratégie Backup

Enfin, le script de backup est modifié afin de prendre en compte cette nouvelle organisation, comme décrit dans l'article sur la stratégie de Backup Nexus en service


Viewer icon.png Voir aussi

Release Notes: https://help.sonatype.com/repomanager2/release-notes/older-release-notes#OlderReleaseNotes-RepositoryManager2.14