<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Elieser Santiesteban-Frutos</title>
    <description>The latest articles on DEV Community by Elieser Santiesteban-Frutos (@hackroot23).</description>
    <link>https://dev.to/hackroot23</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1677630%2Fec5f0e94-c579-4f9f-9a90-d354fe584b2a.jpg</url>
      <title>DEV Community: Elieser Santiesteban-Frutos</title>
      <link>https://dev.to/hackroot23</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hackroot23"/>
    <language>en</language>
    <item>
      <title>Gestión de paquetes privados con Verdaccio: una solución eficiente para proyectos personales y colaborativos</title>
      <dc:creator>Elieser Santiesteban-Frutos</dc:creator>
      <pubDate>Sun, 04 May 2025 03:57:19 +0000</pubDate>
      <link>https://dev.to/hackroot23/gestion-de-paquetes-privados-con-verdaccio-una-solucion-eficiente-para-proyectos-personales-y-3l3a</link>
      <guid>https://dev.to/hackroot23/gestion-de-paquetes-privados-con-verdaccio-una-solucion-eficiente-para-proyectos-personales-y-3l3a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cómo implementar un registry privado de npm usando Verdaccio, sus ventajas para mantener paquetes internos y cómo desplegarlo en local o en la nube.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Durante el desarrollo de varios proyectos personales, noté un patrón recurrente: funciones utilitarias, filtros reutilizables para MongoDB y lógica repetida entre servicios. Compartir este tipo de código entre múltiples repositorios sin publicarlo en el registro público de npm se volvió una necesidad. En ese contexto, decidí explorar una solución para crear un &lt;strong&gt;registro de paquetes privado&lt;/strong&gt; que me permitiera gestionar dependencias internas de forma segura y controlada.&lt;/p&gt;

&lt;p&gt;Así que me puse a buscar una forma de empaquetar y reutilizar ese código sin subirlo a npm público. Quería algo rápido, privado, simple y siempre Software Libre. Ahí fue cuando me topé con &lt;strong&gt;Verdaccio&lt;/strong&gt;, y honestamente, me vino como anillo al dedo.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué es Verdaccio?
&lt;/h2&gt;

&lt;p&gt;Verdaccio es un &lt;strong&gt;registro npm privado y liviano&lt;/strong&gt;, que puede ser desplegado fácilmente en local o en la nube. Permite almacenar, compartir y consumir paquetes npm sin depender del ecosistema público. Es ideal para organizaciones o desarrolladores que requieren:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compartir librerías internas sin hacerlas públicas.&lt;/li&gt;
&lt;li&gt;Controlar el acceso mediante autenticación.&lt;/li&gt;
&lt;li&gt;Tener un entorno seguro para pruebas antes de publicar en npmjs.org.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Instalación rápida con Docker
&lt;/h2&gt;

&lt;p&gt;Para evaluarlo de forma local, ejecuté el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; verdaccio &lt;span class="nt"&gt;-p&lt;/span&gt; 4873:4873 verdaccio/verdaccio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto inicia el servidor en &lt;a href="http://localhost:4873" rel="noopener noreferrer"&gt;http://localhost:4873&lt;/a&gt;. Para un entorno persistente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; verdaccio &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 4873:4873 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/storage:/verdaccio/storage &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/conf:/verdaccio/conf &lt;span class="se"&gt;\&lt;/span&gt;
  verdaccio/verdaccio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto mantiene tanto los paquetes como la configuración, incluso tras reiniciar el contenedor.&lt;/p&gt;

&lt;p&gt;Configuración básica (&lt;code&gt;config.yaml&lt;/code&gt;)&lt;br&gt;
La configuración de Verdaccio se encuentra en el archivo &lt;code&gt;config.yaml&lt;/code&gt;. A continuación, una configuración mínima para comenzar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;auth: para controlar acceso. Usa bcrypt si vas a crear usuarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uplinks: para seguir teniendo acceso a los paquetes públicos de npm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;packages: puedes controlar qué usuarios o grupos pueden publicar o acceder a qué paquetes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo muy básico:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./storage&lt;/span&gt;

