n8n Docker 部署指南

最近在搭自动化工具,选了 n8n。网上教程不少,但要么版本太旧,要么踩坑没写清楚。

我把自己实际部署的过程记录下来,配上完整的配置文件。你跟着做一遍,应该能跑起来。

n8n 是什么?

简单说,n8n 是个开源的工作流自动化工具。可以理解为:

  • IFTTT 的开源替代品
  • 支持可视化编排
  • 能连上百种服务(Slack、GitHub、数据库、API 等等)
  • 自托管版完全免费,无限工作流,无限商用

官方提供云服务(收费),也支持自己部署(免费)。本文讲的是自己部署。

总结

核心就这几步:

  1. 准备目录
  2. 生成密钥密码
  3. 写配置文件
  4. 修复权限
  5. 启动

环境准备

必备条件

# 1. 确保 Docker 安装好了
docker --version
# 推荐:Docker 20.10+

# 2. 确保 Docker Compose 有
docker-compose --version
# 推荐:v2.0+

准备目录

# 创建部署目录
mkdir -p /root/n8n/{data,backups}
cd /root/n8n

第一步:生成密码和密钥

这一步会生成两个关键配置:

  1. 管理员密码 - 登录 Web 界面用
  2. 加密密钥 - n8n 用来加密存储的凭证信息(非常重要,丢了就解密不了)
# 生成 64 位十六进制加密密钥
openssl rand -hex 32
# 复制输出,后面要用。示例:
# a155a297a3cf9f3a9fbb4eadf3b4be08adcb9cff7f3e152e2575b7b23f1b3ade

# 生成管理员密码(20位,包含大小写、数字、特殊字符)
openssl rand -base64 24 | tr -dc 'A-Za-z0-9!@#$%^&*' | head -c 20
# 复制输出。示例:
# dgYN71mMEbkS3uD5djSi

# 获取服务器 IP(用于 Webhook URL)
hostname -I | awk '{print $1}'
# 示例输出:10.0.12.8

第二步:创建配置文件

.env 文件

创建一个 .env 文件,把上面的值填进去:

# /root/n8n/.env

# ========== 认证配置 ==========
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
# 把刚才生成的密码填这里
N8N_BASIC_AUTH_PASSWORD=dgYN71mMEbkS3uD55555

# ========== 加密密钥 ==========
# 把刚才生成的 64 位密钥填这里
N8N_ENCRYPTION_KEY=a155a297a3cf9f3a9fbb4eadf3b4be08adcb9cff7f3e152e2575b7b23f666666

# ========== 网络配置 ==========
N8N_HOST=0.0.0.0
N8N_PORT=5678
N8N_PROTOCOL=http
TZ=Asia/Shanghai
# 改成你的服务器 IP
WEBHOOK_URL=http://10.0.12.8:5678/

# ========== 数据库配置 ==========
# 用 SQLite,最简单
DB_TYPE=sqlite

# ========== 执行配置 ==========
# 生产环境别保存执行数据,省空间
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168

# ========== 安全设置 ==========
# HTTP 访问时关闭安全 Cookie 检查
N8N_SECURE_COOKIE=false

# ========== 跳过账户创建 ==========
N8N_SKIP_CREATION_DURING_STARTUP=true

# ========== 禁用版本通知(可选) ==========
# 关闭后不会弹 "Your license key is on the way" 提示
N8N_VERSION_NOTIFICATIONS_ENABLED=false
N8N_DIAGNOSTICS_ENABLED=false

设置权限:

chmod 600 /root/n8n/.env

docker-compose.yml 文件

# /root/n8n/docker-compose.yml
version: '3.3'

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    restart: unless-stopped
    # 用 host 网络模式,容器直接用宿主机网络
    # 好处:内网能访问,不会把端口暴露到外网
    network_mode: host
    volumes:
      # 挂载数据目录
      - ./data:/home/node/.n8n:rw
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_HOST=0.0.0.0
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - TZ=Asia/Shanghai
      - WEBHOOK_URL=http://10.0.12.8:5678/
      
      - DB_TYPE=sqlite
      - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=168
      
      - N8N_SECURE_COOKIE=false
      - N8N_SKIP_CREATION_DURING_STARTUP=true
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider http://localhost:5678/healthz || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
    container_name: n8n

第三步:修复权限

这是很多人会踩的坑。

Docker 容器里的 n8n 是用 UID 1000 这个用户运行的。如果你直接把 ./data 目录挂载进去,而目录是 root:root 权限,容器就没法写东西。

# 修复权限
chown -R 1000:1000 /root/n8n/data
chmod 755 /root/n8n/data

第四步:启动

# 启动容器
docker-compose up -d

# 等待几秒让容器启动
sleep 15

# 检查状态
docker ps | grep n8n
# 应该看到 n8n 这个容器,状态是 Up

# 检查健康状态
docker inspect --format='{{.State.Health.Status}}' n8n
# 应该输出:healthy

第五步:访问测试

# 本地测试
curl -s -o /dev/null -w "%{http_code}" http://localhost:5678
# 应该返回 200

# 内网测试(把 IP 换成你的服务器 IP)
curl -s -o /dev/null -w "%{http_code}" http://10.0.12.8:5678
# 应该返回 200

打开浏览器访问:http://你的服务器IP:5678

首次访问会让你创建管理员账户,用之前在 .env 里配置的用户名密码登录即可。

我踩过的坑

坑一:PostgreSQL 版本太旧

最初我想用已有的 PostgreSQL 9.4:

syntax error at or near "NOT"
CREATE INDEX IF NOT EXISTS IDX_xxx

原因:n8n 用的 IF NOT EXISTS 语法,PostgreSQL 9.4 不支持。11 以上版本才支持。

解决方案:改用 SQLite,n8n 原生支持,不需要额外部署数据库。

坑二:权限被拒绝

Error: EACCES: permission denied, open '/home/node/.n8n/config'

原因:挂载目录权限是 root:root,容器里用 1000 用户跑,没权限写。

解决方案:见「第三步:修复权限」

浏览器打开时提示安全 Cookie 问题。

原因:n8n 检测到 HTTP 访问但配置了安全 Cookie。

解决方案:在环境变量加 N8N_SECURE_COOKIE=false

坑四:收到许可证邮件

收到邮件说 “Your license key is on the way!”。

原因:n8n Cloud 的营销邮件。自托管版完全免费,不需要许可证。

解决方案一:禁用版本检查(推荐)

如果你不想处理邮件,直接禁用版本通知:

# 追加到 .env 文件
echo "N8N_VERSION_NOTIFICATIONS_ENABLED=false" >> /root/n8n/.env
echo "N8N_DIAGNOSTICS_ENABLED=false" >> /root/n8n/.env

# 重启
./n8n.sh restart

重启后 “Your license key is on the way” 的提示会消失。

解决方案二:激活(可选)

  1. 查邮箱
  2. 找 n8n 发来的邮件
  3. 复制 License Key 填入页面

结论:自托管版完全免费,不影响使用。禁用版本通知最简单。

常用命令

# 启动
./n8n.sh start

# 停止
./n8n.sh stop

# 重启
./n8n.sh restart

# 查看日志
./n8n.sh logs          # 所有日志
./n8n.sh logs -f      # 实时日志
./n8n.sh logs n8n     # 只看 n8n 日志

# 查看状态
./n8n.sh status

# 更新版本
./n8n.sh update

备份与恢复

备份命令

./backup.sh

备份文件会保存在 /root/n8n/backups/ 目录下,文件名类似 n8n_backup_20260212_153321.tar.gz

定时备份

加到 crontab,每天凌晨 2 点自动备份:

crontab -e

# 添加这行
0 2 * * * /root/n8n/backup.sh > /dev/null 2>&1

恢复备份

# 假设有个备份文件
tar xzf /root/n8n/backups/n8n_backup_20260212_153321.tar.gz -C /tmp/

# 恢复数据
docker cp /tmp/. n8n:/home/node/.n8n/

# 重启容器
./n8n.sh restart

最终目录结构

