Сегодня поговорим про мою попытку развернуть selfhosted систему для ведения документации. По сути нужен сервис который бы позволил писать заметки в формате Markdown и привязывать к ним гору документов примерно по 200Mb каждый. Далее все эти документы должны иметь какую-либо структуру, чтобы к ним можно было получать быстрый и простой доступ.
Для решения данной задачи можно выделить 3 типа приложений:
- WEB сервисы. Вы просто открываете сайт, и все редактирование проходит на нем.
- Локальный клиент. Редактирование и просмотр происходит на десктопный утилите, а данные лишь синхронизируются с облаком.
- Комбинированный подход. Есть возможность использовать как десктопные (и мобильные) клиенты, так и получить доступ к данным через веб.
Все в одном
Для начала рассмотрим все что мне не подошло, а потом перейдем к тому, что я все таки выбрал.
Рассмотрим последнюю группу. Типичными представителями этой группы будут Notion и Evernote. Это очень мощные и крутые инструменты, которые на 100% подошли бы для решения наших задач (единственное Evernote
не поддерживает MD). Однако у них есть фатальный недостаток, это коммерческие продукты, не о каком selfhosted не может быть и речи.
Notesnook
Эту задачу, в теории, могла бы решить недавно открытая Notesnook, но к сожалению пока открыт только код клиента, код сервиса все еще закрыт. Компания обещала открыть и сервер 10/2022, но произойдет это или нет неизвестно.
Standard Notes
Существует еще один сервис который с первого взгляда, прямо идеально ложится под требования - Standard Notes. Однако на своем сервере вы можете поднять только урезанную версию приложения - бесплатную. Для полного функционала нужны расширения, и их вполне можно получить бесплатно, даже есть репозиторий. Однако это шаткое положение, где сегодня расширения есть, а в завтра у них поменяется формат, или вообще останется только платная версия, очевидно нас не устраивает. Так что отказывается от этого варианта несмотря на то что он выглядел крайне хорошо.
По итогу можно сказать что представителей данного типа приложений в Open source НЕТ.
WEB
Теперь рассмотрим WEB приложения. С ними есть один нюанс, все более-мение нормальные приложения являются по сути wiki (есть еще аналоги Google Keep - Turtl или Carnet, но вести в них документацию не возможно). Их задача это разместить какую-то информацию в сети в формате веб страниц, и дать возможность удобного доступа к ней читателям данной информации. Отсюда и получаются что основной акцент данных приложений сделан на публикации, а не на редактировании данных. Для меня вариант веб сервиса был наиболее предпочтительным, т.к. у меня всегда открыт браузер, да и за 3 года использования Evernote (даже с платной подпиской), я так и не установил десктопный клиент. Однако я так и не смог найти подходящий сервис для себя, и ниже я предлагаю рассмотреть то что я тестировал и что из этого вышло.
Кстати, все скирины экрана ниже - кликабельны.
XWiki
XWiki - это бесплатная программная платформа вики, написанная на Java с упором на расширяемость.Это старая (с 2004 г) Wiki которую кто-то даже использует в корпоративной среде. Позволяет редактировать документы в Markdown
при помощи плагина, имеет плагины на все случаи жизни, а так-же просто устанавливается из DEB файла. У нее есть ровно 2 проблемы из-за которых я не смог ей пользоваться:
1) Она очень тяжелая. На моем сервере с одноядерным intel atom и 2GB оперативки это все достаточно сильно подтормаживало (обновления страниц), программа явно избыточна (для наших целей) по функционалу.
2) Кривая темная тема. Похоже это болезнь всех приложений на Java, вспомним CubeIDE (я понимаю, что десктоп приложения и серверные это Другое, но все равно забавно). Для меня это является критичным.
Странные яркие полосы.
А также часть текста не видна, поля для ввода текста слишком яркие, да и в других местах бываю графические артефакты. В теории, наверное, это можно как-то подправить. но я не вижу смысла заниматься подобным.
Однако. если вы не любите темную тему, и у вас мощный сервер, то это хорошее решение с тонной плагинов на любой случай жизни.
Wiki.js
Попробуем другую Wiki - Wiki.js. Это молодая и современная Wiki написанная как NodeJS приложение. Красивая и быстрая, прямо идеал, однако имеет ряд недостатков, из-за которых от её использования пришлось отказаться:
1) Это куча нереализованных функций, однако под них есть неактивные кнопки. Зачем так делать, мне не понятно, можно-же просто не добавлять эти кнопки. А самое смешное, что скоро планируется выход версии 3 и там будет совершенно другой дизайн, то-есть эти кнопки совсем бесполезны.
2) Проблема с большими файлами. Судя по всему все файлы которые вы загружаете в систему кладутся внутрь BD. Я не смотрел код (не разбираюсь в NodeJS), но судя по ошибкам которые валятся с сервера при загрузке файла больше чем 5Mb, дефолтному размеру файла в те-же 5Mb и создателю (NGPixel)который говорит, что вместо кидания файлов в вики лучше использовать другие сервисы, это так. Возможно (как говорит NGPixel) в 3 версии это будет работать по другому, но пока необходимости кидать BLOB объекты в БД мне явно не нравится.
3) Так-же к минусам можно отнести то что нельзя посмотреть на всю файловую структуру целиком, сервис отображает только путь до текущего документа.
Bookstack
Последнее что я хотел бы рассмотреть в этой категории - это Bookstack. Это тоже достаточно молодая и быстрая wiki написанная на PHP. По сути она мало чем отличается от прошлой, отличен дизайн и подход к организации файловой структуры. Данная структура - основная фишка данной wiki, но так-же и её проблема. Отдельный MD файл - это страница. Эта страница далее входит в главу (или не входит), после чего страница или глава входят в книгу, а книга является часть полки. Иными словами для любого документа есть только 2 варианта размещения страницы:
1) Полка -> Книга -> Глава -> Страница 2) Полка -> Книга -> Страница
Никакие вложенные папки и т.к. делать нельзя. А главное для того чтобы попасть на страницу нужно сначала выбрать полку на отдельной странице, потом перейти на страницу выбора книги, потом выбрать главу и страницу, и только потом откроется редактор.
Изначально эта вики мне понравилась больше всего, но посидев на ней неделю я понял что прокликивать кучу окон просто невыносимо.
Данная Wiki хранит текст в БД, а файлы отдельно. Однако нет способа конвертировать весе данные в md файлы (такой поддерживает wiki.js), что добавляет неудобства.
Desktop app
В итоге остаются только локальные приложения. Здесь есть 2 самых популярных варианта - это Joplin и Obsidian.
Joplin
Joplin - Open Source приложение для пк или телефонов, написанное на js (electron). Поставляется он через appimage, из-за чего достаточно долго стартует. Оно позволяет собирать MD документы в папки, и прикреплять к ним файлы, добавлять теги. Эти документы хранятся на локальном компьютере. Приложение позволяет синхронизовать эти данные с каким-то сервисом. В первую очередь, с платным сервером создателей.
Приложение хорошее, удобное. Единственная проблема для меня это крайне странный способ хранения файлов:
...
├── f6169e10685345c68ad7318b2be3ba0b.md
├── fc9bbccead2349d4b6c2e689988c480c.md
├── fed320d2173943758422a6d2c7b9104b.md
├── info.json
├── .lock
├── locks
├── .resource
│ ├── 090877bec6944c149edce240f0edfd01
│ ├── 24f851fe1f15442d89fe5e20e19fcbf8
│ ├── 377b3d62936a4eec84430ee52ada9718
│ ├── 6b48fcedac2c48288d639009d9df5ea1
│ ├── 816bb06417f04c459c6a25a8e07136b6
│ ├── 8879b389a68f48228037630cba5242cf
│ ├── 8a88633b6c1b4d07a70eae7188560b97
│ └── cc6e6b0b933a42deb1a7417aa5b46e60
├── .sync
│ ├── readme.txt
│ └── version.txt
└── temp
Зачем так делать совсем непонятно, потому-что сами документы лежат в не зашифрованном виде, как и вложения. У них просто изменены названия и они свалены в одну кучу. Из-за этой причины мы отказываемся от использования данного приложения.
Obsidian
По сути это ровно то-же самое что и прошлое приложение но с рядом как преимуществ так и недостатков. Главной недостаток - это то что приложение free, но не opensource, но на это можно закрыть глаза (о чем в следующем разделе). Преимущество же в том что файлы хранятся ровно так как вы от них этого ожидаете - md файлы в тех-же местах что и в программе, а еще в той-же папке будут лежать вложения (по умолчанию они добавляются в корень, но в настройках это можно изменить).
.
└── note
├── blog.png
├── Inkscape.md
├── Linux.md
└── To learn.md
Так-же obsidian весит в 2 раза меньше чем joplin и вероятно поэтому быстрее грузится:
164M Joplin-2.7.15.AppImage
86M Obsidian-0.15.9.AppImage
В принципе на этом можно остановится. остановимся на этом варианте.
Selfhosted
На этом месте читатель (если вдруг это кто-то читает кроме меня) заметит, что выбор Obsidian
совершенно не решает поставленные перед нами задачи, т.к. файлы лежат на локальном компьютере и их никак нельзя посмотреть из сети. Сразу же приходит в голову идея, а что если загружать файлы документов после изменения на git (который мы поднимали в прошлой статье). Это позволит просматривать и редактировать заметки из сети через WEB интерфейс гита. Однако, хранить не текстовые файлы, в системе контроля версий ориентированной в первую очередь на текст - не очень разумное решение. Поэтому необходимо поднять файловое хранилище - Nextcloud.
Про разворачивание Nextcloud можно прочесть тут. А то как прикрутить к этому всему доменное имя мы обсуждали в прошлой статье.
В итоге мы создаем 2 папки obsidian
в Nextcloud
и на локальном компьютере. Дальше пишем небольшой скрипт который пытается синхронизовать локальные данные с данными на сервере. В итоге документ можно редактировать как на компьютере с помощью obsidian
так и непосредственно на сервере с телефона или другого компьютера.
Для синхронизации можно использовать следующую команду.
nextcloudcmd -u <your_user> -p <your_pass> -s -h --path obsidian ~/obsidian https://<your_server>.com
Интересные ссылки:
- Изоброжение в шапке отсюда.