# Beisel Rallye Graz 🍺 ## Projektübersicht Interaktive Website für eine Bier-Rallye durch 17 Grazer Bezirke. Teilnehmende tragen bei jedem besuchten Bezirk das entsprechende Beisel (Bierlokal) ein und verfolgen ihren Fortschritt. ### Konzept - **Ziel:** Alle 17 Grazer Bezirke besuchen - **Aktivität:** Für jeden Bezirk ein lokales Beisel finden und eintragen - **Zeitrahmen:** 24 Stunden Rallye - **Multi-User:** Mehrere Teilnehmer können parallel teilnehmen ## Technologie-Stack - **Backend:** Express.js (Node.js) - **Frontend:** EJS Templates + Vanilla JavaScript - **Datenbank:** SQLite (beisel_rally.db) - **Styling:** Custom CSS mit Wirtshaus-Theme - **Deployment:** Nginx Reverse Proxy auf `aufeins.click.jetzt` ## Architektur ``` beisel-rally/ ├── index.js # Express Server (Port 8083) ├── package.json # Dependencies & Scripts ├── beisel_rally.db # SQLite Datenbank ├── server.log # Laufzeit-Logs ├── PROJECT.md # Diese Dokumentation ├── public/ │ └── css/ │ └── style.css # Responsive Styling └── views/ └── index.ejs # Haupttemplate mit Client-Side Logic ``` ## Datenbank-Design ### Tabelle: `rally_logs` ```sql CREATE TABLE rally_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_name TEXT NOT NULL, district TEXT NOT NULL, beisel_name TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` **Zweck:** Server-seitige Speicherung aller Rallye-Einträge für persistente Multi-User-Fähigkeit. ## API-Endpunkte (geplant) ### Aktuelle Situation Derzeit wird **nur localStorage** im Browser genutzt. Die SQLite-Datenbank ist vorhanden, wird aber nicht integriert. ### Zu implementierende Endpunkte: - `POST /api/visit` - Neuen Bezirk besuchen - `GET /api/status/:username` - Fortschritt abrufen - `GET /api/all-users` - Alle Teilnehmer anzeigen - `DELETE /api/reset/:username` - Reset für User ## Deployment ### Nginx Konfiguration ```nginx server { listen 443 ssl; server_name aufeins.click.jetzt; ssl_certificate /etc/letsencrypt/live/aufeins.click.jetzt/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/aufeins.click.jetzt/privkey.pem; location / { proxy_pass http://192.168.0.187:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` ### Server Starten ```bash cd /home/claw/.openclaw/agents/wisp/workspace/beisel-rally node index.js # Server läuft auf http://localhost:8083 ``` ## Entwicklungs-Status ### ✅ Abgeschlossen - Grundlegende Frontend-Struktur - Responsive Design mit Mobile-Support - User-Auswahl und -Verwaltung (localStorage) - Fortschrittsanzeige - Wirtshaus-Theme Implementierung ### ❌ Offene Punkte 1. **SQLite-Integration** - API-Endpunkte für Datenbank-Zugriff 2. **Server-Datenpersistenz** - localStorage → Server-Side Storage 3. **Deployment** - Backend-Server auf 192.168.0.187:8083 starten 4. **Sicherheit** - Input Validation, Rate Limiting 5. **Export/Import** - Backup-Funktionalität ## Nächste Schritte ### Kurzfristig (Prio 1) - [ ] API-Endpunkte für SQLite-Datenbank implementieren - [ ] Client-Seite anpassen um API zu nutzen - [ ] Server starten und testen ### Mittelfristig (Prio 2) - [ ] Authentifizierung hinzufügen - [ ] Leaderboard implementieren - [ ] Export/Import Funktionalität ### Langfristig (Prio 3) - [ ] Mobile App (Progressive Web App) - [ ] Social Features (Teilen, Einladungen) - [ ] Anbindung an bestehende Beisel-Datenbank ## Kontakt & Credits Projekt erstellt von Gregor. Entwicklung durch Wisp (AI Coding Agent). **Domain:** aufeins.click.jetzt **Server:** 192.168.0.187:8083 **Gitea:** http://gitea.click.jetzt:3000/clawdia/beisel-rally --- *Prost! 🍻*