/root/n8n/
├── docker-compose.yml    # Docker 配置
├── .env                 # 敏感配置(权限 600)
├── n8n.sh              # 管理脚本
├── backup.sh           # 备份脚本
├── README.md           # 说明文档
├── data/               # SQLite 数据库文件
│   ├── database.sqlite
│   ├── database.sqlite-shm
│   └── database.sqlite-wal
└── backups/            # 备份文件
    └── n8n_backup_20260212_153321.tar.gz

常见问题

Q: 数据存在哪?

SQLite 数据库文件在 /root/n8n/data/database.sqlite

Q: 能改密码吗?

直接改 .env 文件里的 N8N_BASIC_AUTH_PASSWORD,然后重启容器:

./n8n.sh restart

Q: 加密密钥能改吗?

不能。这个密钥是用来加密存储的凭证的。如果改了,之前的凭证就解密不开了。

参考链接

  • n8n 官方文档:https://docs.n8n.io/
  • 自托管安装指南:https://docs.n8n.io/hosting/installation/self-hosted/
  • Docker 镜像:https://hub.docker.com/r/docker.n8n.io/n8nio/n8n

Chrome Gemini 强制开启指南

Gemini 已经内置于 Chrome,但 Google 对其开启增加了繁琐的“地理围栏”和灰度测试。以下是我在macOS下的开启的步骤,做个记录。

0x01 前置准备

  1. 节点伪装: 将代理切换至 美国节点 (US)

  2. 语言环境: 进入 Chrome 设置,将 界面语言 (Display Language) 切换为 English (United States),并重启浏览器。

    image-20260211下午70706177

  3. 身份定位: 确保你的 Google 账号设置或搜索设置中的 Region 也是 US(部分情况非必须,但建议对齐)。

    image-20260211下午71005399

    选择住址:

    image-20260211下午71121578

  4. 关闭chrome。

0x02 注入指令

open -n -a "Google Chrome" --args --variations-override-country=us
  • 原理:强制 Chrome 在启动时覆盖国家代码为 US,绕过服务端检测。

0x03 验证

操作完成后,打开 Chrome:

  1. 输入 chrome://components

  2. 查找 Optimization Guide On Device Model

  3. 如果看到版本号不为 0.0.0.0,说明本地模型已下载成功。

    image-20260211下午70850521

    还可以访问这个页面看关于Gemini更多的配置: <chrome://settings/ai/gemini>

  4. 开始使用,可以直接和Gemini对话了。

    image-20260211下午75702693

    image-20260211下午75822704

0x04 设置快捷命令

打开终端,编辑配置文件:vim ~/.zshrc

alias chrome='open -n -a "Google Chrome" --args --variations-override-country=us'

保存并执行 source ~/.zshrc


OpenCode 任务状态管理问题:已完成的任务被重复执行

最近重度使用opencode,做任务时,明明任务已经执行完了,但新开一个 Session 后,Atlas 又把之前的任务重新执行一遍。

原因分析

OpenCode 用 boulder.json 文件来跟踪任务进度,文件位置在 ~/.sisyphus/boulder.json

{
  "active_plan": "/root/.sisyphus/plans/rsshub-installation.md",
  "completed_at": "2026-02-12T14:40:00.000Z",
  "final_status": "COMPLETED",
  "session_ids": ["ses_xxx", "ses_xxx"],
  "plan_name": "rsshub-installation"
}

问题出在两个方面:

1. boulder.json 指向错误的计划

  • 虽然 n8n-docker-install.md 计划中所有任务都标记为 - [x] 完成
  • boulder.jsonactive_plan 指向了另一个已完成的计划 rsshub-installation
  • 新 Session 找不到正确的计划

2. Session 连续性丢失

  • 多个 Session ID 记录在 boulder 中
  • 新 Session 不知道任务是否真的完成
  • 每次都从头开始

解决方案

方案 1:清理 boulder 状态(新 Session 前执行)

# 删除 boulder.json(清除所有状态)
rm ~/.sisyphus/boulder.json

或者手动重置:

cat > ~/.sisyphus/boulder.json << 'EOF'
{
  "active_plan": "/root/.sisyphus/plans/正确的计划名.md",
  "final_status": "COMPLETED"
}
EOF

方案 2:在计划末尾明确标记结束

.md 计划文件末尾添加:

---

## 计划状态

