Фамильный вики-движок Bonsai: итоги 2019 года

от автора

В начале прошлого года я рассказывал про проект Bonsai — движок для создания семейного вики и фотоальбома с открытым исходным кодом. С тех пор проект планомерно развивался. За год сделано несколько фич, благодаря которым движок теперь значительно проще попробовать в у себя и приятнее использовать в дальнейшем.

Под катом — подробности, планы на будущее и немного bounty.

Docker-образ

Установка первой версии Bonsai была весьма утомительным процессом из-за большого количества зависимостей: для работы необходимы рантайм .NET Core, PostgreSQL, Elasticsearch (а значит Java Runtime и плагин для поддержки русской морфологии), для сборки — еще .NET Core SDK, еще NodeJS для сборки фронта… Даже на фоне глобального усложнения современной веб-разработки это была задача только для сильных духом и многие изначально заинтересованные пользователи бросали ее на полпути.

Хватит это терпеть!

Теперь Bonsai поднимается в три элементарных действия за минуту:

1. Скачать docker-compose.yml.
2. Вписать вместо @@YOUR_EMAIL@@ и @@YOUR_IP@@ нужные значения.
3. Выполнить docker-compose up -d

Авторизация по паролю

В первой версии использовался только один тип авторизации — через социальные сети. Для этого было много причин:

  • Авторизация происходит в один клик
  • Из коробки дается 2FA, восстановление пароля и прочие проверки безопасности
  • Просто поддерживать в коде Bonsai
  • Можно получить часть данных из профиля при регистрации

К сожалению, это вызывало и ряд проблем:

  • Дополнительный сложный шаг при первоначальной установке
  • Нельзя дать доступ человеку, у которого нет соцсетей (например, пожилому родственнику)
  • Для некоторых данных (пол, возраст) соцсети требуют ручной проверки вашего приложения

Поэтому был добавлен второй тип авторизации — по логину и паролю, который включен по умолчанию.

Теперь шаг создания авторизационного приложения в соцсети можно пропустить. После старта Bonsai предложит зарегистрировать учетную запись администратора, где нужно будет ввести желаемый пароль — и все заработает.

Создать новую учетную запись с паролем можно в админке:

При использовании парольной авторизации следует помнить несколько вещей:

  • Пользователь не может восстановить собственный пароль — это может сделать только администратор. Если администратор только один, авторизуется по паролю и этот пароль забыл — придется воспользоваться скриптом для сброса, который необходимо выполнить напрямую в БД.
  • После 10 неудачных попыток подряд аккаунт также блокируется. Для разблокировки необходимо сменить пароль. Помимо ваших собственных действий блокировку могут вызвать вредоносные боты-краулеры, автоматически перебирающие пароли.
  • У одной учетной записи может быть только один тип авторизации за все время. Сначала сделать учетку с паролем, а потом добавить к ней дополнительный логин через соцсети или вообще заменить его штатными средствами нельзя — только через ручные манипуляции с БД.

Рендеринг фамильных деревьев на стороне сервера

Автоматическое построение фамильных деревьев — одна из самых главных возможностей Bonsai, но и самая хитрая.

Как я рассказывал в предыдущей статье, автоматически расположить блоки оптимальным образом — очень сложная задача. Люди пишут про это научные работы, вкладывают тысячи человекочасов и продают готовые компоненты за безумные деньги. К счастью, удалось найти бесплатную библиотеку ELK.js, которая дает вполне приличные результаты.

Проблема с ELK.js была в том, что для клиентской библиотеки она очень долго работает. Можно регулировать результат через свойство thoroughness — чем больше значение, тем лучше график, но тем дольше он генерируется. Чтобы отрендерить понятное дерево на 50 человек, приходилось ждать около 30-40 секунд на каждое открытие страницы с деревом!

Теперь рендеринг происходит не на клиенте при каждом открытии, а на сервере при каждом изменении. Первое время после обновления контента придется подождать как раньше, зато потом страницы открываются мгновенно.

С технической точки зрения перенос вычислений с клиента на сервер вызвал несколько трудностей. Чем запускать JS-код внутри .NET Core? Первой мыслью было использовать замечательную библиотеку Javascript Engine Switcher, которую написал Taritsyn. Увы, для моей задачи она не подошла: ни один из существующих движков не смог переварить код ELK.js. Вместо этого был использован встроенный механизм NodeServices, в котором все сразу заработало, как часы.

Да, теперь Bonsai требует два рантайма, но благодаря докеру это не так страшно. Да, NodeServices собираются отправить на пенсию в одной из следующих версий ASP.NET Core, но сообщество собирается его поддерживать. А куда деваться? Современная веб-разработка полностью состоит из подобных компромиссов. Главное, чтобы это давало результат.

Загрузка документов

Теперь помимо фото и видео Bonsai поддерживает загрузку PDF-файлов. Это может быть удобно для документов — в частности, свидетельств о рождении, браке или смерти.

Первоначально предполагалось делать для документов маленькие превью-картинки. Увы, эта идея разбилась о суровые скалы действительности: ни одна из существующих библиотек не подошла по тому или иному критерию. Были рассмотрены:

  • iText7 — несовместимость лицензии с MIT
  • PDF.js — огромное количество зависимостей, контейнер раздувался вдвое
  • Обертки для GhostScript — также проблемы с лицензией, плюс практически все заброшены и не поддерживают .NET Core

Если я что-то упустил и святой грааль конвертации PDF в изображение все-таки существует — пожалуйста, напишите в комментариях!

Новости на главной

На главной странице под календарем теперь показываются последние измененные страницы и загруженные медиа-файлы:

Обязательный дисклеймер

Проект является некоммерческим и предоставляется «как есть». В нем есть баги. Один раз по банальному недосмотру в master проскочил код, который чуть не очистил базу. Поэтому если вы цените данные, которые вы заводите в Bonsai, то периодически, и особенно при каждом обновлении:

Делайте бэкапы.
ДЕЛАЙТЕ БЭКАПЫ!
Д Е Л А Й Т Е   Б Э К А П Ы ! ! !

Что дальше?

Впереди еще много интересных задач, которые бы хотелось сделать за следующий год:

  • Ранжирование страниц: единая автоматическая метрика, позволяющая сортировать страницы по заполненности их данных. Позволит легко ответить вопросы «какие страницы можно показать в качестве эталона» и, наоборот, «над какими еще нужно поработать».
  • Редизайн главной страницы админки: изменения будут показываться в виде, похожем на «ленту новостей» в соцсетях.
  • Технические задачи: переход на .NET Core 3, всевозможный рефакторинг

Также есть задачи, которые хотелось бы сделать, но у меня не хватает на них времени и компетенций. Надеюсь на помощь сообщества — если не забесплатно, то хотя бы за символическое вознаграждение. Если уверены в своих силах и хотите поучаствовать — пожалуйста, пишите мне в телеграм, обсудим.

  • Компонент календаря: используется стандартный, но он немного кривоват и не поддерживает неточные значения (2019.??.??): нужно написать полноценный.
  • Улучшение поиска: поиск в ElasticSearch иногда дает странные результаты. Скорее всего, я просто не умею пользоваться эластиком — нужно переписать адские конфиги со знанием дела.
  • Распознавание лиц: хорошо бы автоматически распознавать лица на загружаемых фото и привязывать их к страницам. Решений на .NET Core, одновременно открытых и дающих вменяемые результаты, пока не нашел.

Репозиторий проекта доступен по адресу:

https://github.com/impworks/bonsai.

Если вы используете Bonsai — пожалуйста, расскажите об этом в комментариях. Буду рад критике и предложениям.


ссылка на оригинал статьи https://habr.com/ru/post/481600/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *