Портал для мешканців товариства власників будинків — на чистому PHP та SQLite
Не кожен проєкт потребує фреймворку JavaScript та керованої бази даних. Цей —
приватний веб-шафка для членів ОСББ (об'єднання співвласників багатоквартирного будинку) у Києві — навмисно проста під капотом: PHP 8.3, що спілкується з файлом SQLite,
який обслуговується через nginx + PHP-FPM. Жодного фреймворку, жодних кроків збірки, жодного MySQL. Він працює за адресою
osbb-wh.pp.ua.
Цікавою вимогою був не стек технологій — а користувачі. Мешканці — не розробники; багатьом вже немолоді. Усе мало бути очевидним, швидким на дешевому телефоні та мовою їхнього розуміння.
Що він робить
- Закритий доступ — мешканці входять за обліковим записом, прив'язаним до їхньої квартири, з активацією електронної пошти для нових акаунтів.
- Оголошення, документи та протоколи зборів — правління публікує, мешканці читають, українською та російською мовами.
- Реєстр автомобілів з OCR. Мешканці додають свої авто з фотографією, і Tesseract зчитує номерний знак з зображення (після попередньої обробки за допомогою ImageMagick), щоб номер був захоплений без ручного введення.
- Заявки до правління — простий чат підтримки між мешканцем та керуючою компанією.
- Опитування зі строгим правилом одна квартира, один голос.
- Внутрішня пошта між мешканцями (з м'яким видаленням).
- Живі віджети — погода та якість повітря у Києві, отримані на стороні сервера та кешовані, щоб клієнт ніколи не звертався до сторонніх сервісів напряму.
- Адмінпанель — CRUD для мешканців, управління ролями та модерація контенту.
Спостереження за будинком, безпечно
Однією з найбільш цікавих частин є потік відео з камер. Мешканці можуть дивитися камери вхідної групи та подвір'я будинку зі свого облікового запису — але самі камери ніколи не виставляються в публічний інтернет.
Камери працюють за протоколом RTSP, який браузери відтворити не вміють, і живуть у приватній мережі. Тому перед ними стоїть медіасервер MediaMTX: він приймає RTSP потоки та перепублікує їх як зручні для браузера, низьколатентні стріми (HLS / WebRTC). Портал вбудовує ці стріми за логіном користувача — браузер завжди спілкується лише з моїм сервером, ніколи з камерою.
Ця одна проміжна ланка дає багато переваг. Камери зберігають свою заводську прошивку подалі від публічного інтернету (де її знайшли б і зламали протягом кількох годин), важка робота транскодування/репакування — це завдання MediaMTX, а не PHP, доступ прив'язаний до тієї ж системи облікових записів, що й у всьому іншому, і є лише одне місце для його відкликання. Подібний шаблон серверного проксі-плюс-кеш повторюється для живих віджетів погоди та якості повітря у Києві, тому клієнт також ніколи не звертається до сторонніх сервісів напряму.
Чому без фреймворку
Для такого розміру застосунку фреймворк додав би більше концепцій, ніж прибрав. Чистий PHP + PDO над SQLite означає: один файл — це вся база даних, резервні копії — це копія, деплоймент — це git pull, і немає дерева залежностей, яке потрібно патчити. Інтерфейс базується на Bootstrap зі стильним виглядом державного порталу (у дусі українського «Дія»), тому він здається знайомим та надійним людям, які користуються державними електронними послугами.
Урок
Найважчим у «простому» внутрішньому інструменті ніколи не є вибір фреймворку — це людські аспекти: двомовний контент, доступні форми, етап OCR, який усуває рутину, та правила доступу, які технічно непідковане правління може насправді адмініструвати. Маленьке, надійне та читабельне перемагає винахідливе тут.
Прозорість: більшість дописів тут створено за допомогою ШІ, а неанглійські версії перекладені локальною LLM і вичитані. Помітили помилку? Напишіть мені.