Как самостоятельно развернуть Standard Notes на Ubuntu 22.04

Краткое введение
Standard Notes — это открытое и полностью зашифрованное приложение для заметок. Оно доступно в бесплатной и платной версиях и поддерживает как облачный хостинг, так и самостоятельный хостинг на вашем сервере. При самостоятельном хостинге вы храните и синхронизируете заметки между устройствами через собственный сервер. Приложения Standard Notes доступны для всех настольных операционных систем и мобильных платформ.
В этом руководстве описаны все шаги, необходимые для развёртывания и поддержки самостоятельного сервера Standard Notes на Ubuntu 22.04. Кроме базовой установки вы узнаете, как включить платные функции и загрузку файлов, настроить SSL, обеспечить безопасность и организовать резервное копирование.
Важные определения
- Self-host: запуск сервиса на собственном сервере под вашим контролем.
- Files server: отдельный поддомен и сервис для хранения пользовательских загруженных файлов.
- .env: файл окружения с конфигурацией сервера.
Основные идеи из руководства
- Используйте Docker Compose v2 (команда docker compose).
- Nginx выполняет роль обратного прокси и разграничивает TLS/HTTP.
- Certbot (snap) генерирует и обновляет сертификаты Let’s Encrypt.
- Доступ к загрузке файлов требует прав на каталог uploads и ручного задания квоты.
Требования
- Сервер с Ubuntu 22.04 и минимум 2 ГБ оперативной памяти. Рекомендовано 4 ГБ+ для стабильной работы в продакшне.
- Ненулевой (не root) пользователь с правами sudo.
- UFW (Uncomplicated Firewall) включён и настроен.
- Два полностью квалифицированных доменных имени (FQDN): одно для приложения (в примере standardnotes.example.com), второе для файлового сервера (в примере snotes-files.example.com).
- Система обновлена: выполните
$ sudo apt update && sudo apt upgradeПримечание: во всём руководстве сохраняйте оригинальные пути к файлам и имена, если вы хотите точно повторить все команды.
Шаг 1 — Настройка брандмауэра
Прежде чем устанавливать пакеты, разрешите HTTP/HTTPS через UFW.
Проверка статуса UFW:
$ sudo ufw statusПример вывода:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)Разрешите HTTP и HTTPS:
$ sudo ufw allow http
$ sudo ufw allow httpsПроверьте ещё раз:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)Совет по безопасности: запретите доступ по SSH по паролю и включите аутентификацию по ключам, затем ограничьте доступ по IP, если это применимо.
Шаг 2 — Установка Docker и Docker Compose
Добавьте официальный GPG-ключ Docker:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpgДобавьте репозиторий Docker:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullОбновите индексы пакетов и установите Docker и плагин Compose v2:
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-pluginВажно: этот туториал использует Docker Compose v2, поэтому команда будет выглядеть как docker compose (без дефиса).
Чтобы не использовать sudo постоянно, добавьте текущего пользователя в группу docker:
$ sudo usermod -aG docker ${USER}Примените изменения группы (выполните выход и повторный вход в сессию) или:
$ su - $(USER)Проверьте установку:
$ docker --version
$ docker compose versionШаг 3 — Установка Nginx
Ubuntu 22.04 может поставлять старую версию Nginx, поэтому мы подключим официальный репозиторий Nginx для стабильной ветки.
Импорт ключа подписи Nginx:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/nullДобавьте репозиторий стабильной версии:
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.listОбновите индексы и установите Nginx:
$ sudo apt update
$ sudo apt install nginxПроверьте версию:
$ nginx -v
nginx version: nginx/1.22.0Совет: для продакшн-систем рассмотрите использование автоматизированного менеджмента конфигураций (Ansible, Terraform) для воспроизводимости.
Шаг 4 — Установка SSL с Certbot (Snap)
Для TLS мы будем использовать Certbot из snap, чтобы получать актуальную версию.
Обновите core snap и установите Certbot:
$ sudo snap install core
$ sudo snap install --classic certbotСоздайте символьную ссылку, чтобы запускать certbot как /usr/bin/certbot:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotГенерация сертификата для основного домена:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d standardnotes.example.comАналогично для файлового поддомена:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d snotes-files.example.comСоздайте параметр Diffie-Hellman (dhparam) для повышения стойкости TLS:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Чтобы Certbot мог автоматически останавливать и перезапускать Nginx при обновлении сертификатов, добавьте хуки в файлы конфигурации обновления Let’s Encrypt:
Откройте файл:
$ sudo nano /etc/letsencrypt/renewal/standardnotes.example.com.confВставьте внизу:
pre_hook = systemctl stop nginx
post_hook = systemctl start nginxПовторите для snotes-files.example.com.
Проверьте dry-run обновления:
$ sudo certbot renew --dry-runЕсли ошибок нет — автоматическое обновление сертификатов настроено.
Важно: если вы используете прокси перед Nginx (например, Cloudflare в режиме reverse proxy), порядок действий с Certbot может отличаться.
Шаг 5 — Загрузка и настройка Standard Notes
Перейдите в домашнюю директорию и клонируйте репозиторий Standalone:
$ cd ~
$ git clone --single-branch --branch main https://github.com/standardnotes/standalone.git
$ cd standaloneСоздайте конфигурационные файлы по умолчанию:
$ ./server.sh setupГенерация ключей и секретов
Standard Notes требует несколько секретов. Вы можете генерировать их с помощью openssl:
$ openssl rand -hex 32Откройте файл .env и отредактируйте основные переменные. Например:
$ nano .env
NODE_ENV=production
..
AUTH_JWT_SECRET=c0f5bcf6f0f0dcca5b9078c3095e4255a055dfd6376b376733af0e50483cc629
..
DB_USERNAME=std_notes_user
DB_PASSWORD=changeme123
..
VALET_TOKEN_SECRET=977c978ca1d5ea22fe2fda65058905b191f724e33db6e47d0a41e034a082cb3b
..
FILES_SERVER_URL=https://snotes-files.example.comСохраните и закройте файл.
Далее отредактируйте docker/auth.env:
$ nano docker/auth.env
JWT_SECRET=54deb1b0b2499e8d875b0d5266dabef9003e13c1787a959a94e339363c10e56e
LEGACY_JWT_SECRET=c36aae01803a616213f22422b6d3f998a2beb2cb53af8b95bf578a8a3d046cec
..
PSEUDO_KEY_PARAMS_KEY=ea09d3f9122b49c653524cd2285a45fee88beb94f9b76d4d25420b521b080fcd
..
ENCRYPTION_SERVER_KEY=04decf379fbe3bb48cf95dbb5997031418b308e724a25d88cb0b2ed6da725efeСохраните.
Совет: храните секреты в менеджере секретов (Vault, AWS Secrets Manager) для продакшна и не коммитьте их в Git.
Шаг 6 — Запуск Standard Notes
Запустите сервер:
$ ./server.sh startПроцесс может занять несколько минут — Docker загрузит образы и создаст контейнеры, выполнит миграции БД.
Просмотр логов:
$ ./server.sh logsОстановить вывод логов: Ctrl+C.
Проверка статуса контейнеров:
$ ./server.sh statusПример вывода:
Services State:
NAME COMMAND SERVICE STATUS PORTS
api-gateway-standalone "./wait-for.sh auth …" api-gateway running 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp
auth-standalone "./wait-for.sh db 33…" auth running
auth-worker-standalone "./wait-for.sh db 33…" auth-worker running
cache-standalone "docker-entrypoint.s…" cache running 6379/tcp
db-standalone "docker-entrypoint.s…" db running 3306/tcp
files-standalone "./wait-for.sh db 33…" files running 0.0.0.0:3125->3000/tcp, :::3125->3000/tcp
syncing-server-js-standalone "./wait-for.sh db 33…" syncing-server-js running
syncing-server-js-worker-standalone "./wait-for.sh db 33…" syncing-server-js-worker runningПроверка здоровье-сёрвиса:
$ curl http://localhost:3000/healthcheck
OKЕсли вы изменяли порт в .env, замените 3000 на ваш порт.
Шаг 7 — Конфигурация Nginx
Откройте основной конфиг Nginx и добавьте строку для увеличения bucket size (это помогает при длинных именах серверов):
$ sudo nano /etc/nginx/nginx.confДобавьте перед include /etc/nginx/conf.d/*.conf;:
server_names_hash_bucket_size 64;Создайте файл конфигурации для основного домена:
$ sudo nano /etc/nginx/conf.d/standardnotes.confВставьте (замените domain на свой):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name standardnotes.example.com;
client_max_body_size 50M;
access_log /var/log/nginx/standardnotes.access.log;
error_log /var/log/nginx/standardnotes.error.log;
ssl_certificate /etc/letsencrypt/live/standardnotes.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/standardnotes.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/standardnotes.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_cache off;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name standardnotes.example.com;
return 301 https://$host$request_uri;
}Создайте конфигурацию для файлового поддомена:
$ sudo nano /etc/nginx/conf.d/files-standardnotes.confВставьте:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name snotes-files.example.com;
client_max_body_size 50M;
access_log /var/log/nginx/files-standardnotes.access.log;
error_log /var/log/nginx/files-standardnotes.error.log;
ssl_certificate /etc/letsencrypt/live/snotes-files.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/snotes-files.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/snotes-files.example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
proxy_pass http://127.0.0.1:3125;
proxy_cache off;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name snotes-files.example.com;
return 301 https://$host$request_uri;
}Проверьте конфигурацию:
$ sudo nginx -tПерезапустите Nginx:
$ sudo systemctl restart nginxСовет: на продакшне включите ограничение rate limiting и HTTP security headers (HSTS, X-Frame-Options и др.).
Шаг 8 — Использование Standard Notes
Откройте в браузере https://standardnotes.example.com — вы должны увидеть интерфейс приложения.
Для доступа через официальный веб-клиент откройте https://app.standardnotes.com, создайте аккаунт и укажите свой сервер в настройках Advanced features:
- Нажмите Create free account и заполните email и пароль.
- В Advanced features снимите галочку Custom sync server и введите https://standardnotes.example.com.

После входа можно создавать заметки и тестировать синхронизацию.
Шаг 9 — Активация платных функций для self-host аккаунта
Стандартно платные функции нельзя напрямую оплатить на self-host инстансе. Однако сервер поддерживает создание подписки вручную (donation/activation). Выполните:
$ cd ~/standardnotes
$ bash ./server.sh create-subscription [email protected]После этого перезагрузите веб-приложение — платные функции должны активироваться для указанного аккаунта.
Примечание: это активирует платные функции локально, но не списывает средства через официальный платёжный шлюз.
Шаг 10 — Настройка загрузки файлов
Загрузка файлов — платная функция и требует настройки файлового хранилища и квоты.
Настройка прав на каталог uploads:
$ chmod -R 775 data
$ mkdir -p data/uploads
$ sudo chmod -R 755 data/uploads
$ sudo chown -R 1001.1001 data/uploadsОбъяснение: контейнеры в Docker часто работают под определёнными UID/GID. В образе Standard Notes UID 1001 используется для файлового сервиса, поэтому chown делает папку доступной контейнеру.
По умолчанию квота загрузки у пользователей равна нулю. Чтобы предоставить, например, 10 ГБ используйте SQL-запрос внутри контейнера database:
Войдите в MySQL внутри контейнера:
$ docker exec -it db-standalone mysql -u std_notes_user -p
Enter password:Переключитесь в базу данных Standard Notes:
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| standard_notes_db |
+--------------------+
2 rows in set (0.00 sec)
mysql > use standard_notes_db;Добавьте настройку квоты 10 ГБ (значение в байтах = 10737418240):
mysql> INSERT INTO subscription_settings(uuid, name, value, created_at, updated_at, user_subscription_uuid) VALUES (UUID(), "FILE_UPLOAD_BYTES_LIMIT", 10737418240, FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), FLOOR(UNIX_TIMESTAMP(NOW(6))*1000000), (SELECT us.uuid FROM user_subscriptions us INNER JOIN users u ON us.user_uuid=u.uuid WHERE u.email="[email protected]"));Значение 10737418240 = 10 ГБ. Измените при необходимости.
Выйдите:
mysql > exitШаг 11 — Тестирование загрузок
В веб-интерфейсе Standard Notes нажмите на иконку вложений в верхней панели.

Выберите Upload files и загрузите файл. После успешной загрузки вы увидите файл в списке:

Нажмите на три точки рядом с файлом для дополнительных опций:

Безопасность и жёсткое укрепление
- Обновления и патчи
- Регулярно обновляйте систему, Docker и образы контейнеров.
- Минимизация прав
- Не запускайте дополнительные сервисы на том же хосте.
- Ограничивайте привилегии пользователей и контейнеров.
- TLS
- Используйте только TLS 1.2/1.3 и strong cipher suite (как в конфигурации Nginx выше).
- Периодически проверяйте результат на SSL Labs.
- Защита SSH
- Отключите вход по паролю, включите fail2ban и ограничьте доступ по IP.
- Мониторинг логов
- Собирать логи контейнеров и Nginx (ELK/EFK/Prometheus+Grafana).
- Резервное копирование секретов
- Храните .env и ключи в зашифрованном хранилище вне сервера.
Резервное копирование и восстановление
Резервируйте:
- Данные MySQL (volume контейнера db-standalone). Используйте mysqldump:
$ docker exec -i db-standalone mysqldump -u std_notes_user -p standard_notes_db > standard_notes_db.sql- Файлы uploads (data/uploads): копируйте или rsync на удалённый бэкап-сервер.
- Docker volumes: можно экспортировать с помощью docker run –rm –volumes-from.
Восстановление базы:
$ docker exec -i db-standalone mysql -u std_notes_user -p standard_notes_db < standard_notes_db.sqlПлан восстановления: проверяйте процедуру восстановления в тестовой среде минимум раз в квартал.
Обслуживание и обновление
Общий порядок обновления:
- Сделайте бэкап базы и файлов uploads.
- Остановите сервисы: ./server.sh stop или остановите контейнеры.
- Обновите репозиторий standalone (git pull) и обновите .env, если изменились переменные.
- ./server.sh start и проверьте логи.
Минимизация простоев: используйте временный maintenance page и уведомите пользователей.
Устранение неполадок — Частые ошибки и решения
Сервер возвращает 502 Bad Gateway
- Проверьте, запущен ли сервис на порту 3000: curl http://localhost:3000/healthcheck
- Просмотрите логи контейнера и Nginx.
Certbot не может получить challenge
- Временно остановите Nginx и запустите certbot (или используйте webroot-плагин).
- Проверьте DNS A-запись домена.
Проблемы с правами при загрузке файлов
- Проверьте владельца и права на data/uploads (должны соответствовать UID контейнера 1001).
Проблемы с JWT/сессиями
- Перегенерируйте секреты и перезапустите все сервисы (внеся изменения в .env и docker/auth.env).
Критерии приёмки
- Сервис доступен по HTTPS на standardnotes.example.com и snotes-files.example.com.
- curl http://localhost:3000/healthcheck возвращает OK.
- Пользователь может зарегистрироваться и синхронизировать заметки через официальные клиенты.
- Загруженные файлы сохраняются в data/uploads и доступны пользователю.
- Автоматическое обновление сертификатов certbot renew –dry-run проходит без ошибок.
Роль-based чек-листы
Администратор:
- Настроить DNS и UFW.
- Установить Docker и Nginx.
- Настроить Certbot и Nginx конфигурацию.
DevOps:
- Настроить CI/CD для обновлений контейнеров.
- Настроить мониторинг и алерты.
- Настроить резервное копирование и тесты восстановления.
Пользователь:
- Создать аккаунт и проверить синхронизацию заметок.
- Проверить загрузку и доступ к файлам.
Сценарии отказа и откат
- Откат конфигурации .env
- Используйте версионирование файлов конфигурации и храните зашифрованные копии.
- Восстановление БД
- Восстановите с mysqldump и перезапустите сервисы.
- Откат образов Docker
- docker compose pull; docker compose up –no-deps –build
с нужной версией образа.
- docker compose pull; docker compose up –no-deps –build
Советы по производительности
- Увеличьте память контейнеров и выделите больше CPU под базу данных для больших баз.
- Используйте внешний Redis (если используется) и выделенный диск для MySQL.
- Настройте лог-ротацию и ограничьте размер логов.
Миграция с облачного Standard Notes на self-host
- Создайте резервную копию данных в облаке через официальные инструменты (экспорт заметок).
- Импортируйте записи в локальный сервер через API/клиент.
- Проверьте шифрование и ключи — пользователи должны сохранить свои пароли/ключи.
Совместимость и ограничения
- Самостоятельный инстанс не интегрируется с официальной платёжной системой Standard Notes.
- Некоторые расширенные функции, завязанные на облачные сервисы, могут работать иначе.
Мини-методология развертывания (пошаговый чек-лист)
- Подготовка сервера: обновление, создание пользователя, SSH.
- Настройка UFW и DNS.
- Установка Docker и Nginx.
- Получение SSL сертификата.
- Клонирование репозитория Standard Notes.
- Настройка .env и секретов.
- Запуск ./server.sh start и проверка статуса.
- Настройка Nginx виртуальных хостов.
- Настройка прав для uploads и присвоение квот.
- Тестирование и мониторинг.
Частые вопросы
Как обновить Standard Notes до новой версии?
Обновите репозиторий standalone (git pull), выполните ./server.sh stop, затем ./server.sh start. Перед обновлением сделайте бэкап базы и файлов.
Как дать пользователю индивидуальную квоту на загрузку файлов?
Добавьте запись в таблицу subscription_settings как описано в шаге 10, указав значение в байтах. Для 10 ГБ используйте 10737418240.
Можно ли использовать S3 вместо локальной папки uploads?
Да. Для масштабируемого хранилища рекомендуется S3-совместимый бэкенд; потребуется корректировать конфигурацию файлового сервера и переменные окружения.
Как восстановить забытый секрет AUTH_JWT_SECRET?
Смените секрет в .env и соответствующие значения в docker/auth.env, затем перезапустите сервисы. Учтите, что смена JWT-секрета может разлогинить всех пользователей и потребовать повторной авторизации.
Glossary — краткие определения
- JWT: компактный формат токенов для передачи данных о сессии.
- FQDN: полностью квалифицированное доменное имя.
- TLS: протокол шифрования для сетевых соединений.
Социальный превью
OG title: Standard Notes — самостоятельный сервер на Ubuntu 22.04 OG description: Подробное руководство: Docker, Nginx, Certbot, платные функции и загрузка файлов. Быстрая пошаговая инструкция для self-host.
Короткое объявление (анонс для рассылки, 100–200 слов)
Разверните Standard Notes под своим контролем: пошаговое руководство по установке на Ubuntu 22.04 с использованием Docker, Nginx и Certbot. Вы научитесь настраивать SSL, запускать сервисы, активировать платные функции для self-host аккаунта и включать загрузку файлов с выдачей квоты. Включены рекомендации по безопасности, резервному копированию, обновлениям и устранению неполадок. Подойдёт для DevOps-инженеров и системных администраторов, желающих держать личные заметки под полным контролем.
Заключение
Вы успешно развернули Standard Notes на Ubuntu 22.04. Руководство описывает полный цикл: от подготовки сервера до включения платных функций и загрузки файлов. Если остались вопросы — задавайте их в комментариях или используйте официальные репозитории и форумы Standard Notes.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента