Digitale Visitenkarten (Businesscard)

Dieses Projekt stellt eine einfache Verwaltungsoberfläche für digitale Visitenkarten bereit. Jede Karte wird über eine UUID adressiert, die eindeutig einem Datensatz in der Datenbank zugeordnet ist. Besucher:innen rufen die Karte über card.php?uuid= auf, während Administrator:innen über das Passwort-geschützte Dashboard alle Identitäten, Feldwerte, Dateien und UUID-Token pflegen.

Architektur

  • PHP/Apache-Weboberfläche in www/ mit Frontend (card.php, download.php) und Backend (admin.php plus _sql.php, _func.php, _user.php).
  • MariaDB (Docker) hält Tabellen für Identitäten, Felder, UUIDs, Berechtigungen, Dateien und Loginversuche (db/init/001_schema.sql).
  • Docker Compose startet Webserver und Datenbank; www/ wird in den Apache-Container gemountet, www/_files/ spiegelt das Upload-Verzeichnis /var/www/html/_files/.
  • Uploadverzeichnis www/_files/ liegt außerhalb des Document Roots und ist als .gitkeep im Repository abgelegt, damit Hochladungen später von download.php referenziert werden.

Installation & erster Start

  1. Repository clonen.
  2. www/secret.php vom Beispiel kopieren (secret.php.example) und Datenbankzugang konfigurieren, damit _sql.php sich verbinden kann.
  3. mkdir -p www/_files (oder md www/_files unter Windows) ausführen und darauf achten, dass die .gitkeep-Datei vorhanden ist, damit der Ordner beim Containerstart genutzt wird.
  4. docker-compose up --build im Projektverzeichnis ausführen, um Apache und MariaDB zu starten.
  5. http://localhost/admin.php öffnen; die Standardanmeldedaten stehen in www/_user.php (admin / password) und sollten sofort geändert werden.

Admin-Oberfläche & Workflows

  • Login schützt das Dashboard; nach drei gescheiterten Versuchen wird eine IP für eine Stunde gesperrt (admin_login_attempts).
  • Das Dashboard zeigt alle Identitäten sowie UUID-Token. Neue Identitäten erstellt man über ?action=identity_create.
  • Jedes Identity kann beliebige Felder (identity_fields) enthalten. Der Typ kann single, multi, file oder url sein.
  • Dateien werden pro Identität über das neue Upload-Formular hinzugefügt und landen in www/_files/. Der Upload speichert Dateiname, generierten Zwischennamen und MIME-Type in files. Unter dem Formular zeigt das Admin-UI eine Liste der bereits hochgeladenen Dateien inkl. einer Löschoption.
  • Wenn ein Feld auf Typ file gesetzt ist, zeigt die Auswahl nur Uploads der aktuellen Identität (per files.identity_id). Die ausgewählte Datei-ID wird im Feldwert gespeichert, damit später nur diese Datei angezeigt oder heruntergeladen wird.
  • UUID-Token (access_tokens) verbinden eine Identität mit einer eindeutigen Zeichenfolge, können optional Auslaufdaten und Notizen erhalten und dürfen nur einmal existieren. Tokenrechte (token_permissions) bestimmen, welche Feldschlüssel Besucher:innen sehen.

Besucheransicht (Visitenkarte)

  • /card.php?uuid=<UUID> lädt nur die Felder, die das Token freigibt, sowie Dateien mit demselben Token oder ohne Tokenbindung.
  • Dateifelder erscheinen unterhalb der Felder als Downloadlinks, wenn der Token für die Datei berechtigt ist.
  • Das Frontend zeigt Meta-Informationen (Ablaufdatum, Notiz) sowie eine gekürzte UUID. Bestehende Admin-Sessions leiten zurück zum Dashboard, damit Redakteur:innen schnell bearbeiten können.

Datenbankstruktur im Überblick

Tabelle Zweck
identities Identitätsdatensätze mit Name und Timestamp.
identity_fields Key-Value-Felder (Text, mehrzeilig, Datei, URL) pro Identität.
access_tokens UUID-Token pro Identität mit Ablauf, Notiz und eindeutiger Zeichenfolge.
token_permissions Erlaubte Feldschlüssel pro Token.
files Hochgeladene Dateien mit identity_id, filename, stored_name, mime_type und optional token_id.
admin_login_attempts Brute-Force-Schutz mit Zählern und Sperrzeit pro IP.

Sicherheitshinweise

  • UUIDs sind einmalige Zugriffstoken und sollten nicht doppelt vergeben oder offen weitergegeben werden, wenn geschützte Daten hinterlegt sind.
  • Admin-Zugang: Bitte www/_user.php durch eigene Credentials ersetzen oder ein robusteres Auth-Verfahren implementieren.
  • Loginversuche werden nach drei Fehlversuchen eine Stunde gesperrt (registerFailedLogin, isIpLocked, clearLoginAttempts).
  • Datei-Uploads liegen im Verzeichnis www/_files/ (Container: /var/www/html/_files/) und dürfen ausschließlich über download.php mit gültigem Token ausgeliefert werden. Der Ordner sollte nicht direkt vom Webserver referenziert werden.

Weiterentwicklung & Pflege

  1. Stil & Branding: Die Inline-CSS im card.php-Head kann durch ein eigenes Template ersetzt oder ausgelagert werden.
  2. Dateien & Automatisierung: UUIDs und zugehörige Dateien lassen sich per API oder QR-Code verteilen. Die Download-Logik kann um Freigabezeitfenster erweitert werden.
  3. Tests & Validierung: Neue Felder brauchen eventuell Frontend-Validierung; Dateiuploads sollten auf MIME-Type, Größe und erlaubte Endungen geprüft werden.
  4. Deployment: Docker Compose genügt lokal. In Produktion empfiehlt sich ein Reverse Proxy, HTTPS und regelmäßige Backups des MariaDB-Volumes (db_data). Auch www/_files/ sollte gesichert werden, da dort alle Uploads gespeichert werden.

Hinweis: UUIDs repräsentieren digitale Visitenkarten und sind einmalig. Jeder Besuch über eine UUID dokumentiert genau eine Karte, deren Sichtbarkeit über Tokenrechte und Datei-Zuordnungen kontrolliert wird.

Description
No description provided
Readme 69 KiB
Languages
PHP 99.5%
Dockerfile 0.5%