Installer Bambu Gateway sur Debian 13

Bambu Gateway permet de piloter une imprimante Bambu Lab depuis une interface Web et de fournir une API REST pour automatiser les opérations d’impression.

Dans cet article, Bambu Gateway sera installé dans un conteneur LXC Debian 13 sous Proxmox.

Architecture

L’objectif est d’obtenir une installation simple :

  • Imprimante 3D Bambu Lab A1 mini
  • Debian 13
  • LXC Proxmox non privilégié
  • Bambu Gateway installé directement
  • Python dans un environnement virtuel venv
  • Service systemd pour le démarrage automatique
  • Interface Web accessible sur le port 4844

Création du conteneur LXC

Le conteneur utilisé pour cette installation possède les caractéristiques suivantes :

  • CTID : 111
  • Hostname : 3dprint
  • OS : Debian 13
  • CPU : 2 vCPU
  • RAM : 4 Go
  • Swap : 1 Go
  • Disque : 16 Go
  • IP : 192.168.0.250/24
  • Gateway : 192.168.0.1
  • DNS : 192.168.0.1

Le conteneur est configuré en mode unprivileged.

  • Commande à faire sur le pve :
  • pct create 111 \
      local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst \
      --hostname 3dprint \
      --cores 2 \
      --memory 4096 \
      --swap 1024 \
      --rootfs local-lvm:16 \
      --net0 name=eth0,bridge=vmbr0,ip=192.168.0.250/24,gw=192.168.0.1 \
      --nameserver 192.168.0.1 \
      --unprivileged 1 \
      --onboot 1
    
  • puis on entre dans le conteneur :
  • pct enter 111

Installation des paquets nécessaires

Installation des outils nécessaires à la compilation et à l’installation de Bambu Gateway :

apt update
apt install -y python3 python3-venv python3-pip git build-essential jq

On vérifie également Git et GCC :

git --version
gcc --version

Résultat obtenu :

git version 2.47.3

gcc (Debian 14.2.0-19) 14.2.0

Vérification de la connexion avec l’imprimante

Avant d’installer Bambu Gateway, il est intéressant de vérifier que le conteneur peut communiquer directement avec l’imprimante.

Dans notre installation, l’imprimante Bambu Lab A1 mini utilise l’adresse :

192.168.0.10

Test réseau :

ping -c 4 192.168.0.10

Création de l’utilisateur système

Pour éviter d’exécuter Bambu Gateway avec les privilèges root, création d’un utilisateur dédié :

useradd \
  --system \
  --home /opt/bambu-gateway \
  --shell /usr/sbin/nologin \
  bambu

Le répertoire d’installation sera :

/opt/bambu-gateway

Récupération de Bambu Gateway

On clone ensuite le dépôt :

cd /opt

git clone https://github.com/leolobato/bambu-gateway.git bambu-gateway

On donne la propriété du projet à l’utilisateur bambu :

chown -R bambu:bambu /opt/bambu-gateway

On vérifie la version récupérée :

cd /opt/bambu-gateway

git log -1 --oneline --decorate

Lors de notre installation, la version utilisée était v3.1.0.

Création de l’environnement Python

On crée un environnement virtuel Python afin d’isoler les dépendances de Bambu Gateway :

su -s /bin/bash - bambu

cd /opt/bambu-gateway

python3 -m venv venv

On utilise ensuite directement le Python du venv :

venv/bin/python --version
venv/bin/pip --version

Installation des dépendances Python

Les dépendances du projet sont installées avec :

venv/bin/pip install -r requirements.txt

Bambu Gateway utilise notamment FastAPI, Uvicorn, Paho MQTT et Pydantic Settings.

On peut vérifier que l’application démarre correctement :

venv/bin/python -m app --help

Configuration de l’imprimante

Bambu Gateway enregistre la configuration de l’imprimante dans :

/opt/bambu-gateway/data/printers.json

La configuration est générée automatiquement lors du premier démarrage lorsque les variables d’environnement nécessaires sont fournies.

Au premier démarrage, Bambu Gateway initialise data/printers.json à partir des variables d’environnement :

BAMBU_PRINTER_IP
BAMBU_PRINTER_ACCESS_CODE
BAMBU_PRINTER_SERIAL

Le code d’acces ainsi que le numéro de série est à trouver dans les menus de l’imprimante.

su -s /bin/bash - bambu -c '
    cd /opt/bambu-gateway &&
    BAMBU_PRINTER_IP="192.168.0.10" \
    BAMBU_PRINTER_ACCESS_CODE="CODE_ACCESS" \
    BAMBU_PRINTER_SERIAL="SERIAL" \
    /opt/bambu-gateway/venv/bin/python -m app
'

Vérification, exemple de commande pour afficher le numéro de série enregistré :

su -s /bin/bash - bambu -c '
    cd /opt/bambu-gateway &&
    jq "map(with_entries(
        if .key == \"access_code\"
        then .value = \"REDACTED\"
        else .
        end
    ))" data/printers.json
'

Protection du fichier de configuration

Le fichier contient un élément sensible : le code d’accès de l’imprimante.

Il faut donc limiter ses permissions :

chmod 600 /opt/bambu-gateway/data/printers.json

chown bambu:bambu /opt/bambu-gateway/data/printers.json

Vérification :

ls -l /opt/bambu-gateway/data/printers.json

Le résultat attendu est similaire à :

-rw------- 1 bambu bambu ... printers.json

Premier démarrage de Bambu Gateway

On peut tester directement le serveur avant de créer le service systemd :

cd /opt/bambu-gateway

venv/bin/python -m app

Le serveur démarre alors sur :

http://0.0.0.0:4844

Mais à ce stade, le frontend n’est pas encore compilé, la partie Web n’est pas disponible.

Installation de Node.js et npm

Le frontend React doit être compilé avant de pouvoir utiliser l’interface Web complète.

Debian 13 fournit une version suffisamment récente de Node.js :

apt install -y nodejs npm

Vérification :

node --version
npm --version

Dans notre cas :

v20.19.2
9.2.0

Le projet demande Node.js 20 ou supérieur.

Installation du frontend

On se place dans le répertoire Web :

su -s /bin/bash - bambu

cd /opt/bambu-gateway/web

La première tentative avec npm ci peut échouer sur la version v3.1.0 du dépôt.

Dans notre cas, npm signalait notamment des paquets esbuild absents du fichier lock :

npm ci

Le problème venait du fait que le package-lock.json fourni avec cette version du projet n’était pas synchronisé avec le package.json.

Correction du package-lock.json

Avant toute modification, nous sauvegardons le fichier original :

cp package-lock.json package-lock.json.v3.1.0-original

On régénère ensuite uniquement le lockfile :

npm install --package-lock-only

Le fichier package.json n’est pas modifié.

On peut vérifier les différences Git :

git diff -- web/package.json web/package-lock.json

Le fichier package-lock.json est alors mis à jour afin de correspondre aux dépendances réellement déclarées.

Installation des dépendances Node.js

On peut maintenant relancer :

npm ci

Cette fois, l’installation se termine correctement.

Lors de notre installation :

329 packages added
330 packages audited

Npm signale également plusieurs vulnérabilités dans les dépendances. Nous n’avons pas lancé automatiquement npm audit fix ou npm audit fix --force, afin de ne pas modifier arbitrairement les versions utilisées par le projet.

Compilation du frontend

Le frontend est compilé avec :

npm run build

La commande exécute notamment TypeScript puis Vite :

tsc -b && vite build

Le build produit les fichiers statiques dans :

/opt/bambu-gateway/app/static/dist/

On retrouve notamment :

  • index.html
  • les fichiers JavaScript générés par Vite
  • les feuilles de style CSS
  • les ressources du frontend

Un avertissement concernant la taille de certains bundles peut apparaître pendant le build. Il n’empêche pas le fonctionnement de l’application.

Vérification de l’interface Web

On redémarre Bambu Gateway :

cd /opt/bambu-gateway

venv/bin/python -m app

Depuis le navigateur, on peut maintenant accéder à :

http://192.168.0.250:4844/

L’interface Web de Bambu Gateway doit apparaître.

Vérification de l’API

Bambu Gateway expose une API REST.

Test de santé :

curl -s http://127.0.0.1:4844/api/health | jq .

Résultat :

{
  "status": "ok"
}

On peut ensuite interroger les imprimantes configurées :

curl -s http://127.0.0.1:4844/api/printers | jq .

Dans notre cas, l’imprimante apparaît comme connectée :

"online": true

L’API fournit également des informations telles que :

  • l’état de l’imprimante ;
  • la température de la buse ;
  • la température du plateau ;
  • la progression de l’impression ;
  • la vitesse ;
  • le fichier actuellement utilisé ;
  • les erreurs éventuelles.

Création du service systemd

Une fois les tests terminés, nous créons un service systemd afin que Bambu Gateway démarre automatiquement avec le conteneur.

Créer le fichier :

nano /etc/systemd/system/bambu-gateway.service

Contenu :

[Unit]
Description=Bambu Gateway
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bambu
Group=bambu
WorkingDirectory=/opt/bambu-gateway
ExecStart=/opt/bambu-gateway/venv/bin/python -m app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Activation du service

On recharge systemd :

systemctl daemon-reload

On active ensuite le service au démarrage et on le lance immédiatement :

systemctl enable --now bambu-gateway.service

Vérification :

systemctl status bambu-gateway.service

Le service doit apparaître avec l’état :

Active: active (running)

Vérification des logs

Les logs sont accessibles avec journalctl :

journalctl -u bambu-gateway.service -f

On doit notamment retrouver le démarrage d’Uvicorn et l’initialisation de l’imprimante.

Vérification finale

Une dernière vérification permet de contrôler que le service répond correctement :

curl -s http://127.0.0.1:4844/api/health | jq .

Puis :

curl -s http://127.0.0.1:4844/api/printers | jq .

Si l’API retourne "status": "ok" et que l’imprimante apparaît "online": true, l’installation est terminée.

Vérifications utiles

Pour contrôler rapidement l’état du service :

systemctl status bambu-gateway.service

Pour consulter les dernières lignes du journal :

journalctl -u bambu-gateway.service -n 50 --no-pager

Pour suivre les logs en temps réel :

journalctl -u bambu-gateway.service -f

Pour vérifier que le port HTTP est bien ouvert :

ss -lntp | grep 4844

Pour vérifier l’API :

curl -s http://127.0.0.1:4844/api/health | jq .

Résultat

Nous avons maintenant une installation entièrement native de Bambu Gateway :

  • Debian 13
  • LXC Proxmox non privilégié
  • Python 3.13
  • environnement virtuel Python
  • frontend React compilé localement
  • configuration persistante de l’imprimante
  • service systemd
  • API REST
  • interface Web sur le port 4844

Et ensuite : OrcaSlicer Headless

L’étape suivante consiste à ajouter OrcaSlicer Headless afin de pouvoir transformer automatiquement un modèle 3D en fichier d’impression depuis une API.

L’architecture pourra alors évoluer vers :

                    Client / navigateur
                            |
                            v
                    Bambu Gateway
                       :4844
                            |
             +--------------+--------------+
             |                             |
             v                             v
       OrcaSlicer Headless             A1 mini
            :8070                    192.168.0.10
             |
             v
        Fichier 3MF/G-code

On pourra ainsi disposer d’une chaîne complète :

  1. envoi d’un modèle 3D ;
  2. tranchage avec OrcaSlicer ;
  3. génération du fichier d’impression ;
  4. envoi à Bambu Gateway ;
  5. lancement de l’impression sur l’A1 mini ;
  6. suivi de l’impression via l’API.

Cette partie fera l’objet d’un prochain article.

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.