Заметки с end-to-end шифрованием становятся стандартом для пользователей, заботящихся о приватности. Два наиболее зрелых open-source решения в этой нише — Notesnook и Standard Notes — предлагают возможность самостоятельного размещения сервера синхронизации. Этот обзор анализирует практические аспекты селф-хостинга обоих решений: от архитектуры и системных требований до интеграции с клиентскими приложениями и типичных проблем при развёртывании.
Архитектура и компоненты
Standard Notes
Standard Notes использует микросервисную архитектуру, существенно упрощённую в версии 2 (февраль 2023)1. Текущая версия состоит из четырёх Docker-контейнеров вместо тринадцати в legacy-версии, что привело к сокращению потребления памяти на 65%2.
Основные компоненты:
- API Gateway — точка входа, маршрутизирующая запросы от клиентов к внутренним сервисам
- Syncing Server (+ Worker) — управление данными пользователей и синхронизация; Worker обрабатывает асинхронные задачи (email-бэкапы, история ревизий)
- Auth Service (+ Worker) — авторизация и аутентификация; Worker занимается задачами вроде удаления аккаунтов
- MySQL — основная база данных
- Redis — кэш и очередь сообщений между сервисами
- LocalStack — эмуляция S3 для хранения файлов (вложения, зашифрованные бэкапы)
Web-приложение — отдельный контейнер, не входящий в базовый стек. Его можно развернуть дополнительно через docker run -d -p 3000:80 standardnotes/web3.
Notesnook
Notesnook построен на .NET 8 и состоит из трёх core-сервисов4:
- Notesnook.API — основной сервис синхронизации данных
- Streetwriters.Identity — аутентификация и авторизация
- Streetwriters.Messenger — Server-Sent Events для real-time синхронизации
Инфраструктурные зависимости:
- MongoDB — база данных
- MinIO — S3-совместимое хранилище для вложений
- cors-proxy — обработка CORS-запросов
Дополнительно может быть развёрнут web-клиент (React-приложение) и Monograph Server для публичного шаринга заметок.
Сравнение архитектур
| Аспект | Standard Notes | Notesnook |
|---|---|---|
| Контейнеры (минимум) | 4 | 5-6 |
| База данных | MySQL | MongoDB |
| Файловое хранилище | LocalStack (S3) | MinIO (S3) |
| Кэш/очереди | Redis | — |
| Runtime | Node.js | .NET 8 |
| Лицензия | AGPL-3.0 | AGPL-3.0 |
Системные требования
Standard Notes
Официальные минимальные требования2:
- ОС: Linux (Ubuntu 22.04 или совместимый дистрибутив)
- RAM: 2 ГБ (минимум), 4 ГБ рекомендуется
- CPU: 1 vCore
- Docker: актуальная версия
- Хранилище: зависит от объёма заметок и вложений; 10 ГБ для начала
Notesnook
Официальные требования не формализованы (альфа-стадия). По данным сообщества56:
- RAM: 2 ГБ (минимум), 4 ГБ рекомендуется (MongoDB потребляет больше при росте базы)
- Docker и Docker Compose
- Хранилище: от 10 ГБ (MongoDB + MinIO)
- Сеть: несколько портов (5264, 6264, 7264, 8264, 9090, 9009)
Для сборки из исходников потребуется .NET 8 SDK и Git4.
Процесс развёртывания
Standard Notes: Docker (рекомендуемый метод)
Standard Notes предоставляет подробную официальную документацию2. Процесс:
1. Подготовка рабочей директории:
mkdir standardnotes && cd standardnotes
2. Получение конфигурационных файлов:
curl https://raw.githubusercontent.com/standardnotes/server/main/.env.sample > .env
curl https://raw.githubusercontent.com/standardnotes/server/main/docker-compose.example.yml > docker-compose.yml
curl https://raw.githubusercontent.com/standardnotes/server/main/docker/localstack_bootstrap.sh > localstack_bootstrap.sh
chmod +x localstack_bootstrap.sh
3. Генерация секретов и настройка .env:
openssl rand -hex 32 # для AUTH_JWT_SECRET, VALET_TOKEN_SECRET и др.
openssl rand -hex 12 # для DB_PASSWORD
Ключевые переменные: DB_PASSWORD, AUTH_JWT_SECRET, VALET_TOKEN_SECRET, ENCRYPTION_SERVER_KEY. Пароль БД указывается в трёх местах: .env и два раза в docker-compose.yml (MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD)2.
4. Запуск:
docker compose pull && docker compose up -d
5. Проверка:
Сервер доступен по http://localhost:3000. Логи: tail -f logs/*.log2.
6. Настройка HTTPS (для продакшна):
Reverse proxy (Nginx, Traefik или Caddy) с SSL-сертификатом. Standard Notes предоставляет отдельную документацию по настройке HTTPS7.
Notesnook: Docker
Официальная документация минимальна (помечена как TODO)4. Базовый процесс:
1. Получение docker-compose.yml:
wget https://raw.githubusercontent.com/streetwriters/notesnook-sync-server/master/docker-compose.yml
2. Запуск:
docker compose up
Docker Compose автоматически поднимает MongoDB, MinIO и три core-сервиса4.
Однако для production-развёртывания этого недостаточно. Сообщество создало расширенные конфигурации568, которые включают:
- Создание структуры директорий для данных (
database/,storage/,config/) - Настройку
.envфайла с доменами, SMTP-credentials, токенами API - Конфигурацию reverse proxy с поддержкой WebSocket для субдоменов
- Инициализацию MongoDB replica set
Пример структуры:
/srv/notesnook/
database/ # MongoDB data
storage/ # MinIO data
config/ # Environment и конфигурация
Для Notesnook требуется настройка нескольких субдоменов: отдельные для API, Identity, Messenger и (опционально) web-клиента5.
Сравнение процесса развёртывания
| Критерий | Standard Notes | Notesnook |
|---|---|---|
| Официальная документация | Подробная, пошаговая2 | Минимальная, помечена как TODO4 |
| Docker Compose “из коробки” | Работает сразу | Требует доработки для продакшна |
| Количество шагов до рабочего сервера | 5-6 | 8-10 (с учётом субдоменов) |
| Community-гайды | Есть, как дополнение9 | Основной источник информации56 |
| Поддержка | GitHub Issues, Discord | Без поддержки (альфа)4 |
Подписка и premium-функции
Standard Notes: модель подписки для self-hosted
Standard Notes предлагает два пути получения premium-функций на self-hosted сервере10:
Путь 1 — Server-side подписка (бесплатно):
Создаётся вручную через SQL-команды в MySQL. Разблокирует серверные функции (синхронизация файлов, история ревизий, email-бэкапы), но не разблокирует клиентские функции (Super Notes, вложенные теги, расширенные редакторы)10.
Путь 2 — Offline-подписка (платно):
Приобретается на сайте Standard Notes. Разблокирует все функции, включая клиентские. Стоимость значительно ниже облачной подписки11:
| План | Облачная цена | Offline-цена |
|---|---|---|
| Productivity | $90/год | ~$30/год |
| Professional | $120/год | ~$39/год |
Для пользователя с существующим ключом Standard Notes: offline-подписка активируется через код в приложении. Процесс: покупка offline-плана на сайте, получение кода активации, ввод в Desktop/Mobile клиенте через Settings. Существующий ключ облачной подписки не переносится на self-hosted сервер напрямую — это разные системы авторизации10.
Notesnook: бесплатная модель
Notesnook при селф-хостинге не требует подписки для использования серверных функций4. Все возможности синхронизации доступны бесплатно на собственном сервере. Однако некоторые клиентские функции (вложения, расширенное редактирование) требуют Pro-подписки Notesnook ($49.99/год или $4.99/мес)12, при этом пока не документировано, как именно подписка взаимодействует с self-hosted инстансом.
Интеграция с клиентскими приложениями
Standard Notes
Desktop-приложения (Windows, macOS, Linux) и мобильные (iOS, Android) полностью поддерживают подключение к self-hosted серверу2:
- Открыть меню аккаунта
- Нажать “Advanced options”
- Выбрать “Custom” в разделе “Sync Server”
- Ввести URL сервера (например,
https://sync.example.org) - Зарегистрировать новый аккаунт или войти в существующий
Web-приложение (app.standardnotes.com) не поддерживает подключение к self-hosted серверу из-за Content Security Policy (CSP), ограничивающей домены для подключения3. Для веб-доступа необходимо развернуть собственный экземпляр web-приложения:
docker run -d -p 3001:80 standardnotes/web
Это существенное ограничение: для полноценного использования с браузера требуется дополнительный контейнер и настройка домена.
Notesnook
Начиная с версии 3.0.14, все клиенты Notesnook поддерживают настройку custom server URL через Settings > Server13:
- Desktop: Windows, macOS, Linux
- Mobile: iOS, Android
- Web: web.notesnook.com (или self-hosted web-клиент)
Преимущество Notesnook — возможность динамически переключаться между серверами без переустановки приложения13. Все клиенты работают идентично с self-hosted инстансом и облачным сервисом.
Сравнение клиентской интеграции
| Клиент | Standard Notes | Notesnook |
|---|---|---|
| Desktop (Win/Mac/Linux) | Custom server через Advanced options | Custom server через Settings |
| Mobile (iOS/Android) | Custom server через Advanced options | Custom server через Settings |
| Официальный web-app | Не работает с self-hosted (CSP)3 | Работает с self-hosted13 |
| Self-hosted web-app | Требует отдельного контейнера | Включён в стек (опционально) |
| Смена сервера “на лету” | Требует перелогин | Динамическое переключение |
End-to-end шифрование
Standard Notes
Шифрование происходит полностью на стороне клиента до отправки данных на сервер. Сервер хранит только зашифрованные данные и не имеет возможности их расшифровать (zero-knowledge архитектура)14. При self-hosted развёртывании модель шифрования не меняется — ключи шифрования генерируются и хранятся на устройстве пользователя.
Standard Notes прошёл независимый аудит безопасности, результаты которого опубликованы14.
Notesnook
Notesnook использует XChaCha20-Poly1305 для шифрования с Argon2 для деривации ключей15. Как и в случае Standard Notes, шифрование — клиентское, сервер получает только зашифрованные данные.
Дополнительно Notesnook предоставляет инструмент Vericrypt — офлайн-верификатор, позволяющий убедиться, что данные действительно зашифрованы end-to-end16. Vericrypt работает с реальными данными аккаунта и подтверждает корректность деривации ключей.
Notesnook не проходил формальный аудит безопасности, но весь код открыт (включая серверную часть), что позволяет независимую верификацию15.
Влияние self-hosted на шифрование
В обоих случаях self-hosting не ослабляет шифрование. Напротив, он добавляет контроль над метаданными: владелец сервера контролирует access-логи, IP-адреса подключений и временные метки синхронизации, которые в облачной модели доступны провайдеру.
Резервное копирование и миграция
Standard Notes
Бэкап сервера:
docker compose down
# Скопировать директорию data/ целиком
cp -r data/ /backup/standardnotes-$(date +%Y%m%d)/
docker compose up -d
Миграция из облака: Экспорт данных из облачного аккаунта (Settings > Backups > Download), затем импорт на self-hosted сервере через регистрацию нового аккаунта и импорт бэкапа. Аккаунт не “переносится” — создаётся новый7.
Миграция V1 → V2: Standard Notes предоставляет инструкции по обновлению legacy-инсталляций до версии 22.
Notesnook
Бэкап: MongoDB и MinIO требуют раздельного бэкапа. Для MongoDB: mongodump, для MinIO: копирование директории данных4.
Миграция из облака: Notesnook поддерживает экспорт в несколько форматов (Markdown, HTML, текст). Импорт на self-hosted сервере возможен через стандартный механизм импорта в клиенте13.
Типичные проблемы и решения
Standard Notes
Бесконечный цикл авторизации (infinite login loop)
Наиболее часто упоминаемая проблема в сообществе917. Причина — неверно заданная переменная COOKIE_DOMAIN в .env. Значение должно точно соответствовать домену, через который клиенты подключаются к серверу.
# Правильно:
COOKIE_DOMAIN=sync.example.org
# Неправильно (с протоколом или портом):
COOKIE_DOMAIN=https://sync.example.org:3000
Ошибки загрузки файлов
Files Server работает на отдельном порте (3125 по умолчанию). Если reverse proxy не маршрутизирует этот порт, загрузка файлов не работает. Решение — настроить отдельный проксирующий location или субдомен для файлового сервера2.
Проблемы мобильных приложений с сертификатами
Self-signed сертификаты или сертификаты от нестандартных CA могут не приниматься мобильными клиентами. Решение — использовать Let’s Encrypt9.
Web-приложение не подключается
Штатное ограничение: app.standardnotes.com блокирует запросы к нестандартным серверам через CSP3. Решение — развернуть собственный экземпляр web-приложения.
Notesnook
Нестабильность (альфа-стадия)
Главная проблема — self-hosting находится в альфа-стадии. Разработчики прямо предупреждают: “expect a lot of things not to work when connected to your own instance”4. Рекомендация — использовать для экспериментов, не для production.
Ошибки при загрузке вложений
Пользователи сообщают о “Network Error” и файлах размером 0 при загрузке через MinIO18. Причина — некорректная конфигурация MinIO endpoint или отсутствие HTTPS. Решение — использовать HTTPS для MinIO endpoint и проверить bucket policies.
MongoDB replica set
Notesnook требует инициализации MongoDB replica set, что не всегда очевидно из минимальной документации5. Без replica set некоторые операции (транзакции, change streams) не работают.
SMTP-конфигурация
Для регистрации и восстановления пароля требуется рабочий SMTP-сервер. Без него — невозможно создать аккаунт через web-интерфейс5.
Отсутствие документации
Основная практическая проблема. Официальная документация помечена как TODO. Сообщество создало неофициальные гайды568, но они быстро устаревают.
Обновление сервера
Standard Notes
Процесс обновления документирован2:
docker compose down
# Обновить docker-compose.yml, .env, localstack_bootstrap.sh
docker compose pull
docker compose up -d
Перед обновлением рекомендуется сделать полный бэкап данных.
Notesnook
Процесс обновления не документирован официально. Предполагаемый подход:
docker compose down
docker compose pull
docker compose up -d
Риск: при отсутствии миграционных скриптов обновления могут сломать существующую базу данных.
Итоговое сравнение
| Критерий | Standard Notes | Notesnook |
|---|---|---|
| Зрелость self-hosting | Production-ready (V2, с 2023)1 | Альфа-стадия4 |
| Документация | Подробная официальная2 | Минимальная, community-гайды5 |
| Простота развёртывания | Средняя (5-6 шагов) | Низкая (субдомены, replica set) |
| Минимум RAM | 2 ГБ | 2 ГБ |
| E2E шифрование | Да, аудирован14 | Да, XChaCha20-Poly130515 |
| Web-app с self-hosted | Требует отдельного контейнера3 | Поддерживается нативно13 |
| Premium на self-hosted | Offline-подписка ~$39/год11 | Бесплатно (серверные функции) |
| Существующий ключ | Нужна отдельная offline-подписка10 | Не применимо |
| Поддержка мобильных | iOS, Android (custom server)2 | iOS, Android (custom server)13 |
| Стабильность | Высокая | Низкая (альфа) |
| Бэкап | Документирован | Ручной (mongodump + MinIO) |
| Лицензия | AGPL-3.0 | AGPL-3.0 |
Рекомендации
Standard Notes — обоснованный выбор для production self-hosting:
- Зрелая инфраструктура с документированным процессом развёртывания
- Прошёл аудит безопасности
- При наличии существующего ключа: потребуется приобрести offline-подписку ($39/год) для полного набора функций на self-hosted сервере — облачная подписка не переносится
- Основной недостаток — необходимость отдельного контейнера для web-приложения
Notesnook — перспективный, но незрелый вариант:
- Бесплатный self-hosting без ограничений серверных функций
- Более современная клиентская архитектура (динамическое переключение серверов)
- Не готов для production-использования (альфа-стадия, нет документации, нет поддержки)
- Стоит отслеживать развитие — команда заявила, что self-hosting станет приоритетом после стабилизации v313
Для пользователя с существующим ключом Standard Notes оптимальный путь: развернуть Standard Notes Server через Docker, приобрести offline Professional подписку ($39/год), настроить reverse proxy с Let’s Encrypt, подключить desktop и mobile клиенты через “Custom Sync Server”. Web-доступ — через отдельный контейнер standardnotes/web.
Дискуссионные вопросы и противоречия
Стоимость self-hosting vs. облачной подписки. Offline-подписка Standard Notes ($39/год) дешевле облачной ($120/год), но к ней добавляется стоимость серверной инфраструктуры (VPS от $5-10/мес). При использовании домашнего сервера экономия существенна; при аренде VPS — менее очевидна9.
Notesnook: open-source без реального self-hosting. Несмотря на AGPLv3-лицензию и открытый серверный код, практическая возможность self-hosting остаётся ограниченной из-за альфа-стадии и отсутствия документации. Часть сообщества рассматривает это как “номинальный open-source”18.
Безопасность self-hosted vs. облачного. E2E-шифрование одинаково в обоих случаях. Аргумент за self-hosting — контроль над метаданными и отсутствие зависимости от жизнеспособности компании-провайдера. Аргумент против — необходимость самостоятельно обеспечивать безопасность сервера (обновления, firewall, мониторинг)1415.
Quality Metrics
| Метрика | Значение |
|---|---|
| Источников найдено | 24 |
| Источников процитировано | 18 |
| Типы источников | official: 8, community: 5, GitHub: 3, news: 2 |
| Покрытие цитатами | ~92% |
| Подвопросов исследовано | 8 |
| Раундов исследования | 2 (initial + verification) |
Standard Notes — Self-hosting with Docker ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Standard Notes — Self-hosting Web App with Docker ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
GitHub — streetwriters/notesnook-sync-server ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Notesnook sync server: a Noob-Friendly Setup Tutorial (Lemmy) ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Take Control of Your Notes: Self-Hosting Notesnook in Your Homelab (TechDecode) ↩︎ ↩︎ ↩︎ ↩︎
How to completely self-host Standard Notes (The Self-Hosting Blog) ↩︎ ↩︎ ↩︎ ↩︎
Standard Notes — Subscriptions on your self-hosted server ↩︎ ↩︎ ↩︎ ↩︎
Notesnook — Open source & zero knowledge private note taking app ↩︎
GitHub — streetwriters/notesnook (encryption documentation) ↩︎ ↩︎ ↩︎ ↩︎
Selfhosted Standard Notes with Docker and Traefik (ae3.ch) ↩︎