Ein Resident Portal für eine Homeowners’ Association – in reinem PHP und SQLite
Nicht jedes Projekt benötigt ein JavaScript-Framework und eine verwaltete Datenbank. Dieses hier – ein privater Webkasten für die Mitglieder eines Wohnungseigentümervereins (ОСББ) in Kiew – ist absichtlich unter der Haube langweilig: PHP 8.3, das mit einer SQLite-Datei spricht, bereitgestellt von nginx + PHP-FPM. Kein Framework, kein Build-Schritt, kein MySQL. Es läuft unter osbb-wh.pp.ua.
Die interessante Einschränkung war nicht der Stack – es waren die Nutzer. Die Bewohner sind keine Entwickler; viele sind nicht jung. Alles musste offensichtlich, schnell auf einem günstigen Telefon und in ihrer Sprache sein.
Was es tut
- Geschlossener Zugang – die Bewohner melden sich mit ihrer Wohnung an, wobei neue Konten per E-Mail-Aktivierung eingerichtet werden.
- Bekanntmachungen, Dokumente und Protokolle – der Vorstand veröffentlicht, die Bewohner lesen, auf Ukrainisch und Russisch.
- Ein Fahrzeugregister mit OCR. Die Bewohner fügen ihre Autos mit einem Foto hinzu, und Tesseract liest das Kennzeichen vom Bild (mit ImageMagick Pre-Processing), sodass die Nummer ohne manuelle Eingabe erfasst wird.
- Tickets an den Vorstand – ein einfacher Support-Thread zwischen einem Bewohner und der Verwaltung.
- Umfragen mit einer strengen ein Wohnung, eine Stimme-Regel.
- Interne Nachrichten zwischen Bewohnern (mit Soft-Delete).
- Live-Widgets – Wetter und Luftqualität von Kiew, serverseitig abgerufen und gecached, sodass der Client niemals direkt einen Drittanbieter aufruft.
- Admin-Tools – CRUD für Bewohner, Rollenmanagement und Inhaltsmoderation.
Das Gebäude überwachen, sicher
Einer der interessantesten Teile ist der Kamera-Feed. Die Bewohner können die Eingangskameras und Hofkameras des Gebäudes aus ihrem Konto heraus ansehen – aber die Kameras selbst sind niemals dem Internet ausgesetzt.
Die Kameras sprechen RTSP, was Browser nicht abspielen können, und leben im privaten Netzwerk. Daher sitzt ein MediaMTX Media-Server davor: Er nimmt die RTSP-Feeds entgegen und republiziert sie als browserfreundliche, latenzarme Streams (HLS / WebRTC). Das Portalbettet diese hinter dem Login des Bewohners ein – der Browser spricht immer nur mit meinem Server, niemals mit einer Kamera.
Diese eine Indirektion bringt viel. Die Kameras behalten ihre Werksfirmware vom öffentlichen Internet fern (wo sie innerhalb weniger Stunden gefunden und brute-forced werden könnte), die schwere Arbeit des Transkodierens/Repackagings ist Aufgabe von MediaMTX und nicht von PHP, der Zugriff ist an dasselbe Kontosystem wie alles andere gebunden, und es gibt einen Ort, um ihn zu widerrufen. Ein ähnliches Server-Side-Proxy-plus-Cache-Muster wird für die Live-Wetter- und Luftqualitäts-Widgets von Kiew wiederverwendet, sodass der Client auch hier niemals direkt einen Drittanbieter aufruft.
Warum kein Framework
Für eine App dieser Größe hätte ein Framework mehr Konzepte hinzugefügt, als es entfernt hätte. Plain PHP + PDO über SQLite bedeutet: Eine Datei ist die gesamte Datenbank, Backups sind eine Kopie, Deployment ist git pull, und es gibt keinen Abhängigkeitsbaum, der gepatcht werden muss. Das UI stützt sich auf Bootstrap mit einem sauberen, Regierungsportal-Look (im Sinne von „Diia“ in der Ukraine), sodass es für Menschen, die staatliche E-Dienste nutzen, vertraut und glaubwürdig wirkt.
Die Lektion
Die schwierigsten Teile eines „einfachen“ internen Tools sind nie die Framework-Auswahlen – es sind die menschlichen: zweisprachiger Inhalt, zugängliche Formulare, der OCR-Schritt, der einen Aufwand eliminiert, und Zugriffsregeln, die ein nicht technischer Vorstand tatsächlich verwalten kann. Klein, robust und lesbar schlägt hier clever.
Transparenz: Die meisten Beiträge werden mit KI-Unterstützung verfasst, und die nicht-englischen Versionen werden von einem lokalen LLM maschinell übersetzt und anschließend geprüft. Fehler entdeckt? Bitte gib mir Bescheid.