Initial Camp Scan ticketing system

Backend (Fastify + TS): FluentForms webhook -> NocoDB row + QR + MailerSend
email; PIN auth; scan/lookup/redeem with per-code serialization; reusable QR
codes with count-based check-in; admin search.

App (Expo, one codebase): Android APK + iPhone PWA. Login, camera scanner
(native + web barcode-detector split), green/red overlay with sound + haptics,
admin lookup/redeem. Session token persisted per device.

Ops: multi-stage Dockerfile serving API + PWA same-origin, compose bound to
127.0.0.1; Forgejo Actions runner + tag-triggered signed APK build for Obtainium.
Docs in README.md and INSTALL.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hank 2026-07-08 03:47:59 +00:00
commit 3397e3e3ec
60 changed files with 14703 additions and 0 deletions

34
runner/docker-compose.yml Normal file
View file

@ -0,0 +1,34 @@
services:
runner:
image: code.forgejo.org/forgejo/runner:6.3.1
container_name: camptickets-runner
restart: unless-stopped
working_dir: /data
# Grant access to the host Docker socket group so the (uid 1000) runner can
# talk to the daemon. Set DOCKER_GID in runner/.env to your host's
# `stat -c %g /var/run/docker.sock` if it differs.
group_add:
- "${DOCKER_GID:-988}"
volumes:
- ./data:/data
# Runner spawns job containers via the host Docker daemon.
- /var/run/docker.sock:/var/run/docker.sock
env_file: .env
environment:
RUNNER_NAME: ${RUNNER_NAME:-camptickets-runner}
# Register on first boot (when no .runner config exists yet), then run the
# daemon. The `docker` label maps to the node:22-bookworm job image the
# build-apk workflow expects (it installs the Android SDK itself).
command:
- sh
- -c
- |
if [ ! -f /data/.runner ]; then
echo "Registering runner with git.mowden.top ..."
forgejo-runner register --no-interactive \
--instance https://git.mowden.top \
--token "${REGISTRATION_TOKEN}" \
--name "${RUNNER_NAME:-camptickets-runner}" \
--labels "docker:docker://node:22-bookworm"
fi
exec forgejo-runner daemon