diff --git a/docker-compose/bitwardenrs/docker-compose.yml b/docker-compose/bitwardenrs/docker-compose.yml index 06cea11..8e8020e 100755 --- a/docker-compose/bitwardenrs/docker-compose.yml +++ b/docker-compose/bitwardenrs/docker-compose.yml @@ -1,21 +1,19 @@ ## Discord Plex FR : https://discord.gg/ERpYMqS -## Version 2021-02-26 +## Version 2021-08-18 version: '3' services: - bitwarden: - image: bitwardenrs/server - restart: unless-stopped + vaultwarden: # Decommenter les 2 lignes suivantes pour que watchtower surveille ce conteneur # labels: # - com.centurylinklabs.watchtower.enable=true + image: vaultwarden/server:latest + container_name: vaultwarden + restart: unless-stopped ports: - 80:80 # WebUI - volumes: - - /volume1/docker/bitwarden/bw-data:/data environment: - - WEBSOCKET_ENABLED: 'true' # Necessaire pour utiliser websockets - - SIGNUPS_ALLOWED: 'true' # Mettre faux une fois le 1er utilisateur creer et redemarrer le conteneur -# Network conseillé de ne pas utiliser host (pas de redirection de port) ni default_bridge car limité a 16 ip - network_mode: 'bitwardenrs_network' - + - WEBSOCKET_ENABLED=true # Necessaire pour utiliser websockets + - SIGNUPS_ALLOWED=true # Mettre faux une fois le 1er utilisateur creer et redemarrer le conteneu + volumes: + - /volume1/docker/bitwarden/bw-data:/data \ No newline at end of file diff --git a/docker-compose/vaultwarden/docker-compose.yml b/docker-compose/vaultwarden/docker-compose.yml new file mode 100644 index 0000000..86f0ab4 --- /dev/null +++ b/docker-compose/vaultwarden/docker-compose.yml @@ -0,0 +1,143 @@ +##============================================================================================== +## ## +## Fichier docker-compose.yml pour Vaultwarden seulement ## +## Révision du fichier : v4.0 ## +## ## +## Voir tuto : https://www.forum-nas.fr/viewtopic.php?f=56&t=15341&p=99007#p99007 ## +## ## +##============================================================================================== +## ## +## Attention, avec ce fichier, il faut avoir créer le réseau "vaultwarden_network" avant de ## +## créer les conteneurs. ## +## ## +## La mise en place de fail2ban se fera avec un docker-compose dédié. ## +## ## +##============================================================================================== +## ## +## NOTE IMPORTANTE ## +## ----------------- ## +## ## +## Lors de l'importation d'un fichier contenant beaucoup d'entrées, j'ai eu une erreur ## +## 405 Not Allowed - Nginx ## +## Après quelques recherches, et un certains nombre de minutes, il s'est avéré que les ## +## expiration du délai ... (les timeout) dans le reverse proxy par défaut de 60s étaient ## +## trop faible. ## +## En passant les 3 valeurs à 300s (5min), ça a réglé mon problème. ## +## (Pensez à relancer le script vaultwarden__Enable_Websocket.sh après ces modifications) ## +## ## +##============================================================================================== +## ## +## Ajout des Notifications Websocket ## +## ## +## Pour qu'elles'fonctionnent, il faut configurer le reverse-proxy correctement. ## +## Pour celui de DSM, il n'est malheureusement pas possible de configurer les ## +## redirections /notifications/hub vers le serveur WebSocket ni celles vers le port normal ## +## /notifications/hub/negotiate ## +## Voir cet article pour tout ce qui n'est pas possible via l'interface de DSM : ## +## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ## +## ## +## Dès lors, il faut ruser et passer par l'exécution d'un petit script qui va créer un ## +## fchier ws.locations contenant les modifications précédentes, et qui va écrire une ## +## ligne dans le fichier /etc/nginx/app.d/server.ReverseProxy.conf pour inclure le ## +## fichier ws.locations au niveau de la section concernant le nom de domaine pour ## +## vaultwarden. ## +## Comme cela, il n'est pas nécessaire de passer par le changement de reverse-proxy, assez ## +## complexe à mettre en oeuvre... ## +## ## +## Le script est : vaultwarden__Enable_Websocket.sh ## +## ## +## Il faudra la lancer régulièrement et à chaque redémarrage du NAS, via deux tâches ## +## plannifiées dédiées, en donnant 3 paramètres au fichier : ## +## - le nom de domaine de vaultwarden ## +## - le port HTTP exposé (donc pas l'interne du conteneur) pour l'interface graphique ## +## - le port websocket exposé (donc pas l'interne du conteneur) ## +## Voir les commentaires de ce fichier vaultwarden__Enable_Websocket.sh pour plus ## +## d'explications. ## +## ## +##============================================================================================== + +--- + version: "2.4" + + services: + vaultwarden: + image: vaultwarden/server:latest # https://github.com/dani-garcia/vaultwarden + # https://github.com/dani-garcia/vaultwarden/wiki + container_name: vaultwarden + networks: + - vaultwarden_network + environment: + # Utiliser la commande (en SSH) : id NOM_UTILISATEUR + - PUID=1000 + - PGID=100 + - TZ=Europe/Paris + + # Pour l'envoi d'emails + - SMTP_HOST=XXxxXX + - SMTP_FROM=XXxxXX + - SMTP_FROM_NAME=BlaBla + - SMTP_PORT=XXxxXX + - SMTP_SSL=true + - SMTP_USERNAME=XXxxXX + - SMTP_PASSWORD=XXxxXX + + - INVITATION_ORG_NAME=Vaultwarden [Votre Nom, pseudo...] # Permet de spécifier un nom d'application pour les invitations d'organisation + + # Nécessaire pour activer le 2FA pour la connexion à notre serveur Vaultwarden + # Il est possible de spécifier un port de connexion dans l'URL. Le https:// est obligatoire. + # Pour cette option, il est donc OBLIGATOIRE d'avoir fait le nécessaire pour avoir du HTTPS (certificats, reverse-proxy, ...) + - DOMAIN=XXxxXX + + # Pour enregistrer les log avec un niveau particulier + - LOG_FILE=/data/vaultwarden.log + - LOG_LEVEL=warn + - EXTENDED_LOGGING=true + + # je n'aime pas les indices pour les mots de passe... + - SHOW_PASSWORD_HINT=false + + # Pour activer la console d'administation, accessible via : https://mon.domaine.tld/admin/ + # Voir détails ici : https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page + # /!\ + # /!\ N'importe qui pourra accéder à la page de connexion, alors blinder le token d'amdin ci-dessous (64 caractères pour moi) ! + # /!\ Il est de plus TRÈS important d'avoir ACTIVÉ le HTTPS avant l'activation de cette option. + # /!\ + # Je conseille de ne l'activer qu'en cas de nécessité, et de la désactiver après. + # Pour désactiver, il suffit de commenter la ligne ci-dessous. + - ADMIN_TOKEN=XXxxXX + # À noter : + # La première fois que vous enregistrez un paramètre dans la page d'administration, 'config.json' sera généré + # dans votre 'DATA_FOLDER'. Les valeurs de ce fichier auront priorité sur les valeurs 'environnement'. + + - SIGNUPS_ALLOWED=false # Fait en sorte que les inscriptions soient bloquées, seul l'admin pourra inviter + # des utilisateurs avec un envoi d'email depuis la console d'administation + + - WEBSOCKET_ENABLED=true # Active les WebSocket notifications (Nécessite la configuration du reverse-proxy) + # Durant le nombre importants d'essais, j'en suis venu à laisser le port par défaut + # pour le WEBSOCKET_PORT. Il est possible que ça fonctionne avec un port différent. + # Il faudra alors décommenter la ligne suivante, et changer le port exposé plus bas. + #- WEBSOCKET_PORT=3012 # Par défaut = 3012 + + # Pour activer la récupération des icones des IP LAN, il faut mettre sur false la variable ICON_BLACKLIST_NON_GLOBAL_IPS + - ICON_BLACKLIST_NON_GLOBAL_IPS=false # Par défaut = true + + # On défini ici quelques chemins de dossiers qu'il faudra créer (pas sur que le conteneur les crées lui-même...) + - ICON_CACHE_FOLDER=data/icon_cache + - ATTACHMENTS_FOLDER=data/attachments + - SENDS_FOLDER=data/sends + + labels: + - "com.centurylinklabs.watchtower.enable=true" + + volumes: + - "/volume1/docker/vaultwarden/vaultwarden-data/:/data/" + ports: + - XXxxXX:3012 # Choisir un port libre pour le websocket + - XXxxXX:80 # Choisir un port libre pour l'interface WEB + restart: unless-stopped + + networks: + vaultwarden_network: + external: + name: vaultwarden_network + \ No newline at end of file diff --git a/docker-compose/vaultwarden/vaultwarden__Enable_Websocket_DSM-6.x.sh b/docker-compose/vaultwarden/vaultwarden__Enable_Websocket_DSM-6.x.sh new file mode 100644 index 0000000..da0f61e --- /dev/null +++ b/docker-compose/vaultwarden/vaultwarden__Enable_Websocket_DSM-6.x.sh @@ -0,0 +1,114 @@ +#!/bin/bash +##============================================================================================== +## ## +## Script vaultwarden__Enable_Websocket-DSM_6.x.sh ## +## ## +## Source : https://gist.github.com/nstanke/3949ae1c4706854d8f166d1fb3dadc81 ## +## ## +##============================================================================================== +## ## +## Ce script pemet de router ce qui ne peut pas être fait avec le reverse-proxy ## +## de DSM (Synology) pour faire fonctionner les notifications Websocket ## +## Doc. vaultwarden : ## +## Route the /notifications/hub endpoint to the WebSocket server, by default ## +## at port 3012, making sure to pass the Connection and Upgrade headers. ## +## (Note the port can be changed with WEBSOCKET_PORT variable) ## +## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ## +## ## +##============================================================================================== +## ## +## Principe de Tâche planifier à créer ## +## ## +## Il faut lancer régulièrement le script car toutes modifications faites dans l'interface ## +## graphique du Reverse-Proxy de DSM va modifier le fichier de configuration. Il en va de ## +## même lorsque le NAS redémarre. ## +## ## +##============================================================================================== +## ## +## /!\ Il faut modifier l'adresse IP en ligne 79 et 85 par l'IP du NAS /!\ ## +## ## +##============================================================================================== +## ## +## Paramètres de lancement du script : ## +## bash /volume1/docker/bitwarden/enable_ws.sh vault.example.com 5555 5556 ## +## ## +## -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) ## +## -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM) ## +## -- 5556 = Port exposé WEBSOCKET_PORT par Docker ## +## ## +##============================================================================================== + +LOC_DIR="/etc/nginx" +part1=0 +part2=0 + +echo -e "\n$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh pour activer les Notifications Websockets" + +f_affiche_parametre() { + echo " bash /volume1/docker/_Scripts-DOCKER/vaultwarden__Enable_Websocket.sh vault.example.com 5555 5556 " + echo " -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) " + echo " -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM)" + echo " -- 5556 = Port exposé WEBSOCKET_PORT par Docker" +} + +if [ ! $# -eq 3 ]; then + if [ $# -eq 0 ]; then + # Aucun paramètre n'a été fourni. On va afficher la liste de ce qui peut être utilisé. + echo "$(date "+%R:%S - ") Aucun paramètre fourni ! Revoir l'appel du script :" + f_affiche_parametre + else + echo "$(date "+%R:%S - ") Le nombre de paramètres fournis n'est pas correct ! Revoir l'appel du script :" + f_affiche_parametre + fi + echo -e "$(date "+%R:%S - ") ECHEC de lancement du script !!!!!!!!!\n" + exit 1 +fi + +echo "$(date "+%R:%S - ") Exécution des commandes..." + + +############################################################################################################# +## Début de la partie de création/modification de fichiers +## +if [ -f $LOC_DIR/ws.locations ]; then + rm /etc/nginx/ws.locations + part1=1 +fi +echo """ +location /notifications/hub { + proxy_pass http://192.168.2.200:$3; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection \"upgrade\"; +} + +location /notifications/hub/negotiate { + proxy_pass http://192.168.2.200:$2; +} +""" >> $LOC_DIR/ws.locations + + +if ! grep -q "ws.locations" /etc/nginx/app.d/server.ReverseProxy.conf; then + sed -i "/$1;/ a\ include $LOC_DIR/ws.locations;" /etc/nginx/app.d/server.ReverseProxy.conf + if nginx -t 2>/dev/null; then synoservicecfg --reload nginx; else exit 1; fi + + part2=1 # Variable pour indiquer que cette partie a été exécutée +fi +## +## Fin de la partie de création/modification de fichiers +############################################################################################################# + +if [ $part1 -eq 1 ]; then + echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/ws.locations existait déjà, il a été supprimé puis recréé." +else + echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/ws.locations n'existait pas, il a été créé." +fi +if [ $part2 -eq 1 ]; then + echo "$(date "+%R:%S - ") -- !!!!!! ---> La modification dans le fichier /etc/nginx/app.d/server.ReverseProxy.conf n'existait pas. Elle a été écrite." + echo "$(date "+%R:%S - ") -- !!!!!! ---> Le fichier /etc/nginx/app.d/server.ReverseProxy.conf a du être réinitialisé après un reboot ou lors d'une modification du reverse-proxy dans DSM." +else + echo "$(date "+%R:%S - ") -- La modification du fichier /etc/nginx/app.d/server.ReverseProxy.conf a déjà été effectuée lors d'une précédente exécution. Aucune modification n'est donc nécessaire." +fi + +echo "$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh terminé" + +exit \ No newline at end of file diff --git a/docker-compose/vaultwarden/vaultwarden__Enable_Websocket_DSM-7.sh b/docker-compose/vaultwarden/vaultwarden__Enable_Websocket_DSM-7.sh new file mode 100644 index 0000000..dd59d5d --- /dev/null +++ b/docker-compose/vaultwarden/vaultwarden__Enable_Websocket_DSM-7.sh @@ -0,0 +1,129 @@ +#!/bin/bash +##============================================================================================== +## ## +## Script vaultwarden__Enable_Websocket-DSM_7.sh ## +## ## +## Source : https://gist.github.com/nstanke/3949ae1c4706854d8f166d1fb3dadc81 ## +## ## +##============================================================================================== +## ## +## Ce script pemet de router ce qui ne peut pas être fait avec le reverse-proxy ## +## de DSM (Synology) pour faire fonctionner les notifications Websocket ## +## Doc. vaultwarden : ## +## Route the /notifications/hub endpoint to the WebSocket server, by default ## +## at port 3012, making sure to pass the Connection and Upgrade headers. ## +## (Note the port can be changed with WEBSOCKET_PORT variable) ## +## https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications ## +## ## +##============================================================================================== +## ## +## Principe de Tâche planifier à créer ## +## ## +## Il faut lancer régulièrement le script car toutes modifications faites dans l'interface ## +## graphique du Reverse-Proxy de DSM va modifier le fichier de configuration. Il en va de ## +## même lorsque le NAS redémarre. ## +## ## +##============================================================================================== +## ## +## /!\ Il faut modifier l'adresse IP en ligne 47 par l'IP du NAS /!\ ## +## ## +##============================================================================================== +## ## +## Paramètres de lancement du script : ## +## bash /volume1/docker/bitwarden/enable_ws.sh vault.example.com 5555 5556 ## +## ## +## -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) ## +## -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM) ## +## -- 5556 = Port exposé WEBSOCKET_PORT par Docker ## +## ## +##============================================================================================== + +LOC_DIR="/etc/nginx" +part1=0 +part2=0 +MY_DOMAIN=$1 +PORT_ACCES=$2 +PORT_CONT=$3 +IP_NAS="192.168.2.200" + +echo -e "\n$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh pour activer les Notifications Websockets" + +f_affiche_parametre() { + echo " bash /volume1/docker/_Scripts-DOCKER/vaultwarden__Enable_Websocket.sh vault.example.com 5555 5556 " + echo " -- vault.example.com = Nom de domaine de vaultwarden (celui du Reverse Proxy de DSM) " + echo " -- 5555 = Port exposé ROCKET_PORT par Docker (Identique à celui du Reverse Proxy de DSM)" + echo " -- 5556 = Port exposé WEBSOCKET_PORT par Docker" +} + +if [ ! $# -eq 3 ]; then + if [ $# -eq 0 ]; then + # Aucun paramètre n'a été fourni. On va afficher la liste de ce qui peut être utilisé. + echo "$(date "+%R:%S - ") Aucun paramètre fourni ! Revoir l'appel du script :" + f_affiche_parametre + else + echo "$(date "+%R:%S - ") Le nombre de paramètres fournis n'est pas correct ! Revoir l'appel du script :" + f_affiche_parametre + fi + echo -e "$(date "+%R:%S - ") ECHEC de lancement du script !!!!!!!!!\n" + exit 1 +fi + +echo "$(date "+%R:%S - ") Exécution des commandes..." + + +############################################################################################################# +## Début de la partie de création/modification de fichiers +## +if [ -f $LOC_DIR/websocket.locations.vaultwarden ]; then + rm $LOC_DIR/websocket.locations.vaultwarden + part1=1 +fi +echo """ +location /notifications/hub { + proxy_pass http://$IP_NAS:$PORT_CONT; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection \"upgrade\"; +} + +location /notifications/hub/negotiate { + proxy_pass http://$IP_NAS:$PORT_ACCES; +} +""" >>$LOC_DIR/websocket.locations.vaultwarden + +# Note : avec DSM7, le chemin d'accès du fichier server.ReverseProxy.conf a changé +# DSM6.2 = /etc/nginx/app.d/server.ReverseProxy.conf +# DSM7 = /etc/nginx/sites-enabled/server.ReverseProxy.conf +if ! grep -q "websocket.locations.vaultwarden" /etc/nginx/sites-enabled/server.ReverseProxy.conf; then + + # Commandes fonctionnelles avec DSM6.2.x, mais plus avec DSM 7.0 (RC) + #sed -i "/$1;/ a\ include $LOC_DIR/websocket.locations.vaultwarden;" /etc/nginx/app.d/server.ReverseProxy.conf + #if nginx -t 2>/dev/null; then synoservicecfg --reload nginx; else exit 1; fi + + # Commande fonctionnelles avec DSM 7 (RC) + sed -r "s#^([[:blank:]]*server_name[[:blank:]]*${MY_DOMAIN}[[:blank:]]*;[[:blank:]]*)\$#\1\n\n\tinclude ${LOC_DIR}/websocket.locations.vaultwarden;#" /etc/nginx/sites-enabled/server.ReverseProxy.conf > /etc/nginx/sites-enabled/server.ReverseProxy.conf.new + mv /etc/nginx/sites-enabled/server.ReverseProxy.conf.new /etc/nginx/sites-enabled/server.ReverseProxy.conf + + if nginx -t 2>/dev/null; then synosystemctl reload nginx; else exit 1; fi + + part2=1 # Variable pour indiquer que cette partie a été exécutée + +fi +## +## Fin de la partie de création/modification de fichiers +############################################################################################################# + +if [ $part1 -eq 1 ]; then + echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/websocket.locations.vaultwarden existait déjà, il a été supprimé puis recréé." +else + echo "$(date "+%R:%S - ") -- Le fichier $LOC_DIR/websocket.locations.vaultwarden n'existait pas, il a été créé." +fi +if [ $part2 -eq 1 ]; then + echo "$(date "+%R:%S - ") -- !!!!!! ---> La modification dans le fichier /etc/nginx/sites-enabled/server.ReverseProxy.conf n'existait pas. Elle a été écrite." + echo "$(date "+%R:%S - ") -- !!!!!! ---> Le fichier /etc/nginx/sites-enabled/server.ReverseProxy.conf a du être réinitialisé après un reboot ou lors d'une modification du reverse-proxy dans DSM." +else + echo "$(date "+%R:%S - ") -- La modification du fichier /etc/nginx/sites-enabled/server.ReverseProxy.conf a déjà été effectuée lors d'une précédente exécution. Aucune modification n'est donc nécessaire." +fi + +echo "$(date "+%R:%S - ") Script vaultwarden__Enable_Websocket.sh terminé" + +exit \ No newline at end of file