Déploiement complet via docker + reverse proxy

Bonjour à tous,

Étant donné que Gladys va maintenant favoriser le déploiement via docker, je suis en train de créer un projet pour le déploiement simplifié de plusieurs conteneurs histoire d’avoir une solution clé en main sans trop de bidouilles pour un utilisateur lambda. Mon idée c’est de déployer un Gladys exposé sur internet via un reverse proxy avec tous les services l’accompagnant.

Dans mon idée, les conteneurs seraient :

  • Watchtower permettant la mise à jour automatique de tous les containers lorsqu’une mise à jour est présente sur le docker hub
  • Portainer , un gestionnaire du cycle de vie des containers qui permet entre autres d’accéder aux logs des containers, ou bien aux outils de suppression / redémarrage des conteneurs
  • Traefik , le reverse proxy permettant d’exposer Gladys et ses compères via un ou plusieurs ports sur le router de l’utilisateur, qui permet de générer un certificat SSL renouvelable de façon gratuite via Let’s Encrypt et via un nom de domaine gratuit par un fournisseur de DNS gratuit nommé DuckDNS (gratuit, simple, et qui offre la possibilité de générer jusqu’à 5 noms de domaines différents)
  • Socket Proxy un petit proxy qui permet juste de sécuriser les requêtes réalisées sur le cœur de Docker en cas d’attaque de Traefik
  • Mosquitto le broker MQTT permettant le transfert de messages via des capteurs ou des services
  • Zigbee2Mqtt et Zigbee2MqttAssitant (une interface web) permettant de se passer d’une passerelle Zigbee chère et qui est compatible avec de nombreux appareils (cf. le sujet sur le forum)
  • Rhasspy , pour la partie reconnaissance vocale (une fois que j’aurais des paramétrages fonctionnels)
  • Et bien évidemment Gladys

On peut également imaginer rajouter d’autres applis en fonction des besoins (genre un tableau de bord des métriques des différents conteneurs compatibles via Grafana).

Pour le déploiement de tous ces containers, et pour la simplification de déploiement j’utilise l’extension de docker nommé docker-compose. Cette extension permet de définir plusieurs conteneurs dans un seul fichier (pour simplifier) et de les lancer via une simple ligne de commande. En termes de configuration il n’y aurait pas temps de fichier que ça a modifier, j’essaye de rassembler un maximum de variables via le fichier nommé « .env » accompagnant le fichier principal et c’est sur celui-ci qu’on pourra personnaliser une grande partie des infos.

Je n’ai pas encore publié ce projet sur Github, j’ai pas mal de tests, de doc à faire et je suis en attente de la correction de certains bugs côté Traefik, mais je suis plutôt confiant. Aujourd’hui, ce projet me permet d’accéder au broker MQTT sécurisé via TLS et donc par exemple d’y connecter Owntracks en externe et sans sécurité en local (on a bien sûr également la possibilité de sécuriser en local) ainsi qu’à Gladys et au monitoring du reverse proxy via son dashboard. Pour le moment à cause d’un bug de la nouvelle version de Traefik j’ai besoin de 3 ports exposés sur le routeur, mais dans l’avenir seuls deux ports seront utilisés, un pour la communication HTTP/S et l’autre pour la communication TCP (mqtt dans ce cas-là).

Au travers de ce post, j’attends de savoir si ce projet de déploiement via docker-compose vous intéresse, et si vous avez éventuellement des remarques ou des idées d’amélioration / d’ajout pour ce déploiement :wink:

1 Like

Perso la partie traefik m’intéresse, pas eu le temps de m’y pencher sérieusement.

Pour le compose, je suis pas fan mais c’est juste mes goûts :wink:

Bonne initiative

1 Like

Bonjour
Perso j’aime bien l’idée mais j’ai deja mon nom de domaine possible d’utiliser Traefik avec un nom de domaine personalisé ?

@Will9 oui bien sur, Traefik gère les plus grand noms de fournisseurs tels que OVH ou myDNS (les seuls que je connais :P), tu pourras trouver la liste ici : FournisseursDNS
Et Traefik te permet d’ailleurs soit de générer des certificats SSL via Let’s Encrypt ou alors d’importer tes propres certificats si tu en as déjà :wink:

C’est une bonne idée ça :wink:

Je joue encore trop peu avec docker, mais si tu as besoin je peux me monter un lab pour faire des tests et contribué :wink:

Je connais casiement pas Traefik, mais quels avantages comparer a haproxy par exemple ?
J’ai pu le mettre sur certains projet a forte volumétrie, la configuration est très simpliste et peut être coupler avec let’s encrypt

Je t’avoues ne pas bien connaître Haproxy, j’ai beaucoup utilisé Traefik au boulot du coup ma solution est basé dessus parce que je commence a bien connaître le produit :wink:
Mais ce qu’il faut savoir déjà c’est que Traefik est français :stuck_out_tongue:

Ce que j’aime bien avec Traefik c’est que sa configuration n’est pas trop complexe et non statique puisque dans le cas de docker, chaque configuration est défini via les labels des conteneurs et donc peut être modifié assez facilement. Traefik possède plusieurs autres backend que docker, comme Consul ou Kubernetes permettant ainsi d’étendre un peu son utilisation.

