SSD Nodes Learn 8GB RAM — $66/год
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-01

Установка Memmy на VPS: настройка локальной памяти агентов

Настройте централизованное хранилище памяти для AI-агентов на базе SQLite. Инструкция по сборке из исходного кода на Ubuntu и запуску службы на порту 18960 для интеграции с Cursor.

Что такое Memmy и что он хранит

Memmy — это локальный центр памяти для AI-агентов, который работает на вашем собственном VPS (виртуальном частном сервере). Он ведет одну базу данных SQLite, содержащую информацию, которую усвоили ваши агенты; каждый агент на сервере считывает данные из этого хранилища и записывает их туда. Проект memmy-agent от MemTensor, распространяется по лицензии MIT, версия 1.0.4 по состоянию на июль 2026 года.

На сервере используется только часть функционала. Memmy поставляет службу памяти, которая ожидает подключений на http://127.0.0.1:18960, интерфейс командной строки (CLI) memmy-memory для взаимодействия с этой службой, а также настольную рабочую среду (workbench). Рабочая среда упакована только для macOS и Windows, поэтому на Linux VPS вы запускаете службу и CLI. Этого достаточно, чтобы обеспечить общую память для Claude Code, Codex и Cursor.

Memmy распределяет хранимые данные по четырем уровням. L1 Trace — это необработанный обмен данными: запрос, ответ и вызовы инструментов. L2 Policy — это процедура, выведенная из трассировок, которая доказала свою эффективность. L3 World Model — это стабильные знания о проекте или окружении. Skill — это вызываемая процедура, сформированная на основе политики. Служба назначает уровень при получении данных, поэтому вам не нужно создавать их вручную.

Что меняет хаб общей памяти по сравнению с памятью отдельных инструментов

Сегодня каждый агент поставляет собственную память. Claude Code хранит файлы инструкций в репозитории. Cursor хранит правила в базе данных рабочей области. Codex хранит журналы сессий в ~/.codex. Каждое хранилище принадлежит одному инструменту, поэтому факт, который вы сообщили в понедельник в одном инструменте, остается неизвестным во вторник в другом. Вы платите за это дважды: первый раз токенами, потраченными на повторное объяснение проекта, и второй раз — из-за ошибок в работе, когда агент действует на основе предположения, которое вы уже исправили в другом месте.

Хаб выносит хранилище за пределы инструмента. Memmy также считывает существующие хранилища, поэтому вы не начинаете работу с пустой базы данных. Его сканер распознает шесть источников: Claude Code в ~/.claude/projects/**/*.jsonl, Codex в ~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl, OpenCode в ~/.local/share/opencode/opencode.db, файлы state.vscdb в Cursor, базы данных SQLite в OpenClaw в ~/.openclaw и Hermes в ~/.hermes. Вы можете добавить источник вручную, указав имя и локальный путь.

Счетчики импорта не будут совпадать, и это ожидаемо. Сканер группирует сообщения по источнику и диалогу, а затем записывает одну память L1 на каждый завершенный цикл обмена сообщениями. Цикл считается завершенным, если он содержит непустой контент пользователя и заканчивается непустым сообщением помощника, поэтому прерванная сессия не дает данных. Сообщения дедуплицируются с помощью контрольных точек диалога и стабильных идентификаторов циклов. Количество просканированных, импортированных сообщений и новых записей памяти будет различаться при одном и том же запуске.

Это компонент, который работает в связке с тем, как Claude Code управляет контекстом в рамках одной сессии. Управление контекстом определяет, что помещается в одно окно. Хаб памяти определяет, что сохраняется после закрытия этого окна.

Что потребуется на VPS

  • Node.js версии 22 или новее. Это требование документации Memmy, в то время как Ubuntu 24.04 поставляется с Node 18.
  • git и набор инструментов для сборки, так как better-sqlite3 является нативным модулем, который может компилироваться во время установки.
  • Около 2 ГБ оперативной памяти. Установка от имени root требует значительного рабочего пространства и цепочки сборки фронтенда.
  • Несколько ГБ свободного места на диске для node_modules и базы данных.
