Skip to content

使用 docker 的方式在你的服务器上部署 AnythingLLM 并通过 frp 调用本地 ollama 能力

约 2408 字大约 8 分钟

2025-02-19

厂商提供的大模型服务缺乏隐私性,本地部署知识库又缺乏便携性,那么有没有既能保障隐私又能随处访问的知识库呢?有的兄弟,有的有的。

模型部署上使用的是十分用户友好的 ollama,而知识库的搭建则使用 AnythingLLM。将 AnythingLLM 部署在服务器上,便有了公网访问的能力;本地机器部署 ollama,使用 frp 内网穿透至服务器。frp 连接可使用 tsl 加密,服务器无需向外开放 ollama 映射,AnythingLLM 自带鉴权系统,即实现了远程访问,又实现了隐私保障,岂不美哉?

原理图

前置环境

硬件

  • 云服务器:2C-2G 40GiB Ubuntu22
  • 高性能设备:Mac mini M4(用于提供 ollama 能力)

软件

  • 服务器上配置好 docker 环境
  • 高性能设备安装好 ollama 并保证本地能够运行模型

该文章默认你已知晓云服务器防火墙和安全组的管理,涉及到外网端口访问的只有 AnythingLLM 和 frp 的 webui,切记不要将你的 ollama 代理端口映射至外网,这会有被白嫖的风险

在你的服务器安装 AnythingLLM

拉取镜像

在终端中使用以下命令拉取 AnythingLLM

*拉取失败可自行配置 docker 国内镜像源

docker pull mintplexlabs/anythingllm

拉取的默认 tag 为 latest,将与下文中的编排文件内容对应

拉取完成后输入以下命令

docker images

若出现 mintplexlabs/anythingllm 即表示镜像拉取成功

镜像列表

创建容器

在你的服务器上寻找一个心仪的位置,将用于 AnythingLLM 相关目录的挂载

cd /www/wwwroot/docker/anything_llm # 以该目录为例,确保目标文件夹为空

为了方便,直接在该目录下创建 .envdocker-compose.yml

.env 文件无特殊要求为空即可,docker-compose.yml 需要编辑因此使用 vim 编辑创建

touch .env
vi docker-compose.yml

将以下内容适当修改并粘贴进去,volumes下的每一项的冒号左侧路径更改为你的路径,表示将当前的目录挂载于容器的对应路径

services:
  anything-llm:
    image: mintplexlabs/anythingllm:latest
    container_name: anything-llm
    restart: unless-stopped
    ports:
      - "3001:3001"
    cap_add:
      - SYS_ADMIN
    environment:
      - STORAGE_DIR=/app/server/storage
    volumes:
      - /www/wwwroot/docker/anything_llm:/app/server/storage
      - /www/wwwroot/docker/anything_llm/.env:/app/server/.env

将 docker-compose.yml 保存退出后,使用以下命令创建容器

docker compose up -d
docker ps

不出意外的话就能在容器列表中看到刚刚创建的的容器了,访问服务器 ip:3001(推荐反向代理到域名访问) 即可进入 AnythingLLM 的 初始化界面,至此完成服务器 AnythingLLM 的部署

使用 frp 反向代理

用这种小服务器直接跑模型是不现实的(大服务器另说doge),因此我们可以将本地 PC 的 ollama 能力开放给服务器

打开 frp 的[项目地址](Releases · fatedier/frp),根据你的设备类型选择不同的软件包

我的服务器是 X86 的 CPU,因此选择 linux_amd64 后缀的的包,而我的 mac 是基于 arm 的 M4 芯片,则选择 darwin_arm64 后缀的包,两者使用的版本最好一致

忽略下载解压过程.....

frp 文件夹中包含两部分文件:frpc 和 frps,frpc 对应客户端,frps 对应服务端,而相应的 .toml 文件则为对应的配置文件

frp软件包

服务端配置

服务器作为服务端,我们只需要使用 frps 即可,打开 frps.toml,配置参考如下,根据需求可自行配置

完整配置参考:参考 | frp

bindAddr = "0.0.0.0" #服务端监听的 IP 地址,0.0.0.0表示监听所有网络接口
bindPort = 7100 #指定 FRP 服务端的监听端口,客户端将通过这个端口连接到 FRP 服务端,可以设置成别的
 
vhostHTTPPort = 28080 #指定虚拟主机 HTTP 服务监听的端口
 
webServer.addr = "0.0.0.0" #指定 FRP Web UI(管理界面)的绑定地址
webServer.port = 7500 #指定 FRP Web UI 的端口号,可以通过 7500 端口访问管理界面,可以设置成别的
webServer.user = "username" #Web UI 登录所需的用户名,自由设置
webServer.password = "password" #Web UI 登录所需的密码,自由设置
 
log.to = "/frpslog/frps.log" #指定日志输出的文件路径
log.level = "info" #日志的记录级别,info 表示记录一般的信息
log.maxDays = 3 #设置日志文件保留的天数,超过 3 天的日志文件将被自动删除
 
auth.method = "token" #指定认证方式,token 表示客户端和服务端通过 Token 进行身份认证
auth.token = "Token_password" #Token 用于客户端和服务端的身份认证,自由设置
 
allowPorts = [
    { start = 10000, end = 12000}, #定义允许客户端使用的端口范围,客户端可以使用 10000 到 12000 之间的端口进行映射
]

配置 frps 服务

使用 systemctl 创建服务,若你的系统没有可自行安装

使用以下命令创建服务文件

sudo vim /etc/systemd/system/frps.service

粘贴以下内容并保存,注意修改安装路径

[Unit]
Description = frp server # 服务名称,可自定义
After = network.target syslog.target
Wants = network.target
 
[Service]
Type = simple
# 启动frps的命令,需修改为你的frps和frps.toml的路径
ExecStart = /opt/frp_0.60.0_linux_amd64/frps -c /opt/frp_0.60.0_linux_amd64/frps.toml
 
[Install]
WantedBy = multi-user.target

frp 服务管理命令如下,使用启动命令启动

# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps

*以上 frp 服务端配置参考:【超详细】使用FRP、阿里云服务器实现内网穿透连接远程桌面_阿里云 frp-CSDN博客

启动服务后访问 ip:7500,用户名和密码为 frps.toml 中的 webServer.user 和 webServer.password,若能成功访问管理页面则表示 frp 在服务端的配置正常

frp网页管理界面

客户端配置

将 frp 解压到你喜欢的目录,因为是客户端,所以我们只需要在乎 frpc 和 frpc.toml 两个文件即可

编辑 frpc.toml,根据以下配置字段说明进行配置

[common]
tls_enable = true # 启用 tsl 加密
server_addr = example.com # 你的服务器 ip 或域名
server_port = 7100 # 服务器上 frp 的端口,必须与 frp 服务端的 bindPort 一致
token = "YourToken" # 你设置的 token,必须与 frp 服务端的 auth.token 一致
 
 # 以下为 ollama 的内网穿透配置
[ollama] 
type = tcp # 端口类型,ollama 使用的是 tcp
local_ip = 127.0.0.1 # 表示本机内网
local_port = 11434 # ollama 在本地的端口,如果你又修改稿 ollama 的本地端口请自行修改
remote_port = 11435 # 映射至服务器的端口,代表服务器上的该端口与本地 local_port 联通

保存该文件后在 frp 目录下使用终端执行以下命令

./frpc -c frpc.toml

若出现类似如下输出则表示内网穿透成功

2025-02-19 16:05:31.849 [I] [sub/root.go:142] start frpc service for config file [frpc.toml]
2025-02-19 16:05:31.852 [I] [client/service.go:295] try to connect to server...
2025-02-19 16:05:32.013 [I] [client/service.go:287] [25dfd974c1bb30b5] login to server success, get run id [25dfd974c1bb30b5]
2025-02-19 16:05:32.016 [I] [proxy/proxy_manager.go:173] [25dfd974c1bb30b5] proxy added: [ollama]
2025-02-19 16:05:32.054 [I] [client/control.go:168] [25dfd974c1bb30b5] [ollama] start proxy success

此时访问 服务器 ip:7500 应该能看到存在一个客户端连接

客户端连接

确保本地 ollama 正在运行,回到服务器的终端,执行以下命令,注意端口号必须与本地配置文件中的 remote_port 一致

curl 127.0.0.1:11435

若输出 Ollama is running 那么恭喜你,内网穿透成功

AnythingLLM 连接 ollama

访问服务器 ip:3001 或绑定的域名(默认你已经完成初始化),打开 设置(在 Customization -> Display Language 中可以更换中文显示) -> 人工智能提供商 -> LLM首选项,在 LLM提供商中选择 Ollama,在 advanced settings 中输入映射到 ollama 的端口,因为 AnythingLLM 是以 docker 的方式运行的,因此桥接到本地网络的地址并不是 127.0.0.1 而是 172.17.0.1

http://172.17.0.1:11435

完成修改后点击右上角的 save changes,就能看到本地的 ollama 模型列表了

AnythingLLM连接Ollama

在工作区中简单进行对话测试,可以看到本地资源被调用,且成功输出内容,至此实现公网访问 AnythingLLM

本地资源被调用

模型输出