Dans mon cas je l’utilise pour toute mon infra à la maison me permettant à la fois d’accéder à mes applis sur un cluster de raspberry, sur mon NAS et tout en gardant un œil sur le dashboard :slight_smile:

Bonjour,

Pour info, je suis en train d’ajouter la création et le lancement des containers Zigbee2mqtt et Mqtt (si ils n’existent pas) , à partir du service Zigbee2mqtt.
Je pense que cette solution évite de créer l’image et les containers docker des services si ils ne sont pas utiles à l’utilisateur.
@pierre-gilles, pourrais-tu nous dire quelle solution tu préfères afin de ne pas perdre du temps de développement pour rien. Merci

Pour la partie Traefik, c’est sympa mais cela va peut-être à l’encontre de la gateway Gladys, non ? Ou je me trompe.

@Reno Je t’ai répondu ici =>

https://community-3.gladysassistant.com/t/v4-integration-zigbee2mqtt/5009/19

C’est pas forcément le même public, et c’est pas forcément les mêmes sécurités.

Le Gladys Gateway c’est clé en main car tu n’as pas de configuration à faire au niveau de ton fournisseur d’accès, et surtout c’est bien plus sécurisé car ton instance n’est pas accessible sur internet. Si tu expose l’IP de ton Raspberry Pi sur internet, tu t’exposes aux bots qui attaquent des IPs au hasard, c’est déjà arrivé à un paquet de gens sur le forum ^^

Après il en faut pour toutes les populations, pour un utilisateur qui veut un système plug & play sécurisé by design, et un utilisateur avancé qui prend du temps régulièrement pour sécuriser et manager son installation :slight_smile:

Alors c’est parfait !
Il y en aura pour tous les goûts… :wink:

3 Likes

@Albenss j’ai réussi à implémenter traefik 2 chez moi, c’est génial !

Juste un point que je n’arrive pas à configurer, sais tu comment comment faire une redirection en ssl uniquement sur certains endpoint ?

1 Like

Salut @VonOx, effectivement je ne me passe plus de Traefik ni de Docker maintenant :wink:
Alors ça dépend de ta config, personnellement je passe par un fichier pour stocker la config statique, et un autre pour la dynamique.
Depuis la version 2.2.0, tu as la possibilité de définir dans la partie statique la redirection directement dans la définition de ton ou tes endpoints.
Je suis toujours en 2.2.0, je ne sais pas pour la nouvelle version 2.2.1 mais voici comment c’est configuré chez moi :

  #FICHIER traefik.yml
    entryPoints:
      web:
        address: ":80"
        http:
          redirections:
            entryPoint:
              to: web_secure
              scheme: https
              permanent: true

      web_secure:
        address: ":443"
        http: 
          middlewares:
            - securisation@file  #Dans mon fichier dynamique -> compression + headers + nb max de requete
          tls:
            certResolver: letsencrypt
            domains:
              - main: "*.domain.com"
                sans:
                  - "domain.com"

Hésite pas si tu as d’autres problèmes :wink:

Le seul vrai soucis avec cette solution c’est que par défaut et ce n’est pas modifiable pour le moment, Traefik à une API en /api, tout comme Gladys…

Donc en cas d’utilisation de Gladys et de Traefik sur un seul nom de domaine (genre avec un DNS gratuit de type DuckDNS qui n’offre pas la possibilité de créer de sous domaine), on se retrouve à devoir choisir entre exposer sur ce nom de domaine soit l’API de gladys soit celle de Traefik qui permet d’accéder a son dashboard de monitoring…

Par exemple pour mon container gladys voici ma conf , en gros je n’écoute qu’en SSL sur docker

Mais en cas de râté j’aimerai une redirection, du coup je vois pas trop ce qui change dans ta conf

mon certresolver c’est letsencrypt aussi

mon traefik.toml

[entryPoints]
  [entryPoints.http]
  address = ":80"
  [entryPoints.https]
  address = ":443"

[api]

[providers.docker]
  endpoint = "unix:///var/run/docker.sock"

[providers.file]
  filename = "/etc/traefik/services.toml"

[certificatesResolvers.vonox.acme]
  email = "adressmail@host.com"
  storage = "acme.json"
  [certificatesResolvers.vonox.acme.httpChallenge]
    entryPoint = "http"

J’avais pas vu ta 2ème réponse, je possède un ndd j’ai donc des sous domaines

Dans ton cas @VonOx il faut que tu ajoutes dans la définition de ton entrypoint http :

[entryPoints]
  [entryPoints.http]
    address = ":80"
    [entryPoints.foo.http.redirections]
      [entryPoints.foo.http.redirections.entryPoint]
        to = "https"
        scheme = "https"
        permanent = true

  [entryPoints.https]
    address = ":443"

Ça permettra à toutes les requêtes qui ne possède pas forcément le schéma “https://” d’être redirigé vers ton entrypoint nommé “https”.

Un bon moyen de trouver les options dispo dans les fichiers, c’est de se rendre dans la partie References de la doc : https://docs.traefik.io/reference/static-configuration/file/ & https://docs.traefik.io/reference/dynamic-configuration/file/ :wink: