mirror of
https://github.com/MrUnknownDE/bierkasten-casino.git
synced 2026-04-24 16:43:45 +02:00
271 lines
6.2 KiB
Markdown
271 lines
6.2 KiB
Markdown
# Bierbaron Casino
|
||
|
||
Ein vollständiges Fun-Projekt bestehend aus:
|
||
|
||
- **Backend (Node.js / TypeScript / Express)**
|
||
- **Frontend (React + Vite)**
|
||
- **Reverse Proxy (NGINX)**
|
||
- **Datenbank (PostgreSQL)**
|
||
|
||
Das „Bierbaron Casino“ ist ein reines **Spaß-Casino ohne Echtgeld**.
|
||
Alle Einsätze und Gewinne basieren auf einer fiktiven Währung namens **„Bierkästen“**.
|
||
Es gibt **kein echtes Geld**, **keine Auszahlungen**, **kein Glücksspiel**, sondern ein reines Under-Engineering-Projekt für Lernzwecke, Discord-Login, Sessions, Slot-Mechanik und Frontend-Animationen.
|
||
|
||
---
|
||
|
||
## ✨ Features
|
||
|
||
### 🎰 Slot-Machine – „Book of Bier“
|
||
- 5 Walzen, 3 Reihen, 10 Gewinnlinien
|
||
- Scatter-Symbol (**BOOK**)
|
||
- Gewichtete Symbolverteilung
|
||
- Gewinnlinien-Berechnung identisch mit dem Backend
|
||
- Animiertes Rollen mit Soundeffekten
|
||
- Einzelne Walzen stoppen nacheinander
|
||
|
||
### 🔑 Discord OAuth Login
|
||
- Login via Discord OAuth 2.0
|
||
- Avatare + Userdaten werden übernommen
|
||
- Backend speichert Sessions (Express-Session + Secure-Cookie)
|
||
|
||
### 💼 Bierkasten-Wallet
|
||
- Stundenbasierter Claim (25 Bierkästen pro Stunde)
|
||
- Automatische Begrenzung offline gesammelter Stunden
|
||
- Transaktionshistorie
|
||
- Live-Kontostand
|
||
|
||
### 🏆 Leaderboards
|
||
- **Top Balance** (wer hat die meisten Bierkästen?)
|
||
- **Biggest Single Win** (größter Einzelgewinn aus allen Slot-Runden)
|
||
|
||
### 🔐 Reverse Proxy via NGINX
|
||
- Frontend + Backend sauber über eine einzige externe URL
|
||
- Session-Handling via Proxy
|
||
- WebSocket-Support für Vite HMR
|
||
|
||
---
|
||
|
||
## 🛠️ Tech Stack
|
||
|
||
| Komponente | Technologie |
|
||
|-----------|-------------|
|
||
| Frontend | React, TypeScript, Vite, CSS-in-JS |
|
||
| Backend | Node.js 22, TypeScript, Express, pg |
|
||
| Datenbank | PostgreSQL 16 |
|
||
| Proxy | NGINX (Routing für /auth, /api, /slot, /wallet, /me) |
|
||
| Auth | Discord OAuth2 |
|
||
| Sessions | express-session (Cookie-basiert) |
|
||
| Builds | Docker (+ separates Build/Runtime-Stage für Backend) |
|
||
| Dev-HMR | Vite WebSocket Support durch NGINX proxied |
|
||
|
||
---
|
||
|
||
## 📦 Ordnerstruktur
|
||
|
||
```
|
||
|
||
.
|
||
├── backend/ # Node.js + TypeScript Backend
|
||
│ ├── src/
|
||
│ ├── Dockerfile
|
||
│ └── tsconfig.json
|
||
│
|
||
├── frontend/ # React + Vite Frontend
|
||
│ ├── src/
|
||
│ ├── public/
|
||
│ ├── Dockerfile
|
||
│ └── vite.config.ts
|
||
│
|
||
├── nginx/
|
||
│ └── nginx.conf # Reverse Proxy
|
||
│
|
||
├── docker-compose.yml
|
||
├── .env.example
|
||
└── README.md
|
||
|
||
````
|
||
|
||
---
|
||
|
||
## 🚀 Lokale Entwicklung (mit Docker)
|
||
|
||
### 1. Repository klonen
|
||
|
||
```bash
|
||
git clone https://github.com/mrunknownde/bierbaron-casino.git
|
||
cd bierbaron-casino
|
||
````
|
||
|
||
### 2. `.env` erstellen
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
Trage dort deine Daten ein:
|
||
|
||
* Postgres-Login
|
||
* Discord Client ID & Secret
|
||
* Redirect URI (muss exakt im Discord Developer Dashboard hinterlegt sein)
|
||
* COOKIE_SECURE=false (für HTTP-Dev-Modus)
|
||
|
||
### 3. Stack starten
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Danach läuft:
|
||
|
||
* **Frontend:** [http://localhost](http://localhost)
|
||
* **Backend:** intern auf Port 3000 (durch NGINX erreichbar)
|
||
* **NGINX Reverse Proxy:** [http://localhost](http://localhost)
|
||
* **Postgres:** als Container `db`
|
||
|
||
### 4. Debugging
|
||
|
||
Logs ansehen:
|
||
|
||
```bash
|
||
docker compose logs -f backend
|
||
docker compose logs -f frontend
|
||
docker compose logs -f nginx
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 Discord OAuth einrichten
|
||
|
||
1. [https://discord.com/developers](https://discord.com/developers) → New Application
|
||
2. „OAuth2 → General → Redirects“
|
||
3. Folgende Redirect-URL eintragen (je nachdem, welchen Port du extern nutzt):
|
||
|
||
```
|
||
http://localhost/auth/discord/callback
|
||
```
|
||
|
||
4. Client ID & Secret kopieren
|
||
5. In `.env` einfügen:
|
||
|
||
```env
|
||
DISCORD_CLIENT_ID=
|
||
DISCORD_CLIENT_SECRET=
|
||
DISCORD_REDIRECT_URI=http://localhost/auth/discord/callback
|
||
```
|
||
|
||
---
|
||
|
||
## 📚 Datenbanktabellen (Kurzüberblick)
|
||
|
||
### `users`
|
||
|
||
| Spalte | Typ | Beschreibung |
|
||
| ------------ | ------ | --------------- |
|
||
| id | serial | interne User-ID |
|
||
| discord_id | text | Discord User-ID |
|
||
| discord_name | text | Anzeigename |
|
||
| avatar_url | text | Avatar-Bild |
|
||
|
||
### `wallets`
|
||
|
||
| Spalte | Typ | Beschreibung |
|
||
| ------------- | ----------- | ---------------------------- |
|
||
| user_id | int | FK users.id |
|
||
| balance | int | aktueller Kontostand |
|
||
| last_claim_at | timestamptz | Zeitpunkt des letzten Claims |
|
||
|
||
### `slot_rounds`
|
||
|
||
| Spalte | Typ |
|
||
| ---------- | ----- |
|
||
| user_id | int |
|
||
| bet_amount | int |
|
||
| win_amount | int |
|
||
| book_count | int |
|
||
| grid | jsonb |
|
||
|
||
### `wallet_transactions`
|
||
|
||
| Spalte | Typ |
|
||
| ------- | ---- |
|
||
| user_id | int |
|
||
| amount | int |
|
||
| reason | text |
|
||
|
||
---
|
||
|
||
## 🧪 Lokaler Dev-Modus (optional ohne Docker)
|
||
|
||
### Backend
|
||
|
||
```bash
|
||
cd backend
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
### Frontend
|
||
|
||
```bash
|
||
cd frontend
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
Dazu brauchst du dann:
|
||
|
||
* Postgres lokal
|
||
* Nginx lokal oder direkt API URLs ändern
|
||
|
||
---
|
||
|
||
## 🛡️ Sicherheit & Hinweise
|
||
|
||
* Dieses Projekt verwendet **keine Echtgeld-Transaktionen**.
|
||
* Die Slot-Mechanik dient als **reines Lernbeispiel** (Game-Loop, RNG, Paylines, Persistenz).
|
||
* Die Währung „Bierkästen“ ist **rein fiktiv**.
|
||
* Sessions werden in Cookies gespeichert – sichere Einstellungen (Secure, SameSite) sind in `.env` konfigurierbar.
|
||
* Für Produktionsbetrieb solltest du TLS via Traefik, Caddy oder NGINX-LetsEncrypt hinzufügen.
|
||
|
||
---
|
||
|
||
## 🚀 Deployment (Prod)
|
||
|
||
### Empfohlene Struktur
|
||
|
||
* Static Build für Frontend (kein Vite Dev-Server)
|
||
* NGINX dient sowohl als:
|
||
|
||
* Reverse Proxy
|
||
* Static File Server
|
||
* Backend in `NODE_ENV=production`
|
||
* COOKIE_SECURE=true
|
||
* HTTPS aktiviert
|
||
|
||
Ein mögliches Setup:
|
||
|
||
```
|
||
docker compose -f docker-compose.prod.yml up -d
|
||
```
|
||
|
||
---
|
||
|
||
## ❤️ Contributing
|
||
|
||
Pull Requests, Verbesserungen, Issues & Feature-Vorschläge sind jederzeit willkommen.
|
||
|
||
---
|
||
|
||
## 📄 Lizenz
|
||
|
||
Dieses Projekt steht unter einer freien Lizenz deiner Wahl (MIT empfohlen).
|
||
|
||
> Hinweis: Aufgrund der Slot-Mechanik solltest du klar kommunizieren, dass kein Echtgeld involviert ist, um Missverständnisse zu vermeiden.
|
||
|
||
---
|
||
|
||
## 🤝 Kontakt
|
||
|
||
Für Fragen, Ideen oder Austausch:
|
||
GitHub Issues oder Discord-Kontakt.
|