A small full-stack web app for a fictional 3D-printing service based in Bern. Customers submit print requests through a public landing page (in German); an admin dashboard lists, adds, edits, and deletes those submissions.
The whole thing runs as a single docker compose stack and is exposed to the
internet through a Cloudflare tunnel — no port forwarding, no public IP.
- Apache — serves the static site and reverse-proxies
/api/*to Node. Handles basic auth on/admin.htmland the admin API routes. - Node + Express — small JSON API for the contact form and admin CRUD.
- MariaDB — stores submissions.
- Cloudflared — outbound-only tunnel; nothing is exposed on the host.
.
├── docker-compose.yml # orchestrates all four services
├── .env # secrets (gitignored)
│
├── apache/
│ ├── Dockerfile # httpd image with mod_proxy + auth modules
│ ├── printly.conf # vhost: proxy /api, protect /admin
│ └── entrypoint.sh # generates .htpasswd from env on startup
│
├── api/
│ ├── Dockerfile # node:lts-alpine
│ ├── package.json # express + mysql2
│ └── server.js # REST endpoints (contact form + admin CRUD)
│
├── db/
│ └── init.sql # creates the `submissions` table on first run
│
└── html/
├── index.html # public landing page + contact form
└── admin.html # protected dashboard (list / add / edit / delete)