Skip to content

[功能请求] 希望支持按项目/工作区独立存储会话数据库(Per-project Database) #174

Open

Description

@ceeeeeeeeeeeeeeeeb

1. 背景与现状 (Context)

OpenCodeUI 依赖后台运行的 opencode serve 提供 API 与会话支持。

在底层的实际机制中:

  • OpenCode 支持通过环境变量 OPENCODE_DB 将 SQLite 数据库重定向到自定义路径(例如:set OPENCODE_DB=%CD%\.opencode\opencode.db)。
  • 但关键限制在于:opencode serve 仅在启动初始化时读取该变量并建立数据库连接;一旦服务启动后,无法在运行期间通过 API 动态热切换数据库。

这导致目前在 OpenCodeUI 界面中打开或切换不同的项目/工作区时,所有项目的对话历史依然只能全部写入启动时指定的同一个全局数据库中。


2. 核心痛点 (Problems)

  1. 多项目对话混杂:所有项目(甚至敏感项目/临时测试项目)的会话记录、Prompt、思考流全部堆在一个全局单一的 opencode.db 里,无法物理隔离。
  2. 历史无法随项目迁移:项目的对话记录(记录了大量关键架构决策与修改细节)无法保存在项目根目录下,难以随 Git 仓库归档或分享给团队成员。
  3. 全局库单文件膨胀与锁风险:随着项目增多,全局数据库体积不断暴增,清理维护极不方便。

3. 需求与实现方案建议 (Proposed Solution)

既然上游 opencode serve 暂不支持动态切库,而 OpenCodeUI 本身具备对后台 Server 进程的生命周期管理(启动/停止/重启)能力,因此通过**“切换项目时自动优雅重启 Server 并注入环境变量”**是最轻量、最现实且完全可行的方案!

建议的功能交互设计:

  1. 设置中增加开关:
    在设置面板中提供一个选项:

    • [ ] 启用项目级会话数据库隔离 (Per-project Database)
    • 描述:切换工作区时,将对话历史保存在当前项目的 .opencode/opencode.db 中。
  2. 切换项目时的自动处理流程:
    当用户在 UI 中切换到新工作区(例如路径为 E:\my-projects\project-a)时:

    • 第一步:前端发出切换信号,触发本地后端进程管理器优雅终止(SIGTERM)当前正在运行的 opencode serve 进程。

    • 第二步:确保目标项目下的目录存在(若 E:\my-projects\project-a\.opencode 不存在则自动创建目录,避免 SQLite 报文件找不到的错误)。

    • 第三步:注入新项目的环境变量并重新启动 opencode serve:

      OPENCODE_DB="E:\my-projects\project-a\.opencode\opencode.db" opencode serve ...
    • 第四步:前端重连(由于 opencode serve 冷启通常只需几百毫秒),刷新当前项目的会话列表。


4. 上游社区呼声与参考依据 (References & Community Feedback)

在 OpenCode 官方仓库(anomalyco/opencode)与社区中,关于“全局单库存储”带来的困扰以及“按项目独立存储”的呼声由来已久,有多个相关的热门 Issue 与讨论:

  1. [Issue #1865: Add option to auto-save session record to disk]([FEATURE] Add option to auto-save session record to disk. anomalyco/opencode#1865)
    • 社区开发者一直希望对话历史能够自动写到当前工作区目录(如 ./.opencode/),以便按项目归档、版本化管理及人类可读追溯。
  2. [Issue #31307: Multiple opencode instances in the same project share the same database](Multiple opencode instances in the same project share the same session via SQLite database anomalyco/opencode#31307)
    • 探讨了多实例共用同一个全局 ~/.local/share/opencode/opencode.db 时出现的 SQLite 锁竞争问题。官方给出的解决建议正是通过 OPENCODE_DB 为不同实例指定独立数据库路径。
  3. [Issue #31391: why opencode.db so large?](why opencode.db so large? anomalyco/opencode#31391)
    • 所有项目的会话堆在同一个全局数据库中,导致数据库单文件动辄暴增至 10GB 左右,极其笨重,用户无法单独清理某个已结项项目的历史。

希望能考虑加入该特性,这能极大增强 OpenCodeUI 在多项目开发管理时的体验与数据隔离性!非常感谢作者开发出这么棒的 UI!

Activity

  1. lehhair commented on Oct 5, 2026

    @lehhair
    Owner

    还有这种操作,等我适配好v2我试一试,v1的话可能就不会更新了

  2. lehhair commented on Oct 15, 2026

    @lehhair
    Owner

    这个特性如果要加的话,可能就不能同时开多个项目了啊,因为每个项目要单独运行opencode服务

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions