Как установить и настроить Joplin Server на VPS
Joplin — удобный опенсорсный блокнот с шифрованием, markdown и клиентами на все платформы, но по умолчанию он синхронизируется через Dropbox, OneDrive или Joplin Cloud — то есть ваши заметки лежат на чужих серверах. Joplin Server решает эту проблему: вы поднимаете собственную точку синхронизации на своём VPS, и все данные — от паролей до рабочих черновиков — остаются под вашим контролем. Ниже — рабочая установка через Docker Compose с PostgreSQL, HTTPS-сертификатом и подключением клиентов.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что нужно перед установкой
Joplin Server — легковесное Node.js-приложение, оно не требовательно к ресурсам. Для личного использования и небольшой команды (до 10-15 человек) достаточно:
- VPS с 1 vCPU и 1-2 ГБ RAM — этого хватает с запасом, база данных заметок редко превышает пару гигабайт даже при активном использовании с вложениями;
- Ubuntu 24.04 или Debian 12 — в статье команды даны под Ubuntu, для Debian они идентичны;
- Домен или поддомен (например,
notes.example.com), направленный A-записью на IP сервера — без домена не получится честно выпустить HTTPS-сертификат, а без HTTPS клиенты Joplin будут ругаться на синхронизацию; - Docker и Docker Compose — если ещё не установлены, разверните их по отдельной инструкции, там разобраны нюансы для продакшена.
Открытых портов наружу нужно всего два — 80 и 443 для реверс-прокси. Сам Joplin Server будет слушать только на localhost, наружу его слать не нужно.
Docker Compose: Joplin Server и PostgreSQL
Joplin Server умеет работать с SQLite, но для сервера, который будет крутиться постоянно и синхронизировать несколько устройств, разработчики сами рекомендуют PostgreSQL — он устойчивее к параллельным запросам и проще в бэкапе. Создайте директорию проекта и файлы:
mkdir -p /opt/joplin-server/data/postgres
cd /opt/joplin-server
Файл .env с паролем базы — не коммитьте его никуда, сгенерируйте случайную строку:
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_BASE_URL=https://notes.example.com
EOF
Замените notes.example.com на реальный домен. Теперь docker-compose.yml:
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: joplin
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: joplin
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- joplin_net
app:
image: joplin/server:latest
restart: unless-stopped
depends_on:
- db
ports:
- "127.0.0.1:22300:22300"
environment:
APP_PORT: 22300
APP_BASE_URL: ${APP_BASE_URL}
DB_CLIENT: pg
POSTGRES_HOST: db
POSTGRES_PORT: 5432
POSTGRES_DATABASE: joplin
POSTGRES_USER: joplin
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
MAILER_ENABLED: "0"
STORAGE_DRIVER: "Type=Filesystem; Path=/app/data"
volumes:
- ./data/attachments:/app/data
networks:
- joplin_net
networks:
joplin_net:
Обратите внимание на STORAGE_DRIVER. По умолчанию Joplin Server хранит вложения (файлы, картинки) прямо в PostgreSQL как blob-объекты — это работает, но раздувает базу и усложняет бэкап. Вынос вложений в файловую систему через Filesystem-драйвер держит базу компактной, а сами файлы бэкапятся как обычная директория.
MAILER_ENABLED: "0" отключает почтовые уведомления — без него при первом запуске сервер будет ругаться в логи на отсутствие SMTP. Если нужны письма для сброса пароля пользователям (актуально, если сервер общий на команду), позже добавьте блок MAILER_HOST, MAILER_PORT, MAILER_SECURITY, MAILER_AUTH_USER, MAILER_AUTH_PASSWORD — данные обычного SMTP-релея подойдут.
Поднимаем:
docker compose up -d
docker compose logs -f app
В логах должно появиться что-то вроде Server started без ошибок подключения к БД. Если видите ECONNREFUSED на порт 5432 — контейнер db ещё не успел проинициализироваться, подождите 10-15 секунд, depends_on гарантирует только порядок старта контейнеров, но не готовность PostgreSQL принимать соединения.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверРеверс-прокси и SSL-сертификат
Joplin Server слушает на 127.0.0.1:22300 без TLS — снаружи его нужно прикрыть реверс-прокси с HTTPS. Проще всего это сделать через Caddy — он сам выпускает и продлевает сертификат Let's Encrypt, конфиг занимает три строки. Если Caddy ещё не установлен, разверните его по инструкции по установке Caddy с авто-SSL.
Конфиг /etc/caddy/Caddyfile:
notes.example.com {
reverse_proxy 127.0.0.1:22300
}
Перезапустите Caddy:
systemctl reload caddy
Через 10-30 секунд домен должен открыться по HTTPS с валидным сертификатом. Если предпочитаете Nginx с Certbot — это тоже рабочий вариант, просто потребует чуть больше ручной настройки сертификата отдельно от конфига прокси.
Важный момент: APP_BASE_URL в .env должен точно совпадать с адресом, по которому клиенты будут стучаться на сервер, включая протокол https://. Если поменяете домен позже — обновите переменную и пересоздайте контейнер app (docker compose up -d --force-recreate app), иначе клиенты будут получать битые ссылки на вложения.
Первый запуск и учётные записи
Откройте https://notes.example.com в браузере — увидите веб-интерфейс администрирования Joplin Server. Данные для входа по умолчанию:
- Email:
admin@localhost - Пароль:
admin
Это первое, что нужно поменять. Зайдите под этим аккаунтом → Users → откройте профиль администратора → смените email на реальный и задайте длинный пароль. Оставлять дефолтные креды на публично доступном сервере — это фактически открытая дверь к вашим заметкам.
Дальше, если сервер не только для вас, создайте пользователей: Users → New User, укажите email, задайте пароль (или, если настроен MAILER, пользователь получит письмо с приглашением сам задать пароль). Каждому пользователю можно ограничить квоту на объём хранимых данных через поле Max Item Size — полезно, если сервер общий на команду и кто-то один не должен занять всё место вложениями.
Веб-интерфейс также показывает базовую статистику: сколько пользователей, общий объём хранилища, версию приложения — удобно для быстрой проверки, что всё живо, без захода в логи контейнера.
Подключение клиентов Joplin
На каждом устройстве, где стоит Joplin (desktop, Android, iOS), настройка одинаковая:
- Откройте Настройки → Синхронизация (в десктопном приложении: Tools → Options → Synchronisation).
- В поле Target выберите Joplin Server.
- Укажите:
- Email: ваш email пользователя
- Password: пароль пользователя
- Joplin Server URL:
https://notes.example.com
- Нажмите Synchronise (или Check synchronisation configuration — она проверит соединение без реального запуска синка).
Если конфигурация подтвердилась — жмите синхронизацию. Первый синк с уже существующим блокнотом заметок может занять несколько минут в зависимости от объёма — Joplin шифрует и загружает каждую заметку и вложение отдельными запросами, это не мгновенно, особенно если у вас накопилось много прикреплённых файлов.
Отдельно стоит включить End-to-End Encryption (в тех же настройках синхронизации, вкладка Encryption) — тогда даже администратор Joplin Server физически не сможет прочитать содержимое ваших заметок в базе, он видит только зашифрованные блобы. Единственный нюанс — обязательно сохраните мастер-пароль шифрования в надёжном месте: Joplin Server его не хранит и восстановить доступ без него нельзя.
Бэкапы, обновление и обслуживание
Бэкапить нужно два места: базу PostgreSQL и директорию вложений.
# дамп базы
docker compose exec db pg_dump -U joplin joplin > joplin_$(date +%F).sql
# вложения — обычная директория, можно rsync или tar
tar czf attachments_$(date +%F).tar.gz ./data/attachments
Вынесите эти команды в cron и складывайте архивы на отдельное хранилище (не на тот же диск, где крутится сервер) — если интересует более системный подход к бэкапам с ретеншеном и шифрованием, посмотрите сравнение решений для бэкапа сервера, принципы там применимы и к Joplin.
Обновление до новой версии — обычная процедура для Docker-стека:
docker compose pull
docker compose up -d
Перед крупным обновлением (смена мажорной версии Joplin Server) стоит сделать свежий дамп базы — на всякий случай, миграции схемы у Joplin Server применяются автоматически при старте контейнера, и откатить их вручную сложнее, чем восстановиться из бэкапа.
Раз в пару месяцев стоит заглядывать в объём директории data/postgres и data/attachments — если сервер общий на несколько активных пользователей с большими вложениями (сканы, фото), место может закончиться быстрее, чем кажется. df -h в cron с алертом на 80% занятости диска решает эту проблему заранее.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли обойтись без домена и работать по IP?
Технически да, но тогда не получится честно выпустить Let's Encrypt сертификат, а Joplin-клиенты требуют HTTPS для синхронизации (самоподписанный сертификат придётся вручную добавлять в доверенные на каждом устройстве, это неудобно и хрупко). Домен или хотя бы бесплатный поддомен — практичнее.
Обязательно ли использовать PostgreSQL, или SQLite тоже подойдёт?
SQLite работает и официально поддерживается, но при нескольких одновременно синхронизирующихся устройствах или пользователях возможны блокировки базы под нагрузкой. Для одного человека с парой устройств SQLite вполне достаточно, для команды — лучше сразу PostgreSQL.
Как перенести Joplin Server на другой VPS?
Остановите контейнеры, скопируйте директорию /opt/joplin-server целиком (включая data/postgres и data/attachments) на новый сервер, поднимите тот же docker-compose.yml, обновите DNS-запись на новый IP. Данные внутри тома PostgreSQL переносятся вместе с файлами, отдельный экспорт/импорт не нужен.
Что делать, если забыт пароль администратора?
Зайдите в контейнер базы и обновите пароль напрямую через SQL, либо создайте нового пользователя с правами admin через переменные окружения при первом запуске (см. документацию Joplin Server на предмет SUPPORT_EMAIL и служебных флагов) — для разового случая проще всего временно включить MAILER и воспользоваться формой сброса пароля через email.
Нужен ли для Joplin Server отдельный VPS или можно на том же, где уже крутятся другие сервисы?
Можно спокойно ставить рядом с другими Docker-приложениями на одном VPS — Joplin Server потребляет минимум ресурсов в простое. Главное — не забыть про отдельный поддомен и не конфликтовать портами в конфиге реверс-прокси.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →