Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Продуктивность и планирование

Memos

Свое «Избранное» на своем сервере: лента коротких Markdown-заметок без заголовков и папок, которые потом находятся по тегу, тексту и дате. Бесплатный аналог Evernote и Google Keep в одном Go-контейнере со SQLite: MIT, REST API для curl и ботов.

Сентябрь 2026~12 минут чтенияFatmetal Team
Продуктивность и планирование Лицензия: MIT Статус: запущен у нас, v0.30.0

Вердикт

Подходит
  • одному человеку под сток мыслей, ссылок и рабочий лог - вместо пересылки себе в Telegram или Keep
  • тем, кто платит за синхронизацию и публикацию заметок (Obsidian Sync, Day One)
  • инженерам: одна команда curl с токеном создает заметку - в ленту пишут скрипты и боты
  • небольшой команде под общий поток «что сделали за день»
Не подходит
  • командам под wiki с деревом страниц и правами - это Docmost, BookStack, Outline
  • тем, кто ждет «второй мозг» с обратными ссылками и графом
  • кому нужно перенести архив из Evernote кнопкой: импорт у апстрима WIP
  • кому нужны нативные мобильные клиенты и вендор с SLA
Мин. тариф: CPU2-RAM4-DISK50 Рекомендуем: CPU2-RAM4-DISK50 Сложность: easy Время запуска: ~1,2 с Главный риск: первый, кто откроет адрес, становится админом Прод-готовность: с оговорками (закрыть регистрацию сразу, TLS, бэкап SQLite)
Что это

Memos: что это и какую задачу решает

Memos - self-hosted лента коротких заметок. У заметки нет заголовка, папки и шаблона: открыл, написал в Markdown, сохранил. Потом ищешь по тексту, по тегу вида #idea в тексте, по дню в календаре или по закрепу.

Берут это под привычку скидывать себе в мессенджер ссылки, мысли и «сделал сегодня X». Та же скорость захвата, но с тегами, поиском, вложениями и API, а данные - один файл SQLite на своем диске.

Чего здесь нет: иерархии страниц, обратных ссылок, графа и совместной правки. Импорт и экспорт апстрим помечает как WIP.

Лицензия MIT, страница цен апстрима называется «The whole product costs $0». Проект живет на GitHub Sponsors: организация usememos, один ведущий автор, 63 068 звезд на 15 сентября 2026.

Go + ReactSQLite (WAL)REST + gRPC APICaddy 2Docker Compose
Сценарий

Свое «Избранное»: как устроена лента

Одна колонка: сверху поле ввода с выбором видимости (по умолчанию Private), ниже карточки от новых к старым. Слева календарь с подсветкой дней, сохраненные фильтры и облако тегов.

Тег - слово с решеткой в тексте: написали #idea или #рецепт, и он появился в сайдбаре. Никаких «создать тег» и «выбрать папку»: структура возникает из текста.

Лента Memos: поле ввода с видимостью Private, шесть заметок с тегами buglist, idea, рецепт, цитата; слева календарь, Shortcuts и облако тегов
Лента на нашем стенде: латинские и кириллические теги, слева календарь. Memos v0.30.0.

Markdown полный: таблицы, код, чек-листы, LaTeX, вложения перетаскиванием. Видимость: PRIVATE - только автор, PROTECTED - все вошедшие, PUBLIC - аноним на странице Explore; из PUBLIC-заметок складывается личный микроблог.

Клик по тегу в сайдбаре - фильтр над лентой: ответ на вопрос «где та ссылка, которую я кидал себе месяц назад».

Фильтр по тегу idea в Memos: над лентой чип с тегом и крестиком, в ленте одна заметка с этим тегом
Фильтр по тегу: над лентой чип, в выдаче только заметки с #idea.

С телефона это 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 и публикации без подписки.

ПараметрMemosEvernote / 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 хоста с ОС и Docker517 MiB из 3,8 GiB
Диск после установки2,5 GB из 19 GB вместе с ОС; данные - 148 KB
Рекомендуем тарифCPU2-RAM4-DISK50 - 500 ₽/мес
i

Почему 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 ₽/мес

Развернуть в 1 клик →
Развертывание

Развертывание на Fatmetal

Fatmetal Cloud Server + Ubuntu 24.04 + Docker Compose; администратор создается через API до того, как адрес увидел кто-то посторонний.

  1. Создать VM и поставить Docker

    Тариф CPU2-RAM4-DISK50, Ubuntu 24.04. Engine и compose-плагин из официального apt-репозитория Docker встали за 57 секунд.

  2. Написать 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 сервера.

  3. Поднять стек

    sudo docker compose up -d. Образы скачались за 36,5 с (первая попытка уперлась в таймаут Docker Hub, повторный pull докачал остаток), старт контейнеров - 1,2 с, сертификат Caddy взял сам.

  4. Сразу создать администратора и закрыть регистрацию

    Учетной записи по умолчанию нет: первый зарегистрировавшийся становится администратором. Поэтому заводим его через 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.

Настройки Memos, раздел My Account администратора; в меню слева Access Tokens, Webhooks, Tags и админские Member, System, Memo, Storage, Notifications, SSO, AI
Settings после первого входа: Access Tokens и Webhooks для интеграций, в блоке Admin - Storage, SSO, AI. Memos v0.30.0.
Интеграции

Заметка одним 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 Engine57 с
Скачивание образов (95 + 88,7 MB), холодное36,5 с за две попытки (32,4 + 4,1)
Старт контейнеров / первый ответ 2001,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 мс
i

Главное: ~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.

POST /api/v1/auth/signup -> 404

Причина. В 0.30.0 нет отдельного эндпоинта регистрации.

Решение. POST /api/v1/users с полями username, password и role, как в шаге 4 установки.

{"code":3,"message":"invalid credentials"} (HTTP 400 на /api/v1/auth/signin)

Причина. 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 здесь не будет.

FAQ

Частые вопросы

Можно поставить без 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 ₽/мес.

Запустить Memos →
Анонсы новых разборов в Telegram-канале Новые гайды и карточки в маркетплейсе первыми @fatmetal_channel →

Этот стек у нас запущен на конфигурации 2 vCPU / 4 GB RAM (аналог тарифа CPU2-RAM4-DISK50). Нашли баг в гайде - напишите, поправим в течение дня.