← Blog

Портал для жильцов ассоциации домовладельцев — на чистом PHP и SQLite

DEENESRUUK

Не каждый проект нуждается в фреймворке 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 и вычитаны. Заметили ошибку? Напишите мне.