Менеджер заметок.

Я довольно давно искал менеджер заметок после того, как ушел 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.

bed87b4e72b3baea641c0d9b2a31df83.png
Интерфейс админки

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

71211e578e26a5cb08d83169687792b5.png
Окно настроек

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

Общий вид
Общий вид

Пока что не буду говорить, что это вот то, что мне прям нравится, и советовать всем, но приложение выглядит так, как будто бы закрывает все мои потребности.

А ну и да, конечно же подписывайтесь на телегу https://youtu.be/dQw4w9WgXcQ?si=HaFOkir0fWJPF9ZO.

Комментарии (65)


  1. ky0
    07.06.2025 15:26

    В таком виде вам придётся периодически ходить и релоад nginx'а делать, чтобы он применил обновившийся сертификат.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Спасибо что напомнили!
      Добавил в cron

      `0 3,15 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"`


      1. igors
        07.06.2025 15:26

        systemctl может не работать из крона, замените на nginx -s reload


        1. lrrr11
          07.06.2025 15:26

          cron тут в принципе не нужен, потoому что в systemd есть встроенные таймеры

          А вообще по-хорошему можно заменить nginx+certbot на Angie, там есть встроенный модуль acme


          1. Roman_Cherkasov Автор
            07.06.2025 15:26

            Я надеюсь вы не серьезно про Angie


            1. NME_1337
              07.06.2025 15:26

              а что с ним не так? 1 раз проверил, вроде серт выпустился


              1. Roman_Cherkasov Автор
                07.06.2025 15:26

                Просто не понмаю для чего использовать не популярное решение, при наличии проверенных и популярных. Популярность это если что не только про количество звездочек на Github'e, это больше про доступность обучающих материалов и способов решения проблем. Про Angie интернет практически ничего не знает, в отличии от Nginx \ Caddy \ Traefic


                1. NME_1337
                  07.06.2025 15:26

                  В базе своей в нем буквально нет ничего отличного от nginx, абсолютные пути в конфигах etc/nginx заменить на etc/angie и все запустится как и было на nginx. База знаний тоже обратно совместима. Acme по официальной доке сделать (это не минус, потому что упомянут traefik, без официальной доки которого вообще тяжело). И если что-то когда-то пойдет не так, то диагностить одну точку отказа проще чем 3 (nginx, certbot, cron)

                  В общем, малюете страшнее чем оно есть на самом деле. Внезапно любой веб сервер это не совсем просто и базовые конфиги легко превращаются в что-то сильно специфичное


                  1. Roman_Cherkasov Автор
                    07.06.2025 15:26

                    В общем, малюете страшнее чем оно есть на самом деле

                    Если вы так это видите - ок. Я просто не люблю использовать инструменты которые не считаю надежными. Поддержка сообщества - один из признаков надежности для меня.


                1. hydroid
                  07.06.2025 15:26

                  Angie - это просто форк Nginx, та котором есть все что есть в Nignx и даже больше. Не вижу никаких проблем при смене сервера, а новые фичи можно использовать постепенно.



          1. sabirovrinat85
            07.06.2025 15:26

            предпочитаю простоту, потому Caddy, но собранный с модулями caddy-ipinfo-free и caddy-l4 (L4 заодно добавляю на всякий случай, хотя уже не использую функционал).


            1. Roman_Cherkasov Автор
              07.06.2025 15:26

              Да, я на самом деле на другом своем сервере использую Caddy. Работает хорошо уже года полтора. Воткнул бы в него же и Joplin, но там и так сейчас под 80% загрузки.


      1. 13werwolf13
        07.06.2025 15:26

        добавляем в /etc/sysconfig/certbot в переменную CERTBOT_ARGS параметр " --nginx ", правим в файле /etc/letsencrypt/renewal/DOMAIN.conf строку installer и строку authenticator на nginx и можно запускать таймер sudo systemctl enable certbot-renew.service

        ну конечно же плагин nginx для certbot должен быть установлен

        всё, и никаких костылей в кроне


  1. CrazyOpossum
    07.06.2025 15:26

    Спасибо
    А что под капотом? Заметки хранятся в базе или текстовыми файлами? Что мне нравится в Obsidian - что это просто фронтенд над markdown. Если захочу от них уйти - элементарно скриптами перенесу файлы на другой формат. Синхронизацию файлов можно самому сделать, по связке с Syncthing были статьи на хабре.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

  1. Roman_Cherkasov Автор
    07.06.2025 15:26

    Экспорт

    Под капотом postgres + какое-то хранилище файлов. Они имеют расширение .md но это по сути JSON с метаинформацие + одно из полей - md синтаксис.

    По экспорту - все норм. Под спойлером список форматов.
    По обсидиану - да я им дольше всего пользовался, делал через Webdav Yandex диска, за который плачу. Но они сказали что я им пользовался не по назначению и Obsidian начал кидать ошибку синхронизации.

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


    1. CrazyOpossum
      07.06.2025 15:26

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

      Я развернул у себя на vps-ке, синхронизируется всё что имеет доступ к приватной сети.


    1. 13werwolf13
      07.06.2025 15:26

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

      синсину не обязательно чтобы хосты были в одной сети, он прекрасно работает и через nat и через провайдерский нат. единственное где он бессилен это сети некоторых опсосов которые режут весь p2p трафик, но это легко решается через strelaysrv.
      если же имелось ввиду что хосты не бывают в сети ОДНОВРЕМЕННО то всегда можно использовать в роли посредника телефон который и так в сети 24/7 или любой vps или малокушающий одноплатник на шкафу и что угодно другое.


  1. Kovurr
    07.06.2025 15:26

    Notable плюс синхронизация ее папки любым способом. Простые текстовые файлы, поддержка Markdown, что еще нужно?

    И не надо городить домен, хостинг, докер, nginx и т.д.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Если вам больше ничего не нужно и вы готовы городить синхронизацию её папки любым способом - отличное решение.


    1. aik
      07.06.2025 15:26

      Синхронизации на уровне файлов плохо отрабатывают конфликты.


    1. seregina_alya
      07.06.2025 15:26

      У обсидиана то же самое по сути, но человеку явно неудобно. Да и я пробовала через несколько "удобных" способов, но мне быстро это удобство надоело. Хотелось, чтобы с телефона на комп и обратно всё летело так же автоматически и незаметно, как в Notion - в итоге туда и вернулась


  1. Biga
    07.06.2025 15:26

    Не понимаю, почему бы не встроить алгоритм синхронизации прямо в клиент. Да, он не будет доступен удалённо через интернет, но лично мне и не надо. Хочу синхронизоваться по локальной сети в p2p манере без настройки серверов.
    Сейчас пользуюсь локальным webdav на десктопе и obsidian - работает, но так себе.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Вам может понравиться AnyType. Local-First, Peer-to-peer синхронизация внутри одной сети. Алгоритм синхронизации как раз прямо в клиенте. Есть клиенты подо все платформы, в том числе мобильные.


      1. Sol4rinn
        07.06.2025 15:26

        По поводу аналогов Obsidian. Лично для меня в Joplin (AnyType, e.t.c) не хватает возможности сослаться на другую заметку вплоть до блока. Это вот тот функционал, который меня и держит в Obsidian, хотя сам он меня уже весьма устал.


        1. Roman_Cherkasov Автор
          07.06.2025 15:26

          Да, это полезная фича, пользовался ей тоже, но в целом, поиска по названию даже хватает для этих задач. Безусловно дольше, но для меня не стало геймченджером.


          1. Sol4rinn
            07.06.2025 15:26

            А в Joplin плагинами такая штука не настраивается? Тоже пользовался Joplin несколько лет назад. Тогда ушел с него из-за проблемы параллельного редактирования тегов, долго бился с техподдержкой, так и не решили. На тот момент была проблема тегами markdown кажется, которые рушили форматирование в заметке, подробностей не вспомню сейчас...


            1. Roman_Cherkasov Автор
              07.06.2025 15:26

              Не могу подсказать, ещё не во всем функционале разобрался.


  1. Kahelman
    07.06.2025 15:26

    Я в свое время сделал подобное но без заморочек в виде PostgreSQL. Joplin хранит базу данных для синхронизации в виде отдельных файлов и работает по WebDAV. Так что достаточность сервера с поддержкой webdav


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Не уверен что я понял что вы имеете в виду, но да, Joplin можно синкать и по WebDAV. Нюанс только в том что у меня нет WebDAV провайдера нормального.


      1. Kahelman
        07.06.2025 15:26

        А самому на сервере поднять? У lighttpd есть встроенная поддержка WebDAV


        1. 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" )

          HTTP[|/)" {
          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"
          ))
          

          }


          1. Roman_Cherkasov Автор
            07.06.2025 15:26

            Спасибо за развернутый ответ. Но в таком случае уже нет разницы между подходами. Все ещё необходим самостоятельный менеджмент. А так же мы теряем часть функционала который предоставляет нам sync-server, в частности публикацию страниц.


            1. vikarti
              07.06.2025 15:26

              На самом деле есть еще большая разница...которая проявляется когда заметок (включая webclips, часть из которых еще с Evernote) становятся десятки тысяч а вложений (если web clip то там каждая отдельная картинка будет вложением) - сотни тысяч. если использовать WebDAV на apache2 - либо люто зверские тормоза синхронизации и OOM'ы apache (из-за 20 connections Joplin'а сразу с нескольких устройств) либо (если что-то nginx-подобное) просто зверские тормоза с синхронизацией. Joplin Server тут помогает (там не совсем чистый WebDAV). Ну и публикация да.


  1. agronaut
    07.06.2025 15:26

    А Logseq рассматривали? Там синхронизация через облака бесплатная была, выглядит очень прилично


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Пробовал но не погружался, не помню если честно что не подошло.


  1. tolyanski
    07.06.2025 15:26

    Жоплин? Это продолжение статьи про методологию SOSAL? :)


    1. vindy
      07.06.2025 15:26

      Ох уж эти тупые англосаксы, и язык у них смешной, и имена, гыгы. Не то что дворяне Толянские, да, Толян?


      1. tolyanski
        07.06.2025 15:26

        ох уж эти элитные дворяне Душнильские)


  1. Arioch
    07.06.2025 15:26

    ...прочитал заголовок "...как Остановить?"

    И вправду, ну что это за караван какой-то, убийца за убийцей за убийцей. Как в том самом самолете, ей же ей.


  1. autyan
    07.06.2025 15:26

    Я не так давно наткнулся на memos. Очень понравилось: этакие заметки в стиле Telegram — с удобными тегами, календарём и поиском.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Выглядит хорошо, нравится. Когда сделают мобильные приложения - можно будет посмотреть.


      1. dir94
        07.06.2025 15:26

        А уже есть

        https://github.com/mudkipme/MoeMemos

        https://github.com/mudkipme/MoeMemosAndroid

        Но тут надо сказать, что memos это совсем не про "аналог notion". Это скорее аналог google keep


        1. Roman_Cherkasov Автор
          07.06.2025 15:26

          О как, интересно. Но да, выглядит как приложение для немного других задач. Скорее короткие временные заметки / задачи, нежели библиотека.


  1. libroten
    07.06.2025 15:26

    Вдруг кому-то будет полезно.

    Если совсем не хочется заморачиваться с тем, чтобы купить/настроить домен+хостинг, и нету каких-то переживаний за приватность, можно достаточно просто настроить синхронизацию через webdav яндекс диска.

    1. Заводим на яндекс диске папочку для файлов Joplin-а. Я ее так и назвал "Joplin"

    2. В настройках аккаунта яндекса заводим т.н. Пароль приложения, выбираем webdav, сохраняем себе пароль

    3. Идем в настройки синхронизации Joplin, выбираем в качестве способа синхронизации webdav, в поле URL-адрес WebDAV вводим "https://webdav.yandex.ru/<имя папочки на я.диске>" (в моем случае это будет https://webdav.yandex.ru/Joplin)

    4. Имя пользователя - логин в яндексе

    5. Пароль - вводим пароль приложения из п.2.

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


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Жил так с обсидианом, пока Яндекс не сказали что я живу не правильно и что их диском нельзя так пользоваться.


  1. aweselow
    07.06.2025 15:26

    Тема актуальна, тоже привык к Notion и пока сижу на российском yonote, но функционала баз не хватает. А с Appflowy не сравнивали, они также self-hosted сервер в паблике.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Не пользовался базами. Appflowy на мобильных странно выглядит, у yonote нет приложений


  1. ErshoFF
    07.06.2025 15:26

    В joplin в приложении на телефоне сложно отправить вложенные в заметку файлы(например pdf).
    Как решаете?


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      Если расскажете подробнее ваш кейс, может подскажу что. Я просто жму на скрепку, выбираю файл который необходимо вложить и он вкладывается. В том числе PDF.


      1. ErshoFF
        07.06.2025 15:26

        Мобильное приложение на андроид, при удержании "скрепки", "названия документа" в первый раз после запуска приложения менюшка появляется, в последующие разы - не появляется, только отклик вибрации.
        При просто касании - pdf открывается. Но при "поделится" сохраняется с именем в виде хэша файла.


        1. Roman_Cherkasov Автор
          07.06.2025 15:26

          Возможно бага какая-то. У меня в режиме редактирования заметки - просто скрепка снизу слева. Однократное нажатие - вызывает pop-up. Там выбрать файл, выбираю его - он прикрепляется. Появляется ссылка. С компа при этом после синхронизации оно нормально открывается. В обратную сторону тоже работает, только что проверил. Открыл через Adobe PDF Reader встроенный в систему, нажал там три точки -> сохранить на устройстве. В файловом менеджере появилось.

          Возможно дело не в Joplin, а в приложении через которое PDF открывается?


          1. ErshoFF
            07.06.2025 15:26

            Повторяется на разных телефонах и разных версиях android/harmonyos и разных телефонах.
            Проблема есть с файлами pdf и doc/xls, может и с другими, не проверял.
            Повторяется на всех версиях joplin около года, ранее не проверял.


            1. Roman_Cherkasov Автор
              07.06.2025 15:26

              Ну тогда точно только к разрабам в ЛС, либо в PR. У меня пока работает.


  1. TechNerd
    07.06.2025 15:26

    А чем не подошла синхронизация через гит? В obsidian есть куча вариантов плагинов для автоматизации этого процесса. Поднял собственный gitea и все устройства подключил к нему.


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      3 буквы. iOS


    1. Sol4rinn
      07.06.2025 15:26

      А Вы где подняли? Мне всегда было интересно - где надо поднять свой собственный сервер Git, чтобы можно было в любой момент по форс-мажору его перенести/поднять. VPS, домашний сервер?


      1. Roman_Cherkasov Автор
        07.06.2025 15:26

        По форсмажору - это как минимум 2 сервера. Не плохо работает связка Github/Gitlab как основное место разработки + gitea сервер в режиме зеркалирования. Он раз в час ходит и синкает все репы на локальный сервак. В случае недоступности основного - можно продолжить работу на локальном.


  1. vedmak3
    07.06.2025 15:26

    Сделал проще. Выгружаю в mail облако на webdav с включенным шифрованием.

    Также можете заценить TriliumNext Notes


    1. Roman_Cherkasov Автор
      07.06.2025 15:26

      https://habr.com/ru/articles/916514/comments/#comment_28409560
      В этой ветке есть ответ, почему мне не подошел WebDAV


  1. IlyaOsipov
    07.06.2025 15:26

    Чем можно заменить конфлюинс для России бесплатный?



  1. 13werwolf13
    07.06.2025 15:26

    cherrytree или qownnotes, синхронизация между устройствами при помощи syncthing и не нужно крутить довольно тяжёлое серверное ПО для такой простой задачи как ведение заметок. а у упомянутых в статье решений даже клиент тяжеловесный (собственно а что ещё ожидать от вебни, это же не нативный софт).


  1. HSerg
    07.06.2025 15:26

    А почему PostgreSQL, а не SQLite? Встречал оценку, что до 5-10 активных пользователей использовать PostgreSQL смысла нет.