Менеджер заметок.
Я довольно давно искал менеджер заметок после того, как ушел Notion и заблокировал мой аккаунт. Я перепробовал довольно много всякого. Где-то меня не устраивал интерфейс, где-то глючная P2P-синхронизация, где-то отсутствие нативных приложений.
В итоге я довольно длительное время пользовался Obsidian’ом. Но что-то я так и не смог к нему привыкнуть. Не хватало возможности поделиться заметкой, костыльная синхронизация, которую Yandex мне в какой-то момент поломал, ну и куцый формат хранения. Короче, для того чтобы его допилить до удобоваримого состояния, требовалась куча плагинов, которые необходимо вручную синхронизировать между устройствами. Надоело, и я снова отправился в поиск.
Пока что остановился на Joplin. Он довольно просто и быстро разворачивается. Есть приложения под все платформы, которые я использую. Вполне нормально работает без интернета и поддерживает формат заметок, в котором можно поставить 2 картинки в ряд.
Скажу сразу: я пока что Obsidian’ом пользовался сильно дольше, но пока что кажется, что Joplin закрыл все мои потребности. А пока — как его развернуть.
Приготовления
Первое, что нам надо, — домен, для того чтобы можно было развернуть сервер синхронизации с админкой с HTTPS. Регистрируем где хотим.
Дальше — хостинг. Понятное дело, тоже любой. Я тестирую хостинг от одного из новых игроков на рынке, который дает фри-тир на год за 5к, развернул на нем.
Установленная на машину операционная система с Docker и Docker Compose. А также Nginx и Certbot.
После того как получаем IP на машине, стоит сразу на него создать A-запись у регистратора.
Устанавливаем сервер
1. Создаем директории и файлы
sudo mkdir /opt/joplin
cd /opt/joplin/
sudo touch joplin-server.yml
2. Открываем любым текстовым редактором joplin-server.yml
и вписываем в него следующие строки
services:
db:
image: postgres:13
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: always
environment:
- POSTGRES_PASSWORD=Тут пароль
- POSTGRES_USER=Тут пользователь
- POSTGRES_DB=Тут имя базы
app:
image: joplin/server:latest
container_name: joplin-server
depends_on:
- db
ports:
- "8080:8080"
restart: always
environment:
- APP_PORT=8080
- APP_BASE_URL=тут url вида https://example.com
- DB_CLIENT=pg
- POSTGRES_PASSWORD=Тут пароль от базы
- POSTGRES_DATABASE=Название базы
- POSTGRES_USER=Пользователь базы
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
Разумеется, вы можете поменять порты базы, версии, настроить что-нибудь ещё, если этого захотите. Но этого конфига будет достаточно для того чтобы запустить сервер синхронизации.
3. Поднимаем наши контейнеры и проверяем что они запустились
sudo docker compose -f joplin-server.yml up -d
sudo docker ps
Nginx Reverse Proxy
В целом, сервер-то уже работает, но он сейчас работает по HTTP. Я не пробовал, но, возможно, приложения не будут с таким работать, а если и будут — это небезопасно. Так что настраиваем Nginx. В целом можно поставить Traefik, Caddy или что-то более модное.
1. Создаем файл конфигурации
sudo touch /etc/nginx/conf.d/joplin-server.conf
2. Открываем и пишем следующие строки
server {
server_name example.com; // Тут домен
error_log /var/log/nginx/joplin-server.error;
location / {
proxy_pass http://127.0.0.1:8080; // Тут поменять порт, если меняли в Docker Compose файле
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3. Сохраняем файл и проверяем, нет ли ошибок
sudo nginx -t
Если ошибок нет - пререзагружаем сервис и идем проверять админку.
sudo service nginx restart
4. Генерируем certbot'ом ключи и еще раз перезагрущаем nginx сервис
sudo certbot -d example.com -m admin@example.com # не забываем менять на актуальные данные
sudo service nginx restart
Ну и в целом-то всё. Можно логиниться на сервер. Переходим по адресу и логинимся:
admin@localhost
admin
. Сразу меняем пароли на нормальные. Также можно изменить email. Но так как я не настраивал почтовый сервер — письмо с подтверждением не ушло, однако ссылку для подтверждения можно посмотреть в админке во вкладке Emails.

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

У нас есть готовый сервер синхронизации, который мы мейнтейним самостоятельно. Можем просматривать все файлы, делать бэкапы самостоятельно и иметь все проблемы, присущие self-hosted решениям.

Пока что не буду говорить, что это вот то, что мне прям нравится, и советовать всем, но приложение выглядит так, как будто бы закрывает все мои потребности.
А ну и да, конечно же подписывайтесь на телегу https://youtu.be/dQw4w9WgXcQ?si=HaFOkir0fWJPF9ZO.
Комментарии (65)
CrazyOpossum
07.06.2025 15:26Спасибо
А что под капотом? Заметки хранятся в базе или текстовыми файлами? Что мне нравится в Obsidian - что это просто фронтенд над markdown. Если захочу от них уйти - элементарно скриптами перенесу файлы на другой формат. Синхронизацию файлов можно самому сделать, по связке с Syncthing были статьи на хабре.Roman_Cherkasov Автор
07.06.2025 15:26https://habr.com/ru/articles/916514/comments/#comment_28409158 промахнулся с ответом
Roman_Cherkasov Автор
07.06.2025 15:26Экспорт
Под капотом postgres + какое-то хранилище файлов. Они имеют расширение .md но это по сути JSON с метаинформацие + одно из полей - md синтаксис.
По экспорту - все норм. Под спойлером список форматов.
По обсидиану - да я им дольше всего пользовался, делал через Webdav Yandex диска, за который плачу. Но они сказали что я им пользовался не по назначению и Obsidian начал кидать ошибку синхронизации.Syncthing к сожалению мне не очень подходит, потому что есть компы которые не бывают в одной сети, но иметь заметки хочется всегда актуальные.
CrazyOpossum
07.06.2025 15:26Syncthing к сожалению мне не очень подходит, потому что есть компы которые не бывают в одной сети, но иметь заметки хочется всегда актуальные.
Я развернул у себя на vps-ке, синхронизируется всё что имеет доступ к приватной сети.
13werwolf13
07.06.2025 15:26потому что есть компы которые не бывают в одной сети, но иметь заметки хочется всегда актуальные.
синсину не обязательно чтобы хосты были в одной сети, он прекрасно работает и через nat и через провайдерский нат. единственное где он бессилен это сети некоторых опсосов которые режут весь p2p трафик, но это легко решается через strelaysrv.
если же имелось ввиду что хосты не бывают в сети ОДНОВРЕМЕННО то всегда можно использовать в роли посредника телефон который и так в сети 24/7 или любой vps или малокушающий одноплатник на шкафу и что угодно другое.
Kovurr
07.06.2025 15:26Notable плюс синхронизация ее папки любым способом. Простые текстовые файлы, поддержка Markdown, что еще нужно?
И не надо городить домен, хостинг, докер, nginx и т.д.
Roman_Cherkasov Автор
07.06.2025 15:26Если вам больше ничего не нужно и вы готовы городить синхронизацию её папки любым способом - отличное решение.
seregina_alya
07.06.2025 15:26У обсидиана то же самое по сути, но человеку явно неудобно. Да и я пробовала через несколько "удобных" способов, но мне быстро это удобство надоело. Хотелось, чтобы с телефона на комп и обратно всё летело так же автоматически и незаметно, как в Notion - в итоге туда и вернулась
Biga
07.06.2025 15:26Не понимаю, почему бы не встроить алгоритм синхронизации прямо в клиент. Да, он не будет доступен удалённо через интернет, но лично мне и не надо. Хочу синхронизоваться по локальной сети в p2p манере без настройки серверов.
Сейчас пользуюсь локальным webdav на десктопе и obsidian - работает, но так себе.Roman_Cherkasov Автор
07.06.2025 15:26Вам может понравиться AnyType. Local-First, Peer-to-peer синхронизация внутри одной сети. Алгоритм синхронизации как раз прямо в клиенте. Есть клиенты подо все платформы, в том числе мобильные.
Sol4rinn
07.06.2025 15:26По поводу аналогов Obsidian. Лично для меня в Joplin (AnyType, e.t.c) не хватает возможности сослаться на другую заметку вплоть до блока. Это вот тот функционал, который меня и держит в Obsidian, хотя сам он меня уже весьма устал.
Roman_Cherkasov Автор
07.06.2025 15:26Да, это полезная фича, пользовался ей тоже, но в целом, поиска по названию даже хватает для этих задач. Безусловно дольше, но для меня не стало геймченджером.
Sol4rinn
07.06.2025 15:26А в Joplin плагинами такая штука не настраивается? Тоже пользовался Joplin несколько лет назад. Тогда ушел с него из-за проблемы параллельного редактирования тегов, долго бился с техподдержкой, так и не решили. На тот момент была проблема тегами markdown кажется, которые рушили форматирование в заметке, подробностей не вспомню сейчас...
Kahelman
07.06.2025 15:26Я в свое время сделал подобное но без заморочек в виде PostgreSQL. Joplin хранит базу данных для синхронизации в виде отдельных файлов и работает по WebDAV. Так что достаточность сервера с поддержкой webdav
Roman_Cherkasov Автор
07.06.2025 15:26Не уверен что я понял что вы имеете в виду, но да, Joplin можно синкать и по WebDAV. Нюанс только в том что у меня нет WebDAV провайдера нормального.
Kahelman
07.06.2025 15:26А самому на сервере поднять? У lighttpd есть встроенная поддержка WebDAV
Kahelman
07.06.2025 15:26Устанавливаем lighttpd и модуль WebDAV
sudo apt install lighttpd lighttpd-mod-webdav
Включаем модуль WebDAV
sudo lighttpd-enable-mod webdav
sudo systemctl restart lighttpdГотовим директорию для WebDAV
sudo mkdir -p /var/www/webdav
sudo chown www-data:www-data /var/www/webdavСоздаём htpasswd-файл для авторизации
sudo apt install apache2-utils
sudo htpasswd -c /etc/lighttpd/webdav.htpasswd myuserРедактируем конфиг lighttpd
sudo nano /etc/lighttpd/lighttpd.conf
добавляем в конфиг lighhttpd
server.modules += ( "mod_webdav" )
|/)" {
webdav.activate = "enable"
webdav.is-readonly = "disable" # включаем запись
webdav.sqlite-db-name = "/var/lib/lighttpd/webdav.db"auth.backend = "htpasswd" auth.backend.htpasswd.userfile = "/etc/lighttpd/webdav.htpasswd" auth.require = ( "" => ( "method" => "basic", "realm" => "WebDAV", "require" => "valid-user" ))
}
Roman_Cherkasov Автор
07.06.2025 15:26Спасибо за развернутый ответ. Но в таком случае уже нет разницы между подходами. Все ещё необходим самостоятельный менеджмент. А так же мы теряем часть функционала который предоставляет нам sync-server, в частности публикацию страниц.
vikarti
07.06.2025 15:26На самом деле есть еще большая разница...которая проявляется когда заметок (включая webclips, часть из которых еще с Evernote) становятся десятки тысяч а вложений (если web clip то там каждая отдельная картинка будет вложением) - сотни тысяч. если использовать WebDAV на apache2 - либо люто зверские тормоза синхронизации и OOM'ы apache (из-за 20 connections Joplin'а сразу с нескольких устройств) либо (если что-то nginx-подобное) просто зверские тормоза с синхронизацией. Joplin Server тут помогает (там не совсем чистый WebDAV). Ну и публикация да.
agronaut
07.06.2025 15:26А Logseq рассматривали? Там синхронизация через облака бесплатная была, выглядит очень прилично
Roman_Cherkasov Автор
07.06.2025 15:26Пробовал но не погружался, не помню если честно что не подошло.
Arioch
07.06.2025 15:26...прочитал заголовок "...как Остановить?"
И вправду, ну что это за караван какой-то, убийца за убийцей за убийцей. Как в том самом самолете, ей же ей.
autyan
07.06.2025 15:26Я не так давно наткнулся на memos. Очень понравилось: этакие заметки в стиле Telegram — с удобными тегами, календарём и поиском.
Roman_Cherkasov Автор
07.06.2025 15:26Выглядит хорошо, нравится. Когда сделают мобильные приложения - можно будет посмотреть.
dir94
07.06.2025 15:26А уже есть
https://github.com/mudkipme/MoeMemos
https://github.com/mudkipme/MoeMemosAndroid
Но тут надо сказать, что memos это совсем не про "аналог notion". Это скорее аналог google keep
Roman_Cherkasov Автор
07.06.2025 15:26О как, интересно. Но да, выглядит как приложение для немного других задач. Скорее короткие временные заметки / задачи, нежели библиотека.
libroten
07.06.2025 15:26Вдруг кому-то будет полезно.
Если совсем не хочется заморачиваться с тем, чтобы купить/настроить домен+хостинг, и нету каких-то переживаний за приватность, можно достаточно просто настроить синхронизацию через webdav яндекс диска.
Заводим на яндекс диске папочку для файлов Joplin-а. Я ее так и назвал "Joplin"
В настройках аккаунта яндекса заводим т.н. Пароль приложения, выбираем webdav, сохраняем себе пароль
Идем в настройки синхронизации Joplin, выбираем в качестве способа синхронизации webdav, в поле URL-адрес WebDAV вводим "https://webdav.yandex.ru/<имя папочки на я.диске>" (в моем случае это будет https://webdav.yandex.ru/Joplin)
Имя пользователя - логин в яндексе
Пароль - вводим пароль приложения из п.2.
Живу так уже два с половиной года, заметки синхронизируются между четырьмя устройствами.
Roman_Cherkasov Автор
07.06.2025 15:26Жил так с обсидианом, пока Яндекс не сказали что я живу не правильно и что их диском нельзя так пользоваться.
aweselow
07.06.2025 15:26Тема актуальна, тоже привык к Notion и пока сижу на российском yonote, но функционала баз не хватает. А с Appflowy не сравнивали, они также self-hosted сервер в паблике.
Roman_Cherkasov Автор
07.06.2025 15:26Не пользовался базами. Appflowy на мобильных странно выглядит, у yonote нет приложений
ErshoFF
07.06.2025 15:26В joplin в приложении на телефоне сложно отправить вложенные в заметку файлы(например pdf).
Как решаете?Roman_Cherkasov Автор
07.06.2025 15:26Если расскажете подробнее ваш кейс, может подскажу что. Я просто жму на скрепку, выбираю файл который необходимо вложить и он вкладывается. В том числе PDF.
ErshoFF
07.06.2025 15:26Мобильное приложение на андроид, при удержании "скрепки", "названия документа" в первый раз после запуска приложения менюшка появляется, в последующие разы - не появляется, только отклик вибрации.
При просто касании - pdf открывается. Но при "поделится" сохраняется с именем в виде хэша файла.Roman_Cherkasov Автор
07.06.2025 15:26Возможно бага какая-то. У меня в режиме редактирования заметки - просто скрепка снизу слева. Однократное нажатие - вызывает pop-up. Там выбрать файл, выбираю его - он прикрепляется. Появляется ссылка. С компа при этом после синхронизации оно нормально открывается. В обратную сторону тоже работает, только что проверил. Открыл через Adobe PDF Reader встроенный в систему, нажал там три точки -> сохранить на устройстве. В файловом менеджере появилось.
Возможно дело не в Joplin, а в приложении через которое PDF открывается?
ErshoFF
07.06.2025 15:26Повторяется на разных телефонах и разных версиях android/harmonyos и разных телефонах.
Проблема есть с файлами pdf и doc/xls, может и с другими, не проверял.
Повторяется на всех версиях joplin около года, ранее не проверял.Roman_Cherkasov Автор
07.06.2025 15:26Ну тогда точно только к разрабам в ЛС, либо в PR. У меня пока работает.
TechNerd
07.06.2025 15:26А чем не подошла синхронизация через гит? В obsidian есть куча вариантов плагинов для автоматизации этого процесса. Поднял собственный gitea и все устройства подключил к нему.
Sol4rinn
07.06.2025 15:26А Вы где подняли? Мне всегда было интересно - где надо поднять свой собственный сервер Git, чтобы можно было в любой момент по форс-мажору его перенести/поднять. VPS, домашний сервер?
Roman_Cherkasov Автор
07.06.2025 15:26По форсмажору - это как минимум 2 сервера. Не плохо работает связка Github/Gitlab как основное место разработки + gitea сервер в режиме зеркалирования. Он раз в час ходит и синкает все репы на локальный сервак. В случае недоступности основного - можно продолжить работу на локальном.
vedmak3
07.06.2025 15:26Сделал проще. Выгружаю в mail облако на webdav с включенным шифрованием.
Также можете заценить TriliumNext Notes
Roman_Cherkasov Автор
07.06.2025 15:26https://habr.com/ru/articles/916514/comments/#comment_28409560
В этой ветке есть ответ, почему мне не подошел WebDAV
IlyaOsipov
07.06.2025 15:26Чем можно заменить конфлюинс для России бесплатный?
Roman_Cherkasov Автор
07.06.2025 15:26
13werwolf13
07.06.2025 15:26cherrytree или qownnotes, синхронизация между устройствами при помощи syncthing и не нужно крутить довольно тяжёлое серверное ПО для такой простой задачи как ведение заметок. а у упомянутых в статье решений даже клиент тяжеловесный (собственно а что ещё ожидать от вебни, это же не нативный софт).
HSerg
07.06.2025 15:26А почему PostgreSQL, а не SQLite? Встречал оценку, что до 5-10 активных пользователей использовать PostgreSQL смысла нет.
ky0
В таком виде вам придётся периодически ходить и релоад nginx'а делать, чтобы он применил обновившийся сертификат.
Roman_Cherkasov Автор
Спасибо что напомнили!
Добавил в cron
`0 3,15 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"`
igors
systemctl может не работать из крона, замените на nginx -s reload
lrrr11
cron тут в принципе не нужен, потoому что в systemd есть встроенные таймеры
А вообще по-хорошему можно заменить nginx+certbot на Angie, там есть встроенный модуль acme
Roman_Cherkasov Автор
Я надеюсь вы не серьезно про Angie
NME_1337
а что с ним не так? 1 раз проверил, вроде серт выпустился
Roman_Cherkasov Автор
Просто не понмаю для чего использовать не популярное решение, при наличии проверенных и популярных. Популярность это если что не только про количество звездочек на Github'e, это больше про доступность обучающих материалов и способов решения проблем. Про Angie интернет практически ничего не знает, в отличии от Nginx \ Caddy \ Traefic
NME_1337
В базе своей в нем буквально нет ничего отличного от nginx, абсолютные пути в конфигах etc/nginx заменить на etc/angie и все запустится как и было на nginx. База знаний тоже обратно совместима. Acme по официальной доке сделать (это не минус, потому что упомянут traefik, без официальной доки которого вообще тяжело). И если что-то когда-то пойдет не так, то диагностить одну точку отказа проще чем 3 (nginx, certbot, cron)
В общем, малюете страшнее чем оно есть на самом деле. Внезапно любой веб сервер это не совсем просто и базовые конфиги легко превращаются в что-то сильно специфичное
Roman_Cherkasov Автор
Если вы так это видите - ок. Я просто не люблю использовать инструменты которые не считаю надежными. Поддержка сообщества - один из признаков надежности для меня.
hydroid
Angie - это просто форк Nginx, та котором есть все что есть в Nignx и даже больше. Не вижу никаких проблем при смене сервера, а новые фичи можно использовать постепенно.
Roman_Cherkasov Автор
https://habr.com/ru/articles/916514/comments/#comment_28411172
sabirovrinat85
предпочитаю простоту, потому Caddy, но собранный с модулями caddy-ipinfo-free и caddy-l4 (L4 заодно добавляю на всякий случай, хотя уже не использую функционал).
Roman_Cherkasov Автор
Да, я на самом деле на другом своем сервере использую Caddy. Работает хорошо уже года полтора. Воткнул бы в него же и Joplin, но там и так сейчас под 80% загрузки.
13werwolf13
добавляем в
/etc/sysconfig/certbot
в переменнуюCERTBOT_ARGS
параметр" --nginx "
, правим в файле/etc/letsencrypt/renewal/DOMAIN.conf
строкуinstaller
и строкуauthenticator
на nginx и можно запускать таймерsudo systemctl enable certbot-renew.service
ну конечно же плагин nginx для certbot должен быть установлен
всё, и никаких костылей в кроне