Как самостоятельно разместить Memos в 2026 году: заметки, доступ к API и резервные копии
Практическое руководство по самостоятельному размещению Memos: Docker, порты, постоянное хранение данных, TLS, безопасность, резервное копирование и проблемы, которые мешают использовать сервис в production. Пошаговая инструкция.
Рассматривайте Memos как небольшую систему, а не как Docker-образ. Пользовательская цель Memos понятна: быстро создавать заметки в Markdown и работать с ними через API. Развёртывание можно считать приемлемым только после того, как вы сможете создать приватную заметку и вложение, получить их через API, отредактировать заметку и убедиться, что после замены контейнера данные сохранились.
Такой подход позволяет выявить типичную проблему, с которой операторы сталкиваются после локального тестирования: файл базы данных находится на слое контейнера и исчезает после его замены. Кроме того, план резервного копирования и обновления становится достаточно конкретным, чтобы его можно было проверить.
Превратите локальную команду в проверяемый сервис
Первый контейнер должен легко удаляться и создаваться заново. Храните данные не на доступном для записи слое, привяжите порт 5230 только там, откуда до него сможет достучаться proxy, и передавайте конфигурацию во время запуска.
docker run -d \
--name memos \
--restart unless-stopped \
-p 127.0.0.1:5230:5230 \
-v memos-data:/var/opt/memos \
neosmemo/memos:stable --mode prod --port 5230
После первоначального тестирования зафиксируйте версию образа. Читайте самую раннюю ошибку запуска, а не последнее сообщение о перезапуске, проверяйте каждый mount с помощью docker inspect и следите за логами, пока создаёте приватную заметку и вложение, получаете их через API, редактируете заметку и убеждаетесь, что после замены контейнера данные сохранились. Такая последовательность помогает отличить некорректную команду запуска образа от проблемы с зависимостями или правами доступа.
Сначала определите критерии успешной работы Memos
Разделите для Memos четыре составляющие: ingress, listener на порту 5230, постоянное состояние и вспомогательные сервисы или локальные ресурсы. Для работы приложения достаточно одного постоянного volume для встроенной базы данных и ресурсов. Проверьте эту границу до публикации сервиса и ещё раз после замены контейнера.
Перед тем как считать разделение завершённым, выполните проверяемую транзакцию — создайте приватную заметку и вложение, получите их через API, отредактируйте заметку и убедитесь, что после замены контейнера данные сохранились. Измеряйте операции записи SQLite, рост объёма вложений, трафик API и поиск по накопленным заметкам, а результаты сохраняйте вместе с записью о развёртывании. Это даст и критерий приёмки, и первую базовую оценку требуемых ресурсов.
Не предоставляйте Memos доступ ко всему хосту
Для Memos важной поверхностью атаки не обязательно является главная страница. Основная ошибка — оставлять регистрацию открытой дольше, чем требуется. Предотвратите её намеренно: при необходимости отключите регистрацию и защищайте приватные заметки надёжной учётной записью и HTTPS.
В этой базовой конфигурации Memos не требует обязательного bootstrap-секрета; вместо этого защитите фактическую учётную запись администратора или upstream-аутентификацию. Используйте непривилегированного пользователя контейнера, если образ это поддерживает, и не монтируйте посторонние credentials. Настройте на ingress ограничения по частоте запросов или размеру, чтобы недоверенные операции не могли расходовать записи SQLite, увеличивать объём вложений, создавать избыточный трафик API и нагружать поиск по накопленным заметкам.
Настроить TLS легко, а сгенерированные URL — нет
Не используйте для Memos временные или постоянно меняющиеся публичные origin. Вместо этого настройте стабильный HTTPS origin для браузерных клиентов и клиентов API, направьте выбранное DNS-имя на route платформы и проксируйте запросы только на порт 5230.
Выполните эту проверку извне хоста: создайте приватную заметку и вложение, получите их через API, отредактируйте заметку и убедитесь, что после замены контейнера данные сохранились. Если ingress не работает, в руководстве по устранению ошибки 502 Bad Gateway разобраны проблемы с портом и listener. Если Memos получает запрос, но файл базы данных находится на слое контейнера и исчезает после его замены, теперь есть основания искать проблему за пределами proxy.
Докажите, что Memos переживает замену контейнера
Docker-образ можно скачать заново, а базу данных Memos и загруженные ресурсы — нельзя восстановить таким способом. Смонтируйте /var/opt/memos до bootstrap, запишите безвредные тестовые данные и замените контейнер, чтобы доказать фактическую постоянность этого пути. Проверяйте реальный mount, а не доверяйте имени файла Compose, и убедитесь, что runtime-пользователь может записывать данные туда, где их ожидает Memos.
Выберите срок хранения и внешнее хранилище, затем отрепетируйте восстановление, не затрагивая production. Проверка считается успешной только тогда, когда возвращаются пользователи, заметки, теги и ресурсы, а API может получить известную приватную заметку. Для состояния, хранящегося в базе данных, сочетайте snapshots хранилища с экспортом, согласованным с приложением, как описано в статье восстановление на определённый момент времени и snapshots.
Пять проверок, которые надёжнее health контейнера
Не используйте трафик первых пользователей как критерий приёмки Memos. Подготовьте безвредное тестовое состояние и выполните полную последовательность: «создайте приватную заметку и вложение, получите их через API, отредактируйте заметку и убедитесь, что после замены контейнера данные сохранились». Зафиксируйте точный публичный URL, результат, ссылку на образ и интервал логов, связанные с этим запуском.
Замените контейнер и повторите проверку, не пересоздавая данные. Затем восстановите сервис на пустом хосте; условие восстановления — возвращение пользователей, заметок, тегов и ресурсов, а также возможность получить известную приватную заметку через API. На каждом этапе отслеживайте операции записи SQLite, рост объёма вложений, трафик API и поиск по накопленным заметкам. Настройте alert на ухудшение выполнения транзакции, а не на показатели бездействующего контейнера.
Одна финальная проверка должна намеренно завершаться ошибкой: отправьте безвредные данные, близкие к ограничению ресурса или формата, связанному с этой границей: файл базы данных находится на слое контейнера и исчезает после его замены. Убедитесь, что появившееся сообщение Memos указывает на соответствующую границу, а не приводит к удалению данных или бесконечному перезапуску. Восстановите корректное состояние и убедитесь, что та же тестовая транзакция выполняется успешно. Включите эту короткую проверку в release checklist.
Логи, которые подсказывают следующий шаг
Используйте последовательность «создайте приватную заметку и вложение, получите их через API, отредактируйте заметку и убедитесь, что после замены контейнера данные сохранились» как smoke test Memos после каждого развёртывания. Сопутствующие метрики — операции записи SQLite, рост объёма вложений, трафик API и поиск по накопленным заметкам; настройте alert, когда эти ресурсы приближаются к уровню, при котором пользовательская операция начинает деградировать.
Основной риск при изменениях связан с тем, что миграции базы данных Memos нужно репетировать на копии, поскольку всё состояние сервиса хранится в одном компактном пути. Безопасный release начинается с восстанавливаемого snapshot и проверки любого одностороннего изменения состояния до переключения трафика. Если файл базы данных находится на слое контейнера и исчезает после его замены, сохраните неисправный контейнер достаточно надолго, чтобы прочитать его конфигурацию и первую ошибку.
Используйте Dockup для платформенного слоя
Dockup убирает ручную настройку reverse proxy и lifecycle-операций вокруг Memos. Сервис получает стабильный HTTPS route к порту 5230, переданную конфигурацию и постоянное хранилище, сохраняющееся при замене контейнеров. Подключённый сервер клиента работает по той же модели, что и вычислительные ресурсы, размещённые в Dockup.
После запуска выполните требования приложения: используйте стабильный HTTPS origin для браузерных клиентов и клиентов API, подтвердите локальное требование — один постоянный volume для встроенной базы данных и ресурсов — и выполните проверку: создайте приватную заметку и вложение, получите их через API, отредактируйте заметку и убедитесь, что после замены контейнера данные сохранились. Это сохраняет пользу one-click-развёртывания, не скрывая детали, от которых зависят возможность восстановления и безопасность Memos.
Часто задаваемые вопросы
Что требуется Memos для production-развёртывания?
Направьте контейнер Memos на порту 5230 через один HTTPS origin. Для работы приложения достаточно одного постоянного volume для встроенной базы данных и ресурсов. Не считайте Memos готовым к работе, пока не сможете создать приватную заметку и вложение, получить их через API, отредактировать заметку и убедиться, что после замены контейнера данные сохранились.
Какие данные Memos должны входить в резервную копию?
Сохраняйте /var/opt/memos и включайте базу данных Memos и загруженные ресурсы в один manifest восстановления. Корректное восстановление Memos считается успешным только тогда, когда возвращаются пользователи, заметки, теги и ресурсы, а API может получить известную приватную заметку.
Требуется ли Memos HTTPS за reverse proxy?
Используйте HTTPS для публичного origin Memos, а порт 5230 оставьте во внутреннем route. Корректно примените настройку Memos: используйте стабильный HTTPS origin для браузерных клиентов и клиентов API. Для Memos HTTPS защищает credentials и пользовательский контент при передаче, а также обеспечивает единообразное поведение клиентов, зависящее от origin.
Как тестировать обновление Memos?
Восстановите текущее состояние Memos в изолированном развёртывании, установите candidate-версию и повторите транзакцию приёмки. Уделите этому особое внимание, поскольку миграции базы данных Memos нужно репетировать на копии: всё состояние сервиса хранится в одном компактном пути. Сохраняйте предыдущий образ Memos, пока не будут понятны границы миграции данных и rollback.
