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
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 :
- envoi d’un modèle 3D ;
- tranchage avec OrcaSlicer ;
- génération du fichier d’impression ;
- envoi à Bambu Gateway ;
- lancement de l’impression sur l’A1 mini ;
- suivi de l’impression via l’API.
Cette partie fera l’objet d’un prochain article.