**状态**: ✅ 已完成
**完成时间**: 2026-02-12
**验证方式**: 所有任务标记为 - [x]

**注意**: 此计划已完全执行,无需再次执行。

预防措施

  1. 每次新 Session 前检查 boulder 状态
cat ~/.sisyphus/boulder.json
  1. 明确告诉 Atlas 跳过已完成的任务

  2. 不要手动修改 - [ ] 标记

文件位置参考

  • Boulder 状态文件:~/.sisyphus/boulder.json
  • 计划文件目录:~/.sisyphus/plans/
  • 学习记录目录:~/.sisyphus/notepads/

总结

这是一个 OpenCode 的状态管理边界问题:

状态 文件 问题
✅ 任务完成 计划 .md 文件 所有 - [x] 标记正确
❌ boulder 状态 boulder.json 指向错误的计划
⚠️ Session 连续性 - 新 Session 无法正确读取历史状态

解决方案:删除 boulder.json 或手动重置状态即可。

快速修复

新开 Session 遇到任务被重复执行时,运行:

rm ~/.sisyphus/boulder.json

然后重新开始即可。


Miniflux 私有 RSS 阅读器部署与订阅管理

之前用 Feedly 订阅 RSS,但很多技术博客没有原生 RSS,而且被墙的网站也无法访问。于是决定自建一个 RSS 阅读器。

为什么选择 Miniflux

  • 开源免费:MIT 许可证
  • 轻量级:Go 语言开发,资源占用少
  • 自托管:数据完全掌控在自己手中
  • 支持 Fever API:可以搭配各种第三方客户端使用

环境要求

  • Docker 已安装
  • 已有 PostgreSQL 或使用内置数据库

安装步骤

1. 创建目录结构

mkdir -p /root/docker/miniflux
cd /root/docker/miniflux
mkdir -p data pgsql_data

2. 配置 docker-compose

version: '2.4'

services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      - DATABASE_URL=postgres://miniflux:changeme@miniflux-db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=changeme
      - LISTEN_ADDR=:8082
    volumes:
      - ./data:/var/lib/miniflux

  db:
    image: postgres:16
    container_name: miniflux-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=changeme
      - POSTGRES_DB=miniflux
    volumes:
      - ./pgsql_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      timeout: 5s
      retries: 5

3. 启动服务

docker-compose up -d

4. 验证状态

# 检查容器状态
docker ps | grep miniflux

# 测试 Web 访问
curl -s -o /dev/null -w "%{http_code}" http://localhost:8082
# 应返回 200

导入订阅源

我整理了一份可访问的技术博客订阅列表:

技术巨头

名称 RSS 地址
Kubernetes Blog https://kubernetes.io/feed.xml
AWS Blog https://aws.amazon.com/blogs/aws/feed/
Azure Blog https://azure.microsoft.com/blog/feed/
Red Hat Blog https://www.redhat.com/en/rss/blog

国内技术团队

名称 RSS 地址
美团技术团队 https://tech.meituan.com/feed/
有赞技术团队 https://tech.youzan.com/rss/

中文独立博客

名称 RSS 地址
胡涂说 https://hutusi.com/feed.xml
阮一峰的网络日志 https://www.ruanyifeng.com/blog/atom.xml
云风的 BLOG https://blog.codingnow.com/atom.xml
酷壳 https://coolshell.cn/feed

导入命令

# 批量导入 RSS 源
while read url; do
  curl -s -X POST \
    -u admin:changeme \
    -H "Content-Type: application/json" \
    -d "{\"feed_url\":\"$url\"}" \
    http://localhost:8082/v1/feeds
done < feeds.txt

使用效果

部署完成后,成功导入 10 个订阅源,包括:

  • 技术巨头官方博客(Kubernetes、AWS、Azure、Red Hat)
  • 国内一线技术团队博客(美团、有赞)
  • 优质中文独立博客(阮一峰、云风、酷壳等)

Web 界面访问地址:http://你的服务器IP:8082

初始账户:admin / changeme,建议首次登录后立即修改密码。

数据备份

数据目录说明:

/root/docker/miniflux/
├── docker-compose.yml    # 配置文件
├── data/                 # Miniflux 应用数据
└── pgsql_data/          # PostgreSQL 数据库文件