sudo apt update
sudo apt install -y git build-essential python3 curl ca-certificates sqlite3
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version

node --version должна выводить v22 или выше. v18 в этом поле означает, что этап настройки NodeSource не был выполнен, и установка впоследствии завершится ошибкой при проверке версии движка в проекте.

Установка Memmy из исходного кода на Ubuntu 24.04

git clone https://github.com/MemTensor/memmy-agent.git
cd memmy-agent
cp .env.example .env
npm install
npm run memory:build

npm run memory:build компилирует рабочую область @memmy/memory в Memory/dist. Для работы на headless-сервере сборка остальных компонентов дерева не требуется. Проверьте, что собственный модуль загрузился:

node -e "require('better-sqlite3'); console.log('better-sqlite3 loads')"

Если эта строка вызывает ошибку вместо вывода данных, значит, собственный модуль не соответствует вашей версии Node. Выполните npm rebuild better-sqlite3 — именно это делает собственный скрипт запуска проекта перед инициализацией любых процессов.

В файле README команда bash scripts/dev-start.sh указана как способ запуска в одну строку. Не используйте её на headless VPS. Она запускает графическую оболочку Electron и сервер разработки Vite на порту 19000 параллельно со службой памяти. Поскольку Electron требует наличия дисплея, на сервере без графической сессии скрипт зависнет или завершит работу.

Запуск службы памяти и проверка ответа

npm run memory:serve:dev

Это документированный способ запуска службы памяти из исходного кода. Она привязывается к 127.0.0.1:18960, хранит базу данных в ~/.memmy/memory-service/memory.sqlite и считывает конфигурацию из ~/.memmy/config.yaml. В файле README указаны те же значения, если вы хотите задать их явно:

npm run memory:serve:dev -- \
  --host 127.0.0.1 --port 18960 \
  --db ~/.memmy/memory-service/memory.sqlite \
  --config ~/.memmy/config.yaml

Из второго терминала проверьте, работает ли служба:

curl -sS http://127.0.0.1:18960/api/v1/health

Health — это единственный эндпоинт, который не требует токена, поэтому он подходит для проверки состояния. Если curl завершается с кодом 7 и сообщением Failed to connect to 127.0.0.1 port 18960, значит, служба не прослушивает порт. Проверьте терминал, в котором запущена служба: ошибки при запуске выводятся именно туда, и чаще всего они связаны с невозможностью загрузки нативного модуля SQLite. ss -lntp | grep 18960 подтверждает наличие сокета после запуска службы.

Остальная часть HTTP API (интерфейса прикладного программирования) находится по адресу /api/v1.

  • POST /api/v1/memory/add записывает данные в память, а POST /api/v1/memory/search выполняет запросы.
  • GET /api/v1/memory/:id и DELETE /api/v1/memory/:id считывают и удаляют одну запись.
  • POST /api/v1/sessions/open и POST /api/v1/sessions/:sessionId/close открывают и закрывают сессию агента.
  • POST /api/v1/turns/start и POST /api/v1/turns/:turnId/complete записывают один ход.
  • GET /api/v1/panel/overview, /api/v1/panel/analysis и /api/v1/panel/items передают данные на панель управления.

Memmy резервирует блок портов, и при работе без графического интерфейса используется только первый из них: 18960 для памяти, 18970 для проверки состояния шлюза, 18980 для веб-интерфейса и административного HTTP, 18990 для API, совместимого с OpenAI, который запускает memmy serve, а также 19000 и 19010 для сервера разработки настольного интерфейса. Если какой-либо из этих портов уже занят на вашем сервере, ищите причину в этом списке.

Откуда на самом деле берется команда memmy-memory

Здесь обычно возникают ошибки при первой установке, поэтому изучите содержимое пакета, а не пытайтесь угадать. Имя команды не связано с именем репозитория. Оно берется из поля bin рабочего пространства, которое его определяет:

