18 KiB
Guide d'installation from scratch â JH Photomaton
Raspberry Pi 4 (2 Go) · Pi Camera Module V3 · Pi OS Lite 64-bit + cage (kiosk Wayland) Les Sapins Du Web â juillet 2026
Vue d'ensemble du stack
Internet / réseau local
â
[Zoraxy] :443 / :80 â reverse proxy HTTPS
â
[RaspAP] â point d'accĂšs WiFi "Photomaton"
â
ââââââââŽâââââââââââââââââââââââ
â photobooth-app :8000 â â kiosque, camĂ©ra, frames
â JH Photomaton :8090 â â admin, LEDs, bouton, imprimantes
â CUPS :631 â â Canon Selphy CP1300 x2
âââââââââââââââââââââââââââââââ
Matériel :
- Raspberry Pi 4 (2 Go RAM), carte SD 32 Go+
- Pi Camera Module V3 (Sony IMX708, 12 MP)
- Anneau LED WS2812b â 35 LEDs â GPIO 18
- Bouton arcade â GPIO 23 / Relay â GPIO 12
- 2Ă Canon Selphy CP1300
Ătape 1 â Flasher la carte SD
Utiliser Raspberry Pi Imager sur ton PC :
- OS : Raspberry Pi OS Lite (64-bit) â sans bureau (choisir "Raspberry Pi OS (other)" â "Lite")
- Activer SSH, définir utilisateur
piet mot de passe dans les options avancées - Hostname :
photomaton - WiFi : ne pas configurer (RaspAP va le prendre en charge)
Pourquoi Lite ? Le bureau complet (PIXEL) consomme ~450â600 Mo RAM Ă l'idle. Lite + cage + Chromium consomme ~150â250 Mo â soit ~300 Mo libĂ©rĂ©s pour picamera2 et le reste du stack.
Bookworm vs Trixie : Bookworm est plus stable pour picamera2 et rpi-ws281x. Si l'ancienne carte tournait sur Trixie sans problĂšme, reste sur Trixie.
Flasher, insérer dans le Pi, brancher en Ethernet, démarrer.
Ătape 2 â Premier dĂ©marrage et prĂ©paration systĂšme
# Trouver l'IP du Pi sur ton réseau local (depuis ton PC)
# Puis se connecter
ssh pi@<IP_DU_PI>
# Mise Ă jour complĂšte
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y
# Outils essentiels
sudo apt install -y git curl wget vim rsync python3-pip python3-venv \
python3-dev build-essential gcc make
# Redémarrer pour appliquer les mises à jour du noyau
sudo reboot
Ătape 3 â DĂ©sactiver l'audio (requis pour les LEDs WS2812b)
Les LEDs WS2812b utilisent le PWM sur GPIO 18, qui entre en conflit avec la carte son intégrée.
sudo nano /boot/firmware/config.txt
Trouver la ligne dtparam=audio=on et la remplacer par :
dtparam=audio=off
Ajouter aussi en bas du fichier (si pas déjà présent) :
# Désactive le Bluetooth pour libérer l'UART si besoin
dtoverlay=disable-bt
Sauvegarder et redémarrer :
sudo reboot
Ătape 4 â Installer l'environnement kiosk (cage + Chromium)
Sur Pi OS Lite, il n'y a pas de bureau. On installe uniquement ce qu'il faut pour afficher Chromium en mode kiosque via le compositeur Wayland minimal cage.
sudo apt install -y \
cage \
chromium-browser \
xdg-utils \
fonts-liberation \
fonts-noto \
dbus-user-session \
libcap2-bin
Auto-login console
sudo raspi-config
# â System Options â Boot / Auto Login â Console Autologin
Service kiosk systemd
Ce service dĂ©marre cage + Chromium automatiquement au boot, aprĂšs que photobooth-app soit prĂȘt.
sudo nano /etc/systemd/system/photobooth-kiosk.service
[Unit]
Description=Photobooth Kiosk (cage + Chromium)
After=photobooth-app.service network.target
Wants=photobooth-app.service
[Service]
Type=simple
User=pi
PAMName=login
TTYPath=/dev/tty1
StandardInput=tty
Environment=XDG_RUNTIME_DIR=/run/user/1000
Environment=WAYLAND_DISPLAY=wayland-1
# Attendre que photobooth-app soit prĂȘt
ExecStartPre=/bin/sleep 8
ExecStart=/usr/bin/cage -- /usr/bin/chromium-browser \
--kiosk \
--noerrdialogs \
--disable-infobars \
--disable-session-crashed-bubble \
--disable-features=TranslateUI \
--no-first-run \
--disable-restore-session-state \
--autoplay-policy=no-user-gesture-required \
http://localhost:8000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable photobooth-kiosk
Note : cage est un compositeur Wayland "single-app" â il lance Chromium et rien d'autre. Pas de gestionnaire de fenĂȘtres, pas de barre des tĂąches, pas de bureau. C'est exactement ce qu'on veut pour un kiosque.
Ătape 5 â Activer la camĂ©ra
# Installer picamera2 et les outils libcamera (paquets systĂšme)
sudo apt install -y python3-picamera2 libcamera-apps
# Vérifier que la caméra est détectée
libcamera-hello --list-cameras
# Doit afficher : "Available cameras" avec le Sony IMX708
Ătape 6 â Installer photobooth-app
photobooth-app est l'application kiosque qui gÚre la caméra, le décompte et les frames.
# photobooth-app crĂ©e lui-mĂȘme ~/photobooth-data/ et ses sous-dossiers au premier lancement
# Installer dans un venv avec accÚs aux paquets systÚme (nécessaire pour picamera2)
sudo apt install -y python3-venv
python3 -m venv /home/pi/photobooth-venv --system-site-packages
/home/pi/photobooth-venv/bin/pip install photobooth-app
Créer le service systemd pour photobooth-app
sudo nano /etc/systemd/system/photobooth-app.service
[Unit]
Description=Photobooth App
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/photobooth-data/
ExecStart=/home/pi/photobooth-venv/bin/photobooth
Restart=always
RestartSec=5
Environment=HOME=/home/pi
[Install]
WantedBy=multi-user.target
WorkingDirectory=/home/pi/photobooth-data/ â c'est le rĂ©pertoire de travail de photobooth-app. Tous ses sous-dossiers (
config/,media/,userdata/,database/...) y sont créés au premier lancement.
sudo systemctl daemon-reload
sudo systemctl enable photobooth-app
sudo systemctl start photobooth-app
# Attendre ~10s puis vérifier
sudo systemctl status photobooth-app
photobooth-app est accessible sur http://localhost:8000.
Configurer photobooth-app
Accéder à l'interface d'administration : http://<IP>:8000/admin
Réglages à faire impérativement :
a) Backend caméra
Settings â Backends â Add / Edit :
- Backend type : Picamera2
- Camera num : 0
- Capture resolution : 4608 Ă 2592 (mode natif IMX708 â 14 fps)
- Preview resolution : 2304 Ă 1296 (mode natif â 56 fps, champ complet)
- Liveview resolution : 960 à 540 (min. height=500 imposé par photobooth-app, 16:9)
- Framerate still mode : 14 (max en full res)
b) Désactiver les GPIO internes de photobooth-app
Settings â Hardware â GPIO â dĂ©sactiver (JH Photomaton gĂšre ses propres GPIO)
gpio_enabled: false
c) Plugin commander â connecter Ă JH Photomaton
Copier la config depuis le dépÎt aprÚs l'avoir cloné (étape 7) :
# AprÚs avoir cloné le dépÎt JH Photomaton :
cp /home/pi/jh-photomaton/photobooth-app/config/plugin_commander_jh.json \
/home/pi/photobooth-data/config/plugin_commander.json
sudo systemctl restart photobooth-app
d) Bouton "Demande d'impression"
Dans photobooth-app Settings â Share â Actions :
Remplacer la share_command :
curl http://127.0.0.1:8090/api/print/request?filename={filename}
â ïž L'ancienne valeur pointait vers Node-RED (
:1880). Bien remplacer par:8090.
Ătape 7 â Cloner et installer JH Photomaton
# Cloner depuis Gitea
cd /home/pi
git clone https://gitea.lespatas.ovh/admin/photoBooth.git jh-photomaton
cd jh-photomaton
# Lancer l'installation (crée le venv, installe les dépendances, active le service)
sudo bash scripts/install.sh
Le script install.sh fait automatiquement :
apt installdes dépendances systÚme- Création du venv Python avec
--system-site-packages pip install -r requirements.txtpip install rpi-ws281x(LEDs)- Copie du service systemd +
systemctl enable
Vérifier l'installation
sudo systemctl status jh-photomaton
sudo journalctl -u jh-photomaton -f
Interface admin : http://<IP>:8090/admin
Mot de passe : PhotoBooth2026!
Ătape 8 â Configurer settings.yaml
nano /home/pi/jh-photomaton/config/settings.yaml
Points à vérifier / adapter :
app:
port: 8090
admin_password: "PhotoBooth2026!" # changer si voulu
photobooth:
base_url: "http://localhost:8000"
data_dir: "/home/pi/photobooth-data"
media_dir: "/home/pi/photobooth-data/media/processed_full" # chemin réel créé par photobooth-app
event:
name: "Evenement" # sera modifié depuis l'admin
slug: "evenement"
leds:
pin: 18
count: 35 # nombre de LEDs dans l'anneau
brightness: 180 # 0-255, luminosité normale
effects:
capture:
color: [255, 200, 80] # blanc chaud (évite la dominante bleue WS2812b)
flashes: 2
flash_duration: 0.30
button:
pin: 23 # GPIO du bouton arcade
relay_pin: 12 # GPIO du relay
print_enabled: true
print:
mode: "validation"
printers:
- name: "Selphy_Blanche_WiFi"
label: "Selphy Blanche (WiFi)"
- name: "Selphy_Noire_WiFi"
label: "Selphy Noire (WiFi)"
AprĂšs modification :
sudo systemctl restart jh-photomaton
Ătape 9 â Installer CUPS et les imprimantes Selphy
# Installer CUPS + pilotes Gutenprint
sudo apt install -y cups printer-driver-gutenprint
# Ajouter l'utilisateur pi au groupe lpadmin
sudo usermod -aG lpadmin pi
# Démarrer CUPS
sudo systemctl enable cups
sudo systemctl start cups
# Autoriser l'accĂšs distant Ă l'interface CUPS
sudo cupsctl --remote-admin
sudo systemctl restart cups
Accéder à CUPS : http://<IP>:631
Ajouter les imprimantes
Administration â Add Printer pour chaque Selphy :
| Champ | Valeur |
|---|---|
| Connection | socket://192.168.X.X:9100 (IP de la Selphy sur le WiFi) ou USB |
| Name | Selphy_Blanche_WiFi (exactement ce nom â utilisĂ© par le script) |
| Driver | Canon SELPHY CP1300 â Gutenprint |
| Media | Postcard 100Ă148mm |
Répéter pour Selphy_Noire_WiFi.
Script d'impression
â ïž
script_print.shest un script custom â il n'existe pas par dĂ©faut. Il doit ĂȘtre copiĂ© depuis l'ancienne carte SD (voir Ătape 12).
# Créer le dossier s'il n'existe pas
mkdir -p /home/pi/photobooth-data/script/
# AprÚs copie depuis l'ancienne carte, rendre exécutable
chmod +x /home/pi/photobooth-data/script/script_print.sh
# Test manuel
/home/pi/photobooth-data/script/script_print.sh \
"/home/pi/photobooth-data/media/processed_full/test.jpg" \
"image" "test" "1"
# Doit retourner : PRINTED:Selphy_Blanche_WiFi:1
Ătape 10 â Point d'accĂšs WiFi (hostapd + dnsmasq)
Pourquoi pas RaspAP ? RaspAP installe lighttpd + PHP + une interface web â ~40 Mo de RAM pour une UI qu'on n'utilise pas. On configure directement hostapd et dnsmasq, ce qu'il y a en dessous.
sudo apt install -y hostapd dnsmasq
sudo systemctl unmask hostapd
IP statique sur wlan0
Ajouter dans /etc/dhcpcd.conf :
interface wlan0
static ip_address=192.168.230.1/24
nohook wpa_supplicant
hostapd â point d'accĂšs WiFi ouvert
sudo nano /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=Photomaton-LSDW
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
# WiFi ouvert â pas de mot de passe
auth_algs=1
ignore_broadcast_ssid=0
Déclarer le fichier de config dans /etc/default/hostapd :
DAEMON_CONF="/etc/hostapd/hostapd.conf"
dnsmasq â DHCP + redirection DNS (portail captif)
Ajouter Ă la fin de /etc/dnsmasq.conf :
interface=wlan0
bind-interfaces
# DHCP : distribue des IPs aux clients WiFi
dhcp-range=192.168.230.2,192.168.230.100,255.255.255.0,24h
# Annonce le Pi comme serveur DNS aux clients
dhcp-option=6,192.168.230.1
# ââ Portail captif ââââââââââââââââââââââââââââââââââââââââââââââ
# Tout le trafic DNS â Pi (192.168.230.1)
# google.com, instagram.com, lessapinsduweb.com... tout arrive ici.
# Zoraxy fait le tri par HTTP Host header :
# - *.lessapinsduweb.com â apps configurĂ©es dans Zoraxy
# - tout le reste â redirect vers photomaton.lessapinsduweb.com
address=/#/192.168.230.1
# Sondes de dĂ©tection portail captif â iOS et Android ouvrent
# automatiquement le navigateur sur la galerie
address=/captive.apple.com/192.168.230.1
address=/connectivitycheck.gstatic.com/192.168.230.1
address=/detectportal.firefox.com/192.168.230.1
address=/www.msftconnecttest.com/192.168.230.1
Note :
address=/#/192.168.230.1s'applique uniquement aux clients WiFi (DHCP sur wlan0). Le Pi lui-mĂȘme utilise le DNS de son routeur via eth0.
Activer les services
sudo systemctl enable --now hostapd
sudo systemctl enable --now dnsmasq
Ătape 11 â Installer Zoraxy (reverse proxy HTTPS + catch-all)
Zoraxy sert deux rĂŽles ici : reverse proxy HTTPS pour les apps, et redirection captive portal pour tout le trafic inconnu des clients WiFi.
# Télécharger le binaire ARM64
mkdir ~/zoraxy && cd ~/zoraxy
wget https://github.com/tobychui/zoraxy/releases/download/v3.3.2/zoraxy_linux_arm64 -O zoraxy
chmod +x zoraxy
# Service systemd
sudo nano /etc/systemd/system/zoraxy.service
[Unit]
Description=Zoraxy Reverse Proxy
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/zoraxy
ExecStart=/home/pi/zoraxy/zoraxy -port=8888
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable zoraxy
sudo systemctl start zoraxy
Configurer les routes dans Zoraxy
| Hostname | Destination | Notes |
|---|---|---|
photomaton.lessapinsduweb.com |
127.0.0.1:8000 |
Galerie publique / kiosque |
admin.lessapinsduweb.com |
127.0.0.1:8090 |
Interface admin JH Photomaton |
cups.lessapinsduweb.com |
127.0.0.1:631 |
Optionnel |
* (catch-all) |
Redirect â http://photomaton.lessapinsduweb.com |
Portail captif |
La rÚgle catch-all est la clé : quand un client WiFi tape google.com, DNS
rĂ©sout vers 192.168.230.1, Zoraxy reçoit la requĂȘte, ne reconnaĂźt pas l'hĂŽte,
et redirige vers la galerie photo.
Limite HTTPS : si un client tape
https://google.com, le navigateur voit un certificat invalide et bloque avant la redirection. C'est inhérent à tout portail DNS captif. En pratique : QR code sur les tables + iOS/Android qui détectent le portail automatiquement via les sondes dnsmasq ci-dessus.
Ătape 12 â Copier les donnĂ©es de l'ancienne carte SD
Depuis ton PC, copier les fichiers importants de l'ancienne carte :
# Monter l'ancienne carte SD sur le PC (remplacer /dev/sdX)
# ou utiliser un lecteur de carte
# Cadres (frames) photobooth
rsync -av /mnt/old-sd/home/pi/photobooth-data/userdata/ \
pi@<IP_DU_PI>:/home/pi/photobooth-data/userdata/
# Script d'impression
rsync -av /mnt/old-sd/home/pi/photobooth-data/script/ \
pi@<IP_DU_PI>:/home/pi/photobooth-data/script/
# Config photobooth-app (actions, frames configurées)
# photobooth-app stocke tout dans ~/photobooth-data/ (WorkingDirectory du service)
rsync -av /mnt/old-sd/home/pi/photobooth-data/ \
pi@<IP_DU_PI>:/home/pi/photobooth-data/
# â ïž AprĂšs cette copie, vĂ©rifier que plugin_commander.json pointe bien vers :8090 (pas :1880)
# Config JH Photomaton (settings.yaml + base SQLite)
rsync -av /mnt/old-sd/home/pi/jh-photomaton/config/settings.yaml \
pi@<IP_DU_PI>:/home/pi/jh-photomaton/config/
rsync -av /mnt/old-sd/home/pi/jh-photomaton/data/ \
pi@<IP_DU_PI>:/home/pi/jh-photomaton/data/
Ătape 13 â VĂ©rification finale
# Tous les services actifs ?
sudo systemctl status photobooth-app jh-photomaton cups
# Logs JH Photomaton
sudo journalctl -u jh-photomaton -f
# Tests API rapides
curl http://localhost:8090/api/event # événement en cours
curl http://localhost:8090/api/system/stats # CPU/RAM/temp
# Test LED
curl -X POST "http://localhost:8090/api/leds/play?effect=capture"
# Test webhook photobooth (simule une photo prise)
curl "http://localhost:8090/api/webhook/photobooth?event_key=capture"
curl "http://localhost:8090/api/webhook/photobooth?event_key=finished"
# Imprimantes disponibles
lpstat -p
Interface admin : http://<IP>:8090/admin
Résumé des ports
| Service | Port | AccĂšs |
|---|---|---|
| JH Photomaton (admin) | 8090 | http://admin.lessapinsduweb.com ou http://<IP>:8090/admin |
| photobooth-app (kiosque) | 8000 | http://photomaton.lessapinsduweb.com |
| CUPS (imprimantes) | 631 | http://<IP>:631 (réseau local uniquement) |
| Zoraxy (proxy admin) | 8888 | http://192.168.230.1:8888 |
| WiFi hotspot | â | SSID Photomaton-LSDW â IP Pi : 192.168.230.1 |
Points d'attention post-installation
- plugin_commander.json â vĂ©rifier que la URL pointe vers
:8090(pas l'ancien Node-RED:1880) - share_command dans photobooth-app â mĂȘme chose, changer
:1880â:8090/api/print/request - Nom des imprimantes CUPS â doit correspondre exactement Ă ce qui est dans
settings.yaml - GPIO18 / audio â
dtparam=audio=offdans/boot/firmware/config.txtest obligatoire pour les LEDs - Couleur du flash â le rĂ©glage warm white
[255, 200, 80]est danssettings.yamlâ ajustable depuis l'admin dans RĂ©glages â Flash photo - Zoraxy catch-all â ne pas oublier la rĂšgle
*â redirectphotomaton.lessapinsduweb.com, c'est elle qui fait le portail captif - DAEMON_CONF hostapd â sans cette ligne dans
/etc/default/hostapd, hostapd démarre mais ignore la config (SSID invisible)
CI/CD (déploiement automatique depuis Gitea)
Voir docs/CI-CD-SETUP.md pour la configuration complĂšte du pipeline Gitea Actions.
En résumé :
# Sur le Pi â gĂ©nĂ©rer la clĂ© SSH pour le CI
ssh-keygen -t ed25519 -C "gitea-cicd" -f ~/.ssh/gitea_deploy -N ""
cat ~/.ssh/gitea_deploy.pub >> ~/.ssh/authorized_keys
# Installer la rĂšgle sudoers
sudo cp /home/pi/jh-photomaton/scripts/sudoers-jh-photomaton /etc/sudoers.d/jh-photomaton
sudo chmod 440 /etc/sudoers.d/jh-photomaton
Puis dans Gitea â Settings â Secrets : ajouter PI_SSH_HOST, PI_SSH_USER, PI_SSH_KEY.