Commit Graph

52 Commits

Author SHA1 Message Date
steve 0c4d3ab15d perf: add DB indexes and cap guest queries at 100 rows
- Add idx_guests_id and idx_guests_email indexes in init_db()
- Cap all SELECT queries on the guests table to LIMIT 100 to prevent
  unbounded memory growth as the guestbook accumulates entries
2026-03-09 20:17:34 -06:00
steve 3e17574fe6 fix: upgrade to Flask 3.x and replace before_first_request
- Pin Flask to >=3.1.3 to resolve all outstanding Dependabot CVEs
  (session cookie Vary header, Werkzeug DoS/RCE/safe_join vulns)
- Replace removed @before_first_request decorator with app.app_context()
  call at module level, compatible with Flask 3.0+
2026-03-09 20:15:14 -06:00
steve 0c8491ce7a feat: run container as non-root user
Create appuser with configurable UID/GID (default 1000, matching
example.env PID/GID vars) and switch to it before starting Gunicorn.
Override at build time with --build-arg UID=... --build-arg GID=...

Note: the /data volume mount must be owned by the matching UID on the
host for the DB to remain writable.
2026-03-09 20:13:21 -06:00
steve 1a0a1371bc fix: correct marquee scroll speed and add code TODOs
- Fixed scrolling marquee to use a fixed px/s speed via JS instead of
  a fixed duration, preventing it from speeding up as entries are added
- Added inline TODO comments throughout codebase to track known issues
  (rate limiting, CSRF, unbounded queries, deprecated Flask decorator,
  PII logging, schema versioning, Docker non-root user, etc.)
- Added todo-to-issue GitHub Action to auto-create Issues from TODOs on push to main
- Added .claude/ to .gitignore
2026-03-09 19:30:13 -06:00
steve d260bc6f9f docs: remove outdated project structure section from README 2025-04-04 18:48:20 -06:00
steve 412d373421 docs: add Portainer setup instructions to README 2025-04-04 16:28:34 -06:00
steve bae3ddda32 - 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
1.1.0
2025-04-04 15:36:12 -06:00
steve 85a0096846 fix: move index.html template to correct Flask templates directory 2025-04-04 15:04:46 -06:00
steve d76a95e57b chore: move entrypoint.sh to project root 2025-04-04 14:59:05 -06:00
steve 91d4715e19 fix: correct DATABASE_PATH in example.env 2025-04-04 14:55:38 -06:00
steve ffa09e3daa Making the header/title are a variable
Refactor Dockerfile and entrypoint script; add index.html.template and update example.env
2025-04-04 14:46:29 -06:00
steve dfb350f8a8 chore: remove dev Dockerfile and add example docker-compose 2025-04-04 14:28:26 -06:00
steve ff175edcf6 chore: remove committed docker-compose.yml
Cleaning up files so it's easier to deploy. Look for example.docker-compose.yml instead
2025-04-04 14:20:04 -06:00
Steve Dogiakos 2bbe30e1e0 ci: add Docker Hub push step to workflow 2025-04-04 14:07:11 -06:00
steve af3ad37b4c chore: remove committed .env file
Just making the example.env available to the public.
2025-04-04 13:51:14 -06:00
Steve Dogiakos bc9fe0909e Created example.env so I don't have to keep messing
with my setup.
2025-04-04 13:50:13 -06:00
steve c04ffaf16d chore: add MIT license
Adding the MIT license to the project
2025-04-02 19:47:44 -06:00
steve 5091518bd2 ci: update Docker image workflow
changed secrete to vars for DOCKER_USERNAME
2025-04-02 19:36:36 -06:00
steve caf6f9e970 docs: update README
Added section about API use
2025-04-02 19:28:21 -06:00
steve 20dd611b70 ci: add Docker build GitHub Actions workflow
Added Docker secrets so hopefully it will run now.
2025-04-02 18:16:53 -06:00
Steve Dogiakos ada25eba70 fix: remove duplicate email field introduced in previous commit 2025-04-02 15:48:56 -06:00
Steve Dogiakos f34c163a76 Add API to app.py so I can use n8n to export the entries.
Added opt-out newsletter checkbox and the appropriate places to insert it to the db.
2025-04-02 15:31:33 -06:00
Steve Dogiakos cfcd301eb0 ci: remove Docker Hub push workflow 2025-04-02 09:44:59 -06:00
Steve Dogiakos 86529e0728 Rename production.Dockerfile to development.Dockerfile.
It was a late night, ok? Updated README.md to include removal of DB from repo.
2025-04-02 09:29:25 -06:00
steve dba4c21a5e ci: add Docker image build workflow 2025-04-02 08:38:24 -06:00
steve 1cb9dae204 chore: remove committed database file
Remove guestbook.db from repository

