2.7 KiB
2.7 KiB
Theme Song Booth
Prototype web app for a convention booth where attendees request custom AI-generated theme songs.
Flow
- Customer fills out the public request form at
/request. - Operator generates a Suno Custom Mode prompt via Hermes and saves it in the admin detail page.
- Operator generates two song versions in Suno and uploads the MP3s in admin.
- Operator clicks Send Preview Link. Customer receives an email with a private player page.
- Customer listens to Version A and Version B, then approves one/both or requests changes.
- Operator sees the approval alert, collects payment via Square reader, then clicks Mark Paid & Deliver.
- Customer receives the approved MP3(s) as email attachments.
Local Development
cd /home/jess/workspace/theme-song-booth
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env
# Edit .env and set APP_SECRET_KEY, ADMIN_PASSWORD, SMTP_PASS, PUBLIC_BASE_URL
.venv/bin/python init_db.py
.venv/bin/python -m flask --app app run --host=0.0.0.0
Deployment with Portainer
The repo includes a docker-compose.yml that builds directly from GitLab, so Portainer can pull and deploy it as a stack.
- Log in to your Portainer instance.
- Go to Stacks → Add stack.
- Choose Repository and paste:
- URL:
https://gitlab.hallsworth.ca/yrtria/theme-song-booth.git - Branch:
main - Compose path:
docker-compose.yml
- URL:
- Add environment variables directly in Portainer under Environment variables:
APP_SECRET_KEY— long random stringADMIN_PASSWORD— password for/adminSMTP_PASS—b3ZzD@eM!MkqVS8PPUBLIC_BASE_URL— your HTTPS domainHOST_PORT— default127.0.0.1:8000BOOTH_NAME— optional
- Deploy the stack.
- Open a console into the
boothcontainer and run once:python init_db.py - Point your reverse proxy at the
HOST_PORTyou chose (e.g.http://host-ip:8000). - Print the booth QR code pointing to
https://your-domain/request.
Portainer Notes
- The
docker-compose.ymluses named volumes (booth-data,booth-uploads) so Portainer handles persistence automatically. - For a pre-built image instead of repo build, replace the
build:block with animage:line pointing to your registry. - Update the stack after each push to redeploy the latest code.
Files
app.py— Flask application with public/admin routes and email logic.models.py— SQLite schema and helper functions.config.py— Configuration loaded from environment.templates/— Jinja2 HTML templates.init_db.py— Standalone script to create the SQLite database.Dockerfile/docker-compose.yml— Container packaging for Portainer.