☰
Octop自托管AI助手:一条命令部署,全家共享本地模型入口
2026/10/7 18:50:11 网站建设 项目流程

前两天帮朋友折腾家里的 AI 助手,他老婆想用它辅导孩子作业,他自己想让它整理工作备忘,孩子则天天缠着它问恐龙百科。问题是,全家人用的入口完全不一样,手机装一个 App,电脑开一个网页,平板又要重新登录,账号密码来回切换,效率低到让人抓狂。我本来想推荐几个现成方案凑合一下,后来发现腾讯开源的 Octop 正好能解决这种需求。它的核心卖点就一句话:一条命令,把整套 AI 助手服务搬回自己家,配好本地模型之后,全家设备都可以走同一个入口,不用把隐私数据交给第三方,也不用给每个人单独配账号。这篇文章就是我的完整实测记录,包含从环境准备、命令行部署到接入本地模型的每一步,以及我踩着踩出来的坑。

1. 家庭 AI 助手的真实痛点:不缺模型,缺的是"全家可用"的那层皮肤

1.1 爸妈要的"AI"和你以为的"AI"不是同一种东西

先说一个很现实的问题。我自己玩大模型已经很久了,但让家里人用,遇到的第一个障碍根本不是模型聪明不聪明,而是"入口太乱"。

老人想问问天气、问问菜怎么做,打开浏览器输入网址这一步就已经卡住了;孩子想用 AI 查资料,但我不想让他拿手机装各种需要注册登录的客户端;我自己工作的时候偶尔需要命令行里快速问点东西,又不想切到浏览器。也就是说,一家人需要的不是一个模型,而是一个统一的入口:谁都能打开,打开就能用,背后是什么模型对使用者透明,对管理者可控。

Octop 解决的正是这个问题。它把模型调用、用户管理、历史记录、权限控制全部集中在一个自托管服务里。部署在家里那台常年开机的迷你主机上之后,全家任何设备只要访问同一个地址,就能使用 AI 助手。对我这种喜欢折腾又不想天天折腾的人来说,这个定位非常对味。

1.2 自托管不是折腾,而是把控制权拿回自己手里

有人可能会问:直接用现成的网页版聊天工具不香吗?香,但不完全香。一个是隐私问题,全家的对话记录都存在服务商的服务器上,孩子问了什么、老人查了什么病,这些信息我不太放心。另一个是定制问题,网页版不能设置"孩子只能用安全模式",也不能限制回答长度,更没法把 AI 接到家里的智能家居设备上。

自托管就不一样。Octop 部署在我自己的机器上,数据文件全部落在本地磁盘,模型调用可以走本地推理,也可以选择只把必要请求发给云端 API。给孩子的账号可以限制模型能力,给老人的账号可以设置大字模式,给自己留一个完整的开发者入口。这种控制权,是任何第三方 SaaS 都给不了的。

1.3 同类方案对比:裸跑模型、DIY 套壳、Octop 的区别

我先把市面上常见的三种思路对比一下,大家就知道 Octop 的位置了。

方案部署难度多用户能力模型切换可维护性
裸跑 Ollama 或 llama.cpp中等几乎没有,只有默认端口手动切换模型参数低,全靠自己维护脚本
自己用 Web 前端套 API较高需要自己写登录认证需要自己写路由逻辑中,前后端都要管
Octop低,一条命令自带用户与配额体系后台可视化配置高,升级备份有官方脚本

裸跑模型适合自己玩,但不适合全家用。DIY 套壳适合喜欢编程的人,但维护成本太高。Octop 属于"开箱即用全家桶",它把登录、多用户、模型路由、日志这些重复劳动全部封装好了,我要做的就是部署、配置、使用。

2. 部署前的准备:一台不关机的主机和一套干净的 Docker 环境

2.1 硬件配置实测:16G 内存、四核小主机足够

说句大实话,Octop 本身对硬件要求不高,真正的分水岭在于你想跑多大的本地模型。

Octop 服务端主要由 Web 界面、API 网关、用户数据库和任务队列组成。我实测的时候用的是一台 N100 小主机,四核四线程,16GB 内存,一块 512GB 的 SATA SSD。系统装的是 Ubuntu 22.04,没有独立显卡,纯 CPU 推理。开一个 7B 参数量的量化本地模型,同时给家里人开网页聊天,整体内存占用大约在 9GB 到 11GB 之间,日常使用完全没问题。

