22 KiB
Photomaton LSDW - Guide d'installation from scratch
Ce guide permet de remonter le photomaton completement a partir d'un Raspberry Pi 4 (2 Go) neuf. Reconstitue a partir de l'historique bash du Pi original. Derniere mise a jour : Juin 2026
Table des matieres
- Prerequis
- Installation de l'OS
- Configuration initiale du Pi
- Installation de photobooth-app
- Installation de RaspAP (hotspot WiFi)
- Installation de Zoraxy (reverse proxy)
- Certificat TLS (Let's Encrypt + OVH)
- Configuration des imprimantes (CUPS + Selphy)
- Installation de Node-RED
- NeoPixels (WS2812)
- Configuration du mode kiosk (Chromium)
- Optimisation systeme
- Services systemd
- Verification finale
- Post-installation : contenu a restaurer
1. Prerequis
Materiel necessaire
- Raspberry Pi 4 (2 Go RAM)
- Carte microSD (32 Go minimum, classe A2 recommandee)
- Camera Module 3 officielle Raspberry Pi
- Ecran HDMI
- Bouton physique lumineux 12V avec relay
- NeoPixels WS2812 (35 LEDs, strip)
- Canon Selphy CP1300 x2 (blanche + noire) + cables USB
- Cable Ethernet (pour l'installation initiale et les certificats)
- Clavier + souris (pour l'installation initiale)
Logiciels sur le PC
- Raspberry Pi Imager (pour flasher la carte SD)
- Un client SSH (terminal, PuTTY, etc.)
2. Installation de l'OS
Flasher la carte SD
- Telecharger et installer Raspberry Pi Imager
- Choisir l'OS : Raspberry Pi OS (64-bit) base sur Debian 13 Trixie
- Version Desktop (pas Lite, on a besoin de l'environnement graphique pour Chromium)
- Architecture arm64
- Dans les options avancees (engrenage) :
- Hostname :
PiPhotobooth - Activer SSH (authentification par mot de passe)
- Utilisateur :
pi/ mot de passe :[choisir un mot de passe] - Locale :
fr_FR.UTF-8, timezone :Europe/Paris - WiFi : ne pas configurer (on utilisera RaspAP)
- Hostname :
- Flasher la carte SD
Premier demarrage
- Inserer la carte SD, connecter l'ecran HDMI, le clavier, et le cable Ethernet
- Demarrer le Pi
- Attendre la fin du premier boot (peut prendre 2-3 minutes)
- Se connecter en SSH :
ssh pi@PiPhotobooth.local
3. Configuration initiale du Pi
Mise a jour systeme
sudo apt update
sudo apt upgrade -y
Configuration avec raspi-config
sudo raspi-config
Configurer :
- System Options > Boot / Auto Login : Desktop Autologin (B4)
- Interface Options > Camera : Activer (si demande)
- Localisation Options : Locale fr_FR.UTF-8, Timezone Europe/Paris
- Advanced Options > Expand Filesystem (si pas fait automatiquement)
Desactiver les services inutiles
sudo systemctl disable bluetooth.service
sudo systemctl disable wg-quick@wg0.service 2>/dev/null
Desactiver cloud-init (si present)
sudo touch /etc/cloud/cloud-init.disabled
Configurer /etc/hosts
sudo nano /etc/hosts
Ajouter :
127.0.0.1 localhost
127.0.1.1 PiPhotobooth
10.3.141.1 photomaton.lessapinsduweb.com
10.3.141.1 photomaton-nodered.lessapinsduweb.com
10.3.141.1 photomaton-raspap.lessapinsduweb.com
10.3.141.1 photomaton-zoraxy.lessapinsduweb.com
Si cloud-init ecrase /etc/hosts, editer aussi le template :
sudo nano /etc/cloud/templates/hosts.debian.tmpl
Redemarrer
sudo reboot
4. Installation de photobooth-app
Dependances
sudo apt -y install ffmpeg libturbojpeg0 libgl1 libgphoto2-dev fonts-noto-color-emoji
sudo apt -y install libexif12 libgphoto2-6 libgphoto2-port12 libltdl7
sudo apt -y install python3-dev
sudo apt -y install pipx
sudo apt -y install imagemagick
Installation via pipx
pipx ensurepath
# Fermer et rouvrir le terminal (ou source ~/.bashrc)
exit
ssh pi@PiPhotobooth.local
pipx install --system-site-packages photobooth-app --pip-args='--prefer-binary'
Creer le dossier de donnees
mkdir ~/photobooth-data
Verifier que la camera fonctionne
rpicam-hello --list-cameras -v
Premier lancement (test)
cd ~/photobooth-data
photobooth --port 8083
Verifier sur http://PiPhotobooth.local:8083 que l'interface fonctionne. Arreter avec Ctrl+C.
Configuration de photobooth-app
Le service systemd est installe automatiquement par photobooth-app dans :
~/.local/share/systemd/user/photobooth-app.service
Editer pour configurer le port et les dependances :
nano ~/.local/share/systemd/user/photobooth-app.service
Contenu recommande :
[Unit]
Description=photobooth-app
After=zoraxy.service raspapd.service
[Service]
Type=simple
Restart=always
WorkingDirectory=/home/pi/photobooth-data
ExecStart=/home/pi/.local/share/pipx/venvs/photobooth-app/bin/python -O -m photobooth --port 8083
[Install]
WantedBy=default.target
Points importants :
After=zoraxy.service raspapd.service: attend que Zoraxy et RaspAP soient prets--port 8083: port d'ecouteRestart=always: relance en cas de crash
Activer et demarrer :
systemctl --user daemon-reload
systemctl --user enable photobooth-app
systemctl --user start photobooth-app
Activer le linger (pour que le service demarre au boot sans login) :
sudo loginctl enable-linger pi
Verifier :
systemctl --user status photobooth-app
journalctl --user --unit=photobooth-app -n 50 --no-pager
Configuration dans l'interface admin
Acceder a http://PiPhotobooth.local:8083/admin et configurer :
- common :
logging_level->WARNING(pas DEBUG !) - backends : Camera Module 3, backend Picamera2, resolution 2304x1536
- hardwareinputoutput :
gpio_enabled->true - mediaprocessing :
full_still_length-> 2304,preview_still_length-> 1200 - misc : Changer
secret_key(generer avecpython3 -c "import secrets; print(secrets.token_hex(32))")
Voir config/photobooth-config-optimized.json pour la config complete recommandee.
5. Installation de RaspAP (hotspot WiFi)
Installation automatique
curl -sL https://install.raspap.com | bash
Suivre les instructions. Repondre oui aux questions par defaut.
Apres l'installation, le Pi redemarrera avec un hotspot WiFi actif.
Configuration du hotspot
Acceder a l'interface RaspAP : http://10.3.141.1:8082 (ou http://PiPhotobooth.local:8082 via Ethernet)
Login par defaut : admin / secret (changer le mot de passe !)
Configurer :
- Hotspot > Basic :
- SSID :
Photomaton(ou le nom souhaite) - Security : WPA2
- Mot de passe WiFi :
[choisir]
- SSID :
- Hotspot > Advanced :
- Country code : FR
- Channel : choisir un canal peu encombre
Configuration DNS (dnsmasq)
Creer le fichier de resolution locale :
sudo nano /etc/dnsmasq.d/090_custom_local_hotspot.conf
Contenu :
address=/lessapinsduweb.com/10.3.141.1
address=/photomaton.lessapinsduweb.com/10.3.141.1
address=/#/127.0.0.1
Redemarrer dnsmasq :
sudo systemctl restart dnsmasq.service
Verifier :
dig @127.0.0.1 photomaton.lessapinsduweb.com A
# Doit repondre 10.3.141.1
Changer le port lighttpd (si conflit)
Si lighttpd est sur le port 80 (conflit avec Zoraxy), le changer :
sudo nano /etc/lighttpd/lighttpd.conf
Changer server.port = 80 en server.port = 8082 (devrait deja etre fait par RaspAP).
6. Installation de Zoraxy (reverse proxy)
Telecharger et installer
mkdir ~/zoraxy
cd ~/zoraxy
# Telecharger la derniere version arm64
# Verifier la derniere release sur https://github.com/tobychui/zoraxy/releases
wget https://github.com/tobychui/zoraxy/releases/download/v3.3.2/zoraxy_linux_arm64
mv zoraxy_linux_arm64 zoraxy
chmod +x zoraxy
Creer le script de demarrage
nano ~/zoraxy/start.sh
Contenu :
#!/bin/bash
cd /home/pi/zoraxy
./zoraxy -port=:8001
chmod +x ~/zoraxy/start.sh
Creer le service systemd
sudo nano /etc/systemd/system/zoraxy.service
Contenu :
[Unit]
Description=Zoraxy Reverse Proxy
After=network.target
[Service]
Type=simple
ExecStart=/home/pi/zoraxy/start.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable zoraxy.service
sudo systemctl start zoraxy.service
Verifier :
sudo systemctl status zoraxy.service
sudo ss -ltnp | grep zoraxy
Configurer les proxies
Acceder a l'admin Zoraxy : http://127.0.0.1:8001 (ou http://PiPhotobooth.local:8001 via Ethernet)
Creer les 4 proxies :
1. photomaton.lessapinsduweb.com -> 127.0.0.1:8083
- WebSocket Custom Headers : ON
- Disable Chunked Transfer Encoding : ON
- Skip Certificate Validations : ON
2. photomaton-nodered.lessapinsduweb.com -> 127.0.0.1:1880
- Options par defaut
3. photomaton-raspap.lessapinsduweb.com -> 127.0.0.1:8082
- Options par defaut
4. photomaton-zoraxy.lessapinsduweb.com -> 127.0.0.1:8001
- Options par defaut
7. Certificat TLS (Let's Encrypt + OVH)
Le certificat est necessaire pour HTTPS. Comme le Pi n'a pas d'acces internet permanent (WiFi isole), on utilise le challenge DNS via l'API OVH. Cette etape necessite un cable Ethernet connecte a internet.
Installer certbot avec le plugin OVH
sudo apt install certbot # ou via venv si le paquet n'existe pas :
# sudo python3 -m venv /opt/certbot/
# sudo /opt/certbot/bin/pip install --upgrade pip
# sudo /opt/certbot/bin/pip install certbot certbot-dns-ovh
# sudo ln -s /opt/certbot/bin/certbot /usr/local/bin/certbot
Configurer les credentials OVH
Creer les credentials API OVH sur https://api.ovh.com/createToken/
nano ~/.ovhapi
Contenu :
dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = VOTRE_APP_KEY
dns_ovh_application_secret = VOTRE_APP_SECRET
dns_ovh_consumer_key = VOTRE_CONSUMER_KEY
chmod 600 ~/.ovhapi
Generer le certificat
Important : Le Pi doit etre connecte a internet via Ethernet pour cette etape.
sudo certbot certonly \
--dns-ovh \
--dns-ovh-credentials ~/.ovhapi \
-d photomaton.lessapinsduweb.com \
-d photomaton-nodered.lessapinsduweb.com \
-d photomaton-raspap.lessapinsduweb.com \
-d photomaton-zoraxy.lessapinsduweb.com
Les certificats sont generes dans /etc/letsencrypt/live/photomaton.lessapinsduweb.com/.
Importer dans Zoraxy
Dans l'admin Zoraxy (http://127.0.0.1:8001) :
- Aller dans TLS / SSL
- Importer le certificat :
- Certificate : contenu de
/etc/letsencrypt/live/photomaton.lessapinsduweb.com/fullchain.pem - Private Key : contenu de
/etc/letsencrypt/live/photomaton.lessapinsduweb.com/privkey.pem
- Certificate : contenu de
Renouvellement
Le certificat expire tous les 90 jours. Pour renouveler :
- Connecter le Pi a internet via Ethernet
- Lancer :
sudo certbot renew - Reimporter dans Zoraxy si necessaire
Note : Ce n'est pas automatise car le Pi n'a pas d'acces internet permanent. Penser a renouveler avant chaque saison d'events.
8. Configuration des imprimantes (CUPS + Selphy)
Installer les paquets
sudo apt -y install cups printer-driver-gutenprint cups-client
Configurer les permissions
sudo usermod -aG lpadmin pi
sudo usermod -aG lp pi
Configurer CUPS pour l'acces distant
sudo cupsctl --remote-any
sudo systemctl restart cups
Gestion du driver USB
La Selphy CP1300 peut utiliser ipp-usb ou usblp. Pour eviter les conflits :
# Verifier si ipp-usb est installe
sudo apt list --installed | grep ipp
# Si necessaire, blacklister usblp pour utiliser ipp-usb
# (ou l'inverse selon ce qui fonctionne)
sudo nano /etc/modprobe.d/blacklist-usblp.conf
Contenu (si on utilise ipp-usb) :
# blacklist usblp
Ajouter les imprimantes
- Brancher les 2 Canon Selphy CP1300 en USB
- Aller sur
http://localhost:631(ouhttps://photomaton-raspap.lessapinsduweb.comvia WiFi) - Administration > Add Printer
- Selectionner l'imprimante USB Canon
- Nommer :
- Premiere (blanche) :
Canon_SELPHY_CP1300_usb_blanche - Deuxieme (noire) :
Canon_SELPHY_CP1300_usb_noire
- Premiere (blanche) :
- Selectionner le driver Gutenprint
Verification :
lpstat -v
lpstat -p
Installer le script d'impression
mkdir -p ~/photobooth-data/script
cp scripts/script_print.sh ~/photobooth-data/script/
chmod +x ~/photobooth-data/script/script_print.sh
Tester l'impression
# Prendre une photo de test via photobooth-app, puis :
cd ~/photobooth-data/media/processed_full/
lp -d Canon_SELPHY_CP1300_usb_blanche -o landscape -o fit-to-page [nom_fichier].jpg
9. Installation de Node-RED
Installation via le script officiel
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Repondre oui aux questions. Le script installe Node.js et Node-RED, et cree le service systemd.
Activer le service
sudo systemctl enable nodered.service
sudo systemctl start nodered.service
Installer les nodes necessaires
Acceder a Node-RED : http://PiPhotobooth.local:1880
Dans le menu hamburger > Manage palette > Install, installer :
node-red-node-pi-gpio(GPIO input/output)node-red-node-pi-neopixel(NeoPixels WS2812)node-red-node-sqlite(base SQLite)node-red-dashboardou@flowfuse/node-red-dashboard(Dashboard v2)node-red-contrib-button-events(multi-clic bouton)
Importer les flows
- Dans Node-RED, menu hamburger > Import
- Coller le contenu du fichier de flows (backup dans
config/nodered-flows-backup.json) - Deploy
Creer la base SQLite
sudo apt install sqlite3
La base est creee automatiquement par Node-RED au premier usage, mais on peut la creer manuellement :
sqlite3 ~/photobooth-data/photo-to-print.sqlite
CREATE TABLE photoToPrint(
id INT PRIMARY KEY,
filename TEXT NOT NULL,
uid TEXT NOT NULL,
toPrint INT DEFAULT 1,
printed BOOLEAN DEFAULT 0,
created_at TEXT NOT NULL DEFAULT current_timestamp
);
.quit
10. NeoPixels (WS2812)
Cablage
- Data : GPIO18
- Alimentation : 5V + GND
- 35 LEDs
Via Node-RED (methode utilisee)
Le node node-red-node-pi-neopixel gere les NeoPixels directement. Il lance un script Python en sudo :
/home/pi/.node-red/node_modules/node-red-node-pi-neopixel/neopix.py 35 0 pixels 100 true 0 18
Pas d'installation supplementaire requise au-dela du node Node-RED.
Note : uvicorn sur le port 8081
Le processus uvicorn sur le port 8081 est l'API backend de RaspAP (/etc/raspap/api/main.py), pas un service NeoPixels. Il est lance automatiquement par RaspAP et ne doit pas etre desactive.
Le dossier ~/ws2812/ est un ancien test NeoPixels inactif (rien ne le lance). Il peut etre supprime si souhaite.
11. Configuration du mode kiosk (Chromium)
Fichier desktop
nano ~/Desktop/photobooth-app.desktop
Contenu :
[Desktop Entry]
X-GNOME-Autostart-enabled=true
X-GNOME-Autostart-Delay=120
Terminal=false
Type=Application
Name=Photobooth-App
Exec=bash -c "sleep 60 && chromium --kiosk --accept-lang=fr-FR --incognito --password-store=basic --disable-features=Translate,OverscrollHistoryNavigation --noerrdialogs --disable-infobars --no-first-run --ozone-platform=wayland --enable-features=OverlayScrollbar --start-maximized http://127.0.0.1:8083/"
StartupNotify=false
Points importants
- Le binaire est
chromium(paschromium-browser) sous Debian 13 Trixie --ozone-platform=wayland: utilisation native de Wayland (le compositeur est labwc)- Le fichier est dans
~/Desktop/, pas dans~/.config/autostart/ - Le
sleep 60+X-GNOME-Autostart-Delay=120laissent le temps a photobooth-app de demarrer --incognito: pas de cache persistant, pas de popups "restore session"
Lien symbolique pour autostart
sudo ln -s /home/pi/Desktop/photobooth-app.desktop /etc/xdg/autostart/photobooth.desktop
12. Optimisation systeme
Scripts d'optimisation
Copier le dossier photomaton/ sur le Pi, puis :
# Optimisation systeme (swap, kernel, services)
sudo bash scripts/optimize-system.sh
sudo reboot
# Optimisation desktop (desactiver composants inutiles, ~231 Mo)
sudo bash scripts/optimize-desktop.sh
sudo reboot
Optimisations manuelles rapides
Si on ne veut pas lancer les scripts complets :
# Baisser le swappiness (60 -> 10)
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-photomaton-swap.conf
# Desactiver rpcbind (inutile)
sudo systemctl disable rpcbind.service rpcbind.socket
sudo systemctl stop rpcbind.service rpcbind.socket
# Desactiver ModemManager (inutile)
sudo systemctl disable ModemManager.service
sudo systemctl stop ModemManager.service
# Desactiver bluetooth
sudo systemctl disable bluetooth.service
sudo systemctl stop bluetooth.service
# Ajouter un swapfile de securite (en complement de zram)
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon -p 10 /swapfile
echo '/swapfile none swap sw,pri=10 0 0' | sudo tee -a /etc/fstab
13. Services systemd
Liste des services du photomaton
| Service | Type | Fichier | Gere par |
|---|---|---|---|
| photobooth-app | User | ~/.local/share/systemd/user/photobooth-app.service |
pipx (auto-installe), After=zoraxy+raspapd |
| nodered | System | /etc/systemd/system/nodered.service |
Script officiel Node-RED |
| zoraxy | System | /etc/systemd/system/zoraxy.service |
Manuel (voir section 6) |
| cups | System | (pre-installe) | apt |
| hostapd | System | (pre-installe) | RaspAP |
| dnsmasq | System | (pre-installe) | RaspAP |
| lighttpd | System | (pre-installe) | RaspAP |
| dhcpcd | System | (pre-installe) | RaspAP |
Services optionnels (surveillance)
# Watchdog (health check toutes les 2 minutes)
sudo cp systemd/photobooth-watchdog.service /etc/systemd/system/
sudo cp systemd/photobooth-watchdog.timer /etc/systemd/system/
# Editer ExecStart pour pointer vers le bon chemin de health-check.sh
sudo systemctl daemon-reload
sudo systemctl enable photobooth-watchdog.timer
sudo systemctl start photobooth-watchdog.timer
# Maintenance quotidienne (4h du matin)
sudo cp systemd/photobooth-maintenance.service /etc/systemd/system/
sudo cp systemd/photobooth-maintenance.timer /etc/systemd/system/
# Editer ExecStart pour pointer vers le bon chemin de maintenance.sh
sudo systemctl daemon-reload
sudo systemctl enable photobooth-maintenance.timer
sudo systemctl start photobooth-maintenance.timer
Verification des services
# Tous les services actifs
sudo systemctl list-unit-files --type=service --state=enabled
# Etat de chaque service
systemctl --user status photobooth-app
sudo systemctl status nodered
sudo systemctl status zoraxy
sudo systemctl status cups
sudo systemctl status hostapd
sudo systemctl status dnsmasq
14. Verification finale
Checklist
# 1. Tous les services tournent ?
systemctl --user status photobooth-app # active
sudo systemctl status nodered # active
sudo systemctl status zoraxy # active
sudo systemctl status cups # active
sudo systemctl status hostapd # active
sudo systemctl status dnsmasq # active
# 2. Tous les ports ecoutent ?
sudo ss -ltnp
# Attendu : 22, 53, 80, 443, 631, 1880, 5487, 8001, 8082, 8083
# 3. Camera detectee ?
rpicam-hello --list-cameras
# 4. Imprimantes detectees ?
lpstat -v
lpstat -p
# 5. DNS fonctionne ?
dig @127.0.0.1 photomaton.lessapinsduweb.com A
# Doit repondre 10.3.141.1
# 6. HTTPS fonctionne ?
curl -k https://photomaton.lessapinsduweb.com/
# (depuis le Pi lui-meme, ou depuis un telephone connecte au WiFi)
# 7. Memoire ?
free -h
# Verifier que Swap est present (zram + swapfile)
# 8. Health check complet
bash scripts/health-check.sh
Test fonctionnel complet
- Connecter un telephone au WiFi "Photomaton"
- Appuyer sur le bouton physique (1 clic)
- Verifier le countdown sur l'ecran
- Verifier que la photo est prise et apparait dans la galerie
- Scanner le QR code avec le telephone
- Verifier que la photo se telecharge
- Cliquer "Demander l'impression" dans la galerie
- Sur le dashboard Node-RED (telephone) : valider l'impression
- Verifier que la Selphy imprime correctement
15. Post-installation : contenu a restaurer
Fichiers a copier depuis une sauvegarde
# Cadres et fonds
~/photobooth-data/userdata/hopnbloc/
~/photobooth-data/userdata/LSDW/
~/photobooth-data/userdata/demoassets/
# Script d'impression
~/photobooth-data/script/script_print.sh
# Configuration photobooth-app
~/photobooth-data/config/config.json
# Flows Node-RED
~/.node-red/flows.json
# Config Zoraxy (proxies)
~/zoraxy/conf/proxy/*.config
# Config dnsmasq custom
/etc/dnsmasq.d/090_custom_local_hotspot.conf
# Credentials OVH (pour certbot)
~/.ovhapi
Sauvegarder le systeme
Pour eviter de devoir tout refaire, creer une image de la carte SD :
# Sur le PC (pas sur le Pi), avec la carte SD inseree :
sudo dd if=/dev/sdX of=photomaton-backup-$(date +%Y%m%d).img bs=4M status=progress
Ou utiliser rpi-clone pour cloner sur une deuxieme carte SD.