Tutoriales, noticias y soluciones informáticas

PiServer con Docker – Parte 15: Instalación de VaultWarden – Convertir un Docker CLI a Docker Compose

A estas alturas, si recopilamos todo lo que hemos hecho gracias a Docker en los 14 artículos que llevamos realizados, aún podemos hacer un listado interesante: Plex, Pi-hole, aMule, Nginx Proxy Manager, Nextcloud… y unas cuantas aplicaciones más que no pongo por no aburrir al personal.

Ahora vamos a instalar algo que seguro que nos será muy útil en nuestro día a día. Vamos a instalar Vaultwarden, que es un gestor de contraseñas en nube que…

¡PARA! ¡Que te he pillao! Nos quieres duplicar un artículo. Eso ya lo explicaste en este enlace. No nos vengas a reexplicar lo ya explicado. 

No Usuario Anónimo. Soy consciente de que la instalación de VaultWarden se explicó muy ampliamente en ese artículo que nos dices, pero en esta serie de tutoriales estamos viendo cómo instalar todo sobre Docker Compose y en esa instalación usamos en su momento Docker CLI (os recuerdo que las diferencias entre ambos las vimos en este otro artículo).

Así que en este artículo no vamos a explicar cómo se usa VaultWarden ni las ventajas de usar un gestor de contraseñas. Para todo eso os remito a ese mismo artículo. Aquí lo que vamos a explicar es cómo instalarlo mediante Docker Compose, pero sobre todo me interesa que sepáis convertir un Docker CLI en un Docker Compose, y por eso nos viene de perlas ese mismo artículo. Quiero que cuando terminéis de leer el artículo no os dé miedo tener que convertir cualquier Docker CLI que hayáis visto en internet en un Docker Compose.

Recordad que Docker Cli (Command Line Interface) es la herramienta más básica que existe para interactuar con Docker, pero sólo puede ejecutar un contenedor a la vez.

Docker Compose sin embargo nos permite definir y ejecutar aplicaciones que usan múltiples contenedores (los gestionamos todos a la vez mediante un único archivo de configuración que estamos llamando siempre docker-compose.yml).

Y… ¡Qué caray! Estamos haciendo todo en Docker Compose y hemos conseguido tener todos los dockers super ordenados. No vamos a dejar un contenedor descolgado usando Docker CLI ¿Verdad?

Veamos cómo podemos afrontar la conversión.

1- Punto de partida. Cojamos un Docker CLI.

El comando de Docker CLI que usamos en su momento para desplegar VaultWarden era el siguiente:

sudo docker run -d --name bitwarden -v /vw-data/:/data/ -e DOMAIN=https://vaultwarden.tuputodominio.com -e ADMIN_TOKEN=tuputotoken -e ROCKET_PORT=8181 -e WEBSOCKET_ENABLED=true -p 127.0.0.1:8181:8181 -p 127.0.0.1:3012:3012 --restart always vaultwarden/server:latest

Aunque sea un formato distinto al que estamos usando en los Docker Compose de esta serie de artículos, seguro que hay cosas que nos suenan. Por ejemplo:

  • –name bitwarden: Tiene pinta de ser el nombre del contenedor
  • /vw-data/:/data/: Parece que es un volumen.
  • Tal vez no sepamos aún cómo configura los puertos, pero parece claro que usa de alguna forma los puertos 8181 y 3012.
  • Vaultwarde/server:latest: Eso debería sonarnos a una imagen. ¿Será la que vamos a desplegar?

Sin embargo no tenemos la destreza como para intentar la conversión de Docker CLI a Docker Compose por nuestra cuenta ¿Cómo podemos hacer?

Pues seguir mi máxima en la vida. Lo importante no es saber, si no tener el teléfono del que sabe. Voy a llamar a mi cuñado Salgado "el enterado", que como es informático seguro que me puede decir...

Para, para. A ver: no es mala idea, pero no tenemos que molestar a nadie. Tenemos herramientas como para poder hacer la conversión por nuestra cuenta. Vamos a verlas.