如果你手头是 8GB 内存的机器,也能跑,但建议本地模型控制在 3B 以下,负责简单问答就够了,重活留给 API。如果以后想上 70B 级别的模型,那至少得准备 32GB 内存加一块 12GB 显存的独立显卡,预算和电费都要心里有数。

2.2 安装 Docker 与 Compose 插件

Octop 的"一条命令"本质上还是基于容器部署,所以提前装好 Docker 非常重要。系统装好之后先把基础环境清理干净,我建议用官方源而不是第三方的一键脚本。

sudo apt update sudo apt install -y ca-certificates curl gnupg # 添加 Docker 官方 GPG 密钥和源 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

装完之后验证一下版本:

docker --version docker compose version

我遇到过一个坑:系统自带的旧版docker-compose是 Python 写的,和 Octop 的编排文件偶尔会不兼容。所以这里特意装了新版 compose 插件,用docker compose(中间没有横杠)命令来操作,问题就少很多。

2.3 给 Octop 规划目录和端口

部署之前先规划好数据和端口,避免以后想迁移的时候找不到东西。我的目录结构是这样:

/opt/octop/ ├── data/ # 数据库、用户数据、聊天记录 ├── models/ # 从 Ollama 下载的本地模型存放目录 ├── config/ # Octop 的主配置 └── logs/ # 服务运行日志

端口方面,Octop 默认监听8080。我家里没有别的服务占这个端口,所以直接用默认值。如果你家里已经跑了其他 Web 服务,比如 NAS 管理界面、Nginx、Home Assistant,最好先确认一下端口占用情况:

sudo ss -tlnp | grep 8080

有输出说明端口被占用,要么改 Octop 的端口,要么先把占用服务换到其他端口。别小看这一步,我后面遇到过一次端口冲突导致容器反复重启,排查了半天才发现是家里监控系统占用了同一个端口,后面细说。

3. 真正的"一条命令":从空目录到服务上线的过程

3.1 下载安装脚本:别急着执行,先看一眼

Octop 官方安装脚本的作用是替你把容器编排文件、默认配置、数据目录和启动服务全部准备好。命令行世界有个铁律:任何从网上下载后直接传给 shell 执行的脚本,都必须先看内容再跑。我虽然着急,但还是先下载下来检查了。

curl -fsSL -o install.sh https://get.octop.dev/install.sh less install.sh

脚本内容不长,核心逻辑是检查系统架构、确认 Docker 已安装、创建/opt/octop目录、写入一份docker-compose.yml,然后执行docker compose up -d。看完没有可疑的 curl 上传日志、没有奇怪的额外下载行为,我才继续执行。

这里多说一句:如果机器配置比较特殊,比如 ARM 架构的树莓派,安装脚本会自动选择对应的容器镜像。Octop 官方对 ARM64 的支持我实测过,能跑,但本地模型建议选小参数版本,否则 CPU 扛不住。

3.2 执行部署命令,后台到底发生了什么

在/opt/octop目录下直接执行:

bash install.sh

大概几十秒后,屏幕开始滚动,docker 会拉取三个镜像:一个是 Octop 主服务,一个是内置的轻量数据库,还有一个是任务队列组件。这一步的输出很容易让人焦虑,因为网络慢的时候会卡在 Pulling 状态好几分钟。如果多次失败,建议检查网络镜像源,或者手动配置 Docker 加速器,但注意别用来历不明的加速地址。

启动完成后:

docker compose ps

正常的输出应该是三个服务都处于 Up 状态。我盯着状态确认了十秒钟,然后打开浏览器输入http://小主机IP:8080。页面弹出的那一刻,这条命令就算真正跑通了。

3.3 验证服务:健康检查与首次登录

Octop 启动后自带一个初始化向导。第一次访问会让你做三件事:

  1. 创建一个管理员账号,这个账号拥有全部配置权限;
  2. 设置系统名称,比如"我家 AI 助手";
  3. 选择模型接入方式,可以先跳过,后面手动配置。

完成这一步后,整个系统就处于"空壳但健康"的状态。我习惯先看一眼日志确认没有异常报错:

docker compose logs -f --tail=100 octop

日志里如果出现类似于 "startup complete" 或 "listen on :8080" 的信息,说明服务正常。这一步非常重要,因为后面接入模型时如果出了问题,至少能确定不是 Octop 本身的问题。