定期备份 pgsql_data 目录即可完整保存所有订阅数据和文章缓存。

参考资料


WireGuard 隧道下 SSH 连接卡死问题排查

背景

在 WireGuard 虚拟网络环境下,我尝试 SSH 连接远程主机时,TCP 连接可以建立,但会话随即卡死。

使用 ssh -v 开启详细调试模式,发现日志停滞在密钥交换(Key Exchange)的最后一步:

debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
...
debug1: kex: algorithm: curve25519-sha256
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY  <-- 卡死在此处,随后超时

分析

MTU 黑洞 (MTU Black Hole)。

SSH 在密钥交换(KEX)阶段会发送较大的数据包。WireGuard 协议本身会增加头部开销(Overhead)。当 [SSH Payload + TCP/IP Headers + WireGuard Overhead] 的总长度超过物理链路路径上的最小 MTU(通常受限于 PPPoE 拨号或中间路由策略)时,数据包会被静默丢弃。

由于中间链路可能禁用了 ICMP,导致发送端无法收到 “Fragmentation Needed” 通知,从而造成连接“假死”。

解决方案

WireGuard 官方推荐将 MTU 设置为保守值 1280 以适配绝大多数网络环境。


解决macOS应用程序“已损坏”警告

最近在macOS上安装应用程序时,是否遇到过“已损坏,无法打开”的提示。经过一番搜索,这是macOS的安全机制在作祟。

一、问题背景

macOS包含一套名为“Gatekeeper”的安全系统,它会检查应用程序是否来自已知开发者,并确保软件未被篡改。当您从非App Store来源下载应用时,系统可能会阻止其运行,并显示“已损坏”的警告。

二、解决方案

1. 允许“任何来源”的应用程序运行

打开“终端”应用程序(可以在“应用程序”>“实用工具”中找到),输入以下命令并按回车:

sudo spctl --master-disable

根据提示输入您的管理员密码。然后打开“系统偏好设置”>“安全性与隐私”>“通用”,您会看到“允许从以下位置下载的应用程序”选项,现在可以选择“任何来源”了:

image-20260203上午120155297

步骤2:移除应用的安全隔离属性

再次打开“终端”,输入以下命令(注意命令末尾有一个空格):

sudo xattr -dr com.apple.quarantine 

不按回车,而是打开“访达”,找到无法打开的应用程序,将其拖拽到终端窗口中。此时终端会自动填充应用程序的完整路径,然后按回车执行命令并输入管理员密码。大概是这个样子

sudo xattr -dr com.apple.quarantine /Applications/MyApp.app

步骤3:双击打开应用程序

完成前两个步骤后,您现在可以正常双击打开应用程序了。

安全注意事项

  1. 谨慎使用“任何来源”选项:这会降低系统的安全性,建议在使用完应用程序后通过以下命令恢复设置:
    sudo spctl --master-enable
    
  2. 只从可信来源下载应用:即使解决了“已损坏”问题,也要确保应用程序来源可靠

为什么这个方法有效?

macOS使用com.apple.quarantine属性标记从互联网下载的文件,这个属性会告诉Gatekeeper在首次打开时检查应用程序。移除这个属性或完全禁用Gatekeeper可以绕过这些检查。

结论

这个3步方案适用于大多数从非官方渠道下载的macOS应用程序。


opencode 初尝试

最近opencode很火,我也在 macOS/Linux 上装了。这篇文章记录一下安装和使用过程。

官方说明

OpenCode is an open source agent that helps you write code in your terminal, IDE, or desktop.

  • 自动识别编程语言。
  • 多个对话同时进行。
  • 分享编程过程。
  • 支持各种AI模型。
  • 什么编辑器,都能用OpenCode。

安装

最简单的方式是使用Homebrew:

brew install anomalyco/tap/opencode

Linux下:

curl -fsSL https://opencode.ai/install | bash

image-20260212下午124928729

截屏2026-02-12 下午12.51.46

启动OpenCode并配置模型:

cd ~/Workspace  # 进入你的工作目录
opencode        # 启动OpenCode

image-20260120下午60449579

