mirror of
https://github.com/okxlin/appstore.git
synced 2026-09-22 08:00:59 +00:00
[openclaw] add opencode-workstation app
This commit is contained in:
@@ -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
|
||||
@@ -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=
|
||||
@@ -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 endpoint(serasi pihak ketiga)
|
||||
pt-br: OpenAI endpoint(compatí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
@@ -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 |
Reference in New Issue
Block a user