Installation service Nexus

De EjnTricks

L'installation de Nexus a toujours été réalisée sous la forme d'un war déployé dans un serveur d'application, tel Tomcat. Depuis la version 2.11.4, l'installation sous forme d'une application indépendante a été étudiée. La mise en place d'un service est décrite sur le site officiel, mais il existe quelques subtilités.

L'application sera alors disponible depuis l'URL http://<HOST>:8081/nexus


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.11.4, 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.11.4, les répertoires sont les suivants.

  • /var/opt/nexus/2.11.4-01 : Contient les binaires de la version 2.11.4;
  • /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.11.4-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.11.4-01-bundle.tar.gz https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.4-01-bundle.tar.gz
#sudo tar -C /var/opt/nexus -xzf /tmp/nexus-2.11.4-01-bundle.tar.gz
#sudo mv /var/opt/nexus/nexus-2.11.4-01 /var/opt/nexus/2.11.4-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.11.4-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.11.4-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 répetoires sont externalisés dans un répertoire /var/opt/nexus/commondans lequel l’arborescence standard est reproduite pour plus de clarté :

  • bin/jsw/conf contient les fichiers de configuration de démarrage;
  • conf contient les fichiers de configuration.

Dans un premier temps, les répertoires sont créés sous common avec recopie des fichiers de l'instance.

#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.11.4-01/bin/jsw/conf/* /var/opt/nexus/common/bin/jsw/conf
#sudo cp -p /var/opt/nexus/2.11.4-01/conf/* /var/opt/nexus/common/conf

Ces répertoires externalisés est ensuite liés dans la distribution.

#sudo rm -rf /var/opt/nexus/2.11.4-01/bin/jsw/conf
#sudo ln -s /var/opt/nexus/common/bin/jsw/conf /var/opt/nexus/2.11.4-01/bin/jsw/conf
#sudo chown -h nexus:nexus /var/opt/nexus/2.11.4-01/bin/jsw/conf
#sudo rm -rf /var/opt/nexus/2.11.4-01/conf
#sudo ln -s /var/opt/nexus/common/conf /var/opt/nexus/2.11.4-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.11.4-01/conf

Les contenus des répertoires sont alors le suivant :

#sudo ll /var/opt/nexus/2.11.4-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.11.4-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/


Run-icon.png Script démarrage

Les modifications dans le script de démarrage, fichier /var/opt/nexus/2.11.4-01/bin/nexus, doivent permettre :

  • Spécifier l'utilisateur d'exécution;
  • Spécifier un emplacement spécifique pour le fichier "PID".

A noter que lors de l'exécution, si un compte est spécifié et différent de celui en cours d'exécution, le script de démarrage est redémarré avec le compte souhaité.

L'utilisateur d'exécution est sépcifié dans le paramètre RUN_AS_USER, et l'emplacement du fichier "PID" dans le paramètre PIDDIR.

# 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

Et

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

Cependant, le répertoire /run/nexus n'existe pas et le compte nexus n'a pas les droits d'écriture dans /run. Une erreur se produira donc lors de l'exécution, car le fichier "PID" ne pourra être créé. Le script de démarrage /var/opt/nexus/2.11.4-01/bin/nexus est donc modifié afin de forcer la création du répertoire. Pour rappel, comme il est exécuté avec le compte root d fait du service, il est tout à fait possible de créer le répertoire et de modifier les droits d'accès.

Au final, le script 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

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.11.4-01/logs/wrapper.log

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

  • Fichier /var/opt/nexus/2.11.4-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.11.4-01/bin/jsw/conf/wrapper.conf pour le fichier /var/opt/nexus/2.11.4-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.11.4-01/logs
#sudo ln -s /var/log/nexus /var/opt/nexus/2.11.4-01/logs
#sudo chown -h nexus:nexus /var/opt/nexus/2.11.4-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

Share-icon.png Répertoire de travail

Nexus utilise le répertoire sonatype-work pour son fonctionnement. Lors du déployement 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 App Web-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

Historiquement, les services Linux sont déclarés dans le répertoire /etc/init.d. Ce système est progressivement remplacé par l’outil systemd qui utilise un autre système de configuration. Cependant, systemd est capable de générer sa propre configuration depuis les scripts dans /etc/init.d.

Le fichier /etc/init.d/nexus est créé 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


Strategy-icon.png Stratégie de Backup

La stratégie de backup est revue afin de prendre en compte la nouvelle organisation. Sur les précédentes versions, les répertoires et fichiers sauvegardés étaient les suivants:

  • /var/opt/nexus
  • /var/lib/tomcat7/webapps/nexus
  • /usr/share/tomcat7/sonatype-work
  • /etc/apache2/httpd.conf

Ils sont à présents moins nombreux :

  • /var/opt/nexus
  • /etc/apache2/httpd.conf

La mise en place de cette sauvegarde est explicitée ici.