## Discord Plex FR : https://discord.gg/3gtABCH
## Version 2021-08-23
##==============================================================================================
##                                                                                            ##
##                    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