2- Conversion sencilla de Docker CLI en Docker Compose.

Lo más sencillo para hacer esta conversión es usar herramientas en línea. Vamos a ver dos de ellas.

Composerize.

Quiero que tengáis esta web apuntada en vuestros marcadores.

https://www.composerize.com

Como podréis ver, es una herramienta en línea que os ayuda a hacer esa conversión. Sólo tenemos que ponerle el comando que usamos para desplegar el Docker CLI y la versión de Docker Compose que queremos (os aconsejo poner V2-3.X) y nos generará el archivo de Docker Compose equivalente para desplegar exactamente lo mismo. Pero ojo: No pongáis el «sudo» del principio del comando de Docker CLI que si no no os funcionará.

¡Guauuuu! ¡Mi cuñado lo haría exactamente igual! ¡Estoy impresionado!

Eehmmm… claro, claro. Pero aún podemos hacerlo de otra forma.

ChatGPT

En lugar de preguntarle a tu cuñado, podemos usar cualquier herramienta de inteligencia artificial (Como ChatGPT o Gemini) para que nos hagan la conversión. Estos asistentes son verdaderos «expertos» en todo lo que se refiere a crear código y pueden resolver muchos problemas que puedas tener con la generación del Docker Compose.

Screenshot
Espera... no es exactamente el mismo código en un caso que en el otro. 

Tienes razón, pero es un código equivalente. Tanto en un caso como en el otro, al final tendremos el mismo resultado (Es igual hacer 3+2 que 2+3. No te preocupes por que el código sea distinto).

Vemos algo raro en los puertos expuestos

En cualquiera de los dos casos ya tenemos un código que nos suena. Ahora sí que tenemos claro qué imagen vamos a usar para el despliegue, las variables de entorno y los puertos. Aunque tal vez los puertos nos parezcan un poco extraños respecto a lo que estamos acostumbrados a ver.

Sí. En los otros Dockers yo he visto que siempre ponías dos puertos. El de la derecha era el puerto interno del docker y el de la izquierda era el puerto en el host, pero ahí aparecen tres cosas y no lo veo nada claro. 

Efectivamente. Tanto Composerize como ChatGPT nos muestran un esquema de puertos tal que así.

- 127.0.0.1:8181:8181
- 127.0.0.1:3012:3012

Si os preguntáis por qué nos los ponen así, con la ip del «localhost» antes de los puertos, la respuesta es «Por seguridad». De hecho así estaban también en el Docker CLI. Este esquema lo que está diciendo es que estos puertos solo estarán accesibles desde la máquina anfitriona y no desde otras máquinas en la red. Esta es una medida de seguridad para evitar que servicios sensibles sean accesibles externamente.

Si en el tutorial de Nextcloud no habéis creado ninguna red común para nextcloud y el Nginx Proxy Manager, esta configuración del vaultwarden no debería ser ningún problema y podéis pasar ya mismo al siguiente punto, pero si la habéis creado entonces sí que va a haber una pequeña liada.

Si habéis configurado una red, Nginx Proxy Manager estará configurado para usar una red externa (nginx-proxy-network), pero Vaultwarden no está en esta red. Por tanto el Nginx Proxy Manager no podrá acceder directamente a la dirección 127.0.0.1:8181 del contenedor Vaultwarden (porque 127.0.0.1 es diferente en los dos contenedores). En este caso habría dos soluciones:

Solución elegante

La solución más «correcta» sería meter el Docker del VaulWarden en la misma red en la que hemos puesto el Nextcloud y el Nginx. Lo podemos hacer añadiendo estas líneas al docker-compose del VaultWarden.

    networks:
      - nginx-proxy-network

networks:
  nginx-proxy-network:
    external: true

También podríamos crear una red diferente y que el nginx estuviera a la vez en dos redes… pero no os quiero liar la cabeza. Vamos con la otra solución que es mucho más sencilla.

Solución cutre-salchichera: quitar la restricción al puerto del VaultWarden.

Es la solución más rápida. Si quitamos la restricción, las líneas del docker del VaultWarden nos quedarían así.

- 8181:8181
- 127.0.0.1:3012:3012

Al puerto 8181 podría conectarse cualquier máquina. No creo que en una instalación doméstica esto suponga un gran problema. El puerto 3012 seguiría estando securizado y todo funcionaría sin problemas. De hecho esta solución también se podría aplicar en caso de que el proxy estuviera en un equipo completamente distinto (otro ordenador u otra Raspberry). No os liéis, y si tenéis redes diferenciadas haced esto.

3- Creación de la estructura habitual de carpetas.

Vale. Ya tenemos un Docker Compose y nos hemos hecho unos expertos en modificar cualquier Docker Compose a nuestro antojo. Como ya sabemos la estructura que tiene respecto a los volúmenes (y la verdad es que este docker es de los sencillitos), vamos a crear las carpetas dónde irán los datos de nuestro Vaultwarden.

Si habéis seguido los tutoriales anteriores, tendréis una carpeta llamada «docker» dentro de la carpeta de usuario de vuestro sistema (/home/<tu_usuario>/docker). Si no es así, la podemos crear con el comando:

sudo mkdir docker

Vamos a meternos dentro de esa carpeta y a crear el único directorio que hay en la zona «volumes» de nuestro Docker Compose, que se llama vw-data. Lo haremos con estos comandos.

cd docker
sudo mkdir vaultwarden
cd vaultwarden
sudo mkdir vw-data

4- Creamos el archivo docker-compose.yml

Dentro de la carpeta «vaultwarden» vamos a crear el archivo «docker-compose.yml». Lo haremos con el siguiente comando.

sudo nano docker-compose.yml

Y dentro del archivo pondremos, sin cambiar nada, el siguiente contenido (os pongo en la zona de puertos el puerto 8181 sin filtrar por ip, porque así sé que os va a funcionar a todos. Si queréis filtrarlo, dejadlo como 127.0.0.1:8181:8181).

version: '3'
services:
  bitwarden:
    image: vaultwarden/server:latest
    container_name: bitwarden
    environment:
      - DOMAIN=$DOMAIN
      - ADMIN_TOKEN=$ADMIN_TOKEN
      - ROCKET_PORT=8181
      - WEBSOCKET_ENABLED=true
    volumes:
      - $DOCKERDIR/vaultwarden/vw-data/:/data/
    ports:
      - "8181:8181"
      - "127.0.0.1:3012:3012"
    restart: always

Como siempre, guardamos cambios con Control + O y salimos del editor con Control + X.

Si os fijáis, como siempre, hemos puesto en el archivo unas cuantas variables en lugar de sus valores definitivos (esto lo hacemos para securizar lo más posible la instalación). Vamos a establecer sus valores en el apartado 6.

5- Generamos un token seguro

Para el apartado 6 vamos a necesitar un «token seguro».

Ya empezamos con cosas raras. ¿Eso dónde lo tengo que pedir? ¿En el banco? ¿Debo solicitarlo como los certificados digitales en la Fábrica Nacional de Moneda y Timbre?

No, para nada. Lo que debemos generar es una especie de contraseña muy larga para tener la instalación lo más segura posible. Al fin y al cabo un gestor de contraseñas es algo muy crítico. No podemos dejar de lado la seguridad de este entorno. Pero no te preocupes, que conseguirlo es muy sencillo. Sólo tenemos que teclear el siguiente comando:

openssl rand -base64 48

Esto nos habrá generado una clave con la seguridad suficiente como para estar convencidos de que nadie va a poder entrar en nuestro sistema. Simplemente apuntad la clave que os genere. La necesitaremos en el apartado número 6.

6- Creamos el archivo de variables de entorno.

En la misma carpeta donde hemos puesto el archivo docker-compose.yml, crearemos ahora un archivo llamado «.env» que contendrá las variables que hemos definido en el archivo de configuración de VaultWarden. Crearemos el archivo con el siguiente comando:

sudo nano .env

Y dentro del archivo pondremos el siguiente contenido.

DOCKERDIR=/home/<tu_usuario>/docker
PROXY_IP=10.0.1.15
DOMAIN=https://claves.tudominio.com
ADMIN_TOKEN=TuTokenSuperMegaLargoYComplicadoQueLoFlipas

Ahí debemos modificar todas las líneas según lo que tengamos en nuestra instalación, de la siguiente forma.

  • Dockerdir: Debemos poner la ruta hacia la carpeta docker (lo único que hay que cambiar aquí es <tu_usuario> y poner el usuario que estéis usando en vuestra instalación).
  • Proxy_IP: Ahí debéis poner la dirección ip local del host dónde estáis instalando el Vaultwarden, que supongo que es el mismo que el que tiene el Nginx Proxy Manager. Si usáis un proxy en otro equipo deberíais poner la ip local de ese equipo en este apartado.
  • Domain: Aquí debéis poner el subdominio en el que va a funcionar vuestro gestor de contraseñas (algo del tipo https://claves.tudominio.com).
  • Admin_token: Aquí simplemente pondremos el token que hemos generado en el apartado 5.

Con todo esto definido, pulsaremos Control+O para guardar cambios y luego Control+X para salir del editor.

7- Protegemos el archivo de variables de entorno.

Como siempre, vamos a evitar que cualquiera pueda acceder a este archivo .env que acabamos de crear. Lo conseguiremos simplemente tecleando este comando.

sudo chmod 600 .env

Así únicamente el propietario del archivo podrá leerlo.

8- Desplegamos VaultWarden.

Ha llegado el punto que estábamos esperando. Vamos a desplegar nuestra instalación de VaultWarden. Desde la carpeta dónde hemos puesto el archivo docker-compose.yml, vamos a teclear el siguiente comando:

sudo docker-compose -p "vaultwarden" up -d

Después de un ratito, y si todo lo que hemos hecho hasta ahora está correcto, la instalación de nuestro gestor de contraseñas habrá finalizado correctamente.

9- Comprobación y creación del proxy.

Ha llegado el momento de comprobar si nuestro gestor de contraseñas funciona correctamente. Poned la siguiente URL en vuestro navegador (Poniendo vuestra ip en la zona correspondiente, por supuesto).

http://<tu-direccion-ip>:8181

Si os sale ésta página web, entonces felicidades: ya tenéis VaultWarden instalado.

Crear el proxy os va a ser muy sencillo si habéis seguido el resto de tutoriales. Se especifica con detalle en el tutorial número 9 que dedicamos al Nginx Proxy Manager. Como siempre, tendríamos que ir al panel de administración del nginx proxy Mananager y en «hosts» seleccionar la opción «proxy hosts».

Pulsaremos ahora arriba a la derecha el botón que pone «Add Proxy Host».

Y a partir de ahí, como siempre, es rellenar datos. Pondremos lo siguiente:

  • Domain name: El nombre de dominio que va a tener nuestra web (por ejemplo «claves.midominio.es» o «vaultwarden.midominio.com»).
  • Forward hostname / IP: La ip local de nuestra Raspberry. Algo como «192.168.1.15».
  • Forward port: Ponemos el 8181

Por último, en la pestaña de SSL del proxy que estamos creando, desplegamos la pestaña «SSL Certificate», pulsamos sobre la opción «Request a new SSL certificate» y marcamos las opciones «Force SSL» y «HTTP/2 Support». Guardamos cambios y con esto ya quedaría todo funcionando a la perfección. Ahora podremos acceder a la web a través del dominio que hemos indicado en el proxy.

10- Uso de Vaultwarden.

Sobre cómo se usa VaultWarden poco os puedo decir que no haya comentado ya en el artículo que hemos dedicado a Vaultwarden hace unos años.

Pero alguna indicación nos darás ¿No? Que de eso ya ni me acuerdo después de tanto tiempo. 

A ver… muy a grandes rasgos os voy a dar algunas pinceladas:

Habilitar envío de correo.

Lo primero que debéis hacer es entrar en esta web.

https://claves.tudominio.es/admin

(Es decir, el dominio que habilitaste en el paso 9 pero con «/admin» al final).

Ahí te preguntará por una autenticación. Simplemente pon el token que generaste en el paso 5. Esa es la clave que debes usar cada vez que quieras entrar en esa zona.

En la página que se te abre, en la zona superior tienes que entrar en «Settings».

Ahí debes poner la configuración de una cuenta de correo (SMTP) para que VaultWarden pueda enviar «cosas» (como invitaciones al sistema, segundo factor de autenticación, etc…).

Creación de usuarios.

Ahora en el menú superior debes entrar en «Users» y desde ahí puedes invitar a quien quieras para que pueda usar el gestor de contraseñas. Sólo tienes que poner un correo e invitar al usuario. Si quieres tener una cuenta en tu propio gestor, debes invitarte a ti mismo.

Otras funcionalidades interesantes.

Una vez que tengas varias cuentas funcionando hay una funcionalidad muy interesante, que es compartir contraseñas con otras personas.

Supón que esto lo empiezas a usar en tu puesto de trabajo. Si hay algún grupo de contraseñas que uséis entre varias personas (por ejemplo, credenciales de una web a la que os logáis identificándoos como empresa, no como persona física), puedes crear lo que en VaultWarden llaman «organizaciones».

Si creas una organización, puedes meter a gente en esa organización, y las contraseñas que se queden en esa organización las puede usar cualquiera de los usarios miembros de ella (puedes definir privilegios para cada usuario por separado, por si quieres que unos puedan editar esas contraseñas y otros no).

Además os recomiendo ya mismo bajaros la aplicación de escritorio de Vaultwarden. Muy útil para consultar las contraseñas sin necesidad de abrir la web y además la hay tanto para Windows como para Linux y Mac Os.

Pero sobre todo, os recomiendo bajar la aplicación para vuestro navegador. Es una gozada disponer de todas las contraseñas a golpe de click y que el sistema te las vaya ofreciendo según las vas usando. Además, si en una web pones una contraseña que no esté registrada en nuestro VaulWarden, el plugin te permite capturarla y así ya ni la tienes que escribir.

11- Actualización de este Docker.

Si no habéis seguido el resto de tutoriales y únicamente queréis actualizar este docker, simplemente debéis crear un archivo llamado «actualizar.sh» con el siguiente contenido.

cd /home/<tu_usuario>/docker/vaultwarden
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f

No os olvidéis de marcar el archivo resultante como ejecutable, usando el comando chmod +x actualizar.sh.

Si habéis seguido todos los tutoriales, sólo habría que poner esas líneas junto al resto que tenemos en ese archivo, por lo que nos quedaría algo así.

sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
cd /home/<tu_usuario>/docker/pihole
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/wireguard
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
cd /home/<tu_usuario>/docker/amule
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
cd /home/<tu_usuario>/docker/transmission
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/plex
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/navidrome
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/nextcloud
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/vikunja
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/calibre
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/vaultwarden
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now

Una vez hecho esto, actualizar este Docker es tan sencillo como ejecutar ese archivo con el comando ./actualizar.sh.

Y con esto terminamos este artículo. Para mi, VaultWarden es un sistema tremendamente potente y de obligada instalación cuando te montas un servidor casero. En los tiempos que corren es necesario algo así para gestionar con tranquilidad las contraseñas (jamáis reutilicéis una contraseña, aunque considereis el servicio que la usa poco importante). ¿Habéis tenido problemas con la instalación? ¿Tenéis alguna duda o problemas con los puertos o la conversión entre Docker Compose y CLI? Estaré atento a vuestros comentarios.

Share

9 comentarios

  1. Kersis

    Buenas,

    Parece que los dockers son el futuro…
    Podrías algún día hacer una explicación sobre docker swarm ??

    Otra cosa, todo este servidor con todos los dockers los 15+- en un rpi 3 tira bien?? o es demasiada caña ?? la rpi 5 se nota diferencia para todo esto??..

    Un saludo.

    • Aglak

      Por si te vale, yo lo estoy haciendo todo en una 3 y los primeros contenedores responden bien pero al llegar a Nextcloud la cosa es muy diferente. Sólo para entrar le cuesta bastante. Puede que también afecte la calidad de la SD pero lo he probado con varias y el resultado es parecido. Saludos

    • Marcos

      Estoy realizando los tutoriales desde una pi 4 con 8 GB de ram, pero estoy monitorizando contínuamente el uso de recursos. Así de entrada te digo que sí, no debería haber problema para correr todo desde una pi 3, pero claro… tanto procesador como ram son inferiores. Va a ir más lento, pero debería correr.
      Tal y cómo te dice @Aglak el Nextcloud es el contenedor más pesado de los que hemos puesto hasta ahora. Pero oye… yo en su momento corrí todo un servidor LAMP con nextcloud, varias páginas web y hasta un servidor de correo desde una raspberry pi 2, con lo que debería ser suficiente. No te digo que tenga que ir super fluído, pero sí debería ser suficiente para que funcione.

  2. Aglak

    Buenas tardes, instalado el nuevo contenedor. Hay una cosa de la que me he dado cuenta, ¿Porqué unas veces creas la estructura de carpetas con sudo y otras veces sin él? ¿Hay alguna razón? Gracias

    • Marcos

      Ese comando es indiferente hacerlo con sudo o sin sudo. Estás creando una carpeta dentro de tu directorio home, así que tu usuario tiene permisos suficientes para crearla. A veces lo pongo con sudo… pues por despiste, pero vamos… tanto da. Tanto como superusuario como con el usuario normal, vas a tener permisos suficientes para hacer cualquier cosa en un subdirectorio de la carpeta home. Claro… que otra cosa es lanzar comandos de docker, que sí necesitan lanzarse como superusuario, pero para crear una carpeta puedes hacerlo sin sudo.

      • Aglak

        Entendido,gracias.

  3. antonio

    hola!
    había dejado este docker para cuando tuviera tiempo pq me parecía importante.
    lo he instalado sin haber configurado la red nextcloud-nginx, pero sí habiendo configurado la red pihole-wireguard. he tenido q quitar el filtro de ip pq si no no funcionaba.
    al quitarlo funciona, pero al intentar loginearme me da un error «This browser requires HTTPS to use the web vault». he mirado en su wiki y parece cosa de redes, así antes de seguir tocando cosas q no sé, te quería preguntar si tiene algo q ver con esto de q cada docker tiene su red, o la red compartida pihole-wireguard… pasa tanto poniendo en el navegador la dirección iplocal como https://claves.midominio.com.
    a la pàgina de configuración en local iplocal:8181/admin sí q llego y funciona.
    gracias!

    PD: pequeña errata: al crear el directorio te has dejado una T : vaulwarden, y luegos haces CD vaultwarden con T, no funcionaria, por si hay algún usuario muy básico q no se da cuenta…

  4. Iñigo

    Buenos días Marcos:

    Lo primero de todo gracias por estos excelentes tutoriales. Tenia una Rpi3b abandonada en el cajón y gracias a ti me he animado a Dockerizarla con pi-hole, amule-transmission, nginx, Jellyfin y Vaultwarden.

    tengo una dudilla: Imagino que es mas que aconsejable programar backups de la base de datos de contraseñas de Vaultwarden, pero no se como hacerlo.

    ¿Puedes ayudarme?

    Un saludo y gracias por adelantado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

© 2024 Flopy.es

Tema por Anders NorenArriba ↑

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies