HA-Installer Speedtest Tracker avec Docker Compose sous Proxmox et l’intégrer à Home Assistant

Intro

Sur mon blog domo.rem81.com, je partage mes aventures en domotique et auto-hébergement. Aujourd’hui, je vous guide pour installer Speedtest Tracker, une application idéale pour surveiller votre connexion Internet, dans un conteneur LXC sous Proxmox avec Docker Compose, en utilisant l’image fiable lscr.io/linuxserver/speedtest-tracker:latest de LinuxServer.io. Ensuite, je vous montre comment intégrer les résultats dans Home Assistant via l’API REST, avec une belle visualisation en bonus. Allons-y !


Prérequis

  • Un serveur Proxmox VE (j’utilise la version 8.x).
  • Une installation de Home Assistant (VM ou conteneur).
  • Une connexion Internet active.
  • Un peu de curiosité technique !

Avertissement:

Si vous souhaitez un autre type d’installation, rendez vous sur: https://docs.speedtest-tracker.dev/getting-started/installation et sautez l’étape 1.

Étape 1 : Créer un conteneur LXC sous Proxmox

  1. Connexion à Proxmox :
    • Accédez à https://votre-ip-proxmox:8006.
  2. Créer le conteneur LXC :
    • Cliquez sur « Create CT ».
    • Configurez :
      • Hostname : speedtest-tracker.
      • Template : debian-12-standard.
      • Password : Un mot de passe pour root.
      • Disk size : 8 Go.
      • CPU : 1 ou 2 cœurs.
      • Memory : 512 Mo ou 1 Go.
      • Network : Bridge vmbr0, IP statique (ex. 192.168.0.221/24) ou DHCP.
    • Validez avec « Create » et démarrez.

Étape 2 : Configurer Debian et créer un utilisateur UID 1000

    Accéder au conteneur:

    Via SSH : ssh root@<votre_ip> ou console Proxmox.

    Mettre à jour Debian :

    apt update && apt upgrade -y

    Créer un utilisateur avec UID 1000 :

    • Pour les permissions, créez un utilisateur dédié :
    adduser --uid 1000 speedtest-user
    • Suivez les invites (mot de passe optionnel).
    • Vérifiez : id speedtest-user (attendu : uid=1000)

    Installer Docker et Docker Compose :

    Docker:

    apt install -y docker.io
    systemctl enable docker
    systemctl start docker

    Docker compose:

    apt install -y curl
    curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

    Vérifiez :

    docker --version et docker-compose --version

    Étape 3 : Configurer Speedtest Tracker avec Docker Compose

    • Créer un dossier :
    mkdir /opt/speedtest-tracker
    cd /opt/speedtest-tracker
    • Créer une APP_KEY: (l’inserer dans le fichier ci dessous avec le base64:)
    echo -n 'base64:'; openssl rand -base64 32;
    • Créer docker-compose.yml :
    nano docker-compose.yml
    • Collez
    version: "3"
    services:
      speedtest-tracker:
        image: lscr.io/linuxserver/speedtest-tracker:latest
        container_name: speedtest-tracker
        ports:
          - "8080:80"
          - "8443:443"
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=Europe/Paris
          - APP_KEY=base64:JFPMecz4XTujTiC+kNiNAVagZ5eWgRboq0r/d2JS/Us=
          - APP_URL=http://<votre_ip>:8080
          - DB_CONNECTION=sqlite
          - SPEEDTEST_SCHEDULE=0 * * * *
        volumes:
          - ./data:/config
        restart: unless-stopped
    • Préparer le dossier data :
    mkdir data
    chown -R 1000:1000 data
    chmod -R 775 data
    • Lancer :
    docker-compose up -d

    Étape 4 : Vérifier et accéder à Speedtest Tracker

    Logs:

      docker logs speedtest-tracker

      Résultat attendu du style:

      Interface :

      • Ouvrez http://<votre_ip>:8080.
      • Identifiants : admin@example.com
      • Password: password (à changer).

      Token API :

      • Dans Settings > API Tokens, créez un token
        (par ex:.e5cnkhkwPqcETyRUfhHZQj1ytQmELimKCkjrL9DW8554ac65).

      Ajoutez à secrets.yaml dans HA :

      speedtest_token: "Bearer e5cnkhkwPqcETyRUfhHZQj1ytQmELimKCkjrL9DW8554ac65"

      Étape 5 : Intégrer Speedtest Tracker dans Home Assistant

      Ajoutez cette configuration REST dans un fichier configuration.yaml ou (speedtest.yaml si vous utilisez les directives include)

      rest:
        - resource: http://<votre_ip>:8080/api/v1/results/latest/
          headers:
            Authorization: !secret speedtest_token
          method: GET
          scan_interval: 3600
          sensor:
            - name: "Speedtest Download"
              value_template: "{{ (value_json.data.download_bits / 1000000) | round(2) }}"
              device_class: data_rate
              unique_id: "speedtest_download"
              icon: mdi:speedometer
              unit_of_measurement: "Mbit/s"
              state_class: measurement
            - name: "Speedtest Upload"
              value_template: "{{ (value_json.data.upload_bits / 1000000) | round(2) }}"
              device_class: data_rate
              unique_id: "speedtest_upload"
              icon: mdi:speedometer
              unit_of_measurement: "Mbit/s"
              state_class: measurement
            - name: "Speedtest Ping"
              value_template: "{{ value_json.data.ping | round(2) }}"
              device_class: duration
              unique_id: "speedtest_ping"
              icon: mdi:speedometer
              unit_of_measurement: "ms"
              state_class: measurement
      • Redémarrez HA (Settings > System > Restart).
      • Vérifiez dans Developer Tools > States.

      Étape 6 : Visualiser avec une carte dans Home Assistant

      Pour un affichage stylé, ajoutez cette carte avec custom:mini-graph-card (installez-le via HACS si ce n’est pas fait) dans votre dashboard :

      type: grid
      cards:
        - type: vertical-stack
          cards:
            - name: Speed Test
              styles:
                card:
                  - text-transform: uppercase
                  - font-weight: bold
                  - font-size: 125%
                  - letter-spacing: 10px
              style: |
                ha-card {
                  border: solid 2px var(--primary-color);
                }
              type: custom:button-card
            - color_thresholds:
                - color: "#e73c3c"
                  value: 70
                - color: "#e7b13c"
                  value: 50
                - color: "#3ce74d"
                  value: 0
              entities:
                - entity: sensor.speedtest_download
              font_size: 80
              height: 130
              hours_to_show: 48
              line_width: 2
              name: Debit Descendant
              points_per_hour: 1
              show:
                extrema: true
                graph: line
                icon: true
                points: true
              smoothing: true
              style: |
                ha-card {
                  border: solid 2px var(--primary-color);
                }
              type: custom:mini-graph-card
            - color_thresholds:
                - color: "#e74c3c"
                  value: 8
                - color: "#1db954"
                  value: 1
                - color: "#3498db"
                  value: 0
              entities:
                - entity: sensor.speedtest_upload
              font_size: 80
              height: 130
              hours_to_show: 48
              line_width: 2
              name: Debit Montant
              points_per_hour: 1
              show:
                extrema: true
                graph: line
                icon: true
                points: true
              smoothing: true
              style: |
                ha-card { 
                    border: solid 2px var(--primary-color);
                }
              type: custom:mini-graph-card
            - color_thresholds:
                - color: "#e73c3c"
                  value: 500
                - color: "#e7b13c"
                  value: 100
                - color: "#3ce74d"
                  value: 30
              entities:
                - entity: sensor.speedtest_ping
              font_size: 80
              height: 130
              hours_to_show: 48
              line_width: 2
              name: Test Ping
              points_per_hour: 1
              show:
                extrema: true
                graph: line
                icon: true
                points: true
              smoothing: true
              type: custom:mini-graph-card
              style: |
                ha-card {
                  border: solid 2px var(--primary-color);
                }

      Étape 7 : Gestion et dépannage

      Mise à jour:

        docker-compose down
        docker-compose pull
        docker-compose up -d

        Problèmes :

        • Port bloqué : ufw allow 8080 ou pare-feu Proxmox.
        • Capteurs HS : Vérifiez les logs HA.
        • API inaccessible : Testez avec
        curl -H "Authorization: Bearer VOTRE_TOKEN" http://<votre_ip>:8080/api/v1/results/latest/.

        Réponse attendue du style:

        {
          "data": {
            "id": 5,
            "service": "ookla",
            "ping": 15.661,
            "download": 116279515,
            "upload": 91972455,
            "download_bits": 930236120,
            "upload_bits": 735779640,
            "download_bits_human": "930.24 Mbps",
            "upload_bits_human": "735.78 Mbps",
            "created_at": "2025-04-08 11:00:01",
            "updated_at": "2025-04-08 11:00:29"
            // ... autres champs ...
          },
          "message": "ok"
        }

        Conclusion

        J’ai opté pour l’image LinuxServer.io après quelques essais avec d’autres versions – sa légèreté et sa fiabilité m’ont conquis. Voir mes stats réseau (930 Mbps en descendant chez Free SAS !) dans Home Assistant avec une carte graphique est un vrai plus pour ma domotique. Pour plus d’options (reverse proxy, fréquence personnalisée), jetez un œil à la doc officielle LinuxServer.io. Des questions ou idées ? Laissez un commentaire sur domo.rem81.com !

        Références:

        https://docs.speedtest-tracker.dev

        doc officielle LinuxServer.io.

        https://chrishansen.tech/posts/SpeedTest_Tracker/?fbclid=IwY2xjawJga-dleHRuA2FlbQIxMQABHopGFr6KXP-syq1U-xk-GUtDzlGAOH0EnSVVm3IU9mq1Fvp6s8JzttOCuxUF_aem_6EktBNc-GQpu_utLW2iSlQ

        Laisser un commentaire

        Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *