[openclaw] add opencode-workstation app

This commit is contained in:
okxlin
2026-05-08 12:42:42 +08:00
committed by OpenClaw Bot
parent 1e3f24a947
commit 2346f5b2bd
8 changed files with 1033 additions and 0 deletions
+161
View File
@@ -0,0 +1,161 @@
# OpenCode Workstation
## 产品介绍
这是一个按 1Panel v2 应用商店目录组织的 OpenCode 运行环境。容器封装了持久化存储、运行时模式切换、oh-my-opencode 自动安装等能力,可在 1Panel 上快速部署一个带 Web UI 或 ACP 接口的 OpenCode 工作节点。
## 主要功能
- **持久化存储**:工作区、配置、缓存、运行时数据分别独立挂载,容器重建不丢失
- **双模式运行**`serve`Web UI)和 `acp`agent<->agent 协议)两种模式
- **oh-my-opencode 集成**:支持单次执行或持久化安装,配套 DCP / GPT Unlocked 插件可选
- **多 provider 支持**OpenAI、Anthropic、OpenRouter、Gemini 等 API Key / Base URL 均可通过表单配置
- **Docker 套接字可选**:通过表单可配置是否挂载宿主机 Docker 套接字
## 访问说明
- Web / serve 默认端口:`http://<host>:4096`
- ACP 默认端口:`8765`
- `serve` 模式适合通过 1Panel 反向代理后再对外提供访问
- `acp` 端口用于 ACP transport,不适合用浏览器页面探活
## 环境变量
所有敏感信息(API Key 等)通过表单中的 `password` 字段填写,写入 `.env` 文件。容器启动后由 `entrypoint.sh` 动态注入 OpenCode 配置。
## 内部升级指南
这个镜像的升级分成两部分:
- **OpenCode userland**:升级 `opencode-ai` 本体
- **oh-my-opencode**:刷新插件、安装脚本和相关配置逻辑
### 重建容器会更新什么
重建容器会拉取最新镜像,但**不会保证自动升级已持久化的 OpenCode 本体**。
原因是容器启动时:
- `OPENCODE_BOOTSTRAP=1` 只会在 `opencode` 不存在时执行首次安装
- 如果 `/data/opencode` 里已经有现成的 `opencode`bootstrap 会直接跳过
- `OMO_AUTO_INSTALL=1` 则会在每次启动时重新执行 `oh-my-opencode` 安装/刷新流程
所以真实效果是:
- **重建容器**:一定会更新镜像层
- **OpenCode 本体**:已存在时默认不会自动升级
- **oh-my-opencode**:开启自动安装时会刷新
### 手动升级 OpenCode userland
如果你要升级已持久化的 OpenCode 本体,应直接在容器内执行:
```bash
docker exec -it <container_name> bash
/app/scripts/update-opencode-userland.sh
```
升级完成后,可检查版本文件:
```bash
cat /data/state/oh-my-opencode-bootstrap/opencode.version
```
### 刷新 oh-my-opencode
如果你希望同步最新的 `oh-my-opencode` 安装逻辑、插件注册和配置刷新,有两种方式:
#### 方式一:重建容器
前提:
- `启动时自动安装 oh-my-opencode = true`
执行:
1. 打开 1Panel → 已安装应用 → OpenCode Workstation
2. 点击 **重建**
#### 方式二:容器内手动刷新
```bash
docker exec -it <container_name> bash
bunx oh-my-opencode install --no-tui ...
bunx oh-my-opencode doctor
```
### 什么时候用哪种方式
- **只更新 OpenCode 本体**:执行 `/app/scripts/update-opencode-userland.sh`
- **只刷新 oh-my-opencode 行为**:重建容器,或手动重新执行 `bunx oh-my-opencode install ...`
- **安装指定版本**
- `OpenCode Package` 主要影响首次安装,或清空 `/data/opencode` 后重新安装
- `oh-my-opencode Package` 可配合重建容器或手动安装流程生效
- **镜像层也要更新**:在 1Panel 里重建容器
### 在 1Panel 里重建容器
1. 1Panel 应用商店 → 已安装应用 → OpenCode Workstation → 参数/重建
2. 按当前表单参数重新创建容器
### 持久化数据说明
容器数据按功能拆分挂载,重建容器不会丢失:
- `APP_DATA_DIR_1`./data/workspace):工作区代码
- `APP_DATA_DIR_2`./data/config):OpenCode 配置
- `APP_DATA_DIR_3`./data/cache):npm/opencode 缓存
- `APP_DATA_DIR_4`./data/runtime):运行时数据
销毁容器时若勾选"删除数据目录"才会丢失持久化数据。
## 表单填写指南
### 必填字段
| 字段 | 说明 |
|---|---|
| Serve Port | Web UI 访问端口,默认 4096 |
| ACP Port | ACP 协议端口,默认 8765 |
| 时区 | 容器时区,默认 `Asia/Shanghai` |
| 工作区/配置/缓存/运行时挂载目录 | 四个数据持久化目录,默认挂载到 `./data/` 下 |
| 运行模式 | `serve`Web UI)或 `acp`(协议模式) |
### oh-my-opencode 选项
| 字段 | 说明 |
|---|---|
| Bootstrap OpenCode on Start | 首次运行此开关打开即自动安装 OpenCode 本体 |
| 启动时自动安装 oh-my-opencode | 默认开启,自动安装 oh-my-opencode 及其配套插件 |
| Install DCP Plugin | 启用 DCP(分布式代码处理)插件,默认开启 |
| Install GPT Unlocked Plugin | 启用 GPT Unlocked 插件,默认开启 |
| Claude / Gemini / Copilot Install Mode | 控制各模型 provider 的安装模式 |
| Extra Install Args | 传递给 oh-my-opencode 安装脚本的额外参数 |
| OpenCode Package | 默认为 `opencode-ai`;可改为 `opencode-ai@版本`,主要用于首次安装或重装 |
| oh-my-opencode Package | 默认为 `oh-my-opencode`;可改为 `oh-my-opencode@版本` |
### API Key 填写
| 字段 | 说明 |
|---|---|
| OpenAI API Key + Base URL | 填写 OpenAI 或兼容第三方接口(vLLM、LiteLLM、Ollama 等)的 Key 与地址 |
| Anthropic / OpenRouter / Gemini | 对应 provider 的 Key 与自定义地址(若有) |
| GitHub Token | 用于 Git 操作(拉取私有仓库等) |
| Git Author / Committer | 容器内 Git 提交的作者信息 |
### 高级选项
| 字段 | 说明 |
|---|---|
| OpenCode Default Model / Small Model | 覆盖 OpenCode 默认使用的模型 ID |
| OpenCode Provider ID Override | 覆盖默认 provider ID |
| OpenCode Extra Plugins | 额外注册的 OpenCode 插件(逗号分隔的 npm 包名) |
| Docker 套接字路径 | 留空等于不挂载 Docker 套接字 |
## Introduction
A persistent OpenCode workstation packaged as a 1Panel v2 app. Supports serve and ACP modes, oh-my-opencode auto-install, and multi-provider LLM configuration through the deployment form.
## Features
- Persistent volumes for workspace, config, cache, and runtime data
- Switchable serve (Web UI) and ACP (agent protocol) modes
- oh-my-opencode integration with DCP and GPT Unlocked plugins
- Multi-provider support via form fields (OpenAI, Anthropic, OpenRouter, Gemini)
- Optional Docker socket mount
- git author identity configuration
+30
View File
@@ -0,0 +1,30 @@
name: OpenCode Workstation
tags:
- Tool
title: OpenCode Workstation 可持久化的多智能体开发运行环境
description: OpenCode Workstation 可持久化的多智能体开发运行环境
additionalProperties:
key: opencode-workstation
name: OpenCode Workstation
tags:
- Tool
shortDescZh: OpenCode Workstation 可持久化的多智能体开发运行环境
shortDescEn: OpenCode Workstation persistent multi-agent dev runtime.
description:
en: OpenCode Workstation persistent multi-agent dev runtime with oh-my-opencode bootstrap and plugin-friendly storage.
zh: OpenCode Workstation 可持久化的多智能体开发运行环境
zh-Hant: OpenCode Workstation 可持久化的多智慧體開發執行環境
ja: OpenCode Workstation – 永続化対応マルチエージェント開発ランタイム
ko: OpenCode Workstation 영속 스토리지를 갖춘 멀티 에이전트 개발 런타임
ru: OpenCode Workstation – постоянное рантайм-окружение для мультиагентной разработки
ms: OpenCode Workstation persekitaran runtime berterusan untuk pembangunan multi-ejen
pt-br: OpenCode Workstation runtime persistente para desenvolvimento multiagente
type: tool
crossVersionUpdate: true
limit: 0
recommend: 0
website: "https://github.com/okxlin/release-factory"
github: "https://github.com/okxlin/release-factory"
document: "https://github.com/okxlin/release-factory"
architectures:
- amd64
@@ -0,0 +1,42 @@
PANEL_APP_PORT_HTTP=4096
PANEL_APP_PORT_ACP=8765
CONTAINER_NAME=opencode-workstation
TZ=Asia/Shanghai
DOCKER_SOCK_SRC=/var/run/docker.sock
APP_DATA_DIR_1=./data/workspace
APP_DATA_DIR_2=./data/config
APP_DATA_DIR_3=./data/cache
APP_DATA_DIR_4=./data/runtime
OPENCODE_RUNTIME_MODE=serve
OPENCODE_BOOTSTRAP=1
OMO_AUTO_INSTALL=1
DCP_INSTALL=1
GPT_UNLOCKED_INSTALL=1
OMO_CLAUDE_MODE=no
OMO_GEMINI_MODE=no
OMO_COPILOT_MODE=no
OMO_INSTALL_ARGS=
OPENCODE_NPM_PACKAGE=opencode-ai
OMO_PACKAGE=oh-my-opencode
OPENAI_API_KEY=
OPENAI_BASE_URL=
OPENCODE_MODEL=
OPENCODE_SMALL_MODEL=
OPENCODE_PROVIDER_ID=
OPENCODE_EXTRA_PLUGINS=
OPENCODE_SERVER_USERNAME=opencode
OPENCODE_SERVER_PASSWORD=
ANTHROPIC_API_KEY=
ANTHROPIC_BASE_URL=
OPENROUTER_API_KEY=
OPENROUTER_BASE_URL=
GEMINI_API_KEY=
GEMINI_BASE_URL=
GITHUB_TOKEN=
GIT_AUTHOR_NAME=
GIT_AUTHOR_EMAIL=
GIT_COMMITTER_NAME=
GIT_COMMITTER_EMAIL=
GPT_UNLOCKED_BASE_URL=
GPT_UNLOCKED_API_KEY=
GPT_UNLOCKED_MODEL=
+702
View File
@@ -0,0 +1,702 @@
additionalProperties:
formFields:
- default: 4096
edit: true
envKey: PANEL_APP_PORT_HTTP
type: number
required: true
rule: paramPort
labelEn: Serve Port
labelZh: Serve 端口
label:
en: Serve Port
zh: Serve 端口
zh-Hant: Serve 端口
ja: Serve ポート
ko: Serve 포트
ru: Порт Serve
ms: Port Serve
pt-br: Porta do Serve
- default: 8765
edit: true
envKey: PANEL_APP_PORT_ACP
type: number
required: true
rule: paramPort
labelEn: ACP Port
labelZh: ACP 端口
label:
en: ACP Port
zh: ACP 端口
zh-Hant: ACP 端口
ja: ACP ポート
ko: ACP 포트
ru: Порт ACP
ms: Port ACP
pt-br: Porta ACP
- default: Asia/Shanghai
edit: true
envKey: TZ
type: text
required: true
labelEn: Timezone
labelZh: 时区
label:
en: Timezone
zh: 时区
zh-Hant: 時區
ja: タイムゾーン
ko: 시간대
ru: Часовой пояс
ms: Zon waktu
pt-br: Fuso horário
- default: "./data/workspace"
edit: true
envKey: APP_DATA_DIR_1
type: text
required: true
labelEn: Workspace Mount Path
labelZh: 工作区挂载目录
label:
en: Workspace Mount Path
zh: 工作区挂载目录
zh-Hant: 工作區掛載目錄
ja: ワークスペースマウントパス
ko: 작업공간 마운트 경로
ru: Путь монтирования рабочей области
ms: Laluan lekap ruang kerja
pt-br: Caminho de montagem do workspace
- default: "./data/config"
edit: true
envKey: APP_DATA_DIR_2
type: text
required: true
labelEn: Config Mount Path
labelZh: 配置挂载目录
label:
en: Config Mount Path
zh: 配置挂载目录
zh-Hant: 配置掛載目錄
ja: 設定マウントパス
ko: 설정 마운트 경로
ru: Путь монтирования конфигурации
ms: Laluan lekap konfigurasi
pt-br: Caminho de montagem da configuração
- default: "./data/cache"
edit: true
envKey: APP_DATA_DIR_3
type: text
required: true
labelEn: Cache Mount Path
labelZh: 缓存挂载目录
label:
en: Cache Mount Path
zh: 缓存挂载目录
zh-Hant: 快取掛載目錄
ja: キャッシュマウントパス
ko: 캐시 마운트 경로
ru: Путь монтирования кэша
ms: Laluan lekap cache
pt-br: Caminho de montagem do cache
- default: "./data/runtime"
edit: true
envKey: APP_DATA_DIR_4
type: text
required: true
labelEn: Runtime Mount Path
labelZh: 运行时挂载目录
label:
en: Runtime Mount Path
zh: 运行时挂载目录
zh-Hant: 運行時掛載目錄
ja: ランタイムマウントパス
ko: 런타임 마운트 경로
ru: Путь монтирования рантайма
ms: Laluan lekap runtime
pt-br: Caminho de montagem do runtime
- default: /var/run/docker.sock
edit: true
envKey: DOCKER_SOCK_SRC
type: text
required: false
labelEn: Docker Socket Path (leave empty to disable)
labelZh: Docker 套接字路径(留空禁用)
label:
en: Docker Socket Path (leave empty to disable)
zh: Docker 套接字路径(留空禁用)
zh-Hant: Docker 套接字路徑(留空禁用)
ja: Docker ソケットパス(空欄で無効)
ko: Docker 소켓 경로 (비우면 비활성화)
ru: Путь к Docker-сокету (оставьте пустым для отключения)
ms: Laluan soket Docker (kosongkan untuk lumpuhkan)
pt-br: Caminho do socket Docker (deixe em branco para desabilitar)
- default: serve
edit: true
envKey: OPENCODE_RUNTIME_MODE
type: select
required: true
labelEn: Runtime Mode
labelZh: 运行模式
label:
en: Runtime Mode
zh: 运行模式
zh-Hant: 運行模式
ja: 実行モード
ko: 실행 모드
ru: Режим запуска
ms: Mod runtime
pt-br: Modo de execução
values:
- label: serve
value: serve
- label: acp
value: acp
- default: "1"
edit: true
envKey: OPENCODE_BOOTSTRAP
type: select
required: true
labelEn: Bootstrap OpenCode on Start
labelZh: 启动时安装 OpenCode
label:
en: Bootstrap OpenCode on Start
zh: 启动时安装 OpenCode
zh-Hant: 啟動時安裝 OpenCode
ja: 起動時にOpenCodeをインストール
ko: 시작 시 OpenCode 설치
ru: Установить OpenCode при запуске
ms: Pasang OpenCode semasa mula
pt-br: Instalar OpenCode na inicialização
values:
- label: "true"
value: "1"
- label: "false"
value: "0"
- default: "1"
edit: true
envKey: OMO_AUTO_INSTALL
type: select
required: true
labelEn: Auto Install oh-my-opencode
labelZh: 启动时自动安装 oh-my-opencode
label:
en: Auto Install oh-my-opencode
zh: 启动时自动安装 oh-my-opencode
zh-Hant: 啟動時自動安裝 oh-my-opencode
ja: 起動時にoh-my-opencodeを自動インストール
ko: 시작 시 oh-my-opencode 자동 설치
ru: Автоустановка oh-my-opencode при запуске
ms: Pasang oh-my-opencode secara automatik semasa mula
pt-br: Instalar oh-my-opencode automaticamente na inicialização
values:
- label: "true"
value: "1"
- label: "false"
value: "0"
- default: "1"
edit: true
envKey: DCP_INSTALL
type: select
required: true
labelEn: Install DCP Plugin
labelZh: 安装 DCP 插件
label:
en: Install DCP Plugin
zh: 安装 DCP 插件
zh-Hant: 安裝 DCP 外掛
ja: DCPプラグインをインストール
ko: DCP 플러그인 설치
ru: Установить плагин DCP
ms: Pasang plugin DCP
pt-br: Instalar plugin DCP
values:
- label: "true"
value: "1"
- label: "false"
value: "0"
- default: "1"
edit: true
envKey: GPT_UNLOCKED_INSTALL
type: select
required: true
labelEn: Install GPT Unlocked Plugin
labelZh: 安装 GPT Unlocked 插件
label:
en: Install GPT Unlocked Plugin
zh: 安装 GPT Unlocked 插件
zh-Hant: 安裝 GPT Unlocked 外掛
ja: GPT Unlockedプラグインをインストール
ko: GPT Unlocked 플러그인 설치
ru: Установить плагин GPT Unlocked
ms: Pasang plugin GPT Unlocked
pt-br: Instalar plugin GPT Unlocked
values:
- label: "true"
value: "1"
- label: "false"
value: "0"
- default: "no"
edit: true
envKey: OMO_CLAUDE_MODE
type: select
required: true
labelEn: Claude Install Mode
labelZh: Claude 安装模式
label:
en: Claude Install Mode
zh: Claude 安装模式
zh-Hant: Claude 安裝模式
ja: Claudeインストールモード
ko: Claude 설치 모드
ru: Режим установки Claude
ms: Mod pemasangan Claude
pt-br: Modo de instalação do Claude
values:
- label: "no"
value: "no"
- label: "yes"
value: "yes"
- label: max20
value: max20
- default: "no"
edit: true
envKey: OMO_GEMINI_MODE
type: select
required: true
labelEn: Gemini Install Mode
labelZh: Gemini 安装模式
label:
en: Gemini Install Mode
zh: Gemini 安装模式
zh-Hant: Gemini 安裝模式
ja: Geminiインストールモード
ko: Gemini 설치 모드
ru: Режим установки Gemini
ms: Mod pemasangan Gemini
pt-br: Modo de instalação do Gemini
values:
- label: "no"
value: "no"
- label: "yes"
value: "yes"
- default: "no"
edit: true
envKey: OMO_COPILOT_MODE
type: select
required: true
labelEn: Copilot Install Mode
labelZh: Copilot 安装模式
label:
en: Copilot Install Mode
zh: Copilot 安装模式
zh-Hant: Copilot 安裝模式
ja: Copilotインストールモード
ko: Copilot 설치 모드
ru: Режим установки Copilot
ms: Mod pemasangan Copilot
pt-br: Modo de instalação do Copilot
values:
- label: "no"
value: "no"
- label: "yes"
value: "yes"
- default: ""
edit: true
envKey: OMO_INSTALL_ARGS
type: text
required: false
labelEn: Extra Install Args
labelZh: 额外安装参数
label:
en: Extra Install Args
zh: 额外安装参数
zh-Hant: 額外安裝參數
ja: 追加インストール引数
ko: 추가 설치 인수
ru: Дополнительные аргументы установки
ms: Argumen pemasangan tambahan
pt-br: Argumentos extras de instalação
- default: "opencode-ai"
edit: true
envKey: OPENCODE_NPM_PACKAGE
type: text
required: false
labelEn: OpenCode Package
labelZh: OpenCode 安装包
label:
en: OpenCode Package
zh: OpenCode 安装包
zh-Hant: OpenCode 安裝包
ja: OpenCode パッケージ
ko: OpenCode 패키지
ru: Пакет OpenCode
ms: Pakej OpenCode
pt-br: Pacote do OpenCode
- default: "oh-my-opencode"
edit: true
envKey: OMO_PACKAGE
type: text
required: false
labelEn: oh-my-opencode Package
labelZh: oh-my-opencode 安装包
label:
en: oh-my-opencode Package
zh: oh-my-opencode 安装包
zh-Hant: oh-my-opencode 安裝包
ja: oh-my-opencode パッケージ
ko: oh-my-opencode 패키지
ru: Пакет oh-my-opencode
ms: Pakej oh-my-opencode
pt-br: Pacote do oh-my-opencode
- default: ""
edit: true
envKey: OPENAI_API_KEY
type: password
required: false
labelEn: OpenAI API Key
labelZh: OpenAI API Key
label:
en: OpenAI API Key
zh: OpenAI API Key
zh-Hant: OpenAI API Key
ja: OpenAI API Key
ko: OpenAI API Key
ru: OpenAI API Key
ms: OpenAI API Key
pt-br: OpenAI API Key
- default: ""
edit: true
envKey: OPENAI_BASE_URL
type: text
required: false
labelEn: OpenAI Base URL
labelZh: OpenAI 接口地址(兼容第三方)
label:
en: OpenAI Base URL
zh: OpenAI 接口地址(兼容第三方)
zh-Hant: OpenAI 接口地址(兼容第三方)
ja: OpenAI APIエンドポイント(互換可)
ko: OpenAI API 엔드포인트(호환 가능)
ru: OpenAI endpoint(совместим с аналогами)
ms: OpenAI URL endpointserasi pihak ketiga
pt-br: OpenAI endpointcompatível com terceiros
- default: ""
edit: true
envKey: OPENCODE_MODEL
type: text
required: false
labelEn: OpenCode Default Model
labelZh: OpenCode 默认模型
label:
en: OpenCode Default Model
zh: OpenCode 默认模型
zh-Hant: OpenCode 預設模型
ja: OpenCodeデフォルトモデル
ko: OpenCode 기본 모델
ru: Модель OpenCode по умолчанию
ms: Model lalai OpenCode
pt-br: Modelo padrão do OpenCode
- default: ""
edit: true
envKey: OPENCODE_SMALL_MODEL
type: text
required: false
labelEn: OpenCode Small Model
labelZh: OpenCode 轻量模型
label:
en: OpenCode Small Model
zh: OpenCode 轻量模型
zh-Hant: OpenCode 輕量模型
ja: OpenCode軽量モデル
ko: OpenCode 경량 모델
ru: Лёгкая модель OpenCode
ms: Model ringan OpenCode
pt-br: Modelo leve do OpenCode
- default: ""
edit: true
envKey: OPENCODE_PROVIDER_ID
type: text
required: false
labelEn: OpenCode Provider ID Override
labelZh: OpenCode Provider ID 覆盖
label:
en: OpenCode Provider ID Override
zh: OpenCode Provider ID 覆盖
zh-Hant: OpenCode Provider ID 覆寫
ja: OpenCode Provider IDの上書き
ko: OpenCode Provider ID 재정의
ru: Переопределение Provider ID OpenCode
ms: Override ID provider OpenCode
pt-br: Sobrescrever Provider ID do OpenCode
- default: ""
edit: true
envKey: OPENCODE_EXTRA_PLUGINS
type: text
required: false
labelEn: OpenCode Extra Plugins
labelZh: OpenCode 额外插件
label:
en: OpenCode Extra Plugins
zh: OpenCode 额外插件
zh-Hant: OpenCode 額外插件
ja: OpenCode追加プラグイン
ko: OpenCode 추가 플러그인
ru: Дополнительные плагины OpenCode
ms: Plugin tambahan OpenCode
pt-br: Plugins extras do OpenCode
- default: "opencode"
edit: true
envKey: OPENCODE_SERVER_USERNAME
type: text
required: false
labelEn: Serve Basic Auth Username
labelZh: Serve 基本认证用户名
label:
en: Serve Basic Auth Username
zh: Serve 基本认证用户名
zh-Hant: Serve 基本認證使用者名稱
ja: Serve Basic認証ユーザー名
ko: Serve 기본 인증 사용자 이름
ru: Имя пользователя Basic Auth для serve
ms: Nama pengguna Basic Auth untuk serve
pt-br: Usuário de autenticação básica do serve
- default: ""
edit: true
envKey: OPENCODE_SERVER_PASSWORD
type: password
required: false
labelEn: Serve Basic Auth Password
labelZh: Serve 基本认证密码
label:
en: Serve Basic Auth Password
zh: Serve 基本认证密码
zh-Hant: Serve 基本認證密碼
ja: Serve Basic認証パスワード
ko: Serve 기본 인증 비밀번호
ru: Пароль Basic Auth для serve
ms: Kata laluan Basic Auth untuk serve
pt-br: Senha de autenticação básica do serve
- default: ""
edit: true
envKey: ANTHROPIC_API_KEY
type: password
required: false
labelEn: Anthropic API Key
labelZh: Anthropic API Key
label:
en: Anthropic API Key
zh: Anthropic API Key
zh-Hant: Anthropic API Key
ja: Anthropic API Key
ko: Anthropic API Key
ru: Anthropic API Key
ms: Anthropic API Key
pt-br: Anthropic API Key
- default: ""
edit: true
envKey: ANTHROPIC_BASE_URL
type: text
required: false
labelEn: Anthropic Base URL
labelZh: Anthropic Base URL
label:
en: Anthropic Base URL
zh: Anthropic Base URL
zh-Hant: Anthropic Base URL
ja: Anthropic Base URL
ko: Anthropic Base URL
ru: Anthropic Base URL
ms: Anthropic Base URL
pt-br: Anthropic Base URL
- default: ""
edit: true
envKey: OPENROUTER_API_KEY
type: password
required: false
labelEn: OpenRouter API Key
labelZh: OpenRouter API Key
label:
en: OpenRouter API Key
zh: OpenRouter API Key
zh-Hant: OpenRouter API Key
ja: OpenRouter API Key
ko: OpenRouter API Key
ru: OpenRouter API Key
ms: OpenRouter API Key
pt-br: OpenRouter API Key
- default: ""
edit: true
envKey: OPENROUTER_BASE_URL
type: text
required: false
labelEn: OpenRouter Base URL
labelZh: OpenRouter Base URL
label:
en: OpenRouter Base URL
zh: OpenRouter Base URL
zh-Hant: OpenRouter Base URL
ja: OpenRouter Base URL
ko: OpenRouter Base URL
ru: OpenRouter Base URL
ms: OpenRouter Base URL
pt-br: OpenRouter Base URL
- default: ""
edit: true
envKey: GEMINI_API_KEY
type: password
required: false
labelEn: Gemini API Key
labelZh: Gemini API Key
label:
en: Gemini API Key
zh: Gemini API Key
zh-Hant: Gemini API Key
ja: Gemini API Key
ko: Gemini API Key
ru: Gemini API Key
ms: Gemini API Key
pt-br: Gemini API Key
- default: ""
edit: true
envKey: GEMINI_BASE_URL
type: text
required: false
labelEn: Gemini Base URL
labelZh: Gemini Base URL
label:
en: Gemini Base URL
zh: Gemini Base URL
zh-Hant: Gemini Base URL
ja: Gemini Base URL
ko: Gemini Base URL
ru: Gemini Base URL
ms: Gemini Base URL
pt-br: Gemini Base URL
- default: ""
edit: true
envKey: GITHUB_TOKEN
type: password
required: false
labelEn: GitHub Token
labelZh: GitHub Token
label:
en: GitHub Token
zh: GitHub Token
zh-Hant: GitHub Token
ja: GitHub Token
ko: GitHub Token
ru: GitHub Token
ms: GitHub Token
pt-br: GitHub Token
- default: ""
edit: true
envKey: GIT_AUTHOR_NAME
type: text
required: false
labelEn: Git Author Name
labelZh: Git 作者名
label:
en: Git Author Name
zh: Git 作者名
zh-Hant: Git 作者名
ja: Git作成者名
ko: Git 작성자 이름
ru: Имя автора Git
ms: Nama pengarang Git
pt-br: Nome do autor Git
- default: ""
edit: true
envKey: GIT_AUTHOR_EMAIL
type: text
required: false
labelEn: Git Author Email
labelZh: Git 作者邮箱
label:
en: Git Author Email
zh: Git 作者邮箱
zh-Hant: Git 作者郵箱
ja: Git作成者メール
ko: Git 작성자 이메일
ru: Email автора Git
ms: E-mel pengarang Git
pt-br: Email do autor Git
- default: ""
edit: true
envKey: GIT_COMMITTER_NAME
type: text
required: false
labelEn: Git Committer Name
labelZh: Git 提交者名
label:
en: Git Committer Name
zh: Git 提交者名
zh-Hant: Git 提交者名
ja: Gitコミッター名
ko: Git 커미터 이름
ru: Имя коммиттера Git
ms: Nama komit Git
pt-br: Nome do committer Git
- default: ""
edit: true
envKey: GIT_COMMITTER_EMAIL
type: text
required: false
labelEn: Git Committer Email
labelZh: Git 提交者邮箱
label:
en: Git Committer Email
zh: Git 提交者邮箱
zh-Hant: Git 提交者郵箱
ja: Gitコミッターメール
ko: Git 커미터 이메일
ru: Email коммиттера Git
ms: E-mel komit Git
pt-br: Email do committer Git
- default: ""
edit: true
envKey: GPT_UNLOCKED_BASE_URL
type: text
required: false
labelEn: GPT Unlocked Base URL
labelZh: GPT Unlocked Base URL
label:
en: GPT Unlocked Base URL
zh: GPT Unlocked Base URL
zh-Hant: GPT Unlocked Base URL
ja: GPT Unlocked Base URL
ko: GPT Unlocked Base URL
ru: GPT Unlocked Base URL
ms: GPT Unlocked Base URL
pt-br: GPT Unlocked Base URL
- default: ""
edit: true
envKey: GPT_UNLOCKED_API_KEY
type: password
required: false
labelEn: GPT Unlocked API Key
labelZh: GPT Unlocked API Key
label:
en: GPT Unlocked API Key
zh: GPT Unlocked API Key
zh-Hant: GPT Unlocked API Key
ja: GPT Unlocked API Key
ko: GPT Unlocked API Key
ru: GPT Unlocked API Key
ms: GPT Unlocked API Key
pt-br: GPT Unlocked API Key
- default: ""
edit: true
envKey: GPT_UNLOCKED_MODEL
type: text
required: false
labelEn: GPT Unlocked Model
labelZh: GPT Unlocked 模型
label:
en: GPT Unlocked Model
zh: GPT Unlocked 模型
zh-Hant: GPT Unlocked 模型
ja: GPT Unlockedモデル
ko: GPT Unlocked 모델
ru: Модель GPT Unlocked
ms: Model GPT Unlocked
pt-br: Modelo GPT Unlocked
@@ -0,0 +1,83 @@
services:
opencode-workstation:
image: "ghcr.io/okxlin/opencode-workstation:latest"
container_name: ${CONTAINER_NAME}
labels:
createdBy: "Apps"
user: "0:0"
restart: unless-stopped
tty: true
stdin_open: true
ports:
- "${PANEL_APP_PORT_HTTP}:4096"
- "${PANEL_APP_PORT_ACP}:8765"
environment:
- TZ=${TZ}
- OPENCODE_RUNTIME_MODE=${OPENCODE_RUNTIME_MODE}
- ACP_HOST=0.0.0.0
- ACP_PORT=8765
- SERVE_HOST=0.0.0.0
- SERVE_PORT=4096
- OPENCODE_BOOTSTRAP=${OPENCODE_BOOTSTRAP}
- OMO_AUTO_INSTALL=${OMO_AUTO_INSTALL}
- DCP_INSTALL=${DCP_INSTALL}
- GPT_UNLOCKED_INSTALL=${GPT_UNLOCKED_INSTALL}
- OMO_CLAUDE_MODE=${OMO_CLAUDE_MODE}
- OMO_GEMINI_MODE=${OMO_GEMINI_MODE}
- OMO_COPILOT_MODE=${OMO_COPILOT_MODE}
- OMO_INSTALL_ARGS=${OMO_INSTALL_ARGS}
- OPENCODE_NPM_PACKAGE=${OPENCODE_NPM_PACKAGE}
- OMO_PACKAGE=${OMO_PACKAGE}
- OPENCODE_INSTALL_DIR=/data/opencode
- XDG_DATA_HOME=/data/xdg-data
- OPENCODE_NPM_BIN_DIR=/data/bin
- OPENCODE_CONFIG_DIR=/config/opencode
- OMO_INSTALL_DIR=/data/oh-my-opencode
- OPENAI_API_KEY=${OPENAI_API_KEY}
- OPENAI_BASE_URL=${OPENAI_BASE_URL}
- OPENCODE_MODEL=${OPENCODE_MODEL}
- OPENCODE_SMALL_MODEL=${OPENCODE_SMALL_MODEL}
- OPENCODE_PROVIDER_ID=${OPENCODE_PROVIDER_ID}
- OPENCODE_EXTRA_PLUGINS=${OPENCODE_EXTRA_PLUGINS}
- OPENCODE_SERVER_USERNAME=${OPENCODE_SERVER_USERNAME}
- OPENCODE_SERVER_PASSWORD=${OPENCODE_SERVER_PASSWORD}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- ANTHROPIC_BASE_URL=${ANTHROPIC_BASE_URL}
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
- OPENROUTER_BASE_URL=${OPENROUTER_BASE_URL}
- GEMINI_API_KEY=${GEMINI_API_KEY}
- GEMINI_BASE_URL=${GEMINI_BASE_URL}
- GITHUB_TOKEN=${GITHUB_TOKEN}
- GIT_AUTHOR_NAME=${GIT_AUTHOR_NAME}
- GIT_AUTHOR_EMAIL=${GIT_AUTHOR_EMAIL}
- GIT_COMMITTER_NAME=${GIT_COMMITTER_NAME}
- GIT_COMMITTER_EMAIL=${GIT_COMMITTER_EMAIL}
- GPT_UNLOCKED_BASE_URL=${GPT_UNLOCKED_BASE_URL}
- GPT_UNLOCKED_API_KEY=${GPT_UNLOCKED_API_KEY}
- GPT_UNLOCKED_MODEL=${GPT_UNLOCKED_MODEL}
volumes:
- ${APP_DATA_DIR_1}:/workspace
- ${APP_DATA_DIR_2}:/config
- ${APP_DATA_DIR_3}:/cache
- ${APP_DATA_DIR_4}:/data
- ${DOCKER_SOCK_SRC}:/var/run/docker.sock
healthcheck:
test:
- CMD-SHELL
- >-
if [ "$OPENCODE_RUNTIME_MODE" = "serve" ]; then
ps -ef | grep -v grep | grep "opencode serve" >/dev/null;
else
ps -ef | grep -v grep | grep "opencode acp" >/dev/null;
fi
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
command: ["runtime"]
networks:
- 1panel-network
networks:
1panel-network:
external: true
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
set -euo pipefail
mkdir -p "${APP_DATA_DIR_1:-./data/workspace}" \
"${APP_DATA_DIR_2:-./data/config}" \
"${APP_DATA_DIR_3:-./data/cache}" \
"${APP_DATA_DIR_4:-./data/runtime}"
echo '[opencode-workstation:init] initialized persistent directories:'
echo " ${APP_DATA_DIR_1:-./data/workspace} -> /workspace"
echo " ${APP_DATA_DIR_2:-./data/config} -> /config"
echo " ${APP_DATA_DIR_3:-./data/cache} -> /cache"
echo " ${APP_DATA_DIR_4:-./data/runtime} -> /data"
echo '[opencode-workstation:init] default serve address: http://0.0.0.0:4096'
echo '[opencode-workstation:init] ACP port: 8765'
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB