Memos
Свое «Избранное» на своем сервере: лента коротких Markdown-заметок без заголовков и папок, которые потом находятся по тегу, тексту и дате. Бесплатный аналог Evernote и Google Keep в одном Go-контейнере со SQLite: MIT, REST API для curl и ботов.
Вердикт
- одному человеку под сток мыслей, ссылок и рабочий лог - вместо пересылки себе в Telegram или Keep
- тем, кто платит за синхронизацию и публикацию заметок (Obsidian Sync, Day One)
- инженерам: одна команда curl с токеном создает заметку - в ленту пишут скрипты и боты
- небольшой команде под общий поток «что сделали за день»
- командам под wiki с деревом страниц и правами - это Docmost, BookStack, Outline
- тем, кто ждет «второй мозг» с обратными ссылками и графом
- кому нужно перенести архив из Evernote кнопкой: импорт у апстрима WIP
- кому нужны нативные мобильные клиенты и вендор с SLA
Memos: что это и какую задачу решает
Memos - self-hosted лента коротких заметок. У заметки нет заголовка, папки и шаблона: открыл, написал в Markdown, сохранил. Потом ищешь по тексту, по тегу вида #idea в тексте, по дню в календаре или по закрепу.
Берут это под привычку скидывать себе в мессенджер ссылки, мысли и «сделал сегодня X». Та же скорость захвата, но с тегами, поиском, вложениями и API, а данные - один файл SQLite на своем диске.
Чего здесь нет: иерархии страниц, обратных ссылок, графа и совместной правки. Импорт и экспорт апстрим помечает как WIP.
Лицензия MIT, страница цен апстрима называется «The whole product costs $0». Проект живет на GitHub Sponsors: организация usememos, один ведущий автор, 63 068 звезд на 15 сентября 2026.
Свое «Избранное»: как устроена лента
Одна колонка: сверху поле ввода с выбором видимости (по умолчанию Private), ниже карточки от новых к старым. Слева календарь с подсветкой дней, сохраненные фильтры и облако тегов.
Тег - слово с решеткой в тексте: написали #idea или #рецепт, и он появился в сайдбаре. Никаких «создать тег» и «выбрать папку»: структура возникает из текста.
Markdown полный: таблицы, код, чек-листы, LaTeX, вложения перетаскиванием. Видимость: PRIVATE - только автор, PROTECTED - все вошедшие, PUBLIC - аноним на странице Explore; из PUBLIC-заметок складывается личный микроблог.
Клик по тегу в сайдбаре - фильтр над лентой: ответ на вопрос «где та ссылка, которую я кидал себе месяц назад».
С телефона это PWA, нативных приложений нет. Для Chrome и Firefox есть web-clipper, для скриптов - API с токенами, о нем ниже.
Аналог Evernote и Google Keep: что меняется
Денежный аргумент слабее, чем у wiki и CRM: Telegram, Keep и Apple Notes бесплатны, а Day One (49,99 $ в год) и Obsidian Sync (от 4 $ в месяц; цены сняты 14 сентября 2026) стоят примерно как тариф CPU2-RAM4-DISK50 за 500 ₽ в месяц. Memos берут ради своего диска, API и публикации без подписки.
| Параметр | Memos | Evernote / Keep / Telegram / Day One |
|---|---|---|
| Где данные | файл SQLite на вашем диске | в облаке платформы |
| Форма заметки | карточка без заголовка и папки, теги в тексте | Keep, Telegram - карточка; Evernote - документ в блокноте |
| API для скриптов и ботов | REST + gRPC, токены, webhooks | у Telegram и Keep нет |
| Публикация наружу | PUBLIC-заметки и ссылки-шары | у Obsidian - платный Publish |
| Мобильный клиент | только PWA | нативные приложения |
Чем Memos не является. Не Obsidian Sync: vault из Markdown-файлов он не синхронизирует. Не Joplin: там файлы на клиенте, здесь лента в браузере. Не wiki: команде под документацию - Docmost, BookStack или Outline.
Тех-стек и архитектура
Один бинарь на Go: API, React-фронтенд и встроенный SQLite в одном процессе. Внешних зависимостей нет - ни Redis, ни очередей, ни SMTP. Базу можно вынести в MySQL или PostgreSQL, дефолт - SQLite в режиме WAL.
JWT-секрет генерируется при первом запуске и хранится в базе, поэтому единственная переменная под прод - MEMOS_INSTANCE_URL. Вложения по умолчанию лежат внутри той же базы; в Settings, раздел Storage, их можно переключить на папку или S3.
Второй контейнер - Caddy 2 с Let's Encrypt, публичные порты только 80 и 443. Тег stable на дату разбора указывал ровно на 0.30.0, но в compose закреплен номер: минор 0.31 несет ломающие изменения.
Минимальная конфигурация
Апстрим цифр не публикует - «from a Raspberry Pi to a production server». Ниже - что показал стенд.
| RAM стека в простое | ~22 MiB (memos 11,7 + caddy 10,5) |
| RAM хоста с ОС и Docker | 517 MiB из 3,8 GiB |
| Диск после установки | 2,5 GB из 19 GB вместе с ОС; данные - 148 KB |
| Рекомендуем тариф | CPU2-RAM4-DISK50 - 500 ₽/мес |
Почему CPU2-RAM4-DISK50. По классу это ntfy (~17 MiB), а не Docmost (~495 MiB); конфигураций меньше 2 vCPU и 4 GB у Fatmetal нет, а запас уходит в диск - вложения по умолчанию пишутся внутрь SQLite.
Внешние ИИ-модели: необязательно
В Settings, раздел AI, подключается провайдер OpenAI или Gemini (адрес API и ключ) - только для расшифровки голосовых заметок в текст. Без провайдера продукт работает полностью; на стенде транскрипцию не включали.
Из России до этих API напрямую не достучаться. На VPS Fatmetal это уже решено прокси api-proxy.fatmetal.net - он входит в сервер, код не меняется, у сервиса memos три переменные:
environment:
HTTPS_PROXY: http://api-proxy.fatmetal.net:8080
HTTP_PROXY: http://api-proxy.fatmetal.net:8080
NO_PROXY: localhost,127.0.0.1,10.0.0.0/8
NO_PROXY обязателен, иначе локальные обращения тоже уйдут в прокси. HTTP-клиент Go читает эти переменные сам, но на стенде это не сверяли.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете Memos на своем домене, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe от 450 ₽/мес
Развертывание на Fatmetal
Fatmetal Cloud Server + Ubuntu 24.04 + Docker Compose; администратор создается через API до того, как адрес увидел кто-то посторонний.
Создать VM и поставить Docker
Тариф CPU2-RAM4-DISK50, Ubuntu 24.04. Engine и compose-плагин из официального apt-репозитория Docker встали за 57 секунд.
Написать compose.yaml и Caddyfile
Как в документации апстрима, но тег 0.30.0 вместо stable и порт только на loopback. MEMOS_INSTANCE_URL - сразу внешний https-адрес: от него зависят ссылки-шары и флаг Secure у cookie.
services: memos: image: neosmemo/memos:0.30.0 restart: unless-stopped ports: ["127.0.0.1:5230:5230"] volumes: ["./data:/var/opt/memos"] environment: MEMOS_INSTANCE_URL: https://memos.example.com caddy: image: caddy:2 restart: unless-stopped network_mode: host volumes: ["./Caddyfile:/etc/caddy/Caddyfile", "./caddy_data:/data"]Caddyfile - две строки:
memos.example.com { reverse_proxy 127.0.0.1:5230 }. Домен уже должен указывать на IP сервера.Поднять стек
sudo docker compose up -d. Образы скачались за 36,5 с (первая попытка уперлась в таймаут Docker Hub, повторный pull докачал остаток), старт контейнеров - 1,2 с, сертификат Caddy взял сам.Сразу создать администратора и закрыть регистрацию
Учетной записи по умолчанию нет: первый зарегистрировавшийся становится администратором. Поэтому заводим его через API на самом сервере, в той же сессии - до первого пользователя POST /api/v1/users работает без авторизации.
curl -sS -X POST http://127.0.0.1:5230/api/v1/users -H 'Content-Type: application/json' \ -d '{"username":"admin","password":"CHANGEME","role":"ADMIN"}' JWT=$(curl -sS -X POST http://127.0.0.1:5230/api/v1/auth/signin -H 'Content-Type: application/json' \ -d '{"passwordCredentials":{"username":"admin","password":"CHANGEME"}}' | jq -r .accessToken) curl -sS -X PATCH 'http://127.0.0.1:5230/api/v1/instance/settings/GENERAL?updateMask=generalSetting.disallowUserRegistration' \ -H "Authorization: Bearer $JWT" -H 'Content-Type: application/json' \ -d '{"generalSetting":{"disallowUserRegistration":true}}'Затем тем же токеном сменить временный пароль:
PATCH /api/v1/users/admin?updateMask=password. Проверка на стенде: регистрация второго пользователя отдает 403, старый пароль - 400, новый - 200.
Заметка одним curl: API, токены и боты
REST и gRPC принимают персональные токены из Settings, раздел Access Tokens, в заголовке Authorization как Bearer. На стенде заметки создавались по JWT из формы входа, механика та же:
curl -sS -X POST https://memos.example.com/api/v1/memos -H "Authorization: Bearer $JWT" \
-H 'Content-Type: application/json' -d '{"content":"#buglist API отдает 429 - проверить rate-limit","visibility":"PRIVATE"}'
Тег в теле становится тегом в сайдбаре; запрос прошел через публичный https-адрес, то есть API работает полным контуром через Caddy. Отсюда cron с отчетом о бэкапах, Telegram-бот, пересылающий «себе» уже в Memos, ИИ-агент с рабочим логом. В обратную сторону есть Webhooks на новую заметку - например, в n8n или ntfy.
Нюанс: вход через API не ставит cookie веб-клиенту, фронтенд кладет токен в localStorage сам. Скрипту это не мешает.
Что измерили после запуска
14 сентября 2026, Fatmetal Cloud Server 2 vCPU / 4 GB RAM / 20 GB SSD, Ubuntu 24.04.4, Docker 29.8.0; свежая установка без нагрузки.
| Установка Docker Engine | 57 с |
| Скачивание образов (95 + 88,7 MB), холодное | 36,5 с за две попытки (32,4 + 4,1) |
| Старт контейнеров / первый ответ 200 | 1,2 с / 0,04 с |
| RAM в простое, весь стек | ~22 MiB (memos 11,7 / caddy 10,5) |
| CPU в простое | 0,00% на обоих контейнерах |
| Диск после установки | 2,5 GB из 19 GB; образы 183,7 MB, данные 148 KB |
| Отклик главной: loopback / за TLS снаружи | 2,3 мс / 79,7 мс |
Главное: ~22 MiB на два контейнера - самый легкий стек среди наших разборов заметок и wiki: ntfy ~17 MiB, BookStack ~168, Outline ~408, Docmost ~495. Половину занимает Caddy; до и после перезапуска цифры совпали - утечки на простое нет.
Проверено на Memos v0.30.0, сентябрь 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Грабли с запуска и то, чем stable-версия 0.30 отличается от документации, уже переписанной под 0.31.
Первый, кто открыл адрес, становится администратором. Инстанс, оставленный на час без первого входа, может оказаться чужим. Лечится шагом 4 установки сразу после up -d.
Документация описывает 0.31, а stable - это 0.30. Spaces, настройка доступа ACCESS, роль host-admin, именованные хранилища - в бинаре 0.30.0 ничего этого нет, ролей две: ADMIN и USER. Апгрейд на 0.31 - только после release notes.
С заданным MEMOS_INSTANCE_URL инстанс стартует в режиме Access mode: public. Заметки по умолчанию PRIVATE, но аноним видит профиль инстанса и все PUBLIC-заметки. Переключателя «только по входу» в 0.30 нет.
Вложения растут внутри SQLite, а ./data принадлежит UID 10001. Следите за размером memos_prod.db или переключите хранилище заранее - старые файлы при смене не переносятся. На хосте базу читает только sudo.
Причина. В 0.30.0 нет отдельного эндпоинта регистрации.
Решение. POST /api/v1/users с полями username, password и role, как в шаге 4 установки.
Причина. Signin ждет protobuf-обертку oneof; плоский JSON с username и password отвергается до проверки пароля.
Решение. Завернуть учетные данные в {"passwordCredentials":{...}}; в ответе поле accessToken.
Безопасность и обновления
Релизы раз в полтора-два месяца с rc перед каждым: 0.30.0 в июле, 0.31.0-rc.2 - 15 сентября 2026. Отдельного канала security-анонсов нет, есть SECURITY.md - следить за релизами на GitHub.
Обновление в рамках минора: docker compose stop memos, архив каталога data, новый тег в compose.yaml, docker compose pull && docker compose up -d. Перед сменой минора копия базы обязательна - совместимость 0.30 и 0.31 апстрим не гарантирует.
Бэкап - один каталог ./data: memos_prod.db с WAL-файлами и, при хранилище по умолчанию, все вложения. Копировать SQLite в режиме WAL на горячую ненадежно: либо короткая остановка, либо sqlite3 memos_prod.db ".backup 'копия.db'".
Что закрыть перед продом:
- администратор создан и регистрация выключена до открытия адреса в браузере;
- MEMOS_INSTANCE_URL - внешний https-адрес; MEMOS_DEMO не задан (фиксированный JWT-секрет);
- приложение слушает только
127.0.0.1:5230, наружу - Caddy с TLS; тег образа закреплен; - бэкап каталога data по расписанию, хотя бы один проверен восстановлением.
Связь с другими стеками
- Docmost, BookStack, Outline - документ вместо заметки, дерево страниц, права. Когда поток дорастает до документации - туда.
- Karakeep - если основная часть «Избранного» - ссылки: закладки со снимками страниц и поиском по содержимому.
- ntfy - сосед по классу «один Go-бинарь, ~17 MiB» и получатель webhooks из Memos.
- n8n - Telegram-бот на входе, POST /api/v1/memos на выходе, и наоборот через webhook Memos.
Когда это НЕ ваш выбор
Нужна база знаний, а не лента
Вложенные страницы, права на документ, история правок, совместное редактирование - ничего этого нет и не планируется.
Архив из Evernote или Notion надо перенести
Импорт и экспорт у апстрима WIP: переезд - чистая лента с нуля или перенос скриптом через API. Если архив - главная ценность, смотрите Joplin с ENEX-импортом.
Команде нужны рабочие пространства
Spaces и режим «только по входу» появляются в 0.31, а stable - 0.30. Здесь общий поток команды - видимость PROTECTED на общем инстансе, без групп.
Нужен вендор с обязательствами
Community-проект без юрлица, один ведущий автор, версия 0.x пять лет подряд. Смягчают это MIT и 4 755 форков, но SLA и LTS здесь не будет.
Частые вопросы
Можно поставить без Docker?
Да: апстрим отдает бинарь под systemd, Kubernetes-манифесты и сборку из исходников. Docker он называет самым простым production-способом.
Хватит ли 2 GB RAM?
С запасом: стек в простое берет ~22 MiB, с ОС и Docker хост занимает 517 MiB. Ограничитель - диск, если вложения остаются в SQLite.
Есть ли русский интерфейс?
Локализация ru в бинаре есть, но язык - настройка пользователя: пока не выбрать русский в Settings, раздел Preferences, сервер отдает en.
Как обновлять?
Остановить memos, скопировать каталог data, сменить тег в compose.yaml, pull и up -d. Между 0.30 и 0.31 - обязательно release notes.
Какие ограничения лицензии?
MIT: коммерческое использование, изменение и распространение без ограничений. Платных редакций и лицензионных ключей нет.
Итог
Memos - это «Избранное» из мессенджера, перенесенное на свой сервер и доделанное до инструмента: лента карточек без заголовков и папок, теги в тексте, поиск, вложения, публикация и API для скриптов и ботов. Один Go-контейнер с SQLite стартует за 1,2 секунды и берет ~22 MiB вместе с Caddy - на CPU2-RAM4-DISK50 он живет один или на всю небольшую команду. Что принять до установки: это поток, а не wiki, а администратора и запрет регистрации делайте из консоли сразу после старта.
Рекомендуемая конфигурация для установки:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe
Не хотите устанавливать вручную?
Запустите Memos на этой конфигурации автоматически - от 450 ₽/мес.
Этот стек у нас запущен на конфигурации 2 vCPU / 4 GB RAM (аналог тарифа CPU2-RAM4-DISK50). Нашли баг в гайде - напишите, поправим в течение дня.