
Mem0 自托管服务器实战指南FastAPI pgvector Dashboard 的本地部署、安全加固与 Postgres 镜像迁移【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchainMem0原 embedchain 项目演进而来除了 Python SDK 之外还内置了一个可自托管的 FastAPI REST 服务端与本地 Web 仪表盘。本文基于仓库中的 server/README.md结合服务端源码、Docker 编排与运维脚本完整讲解如何用一条命令拉起整套记忆服务、如何理解其安全默认设计、如何管理请求日志与遥测以及如何将 Postgres 镜像从已归档的ankane/pgvector平滑迁移到官方pgvector/pgvector:pg17。读完本文你可以独立完成 Mem0 记忆服务的本地部署、日常运维与跨大版本升级。一、服务端架构总览三个容器组成的最小记忆栈从 server/docker-compose.yaml 可以看到自托管栈由三个服务构成通过mem0_networkbridge 网络互通服务镜像/构建端口映射职责mem0基于 server/dev.Dockerfile 构建8888:8000FastAPI REST API挂载源码并--reload热更新postgrespgvector/pgvector:pg178432:5432向量存储memories 应用库用户、API Key、请求日志mem0-dashboard基于 server/dashboard/ 构建的 Next.js 应用3000:3000Web 仪表盘走/api/health健康检查几个值得注意的编排细节Postgres 凭据强制注入POSTGRES_PASSWORD${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env}server/docker-compose.yaml:?语法意味着.env中未设置该变量时 compose 直接拒绝启动——这正是 README 中POSTGRES_PASSWORD 现为必填项的实现来源。双数据库分工server/init-db.sh 在 Postgres 首次初始化时额外创建mem0_app库存放用户、API Key、请求日志等应用数据默认的postgres库则供 pgvector 存放记忆向量。启动时序mem0服务depends_onPostgres 的service_healthy其启动命令先执行alembic upgrade head再拉起uvicorn main:app即 API 容器启动时会自动跑数据库迁移。二、快速启动2.1 前置准备配置.env复制示例环境文件并至少填写 Postgres 密码与一个 LLM 提供商的 Keycd server cp .env.example .env # Edit .env — at minimum set POSTGRES_PASSWORD and OPENAI_API_KEYserver/.env.example 中各变量的完整含义如下变量默认值说明OPENAI_API_KEY空默认 LLM/Embedder 提供商的 Key也可改用ANTHROPIC_API_KEY/GOOGLE_API_KEYPOSTGRES_HOST/POSTGRES_PORT/POSTGRES_DB/POSTGRES_USERpostgres/5432/postgres/postgres向量库连接参数POSTGRES_PASSWORD必填未设置时 docker compose 拒绝启动POSTGRES_COLLECTION_NAMEmemoriespgvector 集合表名ADMIN_API_KEY空遗留的直连管理密钥建议长度 ≥ 16 位JWT_SECRET空认证启用时的 JWT 签名密钥可用openssl rand -base64 48生成AUTH_DISABLEDfalse仅本地开发可设为true生产环境禁用DASHBOARD_URLhttp://localhost:3000CORS 白名单来源APP_DB_NAMEmem0_app应用数据库名MEM0_DEFAULT_LLM_MODELgpt-5-mini默认 LLM 模型可覆盖以固定版本MEM0_DEFAULT_EMBEDDER_MODELtext-embedding-3-small默认 Embedder 模型MEM0_TELEMETRYtrue匿名遥测开关设为false退出REQUEST_LOG_RETENTION_DAYS30请求日志保留天数默认运行时配置由 server/main.py 中的DEFAULT_CONFIG组装向量存储固定为pgvectorLLM 与 Embedder 默认走 OpenAIgpt-5-minitext-embedding-3-small。此外 server/main.py 定义了镜像内置的提供商白名单BUNDLED_LLM_PROVIDERS (openai, anthropic, gemini)与BUNDLED_EMBEDDER_PROVIDERS (openai, gemini)——通过POST /configure切换到未打包的提供商会直接返回 400源码中的错误提示明确给出了扩展方式安装对应 Python 包、重建容器并扩展白名单。2.2 Agent-first一条命令完成全部初始化cd server make bootstrapserver/Makefile 中bootstrap: up wait-api wait-dashboard seed即依次完成四步up先检查 3000/8888 端口未被占用避免与已有服务冲突再docker compose up -d --buildwait-api轮询GET /auth/setup-status直到 API 就绪每 2 秒一次wait-dashboard轮询GET /api/health直到仪表盘就绪seed执行 server/scripts/seed.sh 完成账号与 Key 初始化。seed 脚本的完整调用链值得展开见 server/scripts/seed.sh调GET /auth/setup-status判断是否已有管理员若无调POST /auth/register创建首个 admin密码未指定时用secrets.token_urlsafe(16)随机生成调POST /auth/login换取 JWT access token携带 Bearer token 调POST /api-keys创建标签为dev-seed-key的 API Key在 Ready 块中一次性打印 Email、Password、API Key。凭据只打印一次关闭终端前务必保存密码与 API Key——API Key 在数据库里只保存 bcrypt 哈希见 server/auth.py 的generate_api_key无法事后找回。可覆盖生成的凭据cd server make bootstrap EMAILadmincompany.com PASSWORDstrong-password NAMEAdmin面向机器解析的场景如 CI、Agent 自动化可用 JSON 输出cd server OUTPUTjson make seed此时 server/scripts/seed.sh 只输出一行 JSON包含dashboard_url、api_url、email、password、api_key五个字段方便直接jq解析。注意make bootstrap跳过设置向导因此使用场景 → 自定义指令步骤不会执行。若之后想补充自定义指令直接POST /configure提交{custom_instructions: ...}即可/configure端点定义见 server/main.py读取配置时敏感字段会自动脱敏为[redacted]。2.3 Browser-first走浏览器设置向导cd server make up然后打开http://localhost:3000按向导完成管理员注册与使用场景配置。相比 Agent-first 流程向导会多触发一个遥测事件见第五节并且向导最后一步可让 LLM 基于你填写的use_case自动生成custom_instructions与一条测试消息——对应 API 侧的POST /generate-instructionsserver/main.py。2.4 拆除与清理# Stop the stack cd server make down # Wipe all data (including the Postgres volume) cd server make cleanmake clean等价于docker compose down -v会永久删除postgres_db卷包含全部记忆与应用数据执行前确认无需保留。三、安全默认认证、API Key 与响应头README 的 Security Defaults 一节列出四条规则均可在源码中得到印证仪表盘登录使用 JWT。server/auth.py 中算法为 HS256access token 有效期 30 分钟refresh token 有效期 30 天。refresh token 采用 jti 表 条件 UPDATE 原子消费server/auth.py关闭了读取-检查-写入竞态同一 token 并发重放最多只有一个成功。程序化访问使用X-API-Key头。Key 由secrets.token_urlsafe(32)生成并加m0sk_前缀数据库api_keys表server/models.py只存前 12 位前缀与 bcrypt 哈希泄露数据库也无法还原 Key 原文。认证默认启用。若既无管理员也无ADMIN_API_KEYserver/main.py 启动时会打印醒目警告块列出三种修复途径设置ADMIN_API_KEY、到http://host:3000/setup注册管理员、仅限本地开发时设AUTH_DISABLEDtrue。AUTH_DISABLEDtrue仅限本地开发。该值通过 compose 的${AUTH_DISABLED:-false}透传生产环境应保持 false。此外所有受保护请求都会经过请求日志中间件且响应附带X-Request-ID便于排障server/main.py。仪表盘安全响应头server/dashboard/next.config.mjs 对所有路径统一设置X-Frame-Options: DENYContent-Security-Policy: frame-ancestors noneX-Content-Type-Options: nosniffReferrer-Policy: strict-origin-when-cross-origin前两者双重阻止 iframe 嵌入防点击劫持nosniff防止浏览器嗅探错误标注的 MIME 类型Referrer-Policy限制跨域 Referer 泄露。如需更强防护如 HSTS、CSP nonceREADME 建议在自己的反向代理层追加。忘记密码的官方恢复路径在栈运行期间从宿主机重置管理员密码cd server make reset-admin-password EMAILadminexample.com PASSWORDnew-strong-password该 target 通过docker compose exec在mem0容器内执行 server/scripts/reset_admin_password.py见 server/Makefile。README 的解释是任何能拿到宿主 shell 的人本就对数据库和密钥拥有完全访问权因此这条命令并不扩大攻击面——它是支持的恢复路径而非绕过机制。四、仪表盘功能登录后仪表盘Next.js 应用源码位于 server/dashboard/src/提供六类能力Requests— API 调用的实时审计日志method、path、status、latency数据即request_logs表server/models.pyMemories— 浏览记忆按 user ID 过滤Entities— 列出所有持有记忆的user_id、agent_id、run_id及其数量删除实体即级联删除其记忆API Keys— 创建、打标签、吊销每个用户的 KeyConfiguration— 运行时覆盖 LLM 与 Embedder 配置变更持久化到应用库settings表重启后重新生效并分层叠加在.env值之上对应 API 的GET/POST /configure与GET /configure/providersSettings— 账号资料与密码管理。API 侧能力与之对应server/main.py 暴露了POST /memories、GET /memories不带标识符时全量列出需 admin 角色上限 1000 条、GET /memories/{id}、POST /search、PUT /memories/{id}、GET /memories/{id}/history、DELETE /memories/{id}、DELETE /memories、POST /reset等端点OpenAPI 文档位于http://localhost:8888/docs。五、请求日志保留策略request_logs表只增不删会随流量增长README 给出的量级参考10 req/s 下约 86.4 万行/天需要周期性清理cd server make prune-logs # defaults to 30 days make prune-logs REQUEST_LOG_RETENTION_DAYS7 # shorter window其背后的实现分两部分写入侧server/main.py 的log_requests中间件记录每个请求的 method、path、status、latency 与 auth_type并在finally中通过run_in_executor异步落库OPTIONS预检请求、/api/health、/docs、/redoc、/openapi.json以及/requests前缀路径被排除server/main.py避免审计接口本身制造噪声。删除侧server/scripts/prune_request_logs.py 读取REQUEST_LOG_RETENTION_DAYS默认 30必须 ≥ 1 的整数按 UTC 时间截断执行DELETE ... WHERE created_at cutoff。README 建议生产环境将其接入 cron 或 systemd timer。为什么大表上这个删除依然便宜因为created_at列上建了BRIN 索引——迁移文件 server/alembic/versions/006_request_logs_brin.py 将其从 btree 换成了CREATE INDEX ... USING BRIN (created_at)。对按时间天然有序追加的日志表BRIN 以极小的索引体积让范围删除快速定位块范围这正是 README 中range deletes stay cheap even on large tables的依据。六、遥测默认开启、最多两个事件、可一键退出遥测实现见 server/telemetry.py与 Mem0 OSS 库一致默认开启指向同一个匿名 PostHog 项目每个安装最多发送两个事件事件触发时机属性admin_registered首个管理员被创建向导或 API 直连均可邮箱域名、服务端版本、安装 UUIDonboarding_completed设置向导到达最终成功态同上外加操作者填写的自由文本use_case几个可验证的实现细节纯 API 引导make bootstrap永远不会发出onboarding_completed因为向导成功态不存在每个事件通过状态文件默认/app/history/telemetry.json保证至多一次_capture_once中的幂等键见 server/telemetry.pydistinct_id是随机生成的安装 UUID属性里只有邮箱域名非完整邮箱不含 PII退出方式在.env中设MEM0_TELEMETRYfalsecompose 中经${MEM0_TELEMETRY:-true}透传server/telemetry.py 解析。七、从ankane/pgvector迁移到pgvector/pgvectorankane/pgvector镜像已归档停止维护当前版本换成官方pgvector/pgvector:pg17PostgreSQL 17、pgvector 0.8.0。变更对照BeforeAfterDocker 镜像ankane/pgvector:v0.5.1pgvector/pgvector:pg17PostgreSQL 版本1517pgvector 版本0.5.10.8.0凭据硬编码postgres/postgres由POSTGRES_USER/POSTGRES_PASSWORD环境变量驱动7.1 全新安装无存量数据无需迁移复制.env.example为.env设置POSTGRES_PASSWORD然后make up。7.2 存量安装保留数据PostgreSQL 17 无法直接读取 15 写下的数据文件必须先导出、再导入。第 1 步在旧栈运行时导出数据cd server # Dump all databases (mem0 memories mem0_app auth/config data) docker compose exec -T postgres pg_dumpall -U postgres mem0_backup.sql ls -lh mem0_backup.sql # 确认 dump 文件非空第 2 步停旧栈并删除旧卷docker compose down docker compose down -v # 删除 postgres_db 卷——务必先确认备份可用第 3 步更新.env凭据不再硬编码于docker-compose.yaml需显式写入POSTGRES_HOSTpostgres POSTGRES_PORT5432 POSTGRES_DBpostgres POSTGRES_USERpostgres POSTGRES_PASSWORDyour-password # required — compose will refuse to start without it POSTGRES_COLLECTION_NAMEmemories若此前依赖硬编码的postgres/postgres设POSTGRES_PASSWORDpostgres保持凭据一致。第 4 步只启动 Postgresdocker compose up -d postgres docker compose exec -T postgres pg_isready -q echo ready || echo not ready必须只先起 Postgres、不起 mem0 APIAPI 启动即执行alembic upgrade head会创建空表而与恢复冲突。第 5 步恢复数据docker compose exec -T postgres psql -U postgres mem0_backup.sqlrole postgres already exists之类的提示无害。关键点恢复必须先于启动 mem0 API 容器。API 启动时的迁移会建空表——之后再恢复会因重复键失败并丢失 API Key 与设置。第 6 步启动 APIdocker compose up -d mem0Alembic 检测到既有表后只增量应用新迁移。第 7 步验证make health curl -s http://localhost:8888/memories?user_idyour-user-id -H X-API-Key: your-api-keymake health会分别检查 API/docs的 HTTP 状态、仪表盘/api/health与pg_isready见 server/Makefile。7.3 回滚如需回退将 server/docker-compose.yaml 中的镜像改回ankane/pgvector:v0.5.1执行docker compose down -v、docker compose up -d --build再把mem0_backup.sql以同样方式灌入旧容器即可。八、本地端口速查与继续深入入口地址仪表盘http://localhost:3000APIhttp://localhost:8888OpenAPI 文档http://localhost:8888/docs常用命令回顾make up启动并等待就绪、make down/make clean停止 / 停止并删卷、make logsdocker compose logs -f、make health三件套体检、make bootstrapAgent-first 一键初始化、make reset-admin-password、make prune-logs。如需进一步阅读实现REST 端点与默认配置在 server/main.py认证与 Key 生成在 server/auth.py路由层在 server/routers/数据库模型在 server/models.py应用库迁移在 server/alembic/versions/仪表盘前端在 server/dashboard/src/服务端行为有对应测试覆盖如 tests/test_server_auth.py、tests/test_api_keys_router.py、tests/test_server_params.py。【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考