first commit
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

This commit is contained in:
2026-07-16 00:55:29 +02:00
commit 209f81aa3d
100 changed files with 17682 additions and 0 deletions
+222
View File
@@ -0,0 +1,222 @@
# Photomaton - Architecture du projet
Association: Les Sapins Du Web (LSDW)
Events: Hop'N Bloc, anniversaires, etc.
## Hardware
| Composant | Modele | Notes |
|-----------|--------|-------|
| SBC | Raspberry Pi 4 (2 Go RAM) | Contrainte memoire forte |
| Camera | Camera Module 3 officielle | Backend picamera2, ratio 3:2 natif |
| Ecran | HDMI (moniteur/TV) | Interface photobooth-app + Chromium kiosk |
| Bouton | Bouton lumineux 12V + relay | GPIO23 (input) + GPIO12 (relay ON/OFF) |
| LED Strip | NeoPixels 35 LEDs | GPIO18, feedback visuel pendant capture |
| Imprimante 1 | Canon Selphy CP1300 (blanche) | USB, CUPS: Canon_SELPHY_CP1300_usb_blanche |
| Imprimante 2 | Canon Selphy CP1300 (noire) | USB, CUPS: Canon_SELPHY_CP1300_usb_noire |
| WiFi | RaspAP (hotspot dedie) | Pour distribution photos via QR code |
## Software Stack
```
+----------------------------------------------------------+
| Navigateur Web |
| (Chromium kiosk mode, ecran HDMI) |
+----------------------------------------------------------+
| |
| photobooth-app (:8083) Node-RED (:1880) |
| - Capture camera - Bouton GPIO23 (multi-clic) |
| - Post-traitement - Relay bouton GPIO12 |
| - Galerie + QR share - NeoPixels GPIO18 |
| - Interface utilisateur - Dashboard admin impression |
| - File attente SQLite |
| - Gestion CUPS (enable/ |
| disable, cancel jobs) |
+----------------------------------------------------------+
| Zoraxy (reverse proxy + TLS :443) |
+----------------------------------------------------------+
| CUPS + Gutenprint | RaspAP (hotspot WiFi) |
| (impression Selphy x2) | (reseau dedie QR code) |
+----------------------------------------------------------+
| Raspberry Pi OS (Trixie) |
+----------------------------------------------------------+
```
## Flux utilisateur (prise de photo)
```
Bouton physique (GPIO23)
|
v
Node-RED (button-events: clic/double/triple/quadruple)
|
+--> Desactive relay bouton (GPIO12 = OFF)
+--> NeoPixels: vert (countdown)
+--> Appel API photobooth-app: GET /api/actions/image/{N}
|
v
photobooth-app
1. Countdown (5s) affiche sur ecran
2. NeoPixels: blanc (flash) <-- via webhook -> Node-RED
3. Capture Camera Module 3 (picamera2)
4. NeoPixels: violet (captured)
5. Post-traitement (cadre, remove_background si active)
6. Photo ajoutee a la galerie
7. NeoPixels: bleu (finished) puis vert apres 2s
8. Reactive relay bouton (GPIO12 = ON)
9. QR code affiche pour telecharger via WiFi
```
## Flux impression
```
Utilisateur: clic "Demander l'impression" dans galerie photobooth-app
|
v
photobooth-app: share_command = curl Node-RED /api/photobooth-custom/ask_print
|
v
Node-RED:
1. Recupere l'UID de la photo via API photobooth /api/mediacollection
2. Insere dans SQLite (photo-to-print.sqlite)
3. Affiche dans le dashboard admin (/dashboard)
|
v
Admin (sur telephone via WiFi):
- Voit la demande dans le tableau avec preview
- Clic "OK" = lance impression via script_print.sh (crop 3:2 + lp)
- Clic "x" = annule la demande
- Peut aussi cancel/clear les jobs CUPS, enable/disable imprimantes
```
## GPIO
| GPIO | Pin physique | Fonction | Controle par |
|------|-------------|----------|--------------|
| 12 | 32 | Relay bouton 12V (output) | Node-RED |
| 17 | 11 | Shutdown (hold 2s) | photobooth-app |
| 18 | 12 | NeoPixels 35 LEDs (output) | Node-RED (rpi-neopixels) |
| 20 | 38 | Job abort | photobooth-app |
| 22 | 15 | Job reject / Collage GPIO | photobooth-app |
| 23 | 16 | Bouton physique (input, pull-up) | Node-RED (button-events) |
| 27 | 13 | Job next | photobooth-app |
## Modes photo (bouton multi-clic)
| Clics | Mode | Action photobooth-app | remove_background |
|-------|------|----------------------|-------------------|
| 1 | HnB normal | /api/actions/image/0 | Non |
| 2 | HnB etoile | /api/actions/image/1 | Oui |
| 3 | HnB cailloux | /api/actions/image/2 | Oui |
| 4 | HnB light | /api/actions/image/3 | Oui |
| Long press | Demande impression | /api/share/actions/latest/0 | - |
## Ports reseau
| Service | Port | Process | Notes |
|---------|------|---------|-------|
| SSH | 22 | sshd | Acces distant |
| DNS | 53 | dnsmasq | RaspAP, resolution domaines locaux |
| HTTP | 80 | zoraxy | Redirect -> HTTPS |
| HTTPS | 443 | zoraxy | Reverse proxy principal |
| CUPS | 631 | cupsd | Administration imprimantes |
| Node-RED | 1880 | node-red | Dashboard admin + GPIO + NeoPixels |
| Zoraxy admin | 5487 | zoraxy | Panel admin (localhost only) |
| Zoraxy admin | 8001 | zoraxy | Panel admin (expose via sous-domaine) |
| RaspAP API | 8081 | uvicorn/python3 | API backend RaspAP (/etc/raspap/api/) |
| RaspAP | 8082 | lighttpd | Interface admin WiFi |
| photobooth-app | 8083 | python | Interface web principale |
| ~~rpcbind~~ | ~~111~~ | ~~rpcbind~~ | **INUTILE - a desactiver** |
## Domaines (Zoraxy reverse proxy)
| Sous-domaine | Upstream | Service |
|-------------|----------|---------|
| `photomaton.lessapinsduweb.com` | 127.0.0.1:8083 | photobooth-app (WebSocket ON) |
| `photomaton-nodered.lessapinsduweb.com` | 127.0.0.1:1880 | Node-RED dashboard |
| `photomaton-raspap.lessapinsduweb.com` | 127.0.0.1:8082 | RaspAP admin |
| `photomaton-zoraxy.lessapinsduweb.com` | 127.0.0.1:8001 | Zoraxy admin |
- Certificats TLS geres par Zoraxy
- QR share: `https://photomaton.lessapinsduweb.com/sharepage/#?url=...`
- Chaque service gere sa propre authentification
## Reseau WiFi (RaspAP)
| Element | Valeur |
|---------|--------|
| Interface | wlan0 |
| IP du Pi | 10.3.141.1 |
| Plage DHCP | 10.3.141.50 - 10.3.141.254 (~200 clients) |
| Masque | 255.255.255.0 |
| Bail DHCP | 12h |
| DNS | dnsmasq sur le Pi (port 53) |
| Internet | AUCUN (captive portal) |
### Resolution DNS (dnsmasq)
```
# /etc/dnsmasq.d/090_custom_local_hotspot.conf
address=/lessapinsduweb.com/10.3.141.1 # *.lessapinsduweb.com -> Pi
address=/photomaton.lessapinsduweb.com/10.3.141.1 # explicite
address=/#/127.0.0.1 # tout le reste -> null (pas d'internet)
```
Flux QR code :
1. Telephone se connecte au WiFi "Photomaton"
2. Recoit IP en 10.3.141.x via DHCP, DNS = 10.3.141.1
3. Scan QR code -> `https://photomaton.lessapinsduweb.com/sharepage/...`
4. dnsmasq resout vers 10.3.141.1 (le Pi)
5. Zoraxy (:443) sert la page via HTTPS
6. photobooth-app (:8083) fournit la photo
## Fichiers sur le Pi
```
/home/pi/
photobooth-data/
media/
processed_full/ # Photos traitees (pleine resolution)
script/
script_print.sh # Script d'impression avec load-balancing
log/ # Logs quotidiens
photo-to-print.sqlite # File d'attente d'impression (Node-RED)
userdata/
hopnbloc/
frames/ # Cadres PNG 2000x1333 (ratio 3:2)
backgrounds/ # Fonds pour remove_background
LSDW/
lulu-versaire2.png # Cadre anniversaire
logo/logo.jpeg # Logo LSDW
demoassets/
backgrounds/ # Fonds demo (etoiles, etc.)
frames/ # Cadres demo
```
## Fichiers du projet (ce repo)
```
photomaton/
scripts/
optimize-system.sh # Optimisation OS pour 2Go RAM
setup-printer.sh # Configuration CUPS + Selphy CP1300
setup-photobooth.sh # Installation complete
script_print.sh # Script d'impression optimise
health-check.sh # Surveillance sante du systeme
maintenance.sh # Nettoyage automatique quotidien
config/
photobooth-config-backup.json # Config originale (sauvegarde)
photobooth-config-optimized.json # Config optimisee
gpio-notes.conf # Documentation GPIO
zoraxy-notes.conf # Notes Zoraxy
nodered-flows-backup.json # Backup flows Node-RED
systemd/
photobooth-app.service # Service robuste avec auto-restart
photobooth-watchdog.service # Health check
photobooth-watchdog.timer # Toutes les 2 minutes
photobooth-maintenance.service # Nettoyage
photobooth-maintenance.timer # Quotidien a 4h
docs/
ARCHITECTURE.md # Ce fichier
ANALYSE-CONFIG.md # Analyse detaillee des problemes
```