Files
photoBooth/Opencode/docs/GUIDE-INSTALLATION.md
T
admin 209f81aa3d
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled
first commit
2026-07-16 00:55:29 +02:00

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

  1. Prerequis
  2. Installation de l'OS
  3. Configuration initiale du Pi
  4. Installation de photobooth-app
  5. Installation de RaspAP (hotspot WiFi)
  6. Installation de Zoraxy (reverse proxy)
  7. Certificat TLS (Let's Encrypt + OVH)
  8. Configuration des imprimantes (CUPS + Selphy)
  9. Installation de Node-RED
  10. NeoPixels (WS2812)
  11. Configuration du mode kiosk (Chromium)
  12. Optimisation systeme
  13. Services systemd
  14. Verification finale
  15. 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

  1. Telecharger et installer Raspberry Pi Imager
  2. 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
  3. 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)
  4. Flasher la carte SD

Premier demarrage

  1. Inserer la carte SD, connecter l'ecran HDMI, le clavier, et le cable Ethernet
  2. Demarrer le Pi
  3. Attendre la fin du premier boot (peut prendre 2-3 minutes)
  4. 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'ecoute
  • Restart=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 avec python3 -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]
  • 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) :

  1. Aller dans TLS / SSL
  2. 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

Renouvellement

Le certificat expire tous les 90 jours. Pour renouveler :

  1. Connecter le Pi a internet via Ethernet
  2. Lancer : sudo certbot renew
  3. 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

  1. Brancher les 2 Canon Selphy CP1300 en USB
  2. Aller sur http://localhost:631 (ou https://photomaton-raspap.lessapinsduweb.com via WiFi)
  3. Administration > Add Printer
  4. Selectionner l'imprimante USB Canon
  5. Nommer :
    • Premiere (blanche) : Canon_SELPHY_CP1300_usb_blanche
    • Deuxieme (noire) : Canon_SELPHY_CP1300_usb_noire
  6. 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-dashboard ou @flowfuse/node-red-dashboard (Dashboard v2)
  • node-red-contrib-button-events (multi-clic bouton)

Importer les flows

  1. Dans Node-RED, menu hamburger > Import
  2. Coller le contenu du fichier de flows (backup dans config/nodered-flows-backup.json)
  3. 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 (pas chromium-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=120 laissent 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

  1. Connecter un telephone au WiFi "Photomaton"
  2. Appuyer sur le bouton physique (1 clic)
  3. Verifier le countdown sur l'ecran
  4. Verifier que la photo est prise et apparait dans la galerie
  5. Scanner le QR code avec le telephone
  6. Verifier que la photo se telecharge
  7. Cliquer "Demander l'impression" dans la galerie
  8. Sur le dashboard Node-RED (telephone) : valider l'impression
  9. 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.