Billetterie self-hosted pour le spectacle de fin d’année de l’école de danse Desha-Moulin, au Centre Culturel de Bergerac, salle en éventail, 754 places modélisées (rangées A→Y). Pas de SaaS, pas de commission : un Raspberry Pi 5, une base SQLite, et c’est tout. Développée comme un sous-projet de gotyeah-danse (/billetterie).
Principes métier verrouillés
- Pas de paiement en ligne, les familles paient au studio, l’admin marque « payé » à la main.
- Pas de choix du siège, les familles demandent N places et ne choisissent jamais leur siège.
- Anti-survente, une demande
pendingconsomme la jauge (un compteur, jamais des sièges précis) → la salle ne peut pas être survendue.
Placement et paiement
- Placement manuel et assisté, l’algo propose jusqu’à 3 suggestions, un humain valide toujours.
- Indépendance, on peut « placer maintenant, payer plus tard ».
- Règlement par versements, espèces / chèques échelonnés avec date de dépôt ; une demande est soldée quand le net atteint le dû, sinon c’est un acompte.
Billets et entrée
- Billets QR générés et scan à l’entrée via html5-qrcode.
- Emails via react-email + Brevo.
- Formulaire public protégé par Cloudflare Turnstile.
Stack Next.js 16 App Router + Prisma 6 / SQLite, en ligne sur billets.cours-danse-bergerac.fr (Docker sur le Pi 5 ARM64, derrière Cloudflare Access).
Self-hosted ticketing for the year-end show of the Desha-Moulin dance school, at the Centre Culturel de Bergerac, fan-shaped hall, 754 seats modelled (rows A→Y). No SaaS, no commission: a Raspberry Pi 5, a SQLite database, and that’s it. Built as a sub-project of gotyeah-danse (/billetterie).
Locked-in business rules
- No online payment, families pay at the studio, the admin marks “paid” by hand.
- No seat selection, families request N seats and never choose their seat.
- Oversell-proof, a
pendingrequest consumes the counter (a single counter, never specific seats) → the hall cannot be oversold.
Seating and payment
- Manual and assisted seating, the algorithm proposes up to 3 suggestions, a human always validates.
- Independence, you can “seat now, pay later”.
- Payment by instalments, cash / staggered cheques with deposit date; a request is settled when the net reaches the amount due, otherwise it’s a down payment.
Tickets and entry
- QR tickets generated and door scanning via html5-qrcode.
- Emails via react-email + Brevo.
- Public form protected by Cloudflare Turnstile.
Stack Next.js 16 App Router + Prisma 6 / SQLite, online at billets.cours-danse-bergerac.fr (Docker on the Pi 5 ARM64, behind Cloudflare Access).