# 用 Traefik 在 Vultr 上安全部署 Dense-Mem

**Summary:** 一篇非技术读者也能跟上的 walkthrough：在 Vultr 云服务器上启动 Dense-Mem，配置 Traefik、HTTPS、私有控制台访问，以及给个人、家庭或工作 AI 工具使用的共享记忆。

- Canonical: https://markhuang.ai/zh/blog/secure-dense-mem-vultr-traefik
- Language: zh-CN
- Author: [Mark Huang](https://markhuang.ai/about)
- Published: 2026-05-30
- Section: 教程
- Tags: Dense-Mem, Vultr, Traefik, Docker, MCP, AI 记忆
- License: https://creativecommons.org/licenses/by-nc/4.0/

---

![一台云 VPS，前面是 HTTPS 边缘网关，后面是私有 Dense-Mem 记忆库](https://cdn.markhuang.ai/blog/secure-dense-mem-vultr-traefik/hero.webp)

*一台云 VPS，前面是 HTTPS 边缘网关，后面是私有 Dense-Mem 记忆库*

## 一句话总结

云端部署的核心思路就一条：只对外暴露一个 HTTPS 端点，管理界面全部藏在后面。

| 对外公开                                      | 保持私有                            |
| ----------------------------------------- | ------------------------------- |
| AI 客户端访问 `https://memory.example.com/mcp` | 控制台走 SSH 隧道，绑定 `127.0.0.1:8090` |
| Traefik 监听 `80` 和 `443`                   | Postgres、Neo4j、控制台都不上公网         |
| 用 API Key 控制记忆访问权限                        | 用 Team 和 Profile 隔离家庭、个人、工作记忆   |

本地跑 Dense-Mem 是最简单的起步方式。但想要笔记本、台式机、工作机、远程 AI 客户端都能访问同一份记忆，就得把它放到一台云服务器上。

这篇教程带你搭一套安全够用的入门环境：

```text
你的 AI 客户端 -> https://memory.example.com/mcp -> Traefik -> Dense-Mem
```

公网能看到的只有一个 HTTPS 的 Dense-Mem 端点，控制台完全隐藏。

> **Info:**
>
> 文中的 Vultr 链接是推荐链接：<https://www.vultr.com/?ref=8310459>。如果你正好要开服务器，通过它注册可以支持这个项目。

## 你要搭的东西

| 组件             | 干什么用                                  |
| -------------- | ------------------------------------- |
| Vultr VPS      | 跑 Dense-Mem 的云服务器                     |
| Docker Compose | 一键拉起 Dense-Mem、Postgres、Neo4j、Traefik |
| Traefik        | 搞定 HTTPS、证书、安全头和路由                    |
| Dense-Mem      | 存放共享的 AI 记忆                           |
| 控制台            | 管理密钥和团队，但只对内开放                        |

这套方案适合个人、家庭或小团队——想要一台自己的记忆服务器，又不想从零搭平台。

## 第一步：创建 Vultr 服务器

通过推荐链接进入 Vultr：

[注册 Vultr 或创建服务器](https://www.vultr.com/?ref=8310459)

新建一个 Cloud Compute 实例：

| 选项     | 推荐配置                                        |
| ------ | ------------------------------------------- |
| 地区     | 选离你最近的机房                                    |
| 系统镜像   | Ubuntu 24.04 LTS                            |
| 规格     | Docker + Postgres + Neo4j 要吃内存，建议至少 4 GB 起步 |
| SSH 密钥 | 务必添加 SSH Key，别用密码登录                         |
| 防火墙    | 只放行 SSH、HTTP、HTTPS                          |

防火墙这样配：

| 端口    | 放行来源         | 用途                     |
| ----- | ------------ | ---------------------- |
| `22`  | 最好只放行你自己的 IP | SSH 管理                 |
| `80`  | 所有来源         | Traefik 用来申请 HTTPS 证书  |
| `443` | 所有来源         | Dense-Mem 的 HTTPS 公开端点 |

这些端口千万不要对外开放：

```text
8080, 8090, 5432, 7474, 7687
```

它们都是内部管理接口和数据库端口，暴露在公网上就是安全隐患。

## 第二步：把域名指向服务器

![域名通过 DNS 解析指向云服务器](https://cdn.markhuang.ai/blog/secure-dense-mem-vultr-traefik/dns-domain.webp)

*域名通过 DNS 解析指向云服务器*

你需要一个域名或者子域名，比如：

```text
memory.example.com
```

添加一条 `A` 记录：

| DNS 字段 | 填写内容            |
| ------ | --------------- |
| 名称     | `memory`        |
| 类型     | `A`             |
| 值      | Vultr 服务器的公网 IP |

等 DNS 生效后验证一下：

```bash
ping memory.example.com
```

ping 出来的 IP 是你的 Vultr 地址就可以继续了。

## 第三步：SSH 登录服务器

在你自己的电脑上：

```bash
ssh root@YOUR_SERVER_IP
```

先把系统更新一下：

```bash
apt update
apt upgrade -y
```

然后按 Docker 官方文档安装 Docker，完整流程可以参考 Docker 官网的 Ubuntu 教程，这里直接给命令：

```bash
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
​
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \
  > /etc/apt/sources.list.d/docker.list
​
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

确认安装成功：

```bash
docker compose version
```

## 第四步：下载 Compose 配置文件

创建应用目录：

```bash
mkdir -p /opt/dense-mem
cd /opt/dense-mem
```

下载集成了 Traefik 配置的 Compose 文件：

```bash
curl -fsSLo docker-compose.yml \
  https://raw.githubusercontent.com/markhuangai/dense-mem/main/examples/docker-compose.expert.yml
```

创建 `.env` 配置文件：

```bash
cat > .env <<'EOF'
POSTGRES_PASSWORD=replace-with-a-long-random-password
NEO4J_PASSWORD=replace-with-a-long-random-password
CONTROL_PORTAL_TOKEN=replace-with-a-long-random-token
AI_API_URL=https://api.openai.com/v1
AI_API_KEY=your-ai-provider-api-key
AI_API_EMBEDDING_MODEL=text-embedding-3-large
AI_API_EMBEDDING_DIMENSIONS=3072
​
DENSE_MEM_DOMAIN=memory.example.com
ACME_EMAIL=you@example.com
CONTROL_PORTAL_BIND=127.0.0.1
CONTROL_PORTAL_PORT=8090
EOF
```

打开编辑：

```bash
nano .env
```

需要改的地方：

- `memory.example.com` 换成你自己的域名
- `you@example.com` 换成你的邮箱
- 所有占位的密码和 token 都要换成真正的密钥
- `your-ai-provider-api-key` 换成你的 AI 服务商 API Key
- 如果不用 OpenAI，`AI_API_URL` 换成你用的 OpenAI 兼容接口的地址
- `AI_API_EMBEDDING_MODEL` 和 `AI_API_EMBEDDING_DIMENSIONS` 要对应同一个 Embedding 模型和维度

生成随机密钥可以用这个命令：

```bash
openssl rand -base64 32
```

示例用的是 OpenAI 的 `text-embedding-3-large`，输出 `3072` 维向量。如果你用 `text-embedding-3-small`，维度改成 `AI_API_EMBEDDING_DIMENSIONS=1536`。注意：在存入重要记忆之前就要定好 Embedding 模型，中途换模型或维度意味着已有记忆得全部重新 Embedding。

## 第五步：启动 Dense-Mem

![公网 HTTPS 流量经过 Traefik 边缘网关后到达后端的 Dense-Mem](https://cdn.markhuang.ai/blog/secure-dense-mem-vultr-traefik/traefik-edge.webp)

*公网 HTTPS 流量经过 Traefik 边缘网关后到达后端的 Dense-Mem*

拉起整套 HTTPS 服务：

```bash
docker compose --profile traefik up -d
```

看看容器都跑起来没有：

```bash
docker compose ps
```

测试一下公开的 health 端点：

```bash
curl https://memory.example.com/health
```

如果返回的 JSON 里状态是 `healthy` 或 `degraded`，说明 HTTPS 路由已经通了。单机部署没开 Redis 的话，显示 `degraded` 是正常的。

## 第六步：创建团队和 API Key

创建你的第一个共享记忆团队：

```bash
docker compose exec server /app/provision-team --name "primary-memory"
```

命令会输出一个 API Key，找个安全的地方存好。

在每台需要连接的设备上设置这个 Key：

```bash
export DENSE_MEM_API_KEY="dm_default_prof_..."
```

## 第七步：让 Claude Code 连上服务器

```bash
claude mcp add --transport http dense-mem https://memory.example.com/mcp \
  --header "Authorization: Bearer $DENSE_MEM_API_KEY"
```

跟 Claude Code 说一声：

```text
请记住，这台 Dense-Mem 服务器是我的共享 AI 记忆。
```

然后开个新会话试试：

```text
关于我的 Dense-Mem 部署，你还记得什么？
```

## 第八步：把 Codex 也接进来

在 `~/.codex/config.toml` 里加上：

```toml
[mcp_servers.dense_mem]
url = "https://memory.example.com/mcp"
bearer_token_env_var = "DENSE_MEM_API_KEY"
tool_timeout_sec = 60
enabled = true
```

重启 Codex。

这样 Claude Code 和 Codex 就共享同一个记忆库了。

## 第九步：控制台只走本地访问

![通过 SSH 隧道本地访问控制台，公网只能到达记忆 API](https://cdn.markhuang.ai/blog/secure-dense-mem-vultr-traefik/private-control-portal.webp)

*通过 SSH 隧道本地访问控制台，公网只能到达记忆 API*

控制台用来管理团队、Profile、密钥和安全设置，绝对不能暴露到公网。

Compose 文件里控制台只绑定在服务器的 `127.0.0.1:8090`。想从自己电脑上访问，走 SSH 隧道：

```bash
ssh -L 8090:127.0.0.1:8090 root@YOUR_SERVER_IP
```

然后浏览器打开：

```text
http://127.0.0.1:8090/
```

用 `.env` 里的 `CONTROL_PORTAL_TOKEN` 登录。

## 家庭或团队共享记忆

Dense-Mem 支持划分多个独立的记忆空间。

| 场景    | 怎么配                                     |
| ----- | --------------------------------------- |
| 个人    | 一个 `primary-memory` 团队就够                |
| 家庭    | 建一个 `family-memory` 团队，成员用不同 Profile 区分 |
| 工作    | 每个工作组或项目单独一个团队                          |
| 自动化工具 | 只需要查不需要写的工具，给只读 Profile 的 Key           |

需要共享记忆就放同一个团队，不想混在一起就拆成不同团队。

这就是 Dense-Mem 的设计思路：要连贯性就给一个记忆库，要隐私就划清边界。

## 安全检查清单

邀请别人用之前，先过一遍这些：

- 控制台不要暴露到公网
- API Key 保管好，别泄露
- 只读工具给只读 Key
- 设备丢了或有人退出团队，及时轮换 Key
- 不要把密码、助记词、私钥这类东西存进记忆
- 记忆重要的话，记得备份 Docker Volume
- 用的 AI 服务商可能会收到记忆文本来做 Embedding 和校验，心里要有数

Dense-Mem 让 AI 记忆更持久，但保护敏感信息的责任还是在你自己身上。

## 为什么要这么做

最好的 AI 工作流不是开一个聊天窗口，而是把各个工具连起来。

Claude Code 可以记住你的编码规范，Codex 也能调用同样的规则。家庭助手记得旅行偏好，工作团队能找回上个月的决策，而不是每个 Sprint 都重新讨论一遍。

Dense-Mem 给这些工具加了一层你自己掌控的共享记忆。

试试看，觉得好用就分享出去，顺便给仓库点个星让更多人发现它：

[github.com/markhuangai/dense-mem](https://github.com/markhuangai/dense-mem)
