Установка 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 --versionnode --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:buildnpm 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/healthHealth — это единственный эндпоинт, который не требует токена, поэтому он подходит для проверки состояния. Если 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 healthCLI по умолчанию использует 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-stringsudo 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/healthstatus=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 для режима учетной записи и пробных токенов, а программа улучшения памяти остается отключенной, пока вы ее не активируете. Путь, за которым стоит следить — это провайдер эмбеддингов: размещенная в облаке модель эмбеддингов получает текст каждого воспоминания, которое она преобразует в вектор. Если это критично, используйте конечную точку, которую вы развернули самостоятельно.