node -p "JSON.stringify(require('./Memory/package.json').bin)"

Эта команда выводит {"memmy-memory":"./dist/src/cli/index.js"}. Таким образом, созданная точка входа — это Memory/dist/src/cli/index.js, и она появляется только после npm run memory:build, так как именно сборка создает dist и делает файл исполняемым. Запустите его напрямую:

node Memory/dist/src/cli/index.js health

Если вы хотите использовать короткое имя в своем PATH, создайте ссылку на этот же файл:

sudo ln -s "$PWD/Memory/dist/src/cli/index.js" /usr/local/bin/memmy-memory
memmy-memory health

CLI по умолчанию использует http://127.0.0.1:18960 и принимает аргументы --url, --token, --config, --source и --user-id. Его подкоманды: init, health, search, add, get и delete, а также вызовы session и turn, которые используют агенты, а не люди. memmy-memory search "deploy steps" и memmy-memory add "staging migrates on deploy" — это две команды, которые агент выполняет чаще всего.

Как подключить Claude Code к Memmy?

У Claude Code нет интерфейса для плагинов памяти, поэтому Memmy не подключается к нему напрямую. Интеграция устроена проще. Claude Code запускает memmy-memory как обычную команду оболочки, а файл инструкций указывает, когда это делать. Документированный установщик Memmy создает этот файл автоматически: memmy-memory init --agent помещает файл инструкций для работы с памятью в каталог правил целевого агента.

Напишите инструкцию вручную один раз, чтобы точно знать, какие указания получил агент. Claude Code считывает CLAUDE.md из корня проекта в начале каждого сеанса, поэтому интеграция целиком состоит из следующего раздела:

## Memory

Before starting a task, run `memmy-memory search "<topic>"` and read what comes back.
When a task is done, run `memmy-memory add "<what you learned>"` for anything that will matter next session.

Четко понимайте, что это дает. Это интеграция на уровне инструкций, поэтому она работает только тогда, когда модель решает выполнить команду. Ничто не принуждает к вызову. Если сеанс завершается без add, данные не сохраняются, и единственным признаком будет пустой результат при следующем поиске. Это тот же компромисс, что и в собственных файлах памяти Claude Code, с одним отличием: хранилище является общим, поэтому заметка также становится доступна для Codex и Cursor на той же машине.

Обратное направление не требует никакой настройки. Сканер Memmy уже считывает ~/.claude/projects/**/*.jsonl, куда Claude Code записывает транскрипты сеансов. Запустите Memmy на том же сервере, где вы используете Claude Code внутри сеанса tmux, и вчерашняя работа станет памятью без какой-либо дополнительной настройки.

Работает ли Memmy в качестве MCP-сервера для Claude Code?

Нет, и понимание этого направления сэкономит вам время. Протокол MCP (model context protocol) состоит из клиентов и серверов. Memmy является клиентом. Он подключается к MCP-серверам и предоставляет их инструменты собственной среде выполнения агента. Он не публикует MCP-эндпоинт, на который мог бы указывать claude mcp add. Единственный MCP-мост в репозитории относится к интеграции Composio внутри локального API десктопной версии, и этот API привязывается к случайному порту на 127.0.0.1 за собственным заголовком x-memmy-mcp-token.

Клиентская часть настраивается в ~/.memmy/config.yaml, на который указывает файл MEMMY_CONFIG, в разделе tools.mcpServers:

tools:
  mcpServers:
    example:
      type: stdio
      command: npx
      args:
        - "-y"
        - "your-mcp-server"
      toolTimeout: 30
      enabledTools:
        - "*"

type принимает stdio, sse и streamableHttp. Сервер stdio запускается как дочерний процесс Memmy, что означает, что его команда должна существовать на той же машине и выполняться от имени того же пользователя. Если вы уже используете MCP-серверы, работающие на VPS, именно их следует указать здесь.

Обеспечение конфиденциальности хранилища памяти

Все данные Memmy находятся в ~/.memmy: config.yaml, рабочая область, memory-service/memory.sqlite и файлы среды выполнения. Сканирование и прием данных происходят локально, а воспоминания записываются в этот локальный файл SQLite, поэтому по умолчанию система работает полностью локально.

Существует два пути передачи данных по сети. MEMMY_CLOUD_SERVICE по умолчанию использует https://memmy-api.memtensor.cn и поддерживает режим учетной записи с пробными токенами, поэтому в режиме API key этот адрес не используется. Программа улучшения памяти — это отдельный переключатель в настройках конфиденциальности, который выключен, пока вы его не активируете.

Третий путь заметить сложнее. Если вы настроите стороннего провайдера эмбеддингов, текст каждого воспоминания будет отправляться этому провайдеру для преобразования в вектор. Локальное хранилище здесь не поможет. Единственный способ закрыть этот канал — использовать конечную точку эмбеддингов, которую вы разместили самостоятельно.

Держите порт 18960 на адресе обратной петли (loopback). Для него не требуется правило брандмауэра, так как служба, привязанная к 127.0.0.1, недоступна извне сервера. Подключайтесь к ней со своего ноутбука через SSH:

ssh -N -L 18960:127.0.0.1:18960 you@your-vps

Если вы когда-либо привяжете службу к внешнему интерфейсу, сначала установите токен. Установка storage.token в конфигурации или использование переменной окружения MEMMY_MEMORY_TOKEN или MEMORY_SERVICE_TOKEN потребует наличия токена Bearer для всех конечных точек, кроме health. Значения конфигурации поддерживают ссылки ${ENV_NAME}, поэтому токен и ваши API-ключи моделей не будут храниться в самом файле. Это соответствует правилу хранения секретов вне AI-агентов в любых других системах, а политика ufw по умолчанию с запретом всего трафика послужит страховкой, если в будущих версиях изменится адрес привязки по умолчанию.

Создайте резервную копию ~/.memmy перед тем, как доверять ей

memory.sqlite — это всё хранилище целиком. Векторы находятся в том же файле через расширение sqlite-vec, поэтому один файл является резервной копией. Копирование его с помощью cp во время записи службой может привести к повреждению базы данных. Используйте собственную команду резервного копирования SQLite:

mkdir -p ~/memmy-backup
sqlite3 ~/.memmy/memory-service/memory.sqlite ".backup '$HOME/memmy-backup/memory.sqlite'"

Это создает согласованную копию, пока служба продолжает работать. Выгружайте её с сервера по расписанию, для чего предназначено restic для удаленного хранения. Потеря config.yaml приведет к потере настроек провайдера, которые можно ввести заново. Потеря memory.sqlite приведет к потере всех воспоминаний, и никакие другие данные на машине не содержат их второй копии.

Запуск службы памяти через systemd

npm run memory:serve:dev в оболочке завершается вместе с самой оболочкой. Файл модуля (unit file) обеспечивает работу службы после перезагрузок.

[Unit]
Description=Memmy memory service
After=network-online.target

[Service]
Type=simple
User=memmy
WorkingDirectory=/opt/memmy/memmy-agent
EnvironmentFile=/etc/memmy/memory.env
ExecStart=/usr/bin/npm run memory:serve:dev
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Не храните токен внутри модуля. Поместите его в /etc/memmy/memory.env, владельцем которого является root, с правами доступа 600:

MEMMY_CONFIG=/home/memmy/.memmy/config.yaml
MEMMY_MEMORY_TOKEN=replace-this-with-a-long-random-string
sudo systemctl daemon-reload
sudo systemctl enable --now memmy-memory
systemctl status memmy-memory --no-pager
curl -sS http://127.0.0.1:18960/api/v1/health

status=203/EXEC в выводе статуса означает, что systemd не смог запустить ExecStart, поэтому проверьте which npm: при установке через NodeSource это /usr/bin/npm, а при использовании nvm — путь в домашнем каталоге пользователя, который systemd не обнаружит. Если модуль запускается и сразу завершается, значит, произошел сбой внутри npm, и journalctl -u memmy-memory -n 50 выведет причину. Механика работы такая же, как и для любой другой службы systemd на VPS.

Чего Memmy пока не умеет

  • Отсутствует сборка для Linux-десктопа. Скрипты упаковки поддерживают только macOS и Windows, поэтому рабочая среда, мастер начальной настройки и панель управления памятью на самом сервере недоступны.
  • memory:serve:dev запускает точку входа TypeScript через tsx, что является путем для разработки. В репозитории также поставляется memory:serve для скомпилированного вывода. Запустите npm run без аргументов, чтобы увидеть, какие именно скрипты доступны в вашей локальной копии.
  • Механизм поиска формирует окно выборки из последних 2000 векторных строк, после чего применяет алгоритм Top-K внутри этого окна. В очень больших хранилищах старые записи могут оказаться за пределами этого диапазона.
  • Векторизация выполняется после захвата данных. В случае сбоя задача попадает в очередь повторных попыток, не блокируя работу агента. Запись, добавленная мгновенно, может быть еще недоступна для векторного поиска.
  • Один файл SQLite соответствует одному узлу. Кластеризация не поддерживается, поэтому второй сервер будет обладать отдельной, независимой памятью.

Версия 1.0.4 и примерно 329 звезд по состоянию на июль 2026 года указывают на то, что проект находится на ранней стадии развития. Флаги, пути и имена скриптов могут меняться от релиза к релизу. Читайте поле bin и вывод npm run в вашей собственной локальной копии, а не полагайтесь на команды, скопированные из сторонних источников, включая этот текст.

FAQ

Почему проверка работоспособности возвращает ошибку connection refused?

На порту 18960 нет активных слушающих процессов. Код завершения curl 7 с Failed to connect to 127.0.0.1 port 18960 означает, что служба памяти не запущена или завершилась при старте. Проверьте терминал или журнал, в котором она была запущена. Две наиболее частые причины: собственный модуль better-sqlite3, не соответствующий вашей версии Node (исправляется командой npm rebuild better-sqlite3), и версия Node ниже 22. После запуска службы подтвердите наличие сокета с помощью ss -lntp | grep 18960.

Откуда берется команда memmy-memory после сборки из исходного кода?

Она берется из поля bin пакета рабочей области @memmy/memory, а не из имени репозитория. Выполните node -p "JSON.stringify(require('./Memory/package.json').bin)" внутри каталога с исходным кодом, и команда выведет {"memmy-memory":"./dist/src/cli/index.js"}. Этот файл появляется только после npm run memory:build, так как в процессе сборки создается dist и файлу присваивается атрибут исполнения. Запускайте его как node Memory/dist/src/cli/index.js health или создайте символическую ссылку в /usr/local/bin для использования короткого имени.

Можно ли добавить Memmy в Claude Code с помощью claude mcp add?

Нет. Memmy — это клиент MCP, а не сервер MCP. Он подключается к серверам, перечисленным в tools.mcpServers в файле ~/.memmy/config.yaml, и предоставляет их инструменты своей среде выполнения. Claude Code взаимодействует с Memmy иначе: он запускает CLI memmy-memory как команду оболочки, руководствуясь файлом инструкций, который memmy-memory init --agent записывает в каталог правил агента.

Отправляет ли Memmy мои воспоминания в облачный сервис при работе?

Сканирование и обработка данных выполняются локально, а воспоминания записываются в ~/.memmy/memory-service/memory.sqlite на вашем диске. MEMMY_CLOUD_SERVICE указывает на https://memmy-api.memtensor.cn для режима учетной записи и пробных токенов, а программа улучшения памяти остается отключенной, пока вы ее не активируете. Путь, за которым стоит следить — это провайдер эмбеддингов: размещенная в облаке модель эмбеддингов получает текст каждого воспоминания, которое она преобразует в вектор. Если это критично, используйте конечную точку, которую вы развернули самостоятельно.