&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;htpasswd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./htpasswd&lt;/span&gt;
    &lt;span class="na"&gt;algorithm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bcrypt&lt;/span&gt;

&lt;span class="na"&gt;uplinks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;npmjs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://registry.npmjs.org/&lt;/span&gt;

&lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;@*/*'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$authenticated&lt;/span&gt;
    &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$authenticated&lt;/span&gt;

  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$authenticated&lt;/span&gt;
    &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$authenticated&lt;/span&gt;

&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permite autenticación básica, acceso y publicación para usuarios autenticados, y reenvía los paquetes que no estén en tu registry a npmjs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dockerfile personalizado para producción
&lt;/h2&gt;

&lt;p&gt;En lugar de usar directamente la imagen base de Verdaccio, puedes crear una imagen personalizada que incluya tu configuración y lógica de arranque:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; verdaccio/verdaccio:5&lt;/span&gt;

&lt;span class="c"&gt;# Set working directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /verdaccio&lt;/span&gt;

&lt;span class="c"&gt;# Copy config files and startup script&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; config.yaml /verdaccio/conf/config.yaml&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; start.sh /verdaccio/start.sh&lt;/span&gt;

&lt;span class="c"&gt;# Expose the default Verdaccio port and Railway's PORT&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 4873&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;

&lt;span class="c"&gt;# Set environment variables&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;

&lt;span class="c"&gt;# Command to run the application using our config file&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; /bin/sh -c "verdaccio --config /verdaccio/conf/config.yaml --listen 0.0.0.0:4873"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este enfoque te permite tener control total sobre el entorno de Verdaccio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personalizas el archivo config.yaml para definir autenticación, permisos y uplinks.&lt;/li&gt;
&lt;li&gt;Puedes añadir un start.sh para tareas como generar usuarios o pre-cargar paquetes.&lt;/li&gt;
&lt;li&gt;Facilita el despliegue en Railway u otras plataformas que esperan un CMD claro y abierto en 0.0.0.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si estás usando Railway, basta con conectar tu repo y configurar la variable de entorno PORT=4873 si lo necesitas explícitamente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Publicación y consumo de paquetes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crear un usuario:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm adduser &lt;span class="nt"&gt;--registry&lt;/span&gt; http://localhost:4873
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publicar un paquete:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish &lt;span class="nt"&gt;--registry&lt;/span&gt; http://localhost:4873
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalar desde otro proyecto:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @tu-nombre/mi-paquete &lt;span class="nt"&gt;--registry&lt;/span&gt; http://localhost:4873
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Despliegue en la nube (Railway o VPS)
&lt;/h2&gt;

&lt;p&gt;Una vez validado localmente, puedes desplegar Verdaccio en servicios como Railway, Render o un VPS. En mi caso, utilicé Railway junto a un túnel de Cloudflare para evitar configuraciones de DNS o puertos abiertos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recomendaciones:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Usa volúmenes persistentes para storage y conf.&lt;/li&gt;
&lt;li&gt;Protege el acceso al registro mediante HTTPS y autenticación.&lt;/li&gt;
&lt;li&gt;Agrega plugins para métricas, dashboards o SSO si tu entorno lo requiere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Manejo de tokens
&lt;/h2&gt;

&lt;p&gt;En entornos CI/CD o instalaciones automatizadas, puedes usar un &lt;code&gt;.npmrc&lt;/code&gt; con token para autenticarte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tu-nombre:registry=https://turegistro.com/
//turegistro.com/:_authToken=TOKEN_GENERADO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes generar este token usando &lt;code&gt;npm login&lt;/code&gt; o &lt;code&gt;npm token create&lt;/code&gt; si tu servidor lo permite.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Verdaccio ha sido una herramienta clave para mantener mi ecosistema de paquetes organizado, modular y seguro. Me permite escalar mis proyectos sin duplicar código ni exponer lógica interna a npm público.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>devops</category>
      <category>docker</category>
      <category>verdaccio</category>
    </item>
  </channel>
</rss>