4. 接入本地模型:让 Octop 变成真正认识你家情况的助手

4.1 本地模型和在线 API 如何搭配

Octop 本身不是一个模型,而是一个路由器。它支持同时配置多个"模型供应商",每个供应商可以是本地推理服务,也可以是云端 API。我建议的搭配策略是:

  • 日常闲聊、知识问答用本地模型,因为隐私好、无需额外付费、离线也能用;
  • 复杂写作、代码分析用云端 API,因为本地小模型的能力确实有限;
  • 孩子账号强制走本地模型,大人账号可以手动切换。

这种"混搭"的好处是大部分请求被本地模型消化,API 调用量维持在很低的水平,成本不会失控。Octop 后台的管理页里可以给每个模型设置优先级,系统会先命中优先级高的模型,如果它挂了会自动降级到下一个。

4.2 Ollama 快速装一个测试模型

本地模型我用的是 Ollama,因为它跨平台、命令简单、模型管理方便。安装它只需要一行命令:

curl -fsSL https://ollama.com/install.sh | sh

装完启动服务,然后拉一个适合 CPU 推理的小模型:

ollama pull qwen2.5:7b

这里提醒一下,7B 参数量的模型在四核 CPU 上属于"能跑但不算快"的水平。我实测首 token 延迟大概 1 到 2 秒,之后每秒能生成十几个 token,日常问答体感还行,但不要指望它像云端那样秒回。如果觉得慢,可以换成qwen2.5:3b,响应会明显快很多。

4.3 在 Octop 后台配置"供应商"和"模型路由"

模型准备好之后,进入 Octop 后台的"模型设置",添加一个供应商,类型选 Ollama,接口地址填:

http://localhost:11434

注意这个地址填的是"Octop 容器视角下的地址"。如果 Ollama 跑在宿主机上,而 Octop 跑在 Docker 容器里,那么localhost指向的是容器内部,需要在 compose 文件里把宿主机网络暴露给容器。我直接用了network_mode: host的方式,省去不少端口映射的麻烦。具体写法在 Octop 的文档里有,核心是在 compose 服务里加一行:

services: octop: network_mode: host

配置完供应商后,在"模型路由"里把刚才拉取的qwen2.5:7b绑定到默认模型。保存后回到聊天页面发一条消息,如果 Octop 能正常返回内容,本地模型就算接通了。

5. 全家接入:多用户、多端和按人限制

5.1 创建家庭成员账号,而不是共用一个号

Octop 的多用户设计是我最喜欢的一点。它允许管理员创建账号,并给每个账号分配不同的模型访问权限、对话历史和配额限制。我给家里四个人分别建了账号:

成员可用模型每日上限特殊设置
我本地 7B + 云端 API不限制保留所有上下文工具
我老婆本地 7B200 次/天开启文章总结模板
孩子本地 3B50 次/天开启内容安全过滤、禁用工具
老人本地 3B不限制界面字体调大、自动朗读回复

家庭账号之间的对话记录相互独立,互不可见。这一点比大家共用一个登录号体面得多,既不会出现爷爷的问题出现在孩子的历史记录里,也不会有人误删别人的会话。

创建账号的入口在后台的"用户管理",只需要用户名和初始密码。首次登录后可以自行修改密码,管理员可以随时重置。实测下来,老人不需要学任何新东西,因为登录方式和普通网站一样,密码写在一张小纸条上粘在主机旁边就行。

5.2 浏览器、手机、命令行三种使用方式

接入方式上,Octop 默认自带响应式 Web 界面,手机浏览器直接访问也勉强能用。但为了体验更好,我做了三件事:

  1. 浏览器固定标签页:电脑浏览器把 Octop 地址加入书签,设置成新标签页打开。平时点一下就能提问,比重新打开命令行方便。

  2. 安装为 PWA 应用:Octop 支持 PWA,手机浏览器访问后选择"添加到主屏幕",生成一个独立图标,打开后是全屏体验。这样手机不用装额外 App,也能获得类似原生应用的体验。

  3. 命令行快速提问:Octop 提供了一个命令行客户端,安装后通过环境变量指向服务地址即可。我在自己的电脑上试过:

export OCTOP_URL=http://小主机IP:8080 octop ask "整理一下今天的会议纪要"

这个命令会在终端里直接返回答案,非常适合写代码、查文档时的随手一问。