在TUI界面中,输入 /connect 配置模型提供商:

  • 新手推荐: OpenCode Zen(经过验证的模型)
  • 进阶选择: Claude Sonnet 4.5(编程能力强)

首次使用,运行 /init 让OpenCode分析你的项目结构。

image-20260120下午60552057

安装好之后让 opencode 帮忙安装 oh my opencode:

请安装ohmyopencode:bunx oh-my-opencode install

image-20260212下午10148553

基础操作

掌握这几个核心命令就能开始使用:

/help          # 查看所有命令
@文件名         # 引用文件内容
!命令           # 执行shell命令
/undo          # 撤销操作
/redo          # 重做操作
Tab键          # 切换Plan/Build模式
Esc            # 退出、打断当前操作

初上手

先拿我的blog项目进行练手:

请分析我这个blog项目的结构和功能,然后告诉我可以用OpenCode做什么改进?

41fec82fadb26603f326c6373bd72213

1d11a8e8c8630c94c2fb0b782642eed3

image-20260204下午12500986

595f8b14f35bbee299f4fbd2e0f73958

68166df70b8a2a8ec494d9dfcc02eab4

e8f331a93ec3795bbbd85cd39ea88c04

其他类似的上手问答工作都可以试试:

1. 请问你会做些什么
2. 检查macOS版本
3. 显示内存使用情况
4. 列出Homebrew安装的包
5. 检查磁盘空间

oh my opencode

Oh My OpenCode

Preview

模型配置说明

ef81cb0665572908a7c98468d5b9b818

  • Sisyphus (西西弗斯): 默认的 Orchestrator (协调者)。他是“全能管家”,负责拆解任务、维护 TODO 列表,脏活累活他先接,搞不定再摇人。
  • Atlas (阿特拉斯): Executor (执行者)。专注于执行 Prometheus 制定好的计划,或者处理具体的实施工作,不负责高层决策。
  • Hephaestus (赫淮斯托斯): The Craftsman (工匠)。这是一个“深度编码”模式 (类似 Deep Mode),不依赖 Fallback 链,专注于一次性写出高质量、经过深思熟虑的代码。
  • Prometheus (普罗米修斯): Planner (规划者)。只动口不动手,负责生成架构文档和实施计划,绝对不写具体代码。

OpenCode 云端模型:

在输入框输入 /models 即可切换models

image-20260206下午34548300

image-20260206下午33410577

添加本地 Ollama 模型

OpenCode 原生支持连接本地 Ollama 实例,无需 API Key。

安装 Ollama

# 启动服务(后台运行)
ollama serve

# 拉取代码专用模型
ollama pull qwen3-coder-next:q4_K_M

⚠️ 重要提示:截至 2026.2.4 macOS 正式版 Ollama不支持 qwen3-coder-next 等最新模型。 请从 GitHub 下载最新的 RC 版本:

  1. 访问 https://github.com/ollama/ollama/releases
  2. 下载 macOS RC 版本的 dmg 文件(不是 tar.gz!)
  3. 打开 dmg 文件,将 Ollama 拖到应用程序文件夹
  4. 启动 Ollama(Launchbar 或 Spotlight 搜索 “Ollama”)

2026-02-06下午2.17.29

先在 OpenCode 中配置 Ollama

vi ~/.config/opencode/opencode.json
{
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama(local)",
      "options": {
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "qwen3-coder-next:q4_K_M": {
          "name": "qwen3-coder-next:q4_K_M"
        }
      }
    }
  }
}

再在 Oh My OpenCode 中使用 Ollama

vi ~/.config/opencode/oh-my-opencode.json
{
  "agents": {
    "hephaestus": {
      "model": "ollama/qwen3-coder-next:q4_K_M"
    },
    "oracle": {
      "model": "ollama/qwen3-coder-next:q4_K_M"
    },
    "prometheus": {
      "model": "ollama/qwen3-coder-next:q4_K_M"
    },
    "sisyphus": {
      "model": "ollama/qwen3-coder-next:q4_K_M"
    }
  },
  "categories": {
    "visual-engineering": {
      "model": "opencode/minimax-m2.1-free"
    },
    "ultrabrain": {
      "model": "opencode/minimax-m2.1-free"
    },
    "quick": {
      "model": "opencode/minimax-m2.1-free"
    }
  }
}

我的常用命令

删除所有 Task

如果需要清除所有 Sisyphus 任务,运行以下命令:

# 查看 Sisyphus 状态
ls ~/.sisyphus/

# 删除 boulder.json(清除任务状态)
rm ~/.sisyphus/boulder.json

# 删除所有计划文件
rm ~/.sisyphus/plans/*.md

# 删除 notepads
rm -rf ~/.sisyphus/notepads/*

/handoff

长对话会产生:

  • 大量已完成的思考过程
  • 过时的中间草稿
  • 历史决策和当前需求混杂
  • 上下文膨胀影响响应质量

使用 /handoff 命令可以 创建当前工作上下文的精简摘要,用于下一会话, 这会生成一个包含以下内容的摘要:

  • 当前项目状态
  • 未完成的工作
  • 关键决策和上下文
  • 建议的下一会话起点

常用命令速查

🔥 高频使用(日常必用)

基础操作

  • opencode - 启动 TUI 界面
  • opencode . - 启动当前目录的 TUI
  • @filename - 引用文件(模糊搜索当前目录)
  • @packages/functions/src/index.ts - 精确引用文件路径
  • !ls -la - 执行 shell 命令,结果加入对话
  • !npm run build - 运行构建命令

必备 Slash 命令

  • /help - 显示帮助信息
  • /init - 初始化项目/创建 AGENTS.md
  • /undo - 撤销上一步修改
  • /redo - 重做操作
  • /share - 分享当前会话
  • /models - 切换/查看可用模型
  • /connect - 配置 API keys

智能体切换

  • Tab - 切换 Build/Plan 模式

⚡ 中频使用(项目开发常用)

CLI 命令

  • opencode -c / opencode --continue - 继续上次会话
  • opencode -s session_id - 继续指定会话
  • opencode run "message" - 非交互式运行
  • opencode serve - 启动 headless HTTP 服务器
  • opencode web - 打开 Web 界面
  • opencode agent [command] - 管理智能体

内置工具

  • read - 读取文件内容
  • write - 创建/覆盖文件
  • edit - 编辑文件
  • grep - 搜索文件内容
  • glob - 按模式查找文件
  • bash - 执行 shell 命令
  • ast_grep_search - AST 模式搜索
  • ast_grep_replace - AST 模式替换
  • lsp_symbols - 获取符号列表
  • lsp_diagnostics - 获取诊断信息
  • lsp_rename - 重命名符号

模式切换

  • build - 默认模式(全工具权限)
  • plan - 规划模式(只读,禁止文件操作)

🔧 低频使用(高级功能)

Oh My OpenCode 专用

11个专业智能体

  • @sisyphus - 默认编排器(复杂任务)
  • @hephaestus - 自主深度工作者
  • @atlas - 主编排钩子
  • @prometheus - 规划智能体
  • @metis - 计划分析验证
  • @momus - 工作计划审查
  • @oracle - 战略顾问
  • @librarian - 多仓库研究
  • @explore - 快速上下文搜索

高级命令

  • ulw / ultrawork - 超work模式(复杂任务自动理解上下文)
  • /refactor - 智能重构
  • /start-work - 从 Prometheus 计划开始执行
  • /cancel-ralph - 取消 Ralph 循环
  • /stop-continuation - 停止所有延续机制
  • /handoff - 创建上下文摘要

32+ 生命周期钩子

  • pre-exec, post-exec, pre-task, post-task
  • on-error, on-success, on-timeout
  • background-compaction, context-compaction
  • 等等…

MCP 管理

  • opencode mcp add [server] - 添加 MCP 服务器
  • opencode mcp remove [server] - 移除 MCP 服务器
  • opencode mcp list - 列出已安装的 MCP

自定义命令

  • /custom-command - 自定义命令(放在 .opencode/commands/ 目录)

服务器/开发

  • opencode attach - 附加到运行中的服务器
  • opencode --fork - 继续时fork会话
  • opencode --model provider/model - 指定模型
  • opencode --agent agent_name - 指定智能体