kiosk-guestbook/README.md
Steve Dogiakos df10a307f1 - make the newsletter checkbox generic
- Added LOGO_URL to `example.env` and index.html template
- Rewrote README.md to reflect current methods of installing and configuring
2025-04-04 15:36:12 -06:00

5.2 KiB
Raw Blame History

Museum Visitor Guestbook

A simple Flask-based guestbook application designed for an internal museum kiosk. This application collects visitor details (first name(s), last name, email, location, and an optional comment) while dynamically revealing the comment field only after the required fields are filled out with at least 3 characters each. The app includes basic input validation, profanity filtering using a custom banned words list, and logging for easier troubleshooting. It uses SQLite for data storage and is containerized with Docker and Docker Compose for easy deployment on an intranet.

Museum Visitor Guestbook Screenshot

Features

  • Dynamic Form Behavior: The comment field is hidden by default and only revealed when the first name, last name, and location fields each contain at least 3 characters.
  • Input Validation: Ensures required fields (first name, last name, and location) are filled and validates email format (if provided). Uses a profanity filter loaded from en.txt to prevent inappropriate language in comments.
  • Logging: Logs key events and validation errors for debugging and monitoring.
  • SQLite Database: Stores guest entries locally, with persistence ensured by mounting a Docker volume.
  • Containerized Deployment: Uses Docker and Docker Compose for a production-ready environment with Gunicorn as the WSGI server.
  • Configurable Template: The applications title and logo can be dynamically configured via environment variables without rebuilding the image.

Project Structure

kiosk-guestbook/
├── app.py                          # Main Flask application code
├── Dockerfile                      # Dockerfile for building the image
├── docker-compose.yml              # Docker Compose configuration (see deployment instructions below)
├── example.docker-compose.yml      # Example Docker Compose file for deployment
├── example.env                     # Example environment variable file
├── entrypoint.sh                   # Entrypoint script that processes templates and starts Gunicorn
├── en.txt                          # Profanity list file (one banned word per line)
├── README.md                       # Project documentation
├── requirements.txt                # Python dependencies (Flask, Gunicorn, etc.)
├── scripts/
│   └── guestbook_export.py         # Script to export guest entries to CSV (e.g., for Mailchimp)
├── static/
│   └── images/
│       └── logo.png                # Default logo for display in the application (configurable via env variable)
└── templates/
    └── index.html.template         # HTML template for the guestbook page (processed to index.html at runtime)

Getting Started

Prerequisites

  • Docker
  • Docker Compose
  • Optionally, Portainer for GUI-based container management

Running the Application

Before proceeding, youll need to have the example configuration files. These files—example.docker-compose.yml and example.env—are included in the repository. You can download them by cloning the entire repository:

git clone <https://github.com/tmdinosaurcenter/kiosk-guestbook.git>
cd kiosk-guestbook

If you dont wish to clone the entire repo, you can also download the two files individually from GitHub. Once you have them, follow the steps below.

Method 1: Using Docker on the CLI

  1. Copy Example Files: From the project root, copy the example files:
cp example.docker-compose.yml docker-compose.yml
cp example.env .env
  1. Edit the .env File (Optional):

Modify .env to customize settings such as SITE_TITLE, LOGO_URL, PORT, etc.

  1. Start the Application

Run the following command to pull (or use) the pre-built image and start the container:

docker-compose up -d

This command starts the container in detached mode, mounts the persistent volume for the SQLite database, and uses your environment variable settings.

  1. Access the Application:

Open your browser and navigate to http://<your-server-ip>:8000 (or the port specified in your .env file).

Method 2: Running in Portainer

Logging and Monitoring

  • The application uses Python's built-in logging module.
  • Key events, such as database initialization, form submissions, and validation errors, are logged.
  • View logs with:

docker-compose logs -f

API Access

Access the API endpoint to export guest entries by navigating to:

http://<your-server-ip>:8000/guests/api

This endpoint can be integrated with on-prem automation tools like n8n.

Additional Notes

  • Intranet-Only Deployment: This application is designed for internal use only and is not exposed to the public internet.

  • Database Persistence: The SQLite database is stored in a Docker volume (guestbook_data), ensuring that data persists even if containers are rebuilt.

  • Production Considerations: The app runs with Gunicorn as a production-ready WSGI server. Adjust worker counts and resource limits as needed based on your servers specifications.

License:

This project is licensed under the MIT License.