Sonatype Nexus Repository es un gestor de artefactos: guarda los paquetes que produce tu equipo (Maven, npm, PyPI y otros formatos) y hace de caché de los registros públicos, de modo que tus builds descargan las dependencias desde tu red y siguen funcionando aunque el registro público falle. En este tutorial instalarás Nexus Repository Community Edition en Ubuntu 24.04 como servicio systemd, lo publicarás con Nginx y HTTPS y configurarás repositorios de npm y Maven para usarlos desde tus proyectos.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 4 GB de RAM, 2 vCPU y espacio en disco suficiente para tus artefactos (empieza con 50 GB).
- Un usuario no root con privilegios
sudo. - Un dominio o subdominio, por ejemplo
nexus.your_domain, con un registro A apuntando a la IP del servidor. - Los puertos 22, 80 y 443 abiertos en UFW.
NotaNexus Repository Community Edition es gratuita pero tiene límites de uso publicados por Sonatype. Revisa las condiciones vigentes en su web si vas a usarlo con mucho volumen.
Paso 1: Crear el usuario de servicio
Nexus no debe ejecutarse como root. Crea un usuario de sistema sin shell de acceso:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin nexus
Paso 2: Descargar Nexus Repository
Las versiones actuales para Linux incluyen su propio entorno Java, así que no necesitas instalar un JDK aparte. Consulta el número de la última versión en la página de descargas de Sonatype (https://help.sonatype.com/en/download.html) y guárdalo en una variable, sustituyendo VERSION por el número real (con el formato 3.x.y-zz):
NEXUS_VERSION=VERSION
Descarga el archivo para Linux x86_64 y descomprímelo en /opt:
cd /tmp
curl -fLO "https://download.sonatype.com/nexus/3/nexus-${NEXUS_VERSION}-linux-x86_64.tar.gz"
sudo tar -xzf "nexus-${NEXUS_VERSION}-linux-x86_64.tar.gz" -C /opt
El archivo crea dos directorios: nexus-<versión>, con la aplicación, y sonatype-work, con los datos (base de datos, blobs, logs). Crea un enlace simbólico estable para la aplicación, para que las actualizaciones solo tengan que cambiar el enlace, y asigna los datos al usuario nexus:
sudo ln -sfn "/opt/nexus-${NEXUS_VERSION}" /opt/nexus
sudo chown -R nexus:nexus "/opt/nexus-${NEXUS_VERSION}" /opt/sonatype-work
Comprueba el resultado:
ls -l /opt
lrwxrwxrwx 1 root root ... nexus -> /opt/nexus-3.x.y-zz
drwxr-xr-x 10 nexus nexus ... nexus-3.x.y-zz
drwxr-xr-x 3 nexus nexus ... sonatype-work
Paso 3: Escuchar solo en localhost
Por defecto Nexus escucha en el puerto 8081 de todas las interfaces. Como vas a publicarlo a través de Nginx, haz que solo escuche en local. La configuración propia de la instancia va en /opt/sonatype-work/nexus3/etc/nexus.properties, que se crea en el primer arranque; créalo ya con este contenido:
sudo mkdir -p /opt/sonatype-work/nexus3/etc
sudo nano /opt/sonatype-work/nexus3/etc/nexus.properties
application-host=127.0.0.1
application-port=8081
Asigna el archivo al usuario nexus:
sudo chown -R nexus:nexus /opt/sonatype-work/nexus3
La memoria de la JVM se define en /opt/nexus/bin/nexus.vmoptions (-Xms y -Xmx). Los valores por defecto están pensados para un servidor de unos 8 GB; en un servidor de 4 GB, baja ambos a -Xms1200m y -Xmx1200m para dejar memoria al sistema y a la caché de disco.
Paso 4: Crear el servicio systemd
Crea la unidad de systemd:
sudo nano /etc/systemd/system/nexus.service
[Unit]
Description=Nexus Repository
After=network.target
[Service]
Type=forking
User=nexus
Group=nexus
LimitNOFILE=65536
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
Restart=on-abort
TimeoutSec=600
[Install]
WantedBy=multi-user.target
LimitNOFILE=65536 es el mínimo de descriptores de archivo que recomienda Sonatype. Recarga systemd y arranca Nexus:
sudo systemctl daemon-reload
sudo systemctl enable --now nexus
El primer arranque tarda uno o dos minutos. Sigue el log hasta ver el mensaje de inicio:
sudo tail -f /opt/sonatype-work/nexus3/log/nexus.log
-------------------------------------------------
Started Sonatype Nexus ... 3.x.y-zz
-------------------------------------------------
Pulsa Ctrl+C y comprueba el endpoint de estado, que responde 200 cuando Nexus acepta peticiones:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/service/rest/v1/status
200
Paso 5: Publicar Nexus con Nginx y HTTPS
Instala Nginx y Certbot:
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx
Crea el bloque de servidor:
sudo nano /etc/nginx/sites-available/nexus
server {
listen 80;
server_name nexus.your_domain;
client_max_body_size 1g;
proxy_read_timeout 300;
proxy_send_timeout 300;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
client_max_body_size 1g permite subir artefactos grandes y los timeouts evitan cortes al descargar paquetes pesados desde los registros públicos. Activa el sitio, abre el firewall y obtén el certificado:
sudo ln -s /etc/nginx/sites-available/nexus /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo ufw allow 'Nginx Full'
sudo certbot --nginx -d nexus.your_domain
Congratulations! You have successfully enabled HTTPS on https://nexus.your_domain
Paso 6: Completar la configuración inicial
Nexus genera una contraseña de administrador aleatoria en el primer arranque. Léela:
sudo cat /opt/sonatype-work/nexus3/admin.password
Abre https://nexus.your_domain, pulsa Sign in e inicia sesión con el usuario admin y esa contraseña. El asistente inicial te pedirá:
- Una contraseña nueva para
admin. - Si quieres permitir el acceso anónimo. Desactívalo si tus artefactos son privados; tendrás que autenticar a los clientes, como se muestra más abajo.
Al terminar, el asistente borra el archivo admin.password.
Nexus trae varios repositorios de Maven creados por defecto: maven-central (proxy de Maven Central), maven-releases y maven-snapshots (hosted, para tus artefactos) y maven-public (un grupo que los une). Los verás en Settings (el icono del engranaje) > Repository > Repositories.
Paso 7: Crear repositorios npm
Los repositorios de Nexus son de tres tipos: proxy (caché de un registro remoto), hosted (paquetes propios) y group (una URL única que combina varios). Crea los tres para npm desde Settings > Repository > Repositories > Create repository:
- npm (proxy): nombre
npm-proxy, Remote storagehttps://registry.npmjs.org. - npm (hosted): nombre
npm-hosted, con Deployment policy en Disable redeploy para que una versión publicada no se pueda sobrescribir. - npm (group): nombre
npm-group, y añade como miembrosnpm-hostedynpm-proxy, en ese orden. Así tus paquetes internos tienen prioridad sobre los públicos del mismo nombre.
Para poder publicar con npm publish, activa el realm de npm en Settings > Security > Realms: mueve npm Bearer Token Realm a la lista Active y guarda.
Crea también un usuario para tu CI en Settings > Security > Users > Create local user, con un rol que tenga permisos sobre estos repositorios. Evita usar la cuenta admin desde los pipelines.
Paso 8: Usar Nexus desde npm y Maven
npm
En tu proyecto, apunta npm al grupo creando un .npmrc:
nano .npmrc
registry=https://nexus.your_domain/repository/npm-group/
Si desactivaste el acceso anónimo, inicia sesión contra el grupo con el usuario de CI. Las versiones actuales de npm intentan un login por navegador por defecto; --auth-type=legacy fuerza el usuario y contraseña que entiende Nexus:
npm login --auth-type=legacy --registry=https://nexus.your_domain/repository/npm-group/
Comprueba que las dependencias se resuelven a través de Nexus:
npm view express version
5.x.x
En Nexus, navega por npm-proxy en Browse: verás el paquete express en caché. Para publicar tus paquetes, añade en su package.json un bloque "publishConfig": { "registry": "https://nexus.your_domain/repository/npm-hosted/" } y ejecuta npm publish tras autenticarte contra esa URL.
Maven
Para que Maven descargue todas las dependencias a través de Nexus, declara un mirror en ~/.m2/settings.xml, con las credenciales del usuario de CI:
nano ~/.m2/settings.xml
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>https://nexus.your_domain/repository/maven-public/</url>
</mirror>
</mirrors>
<servers>
<server>
<id>nexus</id>
<username>ci-user</username>
<password>your_strong_password</password>
</server>
</servers>
</settings>
El id del bloque server debe coincidir con el del mirror. Ejecuta un build en un proyecto Maven (mvn -U dependency:resolve) y comprueba en Browse > maven-central que aparecen los artefactos descargados.
Paso 9: Limpieza y copias de seguridad
Los repositorios proxy crecen sin límite si no los limpias. En Settings > Repository > Cleanup Policies crea una política, por ejemplo que elimine componentes no descargados en los últimos 90 días, y asígnala a los repositorios proxy en su configuración. Las tareas de Settings > System > Tasks ejecutan la limpieza; el espacio en disco se recupera cuando se ejecuta la tarea Admin - Compact blob store, que conviene programar después.
Todo el estado de Nexus (base de datos, blobs y configuración) está en /opt/sonatype-work/nexus3. La forma más sencilla de obtener una copia coherente es detener el servicio durante la copia:
sudo systemctl stop nexus
sudo tar -czf "/var/backups/nexus-$(date +%F).tar.gz" -C /opt sonatype-work
sudo systemctl start nexus
Guarda las copias fuera del servidor. Si el volumen de blobs es grande, programa esta operación en una ventana de poco uso.
Para actualizar, descarga la versión nueva en /opt, asígnala al usuario nexus, cambia el enlace /opt/nexus y reinicia el servicio. Si modificaste nexus.vmoptions, repite el cambio en la versión nueva.
Solución de problemas
Nginx devuelve 502 Bad Gateway: Nexus aún está arrancando o se ha detenido. Revisa sudo systemctl status nexus y /opt/sonatype-work/nexus3/log/nexus.log.
El servicio se detiene por falta de memoria: el -Xmx de nexus.vmoptions es demasiado alto para la RAM del servidor. Bájalo como se indica en el paso 3.
npm publish devuelve 401 Unauthorized: el npm Bearer Token Realm no está activo, o el usuario no tiene permiso de escritura sobre npm-hosted.
Error 413 Request Entity Too Large al subir artefactos: aumenta client_max_body_size en el bloque de Nginx y recárgalo.
Conclusión
Tienes Nexus Repository funcionando en Ubuntu 24.04 como servicio systemd, publicado con HTTPS a través de Nginx, con repositorios proxy y hosted de npm y Maven que tus proyectos ya pueden usar. Como siguientes pasos, puedes configurar tu GitLab Runner o Jenkins para que resuelva dependencias desde Nexus, añadir repositorios PyPI siguiendo el mismo esquema proxy, hosted y group, o usar Harbor como registro dedicado para imágenes de contenedores.