Fullstar

Archives

  • August 2026
  • December 2025
  • August 2024
  • July 2024
  • February 2024
  • November 2023
  • August 2023
  • July 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • February 2022
  • January 2022
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020

Categories

  • Code
  • Lens
  • Life
0
Fullstar
  • Code

Letta部署记录

  • December 26, 2025
  • Brandon

Looking for a Shorter Overview?

AI Summary

这套方案将本地Mac Mini上的Qwen3-Embedding、云端LiteLLM与Linux服务器上的Letta串联起来,并分别配置持久化与自动启动。重点通过HTTPS、Cloudflare、Master Key和Virtual Key分层保护公网模型接口,同时用PostgreSQL为LiteLLM和Letta提供可迁移的数据存储。

Key Moments

AI-generated
1

Mac Mini 部署本地嵌入模型

在 Mac Mini 安装 Ollama 并运行 qwen3-embedding:4b,通过 LaunchAgent 设置局域网监听、模型常驻和开机预热。
2

验证 Ollama 嵌入接口

使用 POST 请求访问 http://<ip address>:11434/api/embeddings,提交模型名和 prompt 以确认嵌入服务可用。
3

云服务器部署安全 LiteLLM 代理

使用 PostgreSQL 与 LiteLLM 转发 gemini/* 请求,并通过 HTTPS、Cloudflare、主密钥和虚拟密钥降低公网 API 泄露及盗刷风险。
4

Linux 部署 Letta 并接入服务

使用 pgvector PostgreSQL 持久化 Letta 数据,配置 LiteLLM 的 OpenAI 兼容地址和远程 Ollama 地址,再在 Letta 自托管后端中创建 Agent 并选择本地嵌入模型。
Total
0
Shares
0
0
0

Letta前身为MemGPT,由Embedding model、大模型与向量数据库组成,采用qwen3-embedding:4b + gemini 3.0 flash + postgresql作为组合,部署架构图如下(其中Linux Server使用frp通过腾讯云服务进行反代,此处略过):

Mac Mini部署Ollama + Qwen3-Embedding: 4b模型

官网下载Ollama,下载并运行模型:ollama run qwen3-embedding:4b,

配置模型开机自启动并运行:创建ollama_startup.sh文件并写入:

#!/bin/bash

# 1. 设置环境变量
# 允许局域网访问
launchctl setenv OLLAMA_HOST "0.0.0.0"
# 设置模型永久常驻内存
launchctl setenv OLLAMA_KEEP_ALIVE "-1"

# 2. 启动 Ollama 主程序
# 使用 open -a 确保以 GUI 模式启动(适合 Mac 桌面版 Ollama)
open -a Ollama

# 3. 等待 Ollama 服务完全启动
# 循环检查 11434 端口是否响应,最多等待 30 秒
for i in {1..30}; do
    if curl -s http://localhost:11434/api/tags > /dev/null; then
        echo "Ollama service is up!"
        break
    fi
    sleep 1
done

# 4. 预热(Warm-up)模型
# 发送一个极小的请求,强制 Ollama 把模型加载进 M4 的 GPU
curl http://localhost:11434/api/embeddings -d '{
  "model": "qwen3-embedding:4b",
  "prompt": "warmup"
}'

创建守护配置文件 ~/Library/LaunchAgents/com.user.ollama_init.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.ollama_init</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/brandon/ollama_startup.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/tmp/ollama_init.stdout.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/ollama_init.stderr.log</string>
</dict>
</plist>

完成后可以使用postman访问接口进行测试:

POST http://<ip address>:11434/api/embeddings
{
    "model": "qwen3-embedding:4b",
    "prompt": "Test message"
}

自此完成embedding model的部署。

Cloud Server部署LiteLLM

最初在gemini3的推荐下准备使用oneApi,但发现oneApi的docker镜像对云服务器架构的支持不好,因此改为使用newApi,部署后发现功能对于个人使用过于冗杂,因此还是决定采用LiteLLM部署。

由于打算将LiteLLM部署在公网,因此等于将API直接暴露在公网中,如果Master key暴露将导致API被无限制盗刷,因此决定采用https + openssl rand + virtual key + cloudflare代理的组合。

首先配置config.yaml:

model_list:
  # 使用通配符,匹配所有以 gemini/ 开头的模型请求
  - model_name: "gemini/*"
    litellm_params:
      model: "gemini/*"  # 将星号部分原样传递给 Google API
      api_key: "os.environ/GEMINI_API_KEY"

litellm_settings:
  drop_params: True  # 依然建议开启,自动过滤不支持的参数
  set_verbose: False

配置docker-compose.yml:

services:
  # 1. 数据库服务
  db:
    image: postgres:16-alpine
    container_name: litellm-db
    restart: always
    environment:
      POSTGRES_USER: litellm_admin
      POSTGRES_PASSWORD: your_passwd
      POSTGRES_DB: litellm_db
    volumes:
      - ./postgres_data:/var/lib/postgresql/data # 持久化数据库数据
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U litellm_admin -d litellm_db"]
      interval: 5s
      timeout: 5s
      retries: 5

  # 2. LiteLLM 服务
  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    container_name: litellm
    restart: always
    ports:
      - "4000:4000"
    volumes:
      - ./config.yaml:/app/config.yaml
    environment:
      - GEMINI_API_KEY=your_genmini_api_key
      - LITELLM_MASTER_KEY=your_master_key
      - DATABASE_URL=postgresql://litellm_admin:your_passwd@db:5432/litellm_db
      - PROXY_BASE_URL=https://domain.example.com
    depends_on:
      db:
        condition: service_healthy # 确保数据库启动并健康后再启动 litellm
    command: [ "--config", "/app/config.yaml", "--port", "4000" ]

由于virtual key在ui界面内配置更方便,因此不关闭litellm的ui,且virtual key依赖数据库,因此需要部署postgres数据库。使用virtual key的主要优点在于减少master key的对外暴露,且外部服务即便暴露了virtual key,也不会导致google api的所有权限全部暴露,且virtual key可以设置budget等,安全性相对于直接使用master key要高上许多。

至此LiteLLM完成部署。

Linux Server部署Letta

考虑到后续可能需要进行迁移,因此选择postgresql作为数据库存储,配置docker-compose.yml如下:

services:
  letta-db:
    image: ankane/pgvector:latest
    container_name: letta-db
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - /home/brandon/Services/letta/data:/var/lib/postgresql/data
      - /home/brandon/Services/letta/init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5

  letta-server:
    image: letta/letta:latest
    container_name: letta-server
    restart: always
    ports:
      - "8283:8283"
    depends_on:
      letta-db:
        condition: service_healthy
    environment:
      - LETTA_PG_URI=${LETTA_PG_URI}
      - SECURE=${SECURE}
      - OPENAI_API_BASE=${OPENAI_API_BASE}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
    volumes:
      - /home/brandon/Services/letta/letta_config:/root/.letta

其中OPENAI_API_BASE填写LiteLLM的地址(https://litellm.example.com/v1),OPEN_API_KEY填写master key或者virtual key,OLLAMA_BASE_URL填写ollama ip地址(http://192.168.3.12:11434)。

当部署完成后进入web界面发现当前letta统一将前端重定向至https://app.letta.com/,需要在这个页面下连接self-host server。接着在web界面中点击Manage project并在Self-hosted server中连接至letta服务,由于在docker-compose中将SECURE设置为true且没有显示给出passwd,letta会自动生成一个密钥,可以在容器log中查找。将key填入config后即可连接至self-hosted letta backend,接着Create Agent,并在创建出的Agent中选择Model,在Advanced中的Embedding Config中选择Embedding model为本地部署的模型。

至此完成Letta部署。

Related Posts

AI-generated

WordPress image offload

先将媒体文件手动传入国内MinIO,再改造同步插件跳过已存在对象并解除扩展名拦截,让数百个图片文件顺利写入WordPress媒体数据库,避免跨境重复上传造成卡死。
51.3% match December 14, 2025

常用工具指令

从Git暂存与分支管理,到GDB断点调试、Makefile依赖和并行构建,再到Docker镜像、容器编排及网络通信,这份命令速查覆盖日常开发中最常用的操作场景。
51.2% match September 18, 2022

Questions Answered

AI-generated

如何在Mac Mini部署并预热Qwen3-Embedding模型?

通过Ollama运行模型、开放局域网端口并发送预热请求。

如何让Ollama在macOS登录后自动启动并保持模型常驻?

使用启动脚本和LaunchAgent配置环境变量、服务等待与模型预热。

公网部署LiteLLM时如何避免主密钥被盗刷?

使用HTTPS、Cloudflare、随机主密钥和可限额的Virtual Key。

Letta如何同时接入LiteLLM和本地Ollama嵌入服务?

在容器环境变量中配置兼容接口地址、密钥和Ollama地址。

Next Up

媒体文件加速
开发工具速查
鲲鹏部署WordPress
Home Server Fixes
Total
0
Shares
Share 0
Tweet 0
Pin it 0
Brandon

Previous Article
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • December 14, 2025
  • Brandon
View Post
Next Article
  • Code

排查 LiteLLM 经 Cloudflare 访问出现 502:Nginx Response Header 太大

  • August 16, 2026
  • Brandon
View Post
You May Also Like
View Post
  • Code

排查 LiteLLM 经 Cloudflare 访问出现 502:Nginx Response Header 太大

  • Brandon
  • August 16, 2026
View Post
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • Brandon
  • December 14, 2025
View Post
  • Code

WordPress image offload

  • Brandon
  • December 14, 2025
View Post
  • Code

ComfyUI应用手册

  • Brandon
  • December 6, 2025
View Post
  • Code

Leetcode Java常用代码

  • Brandon
  • February 17, 2024
View Post
  • Code

Golang入门

  • Brandon
  • February 4, 2024
View Post
  • Code

Setting Up and Maintaining a Ubuntu Environment for My Home Server

  • Brandon
  • November 24, 2023
View Post
  • Code

Swift Learning Log

  • Brandon
  • August 31, 2023

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Fullstar

Input your search keywords and press Enter.

WordPress image offload

常用工具指令

华为云鲲鹏服务器安装wordpress

Setting Up and Maintaining a Ubuntu Environment for My Home Server

Private: keras简单实战代码记录

ComfyUI应用手册

UP NEXT

WordPress image offload

51.3% match December 14, 2025 0