- Deleted guestbook.db, a binary SQLite database file, from the repo.
- Added guestbook.db to .gitignore to prevent storing environment-specific binaries.
- This change enhances security and keeps the repository clean by not tracking generated files.
1.0.0
2025-04-02 08:05:08 -06:00
Steve Dogiakos f528ef6f38 docs: add screenshot to README and update .gitignore 2025-04-02 08:02:47 -06:00
Steve Dogiakos c8c9d5ecd6 fix: update guestbook_export.py export logic 2025-04-01 22:17:18 -06:00
Steve Dogiakos d126d18fe9 chore: add Python-focused .gitignore 2025-04-01 22:12:24 -06:00
Steve Dogiakos 5f5dd41586 docs: update project structure section in README 2025-04-01 22:09:54 -06:00
Steve Dogiakos fdc4d098cc docs: revise README to reflect current project state 2025-04-01 22:04:35 -06:00
Steve Dogiakos 75e69d5144 chore: lint and update docker-compose.yml
- Fixed port variable interpolation to use ${PORT:-8000} for a default value.
- Updated volume configuration to use a named volume (guestbook_data) mounted at /data.
- Improved YAML formatting for clarity.
2025-04-01 21:53:25 -06:00
Steve Dogiakos 81bf13001a feat: add logo to page header 2025-04-01 21:00:24 -06:00
Steve Dogiakos 2cfe3f59fe chore(deps): bump Werkzeug to 3.0.6 2025-04-01 19:56:39 -06:00
steve 5b5b80a5ef chore(deps): merge Dependabot Flask 2.2.5 bump
Bump flask from 2.1.1 to 2.2.5
2025-04-01 19:53:33 -06:00
dependabot[bot] e5cf293adc chore(deps): bump Flask from 2.1.1 to 2.2.5
Bumps [flask](https://github.com/pallets/flask) from 2.1.1 to 2.2.5.
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/2.1.1...2.2.5)

---
updated-dependencies:
- dependency-name: flask
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-02 01:46:15 +00:00
Steve Dogiakos 6b26e22709 feat: reveal comment field dynamically after required fields are filled
- Hide comment field by default.
- Add JavaScript to reveal comment field when first name, last name, and location have at least 3 characters.
- Update form instructions to inform users about the comment field.
2025-04-01 19:19:28 -06:00
Steve Dogiakos 62a3bdd222 feat: add MailChimp export script 2025-04-01 18:48:04 -06:00
Steve Dogiakos cb9fdc6b79 feat: make email optional and add form instructions
- Display brief instructions above the guestbook form.
- Update validation: require first name, last name, and location; make email optional.
- Remove the 'required' attribute from the email input field.
- Provide context in the UI so users understand why email is optional.
2025-04-01 18:38:39 -06:00
Steve Dogiakos f676e4d6ad feat: add scrolling marquee to display recent guests
- Update index.html to include a fixed, horizontally scrolling marquee at the bottom.
- Use CSS keyframes to animate guest entries, showing first name and location.
- Enhance user interface by providing a dynamic display of entries.
2025-04-01 18:33:06 -06:00
Steve Dogiakos 1175fe2236 feat: add basic application logging
- Configure Python logging at INFO level.
- Log key events: database initialization, incoming requests, validation errors, and successful guest submissions.
- Log the number of guest entries displayed when rendering the page.

This improves observability and helps with troubleshooting.
2025-04-01 18:06:10 -06:00
Steve Dogiakos 3b28b22627 feat: add server-side input validation
- Validate that first_name, last_name, email, and location are provided
- Add regex-based email format validation in app.py
- Display error messages on the guestbook form if validation fails

These changes help ensure that only properly formatted data is stored.
2025-04-01 18:01:58 -06:00
Steve Dogiakos 03d83606b7 feat: split name into first/last and simplify form fields 2025-04-01 17:40:08 -06:00
steve 79a28cfd8e chore: merge html-form branch 2025-04-01 17:28:27 -06:00
Steve Dogiakos bd86069d22 fix: pin Flask version in requirements.txt 2025-04-01 17:28:09 -06:00
steve 1e191e9bcb docs: update README for Flask branch 2025-04-01 17:19:43 -06:00
steve 4f48124bbf feat!: migrate from Node.js to Flask with SQLite 2025-04-01 16:55:34 -06:00
steve 6fbdd09087 fix: add express dependency to resolve missing module 2025-01-27 16:06:00 -07:00
steve 745c2940e3 docs: fix README formatting 2025-01-27 13:58:30 -07:00
steve 19dfb7cdfb chore: add public static folder 2025-01-27 13:47:35 -07:00