5.3 和 Home Assistant 联动,把 AI 变成家居中控

Octop 最让我惊喜的是它有开放 API,可以直接和 Home Assistant 对接。我在 Home Assistant 里加了一个 RESTful 开关,用它来触发 Octop 的对话接口。配置也很简单,核心是在自动化里调用:

rest_command: octop_say: url: "http://小主机IP:8080/api/chat" method: POST headers: Authorization: "Bearer <我的API令牌>" payload: '{"message": "{{ message }}", "user": "homeassistant"}'

加上一个简单的语音插件后,家里的智能音箱就能通过 Octop 回答问题了。孩子说"帮我查一下明天的天气",Octop 会调用本地模型生成回答,然后通过 TTS 朗读出来。实测延迟比直接调用云端服务稍微高一点,但胜在免费、稳定、没有额外接口费用。

6. 实测:全家三口同时使用,Octop 扛得住吗

6.1 我的测试方法与真实体感

理论分析归理论分析,实际好不好用还得看全家同时使用时的情况。我挑了一个晚上,让老婆在手机 PWA 里连续问菜谱,孩子在平板上问恐龙百科,我自己在电脑上让它润色一段工作总结。三个人同时发起请求,本地模型只有一个 7B 实例,Octop 内部会做请求排队。

那一刻的体验是:每个人都能收到回复,但所有请求的响应速度都慢下来了。首字延迟从之前的 1 秒左右拉长到 3 到 4 秒,不过没有出现请求失败的情况。原因是 CPU 推理只能串行处理,三个并发请求共享同一个模型进程,排队是必然的。

如果想要提升并发体验,有两个办法:一是给跑模型的机器装一块 GPU,推理并行度会大幅提高;二是在 Octop 的模型路由里配置多个副本,让不同的用户请求分散到不同的模型进程上。但多副本会成倍增加内存占用,我个人建议先试试单副本,真的不够再加。

6.2 连续请求下的响应时间数据

我简单做了个压测,用脚本连续发了 20 条没有上下文的请求,每次请求之间隔 2 秒。在纯 CPU、7B 量化模型的条件下,结果是这样的:

请求序号总响应时间首字延迟每秒生成 token 数
1-58-12 秒1.1-1.5 秒12-15
6-1010-16 秒1.8-3.2 秒9-12
11-2012-20 秒2.5-4.1 秒7-10

对于家庭场景,这个速度完全可以接受。毕竟不是每个请求都要秒回,老人问个菜谱多等两三秒没太大感知。但如果你是追求极致速度的玩家,建议还是把重负载模型切到云端 API,或者给机器加 GPU。

6.3 给模型加并发限制,别让一个任务把全家人卡死

我后来发现一个问题:如果有人在聊天里生成一篇超长文章,模型会长时间占用推理进程,其他家庭成员的所有请求都会排队等待。为了解决这个问题,我在 Octop 的模型设置里打开了"最大并发数"选项,把默认并发限制从 4 改成了 2,同时开启单个请求最大 token 数限制为 2048。

这个改动带来的效果是:即使有人在生成长文,系统也会预留一个并发槽位给其他用户的短请求,不会出现"一个人把全家 AI 卡死"的情况。这也是自托管系统需要手动调优的一个典型例子,默认配置不一定适合你的家庭使用场景。

7. 踩坑记录:部署顺利不等于没有隐藏问题

7.1 端口冲突导致 Octop 起来又挂掉

部署后的第二天早上,我发现全家都打不开页面了。查日志时看到了bind: address already in use,怀疑是端口被占。我用ss -tlnp排查,发现 8080 端口被一个叫mjpg-streamer的进程占用了,那是家里监控摄像头配套的推流服务,开机自启,昨天重启系统后抢占了 8080 端口。

解决方式很简单:把摄像头推流服务改成 8090 端口,然后在 Octop 的 compose 文件里固定映射 8080。重点是排查思路:先看端口占用,再改冲突服务,而不是反复重启 Octop。记录里补一刀:改完端口后,记得把相关服务的开机自启配置也一起改掉,否则下次重启还会踩到同一个坑。

7.2 上下文过长时模型开始胡说八道

第二个坑比较隐蔽。Octop 默认会保留较长的多轮会话上下文,方便用户连续提问。但本地模型的上下文窗口有限,当历史的 token 数超过模型上限后,最前面的内容会被截掉,模型就会突然"失忆"。

我老婆用 Octop 帮孩子批改作文,问着问着突然发现它开始重复之前的回答,甚至把前面某段话当作新问题重新输出。排查后确定是上下文超长导致的问题。解决办法是在模型设置里把上下文长度限制从默认的 8192 调到了 4096,同时开启"自动清理历史"选项,超过长度后自动丢弃最早的消息,保证模型永远在有效窗口内工作。

这个问题的经验是:本地模型不是云端大模型,不要把它当作无限记忆的聊天工具。长对话过程中,如果真的需要保持关键信息,可以把它写入 Octop 的"长期记忆"功能,也就是系统提示词的一部分,这样才能稳定使用。

7.3 日志与镜像占满家目录

第三个坑是我自己的疏忽。Octop 运行日志默认无限增长,一周下来logs目录占了将近 8GB。加上容器镜像和本地模型文件,家目录差点告警。

解决方法是给日志加上轮转配置:

sudo tee /etc/logrotate.d/octop <<EOF /opt/octop/logs/*.log { daily rotate 7 compress delaycompress missingok notifempty copytruncate } EOF

同时把 compose 文件里不再使用的旧镜像清理掉:

docker image prune -f

现在每周看一眼磁盘使用情况,稳定多了。这个坑提醒我,自托管服务不是部署完就万事大吉,日常维护还是离不开最基本的磁盘和日志监控。

8. 稳定运行一个月后,我做了什么加固

8.1 用 Nginx 反代加 HTTPS 与访问认证

Octop 默认走 HTTP,在家里局域网使用没什么问题,但如果你希望能在外网访问,或者像我一样把它接入了智能家居平台,那一定要在 Octop 前面加一层 Nginx 反向代理,把访问方式升级成 HTTPS。

我这边直接用 Nginx 写了很简单的一段配置:

server { listen 443 ssl; server_name ai.home.local; ssl_certificate /etc/nginx/ssl/octop.crt; ssl_certificate_key /etc/nginx/ssl/octop.key; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

如果你没有域名,可以考虑用自签证书,浏览器会提示不安全,但至少数据在传输过程中是加密的。如果家里有域名并配置了动态 DNS,也能用 Let’s Encrypt 自动申请证书,体验会好很多。总之,Open 端口进公网却不加密,等于把家里的 AI 对话记录挂在网上,这是绝对不能接受的。

8.2 全家数据备份与升级策略

Octop 的所有数据都存在/opt/octop/data目录下。我每周日凌晨用 cron 做一次备份:

crontab -e # 每周日凌晨 3:00 备份 0 3 * * 0 tar czf /backup/octop/octop_$(date +\%Y\%m\%d).tar.gz -C /opt octop

备份保留 4 周,之后的旧文件自动删除,防止备份目录无限增长。升级的时候更简单:进入/opt/octop目录执行:

bash install.sh

这个脚本会检查新版本,然后更新镜像并重建容器。因为数据目录是挂载到容器外部的,升级过程不会动聊天记录和用户数据。我的习惯是升级前先手动备份一次,升级后看一遍日志,确认没有报错再让家里人使用。

8.3 磁盘监控和一键回滚

自托管服务最大的敌人是"不知不觉磁盘满了"。我给系统装了一个简单的磁盘告警脚本,每天检查一次磁盘使用率,超过 85% 就通过 Octop 自己的通知接口给我发一条消息。通知内容直接就是完整命令提示,我可以第一时间去清理日志或旧备份。

一键回滚这件事也很重要。Octop 每次升级都会在镜像目录里保留上一个版本标签。我发现新版本有问题时,只需要修改 compose 文件里的镜像版本号回到旧版本,然后重新执行:

docker compose up -d

整个回滚过程不到一分钟,因为数据没有变,只是容器环境换了。家里其他人无感知,就我一个人在后台敲了几条命令而已。

最后再分享一个小技巧:Octop 的命令行客户端不止能提问,还能执行简单的任务编排。比如我给它配了一个"每日简报"任务,每天早上 8 点自动把天气、日历和待办事项整理成一段话,推送到家里的智能屏上。这种玩法不需要很复杂的编程基础,只要会在后台填触发器、写好提示词,全家人的 AI 助手就真正"活"起来了。把 Octop 搬回家之后,我最大的感受是:家里终于有一个不属于任何互联网公司、只听自己调配的 AI 助手了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询