Eine vollständige Verwaltungssoftware für Angelvereine mit Mitgliederverwaltung, Fischverwaltung, Import/Export und rollenbasiertem Benutzersystem.
- 👥 Mitgliederverwaltung – Flexible Spalten, vollständig konfigurierbar via
config.json - 📊 Dashboard – Übersicht mit Mitgliederstatistiken und aktuellem Fisch des Jahres
- 🐟 Fischverwaltung – Fisch des Jahres (Jugend & Erwachsene) mit automatischer 3-Jahres-Sperre
- 📥 Import – PDF (mit OCR) und Excel-Dateien importieren inkl. Reconciliation/Merge
- 📤 Export – Anpassbare PDF-Templates mit Deckblatt, Filterinfo und Datum/Anzahl-Kopfzeile
- 🔐 Rollenbasiertes Rechtesystem – admin / editor / viewer mit feingranularer API-Absicherung
- 👤 Benutzerverwaltung – Benutzer anlegen, Rollen vergeben, löschen (Admin-Panel)
- 📱 Mobil-optimiert – Responsives UI mit React & Tailwind CSS
- 🐳 Docker-ready – Produktionsbereit mit Dockerfile & Docker Compose
- ⚙️ Konfigurierbar – Alle Spalten, Feldtypen, Export-Vorlagen und Einstellungen in
config.json
| Component | Technologie |
|---|---|
| Frontend | React 18 + Vite 5 + Tailwind CSS 3 |
| Backend | Node.js 20+ + Express 4 |
| Datenbank | SQLite (better-sqlite3) |
| Auth | bcrypt + express-session |
| PDFKit (Export), pdf-parse (Import/OCR) | |
| Excel | xlsx (SheetJS) |
| Tests | Jest + Supertest |
| Deployment | Docker + Docker Compose |
- Node.js 20+
- npm
# Repository klonen
git clone https://github.com/deinusername/angelverein-app.git
cd angelverein-app/angelverein-app
# Abhängigkeiten installieren (Backend + Frontend)
npm install
# config.json anpassen (Vereinsname, Spalten, Export-Vorlagen)
nano config.json
# Entwicklungsserver starten (Frontend :5173 + Backend :3500 parallel)
npm run devOder in getrennten Terminals:
# Terminal 1: Backend (Port 3500)
npm run server
# Terminal 2: Frontend (Port 5173)
npm run clientZugriff: http://localhost:5173
- Browser öffnen → http://localhost:5173
- Beim ersten Start erscheint das Setup-Formular
- Admin-Benutzername und Passwort vergeben
- Anmelden – die App ist einsatzbereit
cd angelverein-app
# config.json anpassen (Vereinsname, Spalten, etc.)
nano config.json
# Services starten
docker compose up -d
# Logs prüfen
docker compose logs -fURL: http://localhost:3500 (direkt oder via Reverse Proxy/Tunnel)
In .env oder im docker-compose.yml setzen:
NODE_ENV=production
PORT=3500
TRUST_PROXY=true # hinter Nginx/Caddy/Traefik
SESSION_SECRET=... # optional, wird auto-generiert
SECURE_COOKIE=true # für HTTPS-ProduktivbetriebDocker Compose verwendet zwei Volumes, die auch nach docker compose down erhalten bleiben:
angelverein-data– SQLite-Datenbanken, Session-Secretangelverein-uploads– hochgeladene Dateien
| Rolle | Rechte |
|---|---|
| admin | Vollzugriff: Benutzerverwaltung, Import, Export-Vorlagen, Fischverwaltung |
| editor | Mitglieder anlegen / bearbeiten / löschen, Dashboard, Export |
| viewer | Nur lesen: Mitgliederliste, Dashboard, Export-Ansicht |
Die config.json steuert das gesamte Verhalten der App:
{
"vereinsname": "Angelverein e.V.",
"port": 3500,
"spalten": [
{ "key": "nr", "label": "Nr.", "type": "text", "required": false },
{ "key": "j/e", "label": "J/E", "type": "text", "required": true },
{ "key": "vorname", "label": "Vorname", "type": "text", "required": true },
{ "key": "nachname", "label": "Nachname", "type": "text", "required": true },
{ "key": "geburtsdatum", "label": "Geburtsdatum", "type": "date", "required": false },
{ "key": "adresse", "label": "Adresse", "type": "text", "required": false },
{ "key": "alter", "label": "Alter", "type": "text", "required": false, "readonly": true },
{ "key": "telefon", "label": "Telefon", "type": "text", "required": false },
{ "key": "email", "label": "E-Mail", "type": "email", "required": false },
{ "key": "av", "label": "AV", "type": "date", "required": false },
{ "key": "mitgliedsdauer", "label": "Mitgliedsdauer", "type": "text", "required": false, "readonly": true },
{ "key": "dav", "label": "DAV", "type": "date", "required": false},
{ "key": "sonstiges", "label": "Sonstiges", "type": "Text", "required": false}
],
"terminplan": {
"regeln": "Hier die Wettkampfregeln eintragen.",
"punkteverteilung": "4 Punkte (1.) | 3 Punkte (2.) | 2 Punkte (3.) | 1 Punkt (4.)",
"vorstand": [
{
"rolle": "1. Vorsitzender",
"name": "Max Mustermann",
"adresse": "Musterstraße 1, 12345 Musterstadt",
"telefon": "01234 / 567890",
"email": "max@beispiel.de"
}
],
"bankdaten": {
"name": "Angelverein Muster e.V.",
"iban": "DE00000000000000000000",
"bic": "BEISPIELXXX"
}
},
"exportVorlagen": [
{
"name": "Verbandsmeldung",
"ueberschrift": "Mitgliedermeldung an den Verband",
"felder": ["vorname", "nachname", "adresse"],
"filter": { "sonstiges": "A" },
"zeigeAnzahl": true,
"zeigeDatum": true
},| Typ | Beschreibung |
|---|---|
text |
Freitextfeld |
date |
Datumsfeld (YYYY-MM-DD) |
email |
E-Mail mit Validierung |
boolean |
Ja/Nein Checkbox |
select |
Dropdown mit vordefinierten Optionen |
- Passwörter werden mit bcrypt gehasht (10 Salt-Runden)
- Session-Secrets werden sicher im
data/-Verzeichnis gespeichert und nicht ins Repository commitet - Alle API-Routen sind durch
requireAuthgeschützt, sensible Routen zusätzlich durchrequireRole - CORS ist konfigurierbar
MIT License – siehe LICENSE
Fragen oder Fehler? Erstelle ein GitHub Issue.
🔒 Datenschutz & DSGVO-Hinweise Diese Software speichert personenbezogene Daten (Mitgliederdaten). Der Betreiber ist gemäß DSGVO Art. 4 Nr. 7 selbst verantwortlich für den datenschutzkonformen Betrieb. Pflichten des Betreibers HTTPS ist zwingend erforderlich. Ohne verschlüsselte Verbindung dürfen keine personenbezogenen Daten übertragen werden. Empfohlene Lösungen:
Caddy – automatisches Let's Encrypt, minimale Konfiguration Nginx + Certbot Cloudflare Tunnel
Weitere Betreiberpflichten:
Verarbeitungsverzeichnis nach Art. 30 DSGVO führen Auftragsverarbeitungsvertrag (AVV) mit dem Hoster abschließen Regelmäßige Backups der Datenbank (data/-Verzeichnis) Zugriff auf den Server auf autorisierte Personen beschränken
Haftungsausschluss Diese Software wird unter der MIT-Lizenz bereitgestellt. Der Entwickler übernimmt keine Haftung für datenschutzrechtliche Verstöße die durch unsachgemäßen Betrieb entstehen.
Tight Lines! 🎣
