docs: add localized documentation pages

Adds translated docs for Spanish, Korean, Polish, Portuguese, Ukrainian, and Chinese
Covers install, quickstart, themes, troubleshooting, tunnels, and reverse proxy guides
Updates docs workflow, sidebar, and contributor documentation
This commit is contained in:
Bohdan Triapitsyn
2026-05-23 00:33:39 +03:00
parent 82633d97f5
commit 6f4e0068c1
47 changed files with 3638 additions and 17 deletions
+1 -1
View File
@@ -59,7 +59,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Trigger openchamber-website docs sync (optional)
if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
if: ${{ github.event_name == 'push' || github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
env:
WEBSITE_REPO: openchamber/openchamber-website
WEBSITE_TOKEN: ${{ secrets.OPENCHAMBER_WEBSITE_REPO_TOKEN }}
+123 -1
View File
@@ -19,7 +19,12 @@ This package is docs content source-of-truth for OpenChamber.
- `foo.mdx` -> `/foo/`
- `folder/index.mdx` -> `/folder/`
- `folder/bar.mdx` -> `/folder/bar/`
4. Run validation:
4. Add translations for the page — see [Localization](#localization). Translations
are optional per page (a missing translation falls back to English), but ship
them together with the page when you can.
5. If the page is linked from the sidebar, add its localized labels too — see
[Translate the sidebar](#translate-the-sidebar).
6. Run validation:
```bash
bun run docs:validate
@@ -44,6 +49,120 @@ Rules:
- every sidebar link must map to an existing MDX file
- keep section labels short and task-oriented
## Localization
The docs are translated into the same languages the OpenChamber app ships in.
English is the source of truth and lives at the root of `content/docs/`. Every
other language mirrors the English files under a locale folder.
### Supported locales
| Language | Content folder | Sidebar `translations` key |
| --- | --- | --- |
| English | _(root, no folder)_ | `en` |
| Ukrainian | `uk/` | `uk` |
| Chinese (Simplified) | `zh-cn/` | `zh-CN` |
| Spanish | `es/` | `es` |
| Brazilian Portuguese | `pt-br/` | `pt-BR` |
| Korean | `ko/` | `ko` |
| Polish | `pl/` | `pl` |
> [!IMPORTANT]
> The **content folder** uses the lowercase locale key (`zh-cn`, `pt-br`); the
> **sidebar `translations`** key uses the BCP-47 language tag (`zh-CN`, `pt-BR`).
> They look similar but are not interchangeable — Starlight resolves them with
> different rules. Everything else (`uk`, `es`, `ko`, `pl`, `en`) is identical
> in both columns.
This locale set is mirrored in the website at
`openchamber-website/apps/docs/astro.config.mjs` (`locales`). If a language is
added or removed, update both places.
### Translate a page
Mirror the English file under each locale folder, keeping the **exact same
filename and path**. Starlight matches a translation to its English page by path.
```
content/docs/
install.mdx # English (source of truth)
uk/install.mdx # Ukrainian
zh-cn/install.mdx # Chinese (Simplified)
es/install.mdx # Spanish
pt-br/install.mdx # Brazilian Portuguese
ko/install.mdx # Korean
pl/install.mdx # Polish
guides/tunnels.mdx # nested English page
uk/guides/tunnels.mdx # its Ukrainian translation
```
Each translated file needs its **own translated frontmatter** (`title` and
`description` are required by validation):
```mdx
---
title: Встановлення
description: Встановіть OpenChamber для десктопа, вебу або VS Code.
---
```
You do **not** have to translate every page at once. A page that is missing in a
locale automatically falls back to the English version, so translations can land
incrementally.
### Translate the sidebar
Do **not** create separate sidebar entries per language and do **not** add a
locale prefix to `link` — Starlight prefixes the active locale automatically.
Instead, add a `translations` map (keyed by the BCP-47 tag from the table above)
to each section and item in `sidebar.config.json`:
```json
{
"label": "Start here",
"translations": {
"uk": "Почніть тут",
"zh-CN": "从这里开始",
"es": "Empieza aquí",
"pt-BR": "Comece aqui",
"ko": "여기서 시작",
"pl": "Zacznij tutaj"
},
"items": [
{
"label": "Install",
"link": "/install/",
"translations": {
"uk": "Встановлення",
"zh-CN": "安装",
"es": "Instalación",
"pt-BR": "Instalação",
"ko": "설치",
"pl": "Instalacja"
}
}
]
}
```
A label with no translation for the active locale falls back to the English
`label`.
### What not to translate
- brand and product nouns: OpenChamber, OpenCode, VS Code, PWA, GitHub, Discord,
macOS, SSH
- code blocks, shell commands, file paths, flags, and config keys
- the page filename and the sidebar `link` (these stay identical across locales)
### Validate
`bun run docs:validate` walks every `.mdx` under `content/docs/` — **including
translations** — and fails if any page is missing `title` or `description`
frontmatter, or if a sidebar `link` does not resolve to an English page. Run it
after adding or translating pages.
## Sync into openchamber-website
`openchamber-website` renders/deploys docs via Starlight in `apps/docs`.
@@ -51,7 +170,10 @@ Rules:
After docs content updates here:
1. copy `packages/docs/content/docs/*` -> `openchamber-website/apps/docs/src/content/docs/*`
(this is recursive, so locale folders like `uk/` and `zh-cn/` carry over with
no extra steps)
2. map `packages/docs/sidebar.config.json` into `openchamber-website/apps/docs/astro.config.mjs` sidebar
(the `translations` maps carry over as-is)
3. run docs checks/build in website repo
Automation support exists in `.github/workflows/docs-source.yml` (release/manual packaging of docs source artifact).
+18 -6
View File
@@ -21,13 +21,20 @@ Outputs:
- uploads archive as workflow artifact
- on release/manual with tag, uploads archive to release assets
## Optional cross-repo sync trigger
## Cross-repo sync trigger
The workflow can trigger a `repository_dispatch` event in `openchamber-website`.
After validating and packaging, the workflow sends a `repository_dispatch` event
to `openchamber-website` so it re-syncs and redeploys the docs. This fires on
**every** trigger above — push to `main` (docs changes), release, and manual
`workflow_dispatch` — so a normal commit to docs auto-updates the live site.
Set secret in this repo:
Required secret in this repo:
- `OPENCHAMBER_WEBSITE_REPO_TOKEN` (token with access to `openchamber/openchamber-website`)
- `OPENCHAMBER_WEBSITE_REPO_TOKEN` — a token with `contents: write` (classic
`repo` scope, or fine-grained with Contents: read & write) on
`openchamber/openchamber-website`. **Without it the dispatch step is skipped**
(it logs "not set" and exits cleanly), so the site will never auto-update.
This is the most common reason the pipeline silently does nothing.
Event sent:
@@ -36,7 +43,12 @@ Event sent:
Payload includes:
- `source_repo`
- `source_ref`
- `source_ref` — the ref the website checks out from `openchamber` (`main` on a
push, the tag on a release)
- `archive_name`
`openchamber-website` can listen for this event and pull docs source from release artifacts.
`openchamber-website`'s `deploy-docs.yml` listens for this event
(`repository_dispatch: types: [docs_source_updated]`), checks out
`openchamber` at `source_ref`, runs `docs:sync`, builds `apps/docs`, and deploys
to Cloudflare Pages. That repo needs its own secrets: `OPENCHAMBER_REPO_TOKEN`
(read access to this repo), `CLOUDFLARE_API_TOKEN`, and `CLOUDFLARE_ACCOUNT_ID`.
+4 -2
View File
@@ -4,9 +4,11 @@ This package is the source-of-truth for OpenChamber public docs content.
## Layout
- `content/docs/*.mdx` - English docs pages
- `content/docs/*.mdx` - English docs pages (source of truth)
- `content/docs/<locale>/*.mdx` - translations, mirroring the English filenames
(e.g. `uk/`, `zh-cn/`, `pt-br/`); see `CONTRIBUTING.md` → Localization
- `sidebar.config.json` - docs navigation structure for Starlight sidebar
- `CONTRIBUTING.md` - authoring guide for adding pages and sections
- `CONTRIBUTING.md` - authoring guide for adding pages, sections, and translations
- `DEPLOYMENT.md` - release/manual packaging and sync trigger model
## Local validation
+25
View File
@@ -0,0 +1,25 @@
---
title: Documentación de OpenChamber
description: Guía de configuración y uso de OpenChamber en web, escritorio y VS Code.
---
# Documentación de OpenChamber
OpenChamber es el espacio de trabajo visual en torno a OpenCode.
Usa esta documentación para:
- instalar la plataforma adecuada para tu flujo de trabajo
- exponer OpenChamber de forma segura para uso remoto
- personalizar la apariencia y resolver problemas comunes
## Lee esto primero
- [Instalación](/es/install/)
- [Inicio rápido](/es/quickstart/)
- [Túneles](/es/tunnels/)
- [Resolución de problemas](/es/troubleshooting/)
## Para qué sirve OpenChamber
OpenChamber está pensado para las partes de la programación con IA que se benefician de un centro de control: ramificar sesiones, revisar diffs, gestionar terminales, observar el progreso de las herramientas, ejecutar acciones de proyecto y mantener todo el panel a la vista mientras el agente trabaja.
+33
View File
@@ -0,0 +1,33 @@
---
title: Instalación
description: Instala OpenChamber para escritorio, web o VS Code.
---
# Instalación
OpenChamber tiene tres plataformas principales:
- app de escritorio para macOS
- app web alojada por la CLI con PWA instalable
- extensión para VS Code
## Requisito previo
Instala [OpenCode](https://opencode.ai) primero.
## Web + PWA
```bash
curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash
openchamber --ui-password be-creative-here
```
Luego abre la URL que imprime la CLI (normalmente `http://localhost:3000`).
## Escritorio
Descarga la última compilación de escritorio desde la página de releases de GitHub o la página de descargas de OpenChamber.
## VS Code
Instálala desde el VS Code Marketplace e inicia sesión con tu flujo de trabajo habitual de OpenCode.
@@ -0,0 +1,22 @@
---
title: Inicio rápido
description: Inicia OpenChamber rápidamente y elige la plataforma adecuada para la tarea.
---
# Inicio rápido
## La vía más rápida
1. Instala OpenCode.
2. Instala la CLI de OpenChamber.
3. Ejecuta `openchamber --ui-password be-creative-here`.
4. Abre la UI web en tu máquina.
5. Si lo necesitas, inicia un túnel y escanea el código QR desde tu teléfono.
Usa una contraseña de UI fuerte, sobre todo si piensas exponer la instancia de forma remota.
## ¿Qué plataforma debería usar?
- usa **escritorio** para el día a día en flujos de trabajo centrados en macOS
- usa **web** para acceso remoto y revisión desde el móvil
- usa **VS Code** para sesiones nativas del editor, junto al código
@@ -0,0 +1,347 @@
---
title: Proxy inverso
description: Configura OpenChamber correctamente detrás de Nginx, Nginx Proxy Manager u otro proxy inverso.
---
# Proxy inverso
Usa esta página si ejecutas OpenChamber detrás de Nginx, Nginx Proxy Manager, Caddy, Cloudflare u otro proxy inverso.
## Antes de ponerle un proxy
1. Confirma primero que OpenChamber funciona directamente.
2. Abre `http://<server-ip>:3000` o tu puerto personalizado desde la misma red.
3. Añade el proxy inverso solo después de que la conexión directa funcione.
## Qué debe admitir el proxy
- WebSockets para el transporte de mensajes en vivo:
- `/api/event/ws`
- `/api/global/event/ws`
- `/api/terminal/ws`
- SSE sin búfer:
- `/api/event`
- `/api/global/event`
- `/api/notifications/stream`
- `/api/openchamber/events`
- `/api/terminal/:sessionId/stream`
- Cuerpos de solicitud grandes para adjuntos y operaciones de archivos
- Tiempos de espera de lectura prolongados para streams en vivo y sesiones de terminal
## Reglas que importan
- Habilita el proxy de WebSockets.
- Desactiva el búfer en las rutas SSE.
- Desactiva gzip en el proxy si OpenChamber ya comprime las respuestas.
- Mantén la compresión activada en una sola capa.
- Reenvía las cabeceras de proxy habituales como `Host`, `X-Forwarded-For` y `X-Forwarded-Proto`.
- Aumenta los límites de tamaño del cuerpo si los usuarios suben archivos.
## Lista de comprobación rápida
- OpenChamber accesible directamente en la LAN
- WebSockets habilitados en el proxy
- las rutas SSE tienen el búfer desactivado
- `gzip off` en el host del proxy, o compresión del proxy desactivada de otro modo
- `client_max_body_size` suficientemente grande para los adjuntos
- `proxy_read_timeout` suficientemente largo para los streams
## Ejemplo: Nginx
<details>
<summary>Mostrar configuración de ejemplo</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
## Ejemplo: Nginx Proxy Manager
<details>
<summary>Mostrar ejemplo de la pestaña Advanced</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/notifications/stream {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/openchamber/events {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
Habilita también `Websockets Support` en Nginx Proxy Manager para este host.
## Señales habituales de fallo
### La página carga, pero el envío de mensajes falla
- los WebSockets no están habilitados en el proxy
- `/api/event/ws` o `/api/global/event/ws` no pasa correctamente
### Las notificaciones o el estado en vivo no se actualizan
- una de las rutas SSE está en búfer o en caché
- falta `X-Accel-Buffering "no"`
### Las subidas de archivos fallan
- `client_max_body_size` es demasiado pequeño
### Todo funciona en local, pero solo falla detrás del proxy
- el proxy está comprimiendo y almacenando en búfer el tráfico en vivo
- al proxy le falta soporte de WebSockets
## Ejemplo: Caddy
<details>
<summary>Mostrar configuración de ejemplo</summary>
```caddy
reverse_proxy 127.0.0.1:3000 {
# WebSocket support is automatic in Caddy
# Flush SSE responses immediately
flush_interval -1
# Pass through Host and proxy headers
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# Increase timeouts for long-lived streams
transport http {
read_timeout 3600s
write_timeout 3600s
}
}
```
</details>
Caddy gestiona las actualizaciones de WebSocket automáticamente: no hace falta configuración adicional. La directiva `flush_interval -1` garantiza que los fragmentos SSE se reenvíen de inmediato sin búfer.
## Advertencia sobre CDN y doble compresión
Si colocas una CDN (como Cloudflare) delante de tu proxy inverso, ten en cuenta la doble compresión:
- OpenChamber comprime las respuestas HTTP con gzip (umbral de 1 KB).
- Cloudflare y otras CDN también comprimen las respuestas por defecto.
- Esto puede provocar respuestas con doble compresión o cabeceras `Content-Encoding` incorrectas.
Para evitarlo, desactiva la compresión en **una** capa:
- **Cloudflare:** Rules → Compression → disable (o usa el modo "Passthrough").
- **Nginx:** `gzip off` (ya mostrado en los ejemplos anteriores).
- **Caddy:** Caddy no recomprime por defecto si el upstream ya envía contenido comprimido.
Las rutas de streaming SSE están excluidas de la compresión por OpenChamber, pero la CDN aún puede almacenarlas en búfer. Consulta la documentación de tu CDN para saber cómo desactivar el búfer en las rutas SSE.
## Relacionado
- [Túneles](/es/tunnels/)
- [Resolución de problemas](/es/troubleshooting/)
+30
View File
@@ -0,0 +1,30 @@
---
title: Temas
description: Personaliza OpenChamber con temas integrados y definidos por el usuario.
---
# Temas
OpenChamber admite temas integrados y archivos JSON de tema personalizados.
## Añadir un tema personalizado
1. Crea el directorio de temas:
```bash
mkdir -p ~/.config/openchamber/themes
```
2. Añade tu archivo JSON a ese directorio (por ejemplo, `my-theme.json`).
3. Abre OpenChamber y ve a **Settings -> Theme -> Reload themes**.
4. Elige tu tema en el desplegable.
## Ubicación de los temas
- macOS/Linux: `~/.config/openchamber/themes/`
## Referencia completa del formato JSON
Usa la guía completa del formato en la documentación del repositorio principal:
- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md)
@@ -0,0 +1,30 @@
---
title: Resolución de problemas
description: Problemas comunes de configuración y ejecución con soluciones rápidas.
---
# Resolución de problemas
## El comando OpenChamber se cierra o no arranca
- confirma que Node.js es `>=20`
- ejecuta `openchamber --version`
- reinstala la última CLI si hace falta
## No se puede acceder a la UI web
- revisa los logs del servidor con `openchamber logs`
- verifica el puerto activo (por defecto `3000`)
- abre primero `http://localhost:3000` directamente antes de probar enlaces de túnel
## El enlace remoto/de túnel no funciona
- ejecuta `openchamber tunnel status --all`
- reinicia el túnel desde la misma instancia/puerto
- regenera el enlace de conexión si el token anterior ya se usó
## La extensión de VS Code no se conecta
- confirma que el servidor de OpenChamber está en marcha
- verifica que la extensión está actualizada
- recarga la ventana de VS Code y reintenta la conexión
+77
View File
@@ -0,0 +1,77 @@
---
title: Túneles
description: Expón OpenChamber de forma segura para acceso remoto y móvil.
---
# Túneles
Usa `openchamber tunnel` para exponer una instancia de OpenChamber en marcha.
## Inicio rápido (modo rápido de Cloudflare)
1. Inicia OpenChamber:
```bash
openchamber
```
2. Inicia un túnel:
```bash
openchamber tunnel start --provider cloudflare --mode quick
```
3. Comprueba el estado:
```bash
openchamber tunnel status
```
Por defecto, OpenChamber imprime un código QR en sesiones TTY interactivas. Usa `--qr` para forzar la salida del QR, o `--no-qr` para desactivarla.
## Modos gestionados
### Gestionado remoto
Usa un token + nombre de host gestionados por Cloudflare:
```bash
openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com
```
### Gestionado local
Usa una configuración local de `cloudflared`:
```bash
openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
```
## Perfiles (managed-remote)
Guarda un perfil reutilizable:
```bash
openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token
```
Inicia usando el perfil guardado:
```bash
openchamber tunnel start --profile prod-main
```
## Comandos útiles
```bash
openchamber tunnel providers
openchamber tunnel ready --provider cloudflare
openchamber tunnel doctor --provider cloudflare
openchamber tunnel stop --port 3000
```
## Notas de comportamiento
- un único túnel activo por instancia de OpenChamber (puerto)
- iniciar un nuevo modo/proveedor en la misma instancia reemplaza el túnel anterior
- generar un nuevo enlace de conexión revoca el anterior sin usar
+25
View File
@@ -0,0 +1,25 @@
---
title: OpenChamber 문서
description: 웹, 데스크톱, VS Code에서 OpenChamber를 설정하고 운영하는 가이드.
---
# OpenChamber 문서
OpenChamber는 OpenCode를 둘러싼 시각적 작업 공간입니다.
이 문서를 사용해:
- 워크플로에 맞는 플랫폼을 설치하세요
- 원격 사용을 위해 OpenChamber를 안전하게 공개하세요
- 외관을 맞춤 설정하고 흔한 문제를 해결하세요
## 먼저 읽어보기
- [설치](/ko/install/)
- [빠른 시작](/ko/quickstart/)
- [터널](/ko/tunnels/)
- [문제 해결](/ko/troubleshooting/)
## OpenChamber는 무엇을 위한 것인가
OpenChamber는 관제 센터가 도움이 되는 AI 코딩 작업을 위한 것입니다. 세션 분기, diff 검토, 터미널 관리, 도구 진행 상황 관찰, 프로젝트 액션 실행, 그리고 에이전트가 작업하는 동안 전체 보드를 한눈에 유지하는 일입니다.
+33
View File
@@ -0,0 +1,33 @@
---
title: 설치
description: 데스크톱, 웹, VS Code용 OpenChamber를 설치하세요.
---
# 설치
OpenChamber에는 세 가지 주요 플랫폼이 있습니다:
- macOS용 데스크톱 앱
- 설치 가능한 PWA를 갖춘 CLI 호스팅 웹 앱
- VS Code 확장
## 사전 요구 사항
먼저 [OpenCode](https://opencode.ai)를 설치하세요.
## 웹 + PWA
```bash
curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash
openchamber --ui-password be-creative-here
```
그런 다음 CLI가 출력한 URL을 여세요(보통 `http://localhost:3000`).
## 데스크톱
GitHub 릴리스 페이지 또는 OpenChamber 다운로드 페이지에서 최신 데스크톱 빌드를 내려받으세요.
## VS Code
VS Code 마켓플레이스에서 설치하고 평소 사용하는 OpenCode 워크플로로 로그인하세요.
@@ -0,0 +1,22 @@
---
title: 빠른 시작
description: OpenChamber를 빠르게 시작하고 작업에 맞는 플랫폼을 선택하세요.
---
# 빠른 시작
## 가장 빠른 경로
1. OpenCode를 설치합니다.
2. OpenChamber CLI를 설치합니다.
3. `openchamber --ui-password be-creative-here`를 실행합니다.
4. 컴퓨터에서 웹 UI를 엽니다.
5. 필요하면 터널을 시작하고 휴대폰으로 QR 코드를 스캔합니다.
특히 인스턴스를 원격으로 공개할 계획이라면 강력한 UI 비밀번호를 사용하세요.
## 어떤 플랫폼을 사용해야 하나요?
- macOS 중심의 일상 작업에는 **데스크톱**을 사용하세요
- 원격 접근과 모바일 검토에는 **웹**을 사용하세요
- 코드 옆에서 에디터 네이티브 세션을 원하면 **VS Code**를 사용하세요
@@ -0,0 +1,347 @@
---
title: 리버스 프록시
description: Nginx, Nginx Proxy Manager 또는 다른 리버스 프록시 뒤에서 OpenChamber를 올바르게 구성하세요.
---
# 리버스 프록시
Nginx, Nginx Proxy Manager, Caddy, Cloudflare 또는 다른 리버스 프록시 뒤에서 OpenChamber를 실행한다면 이 페이지를 사용하세요.
## 프록시를 두기 전에
1. 먼저 OpenChamber가 직접 작동하는지 확인하세요.
2. 같은 네트워크에서 `http://<server-ip>:3000` 또는 사용자 지정 포트를 여세요.
3. 직접 연결이 작동한 후에만 리버스 프록시를 추가하세요.
## 프록시가 지원해야 하는 것
- 실시간 메시지 전송을 위한 WebSocket:
- `/api/event/ws`
- `/api/global/event/ws`
- `/api/terminal/ws`
- 버퍼링 없는 SSE:
- `/api/event`
- `/api/global/event`
- `/api/notifications/stream`
- `/api/openchamber/events`
- `/api/terminal/:sessionId/stream`
- 첨부 파일 및 파일 작업을 위한 대용량 요청 본문
- 실시간 스트림과 터미널 세션을 위한 긴 읽기 타임아웃
## 중요한 규칙
- WebSocket 프록시를 활성화하세요.
- SSE 경로에서 버퍼링을 비활성화하세요.
- OpenChamber가 이미 응답을 압축한다면 프록시에서 gzip을 비활성화하세요.
- 압축은 한 계층에서만 켜두세요.
- `Host`, `X-Forwarded-For`, `X-Forwarded-Proto` 같은 일반 프록시 헤더를 전달하세요.
- 사용자가 파일을 업로드한다면 본문 크기 제한을 늘리세요.
## 빠른 체크리스트
- LAN에서 OpenChamber에 직접 접근 가능
- 프록시에서 WebSocket 활성화
- SSE 경로의 버퍼링 꺼짐
- 프록시 호스트에서 `gzip off`, 또는 다른 방식으로 프록시 압축 비활성화
- 첨부 파일에 충분히 큰 `client_max_body_size`
- 스트림에 충분히 긴 `proxy_read_timeout`
## 예시: Nginx
<details>
<summary>예시 구성 보기</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
## 예시: Nginx Proxy Manager
<details>
<summary>Advanced 탭 예시 보기</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/notifications/stream {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/openchamber/events {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
이 호스트에 대해 Nginx Proxy Manager에서 `Websockets Support`도 활성화하세요.
## 흔한 실패 징후
### 페이지는 로드되지만 메시지 전송이 실패함
- 프록시에서 WebSocket이 활성화되지 않음
- `/api/event/ws` 또는 `/api/global/event/ws`가 올바르게 전달되지 않음
### 알림 또는 실시간 상태가 업데이트되지 않음
- SSE 경로 중 하나가 버퍼링되거나 캐시됨
- `X-Accel-Buffering "no"`가 누락됨
### 파일 업로드가 실패함
- `client_max_body_size`가 너무 작음
### 로컬에서는 모두 작동하지만 프록시 뒤에서만 깨짐
- 프록시가 실시간 트래픽을 압축하고 버퍼링함
- 프록시에 WebSocket 지원이 없음
## 예시: Caddy
<details>
<summary>예시 구성 보기</summary>
```caddy
reverse_proxy 127.0.0.1:3000 {
# WebSocket support is automatic in Caddy
# Flush SSE responses immediately
flush_interval -1
# Pass through Host and proxy headers
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# Increase timeouts for long-lived streams
transport http {
read_timeout 3600s
write_timeout 3600s
}
}
```
</details>
Caddy는 WebSocket 업그레이드를 자동으로 처리합니다 — 추가 구성이 필요 없습니다. `flush_interval -1` 지시어는 SSE 청크가 버퍼링 없이 즉시 전달되도록 보장합니다.
## CDN 및 이중 압축 경고
리버스 프록시 앞에 CDN(예: Cloudflare)을 두는 경우 이중 압축에 유의하세요:
- OpenChamber는 HTTP 응답을 gzip으로 압축합니다(임계값 1KB).
- Cloudflare와 다른 CDN도 기본적으로 응답을 압축합니다.
- 이로 인해 이중 압축된 응답이나 잘못된 `Content-Encoding` 헤더가 발생할 수 있습니다.
이를 피하려면 **한** 계층에서 압축을 비활성화하세요:
- **Cloudflare:** Rules → Compression → disable(또는 "Passthrough" 모드 사용).
- **Nginx:** `gzip off`(위 예시에 이미 표시됨).
- **Caddy:** 업스트림이 이미 압축된 콘텐츠를 보내면 Caddy는 기본적으로 다시 압축하지 않습니다.
SSE 스트리밍 경로는 OpenChamber에서 압축에서 제외되지만, CDN이 여전히 버퍼링할 수 있습니다. SSE 경로에서 버퍼링을 비활성화하는 방법은 CDN 문서를 확인하세요.
## 관련 항목
- [터널](/ko/tunnels/)
- [문제 해결](/ko/troubleshooting/)
+30
View File
@@ -0,0 +1,30 @@
---
title: 테마
description: 내장 테마와 사용자 정의 테마로 OpenChamber를 맞춤 설정하세요.
---
# 테마
OpenChamber는 내장 테마와 사용자 정의 테마 JSON 파일을 지원합니다.
## 사용자 정의 테마 추가
1. 테마 디렉터리를 만듭니다:
```bash
mkdir -p ~/.config/openchamber/themes
```
2. 해당 디렉터리에 JSON 파일을 추가합니다(예: `my-theme.json`).
3. OpenChamber를 열고 **Settings -> Theme -> Reload themes**로 이동합니다.
4. 드롭다운에서 테마를 선택합니다.
## 테마 위치
- macOS/Linux: `~/.config/openchamber/themes/`
## 전체 JSON 형식 참조
메인 저장소 문서의 전체 형식 가이드를 사용하세요:
- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md)
@@ -0,0 +1,30 @@
---
title: 문제 해결
description: 흔한 설정 및 실행 문제와 빠른 해결 방법.
---
# 문제 해결
## OpenChamber 명령이 종료되거나 시작되지 않음
- Node.js `>=20`인지 확인하세요
- `openchamber --version`을 실행하세요
- 필요하면 최신 CLI를 다시 설치하세요
## 웹 UI에 접근할 수 없음
- `openchamber logs`로 서버 로그를 확인하세요
- 활성 포트를 확인하세요(기본값 `3000`)
- 터널 링크를 테스트하기 전에 먼저 `http://localhost:3000`을 직접 여세요
## 원격/터널 링크가 작동하지 않음
- `openchamber tunnel status --all`을 실행하세요
- 같은 인스턴스/포트에서 터널을 다시 시작하세요
- 이전 토큰이 이미 사용되었다면 연결 링크를 다시 생성하세요
## VS Code 확장이 연결되지 않음
- OpenChamber 서버가 실행 중인지 확인하세요
- 확장이 최신인지 확인하세요
- VS Code 창을 새로 고치고 연결을 다시 시도하세요
+77
View File
@@ -0,0 +1,77 @@
---
title: 터널
description: 원격 및 모바일 접근을 위해 OpenChamber를 안전하게 공개하세요.
---
# 터널
실행 중인 OpenChamber 인스턴스를 공개하려면 `openchamber tunnel`을 사용하세요.
## 빠른 시작 (Cloudflare 빠른 모드)
1. OpenChamber를 시작합니다:
```bash
openchamber
```
2. 터널을 시작합니다:
```bash
openchamber tunnel start --provider cloudflare --mode quick
```
3. 상태를 확인합니다:
```bash
openchamber tunnel status
```
기본적으로 OpenChamber는 대화형 TTY 세션에서 QR 코드를 출력합니다. `--qr`로 QR 출력을 강제하거나 `--no-qr`로 비활성화하세요.
## 관리형 모드
### 관리형 원격
Cloudflare가 관리하는 토큰 + 호스트네임을 사용합니다:
```bash
openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com
```
### 관리형 로컬
로컬 `cloudflared` 구성을 사용합니다:
```bash
openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
```
## 프로필 (managed-remote)
재사용 가능한 프로필을 저장합니다:
```bash
openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token
```
저장된 프로필로 시작합니다:
```bash
openchamber tunnel start --profile prod-main
```
## 유용한 명령
```bash
openchamber tunnel providers
openchamber tunnel ready --provider cloudflare
openchamber tunnel doctor --provider cloudflare
openchamber tunnel stop --port 3000
```
## 동작 참고 사항
- OpenChamber 인스턴스(포트)당 활성 터널은 하나입니다
- 같은 인스턴스에서 새 모드/공급자를 시작하면 이전 터널이 대체됩니다
- 새 연결 링크를 생성하면 사용되지 않은 이전 링크가 무효화됩니다
+25
View File
@@ -0,0 +1,25 @@
---
title: Dokumentacja OpenChamber
description: Przewodnik konfiguracji i obsługi OpenChamber w przeglądarce, na komputerze i w VS Code.
---
# Dokumentacja OpenChamber
OpenChamber to wizualna przestrzeń pracy wokół OpenCode.
Skorzystaj z tej dokumentacji, aby:
- zainstalować platformę odpowiednią dla swojego procesu pracy
- bezpiecznie udostępnić OpenChamber do użytku zdalnego
- dostosować wygląd i rozwiązywać typowe problemy
## Przeczytaj najpierw
- [Instalacja](/pl/install/)
- [Szybki start](/pl/quickstart/)
- [Tunele](/pl/tunnels/)
- [Rozwiązywanie problemów](/pl/troubleshooting/)
## Do czego służy OpenChamber
OpenChamber jest przeznaczony do tych części programowania z AI, które zyskują na centrum dowodzenia: rozgałęzianie sesji, przeglądanie diffów, zarządzanie terminalami, śledzenie postępu narzędzi, uruchamianie akcji projektu i utrzymywanie całej planszy na widoku, gdy agent pracuje.
+33
View File
@@ -0,0 +1,33 @@
---
title: Instalacja
description: Zainstaluj OpenChamber na komputer, do przeglądarki lub do VS Code.
---
# Instalacja
OpenChamber ma trzy główne platformy:
- aplikacja na komputer dla macOS
- aplikacja webowa hostowana przez CLI z instalowalnym PWA
- rozszerzenie do VS Code
## Wymaganie wstępne
Najpierw zainstaluj [OpenCode](https://opencode.ai).
## Przeglądarka + PWA
```bash
curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash
openchamber --ui-password be-creative-here
```
Następnie otwórz adres URL wypisany przez CLI (zwykle `http://localhost:3000`).
## Komputer
Pobierz najnowszą kompilację na komputer ze strony wydań na GitHubie lub ze strony pobierania OpenChamber.
## VS Code
Zainstaluj z VS Code Marketplace i zaloguj się do swojego zwykłego procesu pracy OpenCode.
@@ -0,0 +1,22 @@
---
title: Szybki start
description: Szybko uruchom OpenChamber i wybierz platformę odpowiednią do zadania.
---
# Szybki start
## Najszybsza droga
1. Zainstaluj OpenCode.
2. Zainstaluj CLI OpenChamber.
3. Uruchom `openchamber --ui-password be-creative-here`.
4. Otwórz webowy interfejs na swoim komputerze.
5. W razie potrzeby uruchom tunel i zeskanuj kod QR telefonem.
Używaj silnego hasła UI, zwłaszcza jeśli planujesz udostępniać instancję zdalnie.
## Której platformy użyć?
- użyj **komputera** do codziennej pracy w procesach skupionych na macOS
- użyj **przeglądarki** do zdalnego dostępu i przeglądania na telefonie
- użyj **VS Code** do sesji natywnych dla edytora, obok kodu
@@ -0,0 +1,347 @@
---
title: Reverse proxy
description: Skonfiguruj OpenChamber poprawnie za Nginx, Nginx Proxy Manager lub innym reverse proxy.
---
# Reverse proxy
Skorzystaj z tej strony, jeśli uruchamiasz OpenChamber za Nginx, Nginx Proxy Manager, Caddy, Cloudflare lub innym reverse proxy.
## Zanim ustawisz proxy
1. Najpierw potwierdź, że OpenChamber działa bezpośrednio.
2. Otwórz `http://<server-ip>:3000` lub swój własny port z tej samej sieci.
3. Dodaj reverse proxy dopiero, gdy połączenie bezpośrednie działa.
## Co proxy musi obsługiwać
- WebSockets do transportu wiadomości na żywo:
- `/api/event/ws`
- `/api/global/event/ws`
- `/api/terminal/ws`
- SSE bez buforowania:
- `/api/event`
- `/api/global/event`
- `/api/notifications/stream`
- `/api/openchamber/events`
- `/api/terminal/:sessionId/stream`
- Duże treści żądań dla załączników i operacji na plikach
- Długie limity czasu odczytu dla strumieni na żywo i sesji terminala
## Reguły, które mają znaczenie
- Włącz proxy WebSocket.
- Wyłącz buforowanie na trasach SSE.
- Wyłącz gzip na proxy, jeśli OpenChamber już kompresuje odpowiedzi.
- Utrzymuj kompresję włączoną tylko w jednej warstwie.
- Przekazuj zwykłe nagłówki proxy, takie jak `Host`, `X-Forwarded-For` i `X-Forwarded-Proto`.
- Zwiększ limity rozmiaru treści, jeśli użytkownicy przesyłają pliki.
## Szybka lista kontrolna
- OpenChamber dostępny bezpośrednio w LAN
- WebSockets włączone w proxy
- trasy SSE mają wyłączone buforowanie
- `gzip off` na hoście proxy lub kompresja proxy wyłączona w inny sposób
- `client_max_body_size` wystarczająco duży dla załączników
- `proxy_read_timeout` wystarczająco długi dla strumieni
## Przykład: Nginx
<details>
<summary>Pokaż przykładową konfigurację</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
## Przykład: Nginx Proxy Manager
<details>
<summary>Pokaż przykład z karty Advanced</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/notifications/stream {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/openchamber/events {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
Włącz także `Websockets Support` w Nginx Proxy Manager dla tego hosta.
## Typowe oznaki awarii
### Strona się ładuje, ale wysyłanie wiadomości zawodzi
- WebSockets nie są włączone w proxy
- `/api/event/ws` lub `/api/global/event/ws` nie przechodzi poprawnie
### Powiadomienia lub status na żywo nie aktualizują się
- jedna z tras SSE jest buforowana lub w pamięci podręcznej
- brakuje `X-Accel-Buffering "no"`
### Przesyłanie plików zawodzi
- `client_max_body_size` jest zbyt mały
### Wszystko działa lokalnie, ale psuje się tylko za proxy
- proxy kompresuje i buforuje ruch na żywo
- proxy nie obsługuje WebSockets
## Przykład: Caddy
<details>
<summary>Pokaż przykładową konfigurację</summary>
```caddy
reverse_proxy 127.0.0.1:3000 {
# WebSocket support is automatic in Caddy
# Flush SSE responses immediately
flush_interval -1
# Pass through Host and proxy headers
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# Increase timeouts for long-lived streams
transport http {
read_timeout 3600s
write_timeout 3600s
}
}
```
</details>
Caddy obsługuje uaktualnienia WebSocket automatycznie — żadna dodatkowa konfiguracja nie jest potrzebna. Dyrektywa `flush_interval -1` zapewnia, że fragmenty SSE są przekazywane natychmiast, bez buforowania.
## Ostrzeżenie o CDN i podwójnej kompresji
Jeśli umieścisz CDN (np. Cloudflare) przed swoim reverse proxy, pamiętaj o podwójnej kompresji:
- OpenChamber kompresuje odpowiedzi HTTP za pomocą gzip (próg 1 KB).
- Cloudflare i inne CDN-y również domyślnie kompresują odpowiedzi.
- Może to powodować podwójnie skompresowane odpowiedzi lub nieprawidłowe nagłówki `Content-Encoding`.
Aby tego uniknąć, wyłącz kompresję w **jednej** warstwie:
- **Cloudflare:** Rules → Compression → disable (lub użyj trybu "Passthrough").
- **Nginx:** `gzip off` (już pokazane w przykładach powyżej).
- **Caddy:** Caddy domyślnie nie kompresuje ponownie, jeśli upstream już wysyła skompresowaną treść.
Trasy strumieniowania SSE są wyłączone z kompresji przez OpenChamber, ale CDN może je nadal buforować. Sprawdź dokumentację swojego CDN, jak wyłączyć buforowanie na ścieżkach SSE.
## Powiązane
- [Tunele](/pl/tunnels/)
- [Rozwiązywanie problemów](/pl/troubleshooting/)
+30
View File
@@ -0,0 +1,30 @@
---
title: Motywy
description: Dostosuj OpenChamber za pomocą wbudowanych i własnych motywów.
---
# Motywy
OpenChamber obsługuje wbudowane motywy oraz własne pliki JSON z motywami.
## Dodaj własny motyw
1. Utwórz katalog motywów:
```bash
mkdir -p ~/.config/openchamber/themes
```
2. Dodaj swój plik JSON do tego katalogu (na przykład `my-theme.json`).
3. Otwórz OpenChamber, a następnie przejdź do **Settings -> Theme -> Reload themes**.
4. Wybierz swój motyw z listy rozwijanej.
## Lokalizacja motywów
- macOS/Linux: `~/.config/openchamber/themes/`
## Pełna dokumentacja formatu JSON
Skorzystaj z pełnego przewodnika po formacie w dokumentacji głównego repozytorium:
- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md)
@@ -0,0 +1,30 @@
---
title: Rozwiązywanie problemów
description: Typowe problemy z konfiguracją i działaniem oraz szybkie rozwiązania.
---
# Rozwiązywanie problemów
## Polecenie OpenChamber kończy się lub nie uruchamia
- upewnij się, że Node.js `>=20`
- uruchom `openchamber --version`
- w razie potrzeby zainstaluj ponownie najnowsze CLI
## Webowy interfejs jest nieosiągalny
- sprawdź logi serwera poleceniem `openchamber logs`
- zweryfikuj aktywny port (domyślnie `3000`)
- najpierw otwórz `http://localhost:3000` bezpośrednio, zanim zaczniesz testować linki tunelu
## Link zdalny/tunelu nie działa
- uruchom `openchamber tunnel status --all`
- zrestartuj tunel z tej samej instancji/portu
- wygeneruj nowy link połączenia, jeśli poprzedni token został już użyty
## Rozszerzenie VS Code nie łączy się
- upewnij się, że serwer OpenChamber działa
- zweryfikuj, że rozszerzenie jest zaktualizowane
- przeładuj okno VS Code i ponów połączenie
+77
View File
@@ -0,0 +1,77 @@
---
title: Tunele
description: Bezpiecznie udostępnij OpenChamber do dostępu zdalnego i mobilnego.
---
# Tunele
Użyj `openchamber tunnel`, aby udostępnić działającą instancję OpenChamber.
## Szybki start (tryb szybki Cloudflare)
1. Uruchom OpenChamber:
```bash
openchamber
```
2. Uruchom tunel:
```bash
openchamber tunnel start --provider cloudflare --mode quick
```
3. Sprawdź status:
```bash
openchamber tunnel status
```
Domyślnie OpenChamber wypisuje kod QR w interaktywnych sesjach TTY. Użyj `--qr`, aby wymusić wyświetlenie kodu QR, lub `--no-qr`, aby je wyłączyć.
## Tryby zarządzane
### Zarządzany zdalny
Użyj tokenu + nazwy hosta zarządzanych przez Cloudflare:
```bash
openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com
```
### Zarządzany lokalny
Użyj lokalnej konfiguracji `cloudflared`:
```bash
openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
```
## Profile (managed-remote)
Zapisz profil wielokrotnego użytku:
```bash
openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token
```
Uruchom z zapisanym profilem:
```bash
openchamber tunnel start --profile prod-main
```
## Przydatne polecenia
```bash
openchamber tunnel providers
openchamber tunnel ready --provider cloudflare
openchamber tunnel doctor --provider cloudflare
openchamber tunnel stop --port 3000
```
## Uwagi dotyczące zachowania
- jeden aktywny tunel na instancję OpenChamber (port)
- uruchomienie nowego trybu/dostawcy na tej samej instancji zastępuje poprzedni tunel
- wygenerowanie nowego linku połączenia unieważnia poprzedni nieużyty
@@ -0,0 +1,25 @@
---
title: Documentação do OpenChamber
description: Guia de configuração e uso do OpenChamber na web, no desktop e no VS Code.
---
# Documentação do OpenChamber
O OpenChamber é o espaço de trabalho visual em torno do OpenCode.
Use esta documentação para:
- instalar a plataforma certa para o seu fluxo de trabalho
- expor o OpenChamber com segurança para uso remoto
- personalizar a aparência e resolver problemas comuns
## Leia isto primeiro
- [Instalação](/pt-br/install/)
- [Início rápido](/pt-br/quickstart/)
- [Túneis](/pt-br/tunnels/)
- [Solução de problemas](/pt-br/troubleshooting/)
## Para que serve o OpenChamber
O OpenChamber é voltado para as partes da programação com IA que se beneficiam de um centro de controle: ramificar sessões, revisar diffs, gerenciar terminais, acompanhar o progresso das ferramentas, executar ações de projeto e manter todo o painel à vista enquanto o agente trabalha.
@@ -0,0 +1,33 @@
---
title: Instalação
description: Instale o OpenChamber para desktop, web ou VS Code.
---
# Instalação
O OpenChamber tem três plataformas principais:
- app de desktop para macOS
- app web hospedado pela CLI com PWA instalável
- extensão para VS Code
## Pré-requisito
Instale o [OpenCode](https://opencode.ai) primeiro.
## Web + PWA
```bash
curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash
openchamber --ui-password be-creative-here
```
Depois abra a URL impressa pela CLI (geralmente `http://localhost:3000`).
## Desktop
Baixe a build de desktop mais recente na página de releases do GitHub ou na página de download do OpenChamber.
## VS Code
Instale pela VS Code Marketplace e entre no seu fluxo de trabalho habitual do OpenCode.
@@ -0,0 +1,22 @@
---
title: Início rápido
description: Inicie o OpenChamber rapidamente e escolha a plataforma certa para a tarefa.
---
# Início rápido
## Caminho mais rápido
1. Instale o OpenCode.
2. Instale a CLI do OpenChamber.
3. Execute `openchamber --ui-password be-creative-here`.
4. Abra a UI web na sua máquina.
5. Se precisar, inicie um túnel e escaneie o QR code pelo celular.
Use uma senha de UI forte, principalmente se pretende expor a instância remotamente.
## Qual plataforma devo usar?
- use **desktop** para o uso diário em fluxos focados em macOS
- use **web** para acesso remoto e revisão pelo celular
- use **VS Code** para sessões nativas do editor, ao lado do código
@@ -0,0 +1,347 @@
---
title: Proxy reverso
description: Configure o OpenChamber corretamente atrás do Nginx, Nginx Proxy Manager ou outro proxy reverso.
---
# Proxy reverso
Use esta página se você executa o OpenChamber atrás do Nginx, Nginx Proxy Manager, Caddy, Cloudflare ou outro proxy reverso.
## Antes de colocar um proxy
1. Primeiro confirme que o OpenChamber funciona diretamente.
2. Abra `http://<server-ip>:3000` ou sua porta personalizada a partir da mesma rede.
3. Adicione o proxy reverso somente depois que a conexão direta funcionar.
## O que o proxy precisa suportar
- WebSockets para o transporte de mensagens ao vivo:
- `/api/event/ws`
- `/api/global/event/ws`
- `/api/terminal/ws`
- SSE sem buffer:
- `/api/event`
- `/api/global/event`
- `/api/notifications/stream`
- `/api/openchamber/events`
- `/api/terminal/:sessionId/stream`
- Corpos de requisição grandes para anexos e operações de arquivo
- Tempos de leitura longos para streams ao vivo e sessões de terminal
## Regras que importam
- Habilite o proxy de WebSockets.
- Desative o buffer nas rotas SSE.
- Desative o gzip no proxy se o OpenChamber já comprime as respostas.
- Mantenha a compressão ativada em apenas uma camada.
- Encaminhe os cabeçalhos de proxy normais, como `Host`, `X-Forwarded-For` e `X-Forwarded-Proto`.
- Aumente os limites de tamanho do corpo se os usuários enviarem arquivos.
## Checklist rápido
- OpenChamber acessível diretamente na LAN
- WebSockets habilitados no proxy
- rotas SSE com buffer desativado
- `gzip off` no host do proxy, ou compressão do proxy desativada de outra forma
- `client_max_body_size` grande o suficiente para os anexos
- `proxy_read_timeout` longo o suficiente para os streams
## Exemplo: Nginx
<details>
<summary>Mostrar configuração de exemplo</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
## Exemplo: Nginx Proxy Manager
<details>
<summary>Mostrar exemplo da aba Advanced</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/notifications/stream {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/openchamber/events {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
Habilite também o `Websockets Support` no Nginx Proxy Manager para este host.
## Sinais comuns de falha
### A página carrega, mas o envio de mensagens falha
- os WebSockets não estão habilitados no proxy
- `/api/event/ws` ou `/api/global/event/ws` não está passando corretamente
### As notificações ou o status ao vivo não atualizam
- uma das rotas SSE está com buffer ou em cache
- falta o `X-Accel-Buffering "no"`
### Os envios de arquivo falham
- `client_max_body_size` é pequeno demais
### Tudo funciona localmente, mas só quebra atrás do proxy
- o proxy está comprimindo e armazenando em buffer o tráfego ao vivo
- falta suporte a WebSockets no proxy
## Exemplo: Caddy
<details>
<summary>Mostrar configuração de exemplo</summary>
```caddy
reverse_proxy 127.0.0.1:3000 {
# WebSocket support is automatic in Caddy
# Flush SSE responses immediately
flush_interval -1
# Pass through Host and proxy headers
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# Increase timeouts for long-lived streams
transport http {
read_timeout 3600s
write_timeout 3600s
}
}
```
</details>
O Caddy lida com os upgrades de WebSocket automaticamente — nenhuma configuração extra é necessária. A diretiva `flush_interval -1` garante que os fragmentos SSE sejam encaminhados imediatamente, sem buffer.
## Aviso sobre CDN e dupla compressão
Se você colocar uma CDN (como a Cloudflare) na frente do seu proxy reverso, fique atento à dupla compressão:
- O OpenChamber comprime as respostas HTTP com gzip (limite de 1 KB).
- A Cloudflare e outras CDNs também comprimem as respostas por padrão.
- Isso pode causar respostas duplamente comprimidas ou cabeçalhos `Content-Encoding` incorretos.
Para evitar isso, desative a compressão em **uma** camada:
- **Cloudflare:** Rules → Compression → disable (ou use o modo "Passthrough").
- **Nginx:** `gzip off` (já mostrado nos exemplos acima).
- **Caddy:** o Caddy não recomprime por padrão se o upstream já envia conteúdo comprimido.
As rotas de streaming SSE são excluídas da compressão pelo OpenChamber, mas a CDN ainda pode armazená-las em buffer. Consulte a documentação da sua CDN sobre como desativar o buffer nas rotas SSE.
## Relacionado
- [Túneis](/pt-br/tunnels/)
- [Solução de problemas](/pt-br/troubleshooting/)
@@ -0,0 +1,30 @@
---
title: Temas
description: Personalize o OpenChamber com temas integrados e definidos pelo usuário.
---
# Temas
O OpenChamber oferece suporte a temas integrados e arquivos JSON de tema personalizados.
## Adicionar um tema personalizado
1. Crie o diretório de temas:
```bash
mkdir -p ~/.config/openchamber/themes
```
2. Adicione seu arquivo JSON a esse diretório (por exemplo, `my-theme.json`).
3. Abra o OpenChamber e vá em **Settings -> Theme -> Reload themes**.
4. Escolha seu tema na lista suspensa.
## Localização dos temas
- macOS/Linux: `~/.config/openchamber/themes/`
## Referência completa do formato JSON
Use o guia completo do formato na documentação do repositório principal:
- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md)
@@ -0,0 +1,30 @@
---
title: Solução de problemas
description: Problemas comuns de configuração e execução com soluções rápidas.
---
# Solução de problemas
## O comando OpenChamber encerra ou não inicia
- confirme o Node.js `>=20`
- execute `openchamber --version`
- reinstale a CLI mais recente se necessário
## A UI web não está acessível
- verifique os logs do servidor com `openchamber logs`
- confira a porta ativa (padrão `3000`)
- abra `http://localhost:3000` diretamente primeiro, antes de testar links de túnel
## O link remoto/de túnel não funciona
- execute `openchamber tunnel status --all`
- reinicie o túnel a partir da mesma instância/porta
- gere um novo link de conexão se o token anterior já tiver sido usado
## A extensão do VS Code não conecta
- confirme que o servidor do OpenChamber está em execução
- verifique se a extensão está atualizada
- recarregue a janela do VS Code e tente conectar de novo
@@ -0,0 +1,77 @@
---
title: Túneis
description: Exponha o OpenChamber com segurança para acesso remoto e móvel.
---
# Túneis
Use `openchamber tunnel` para expor uma instância do OpenChamber em execução.
## Início rápido (modo rápido da Cloudflare)
1. Inicie o OpenChamber:
```bash
openchamber
```
2. Inicie um túnel:
```bash
openchamber tunnel start --provider cloudflare --mode quick
```
3. Verifique o status:
```bash
openchamber tunnel status
```
Por padrão, o OpenChamber imprime um QR code em sessões TTY interativas. Use `--qr` para forçar a saída do QR, ou `--no-qr` para desativá-la.
## Modos gerenciados
### Gerenciado remoto
Use um token + nome de host gerenciados pela Cloudflare:
```bash
openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com
```
### Gerenciado local
Use uma configuração local do `cloudflared`:
```bash
openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
```
## Perfis (managed-remote)
Salve um perfil reutilizável:
```bash
openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token
```
Inicie usando o perfil salvo:
```bash
openchamber tunnel start --profile prod-main
```
## Comandos úteis
```bash
openchamber tunnel providers
openchamber tunnel ready --provider cloudflare
openchamber tunnel doctor --provider cloudflare
openchamber tunnel stop --port 3000
```
## Notas de comportamento
- um único túnel ativo por instância do OpenChamber (porta)
- iniciar um novo modo/provedor na mesma instância substitui o túnel anterior
- gerar um novo link de conexão revoga o anterior não utilizado
+25
View File
@@ -0,0 +1,25 @@
---
title: Документація OpenChamber
description: Посібник з налаштування та роботи з OpenChamber на вебі, десктопі та у VS Code.
---
# Документація OpenChamber
OpenChamber — це візуальний робочий простір навколо OpenCode.
Використовуйте ці доки, щоб:
- встановити платформу, що пасує вашому робочому процесу
- безпечно відкрити OpenChamber для віддаленого використання
- налаштувати вигляд і усувати типові проблеми
## Прочитайте спершу
- [Встановлення](/uk/install/)
- [Швидкий старт](/uk/quickstart/)
- [Тунелі](/uk/tunnels/)
- [Усунення несправностей](/uk/troubleshooting/)
## Для чого OpenChamber
OpenChamber створений для тих частин AI-кодингу, яким потрібен командний центр: розгалуження сесій, перегляд діфів, керування терміналами, спостереження за прогресом інструментів, запуск дій проєкту та збереження всієї картини перед очима, поки агент працює.
+33
View File
@@ -0,0 +1,33 @@
---
title: Встановлення
description: Встановіть OpenChamber для десктопа, вебу або VS Code.
---
# Встановлення
OpenChamber має три основні платформи:
- десктоп-застосунок для macOS
- вебзастосунок на базі CLI зі встановлюваним PWA
- розширення для VS Code
## Передумова
Спершу встановіть [OpenCode](https://opencode.ai).
## Веб + PWA
```bash
curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash
openchamber --ui-password be-creative-here
```
Потім відкрийте URL, який вивів CLI (зазвичай `http://localhost:3000`).
## Десктоп
Завантажте найновішу десктопну збірку зі сторінки релізів на GitHub або зі сторінки завантаження OpenChamber.
## VS Code
Встановіть із VS Code Marketplace і увійдіть у свій звичний робочий процес OpenCode.
@@ -0,0 +1,22 @@
---
title: Швидкий старт
description: Швидко запустіть OpenChamber і оберіть платформу під задачу.
---
# Швидкий старт
## Найшвидший шлях
1. Встановіть OpenCode.
2. Встановіть CLI OpenChamber.
3. Виконайте `openchamber --ui-password be-creative-here`.
4. Відкрийте веб-UI на своїй машині.
5. За потреби запустіть тунель і відскануйте QR-код із телефона.
Використовуйте надійний пароль UI, особливо якщо плануєте відкривати інстанс віддалено.
## Яку платформу обрати?
- обирайте **десктоп** для щоденної роботи переважно на macOS
- обирайте **веб** для віддаленого доступу та перегляду з мобільного
- обирайте **VS Code** для сесій усередині редактора, поруч із кодом
@@ -0,0 +1,347 @@
---
title: Зворотний проксі
description: Налаштуйте OpenChamber коректно за Nginx, Nginx Proxy Manager або іншим зворотним проксі.
---
# Зворотний проксі
Скористайтеся цією сторінкою, якщо запускаєте OpenChamber за Nginx, Nginx Proxy Manager, Caddy, Cloudflare або іншим зворотним проксі.
## Перш ніж проксувати
1. Спершу переконайтеся, що OpenChamber працює напряму.
2. Відкрийте `http://<server-ip>:3000` або свій власний порт із тієї самої мережі.
3. Додавайте зворотний проксі лише після того, як пряме підключення працює.
## Що має підтримувати проксі
- WebSocket для живого транспорту повідомлень:
- `/api/event/ws`
- `/api/global/event/ws`
- `/api/terminal/ws`
- SSE без буферизації:
- `/api/event`
- `/api/global/event`
- `/api/notifications/stream`
- `/api/openchamber/events`
- `/api/terminal/:sessionId/stream`
- Великі тіла запитів для вкладень і файлових операцій
- Довгі таймаути читання для живих потоків і термінальних сесій
## Правила, що мають значення
- Увімкніть проксування WebSocket.
- Вимкніть буферизацію на SSE-маршрутах.
- Вимкніть gzip на проксі, якщо OpenChamber уже стискає відповіді.
- Тримайте стиснення увімкненим лише в одному шарі.
- Передавайте звичайні проксі-заголовки, як-от `Host`, `X-Forwarded-For` та `X-Forwarded-Proto`.
- Збільшіть ліміти розміру тіла, якщо користувачі завантажують файли.
## Швидкий чеклист
- OpenChamber доступний напряму в LAN
- WebSocket увімкнено в проксі
- На SSE-маршрутах вимкнено буферизацію
- `gzip off` на хості проксі, або стиснення проксі вимкнено інакше
- `client_max_body_size` достатньо великий для вкладень
- `proxy_read_timeout` достатньо довгий для потоків
## Приклад: Nginx
<details>
<summary>Показати приклад конфігу</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
## Приклад: Nginx Proxy Manager
<details>
<summary>Показати приклад вкладки Advanced</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/notifications/stream {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/openchamber/events {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
Також увімкніть `Websockets Support` у Nginx Proxy Manager для цього хоста.
## Типові ознаки проблем
### Сторінка завантажується, але надсилання повідомлень не працює
- WebSocket не увімкнено в проксі
- `/api/event/ws` або `/api/global/event/ws` проходить некоректно
### Сповіщення або живий статус не оновлюються
- один із SSE-маршрутів буферизується або кешується
- відсутній `X-Accel-Buffering "no"`
### Завантаження файлів не вдається
- `client_max_body_size` замалий
### Усе працює локально, але ламається лише за проксі
- проксі стискає й буферизує живий трафік
- у проксі відсутня підтримка WebSocket
## Приклад: Caddy
<details>
<summary>Показати приклад конфігу</summary>
```caddy
reverse_proxy 127.0.0.1:3000 {
# WebSocket support is automatic in Caddy
# Flush SSE responses immediately
flush_interval -1
# Pass through Host and proxy headers
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# Increase timeouts for long-lived streams
transport http {
read_timeout 3600s
write_timeout 3600s
}
}
```
</details>
Caddy обробляє WebSocket-апгрейди автоматично — додаткове налаштування не потрібне. Директива `flush_interval -1` гарантує, що SSE-фрагменти пересилаються негайно, без буферизації.
## CDN і подвійне стиснення — попередження
Якщо ви ставите CDN (наприклад, Cloudflare) перед своїм зворотним проксі, памʼятайте про подвійне стиснення:
- OpenChamber стискає HTTP-відповіді через gzip (поріг 1 КБ).
- Cloudflare та інші CDN теж стискають відповіді типово.
- Це може призвести до подвійно стиснутих відповідей або некоректних заголовків `Content-Encoding`.
Щоб цього уникнути, вимкніть стиснення на **одному** шарі:
- **Cloudflare:** Rules → Compression → disable (або режим "Passthrough").
- **Nginx:** `gzip off` (уже показано в прикладах вище).
- **Caddy:** Caddy не перестискає типово, якщо джерело вже надсилає стиснутий контент.
SSE-маршрути потоків виключені зі стиснення в OpenChamber, але CDN усе одно може їх буферизувати. Перевірте документацію свого CDN щодо вимкнення буферизації на SSE-шляхах.
## Повʼязане
- [Тунелі](/uk/tunnels/)
- [Усунення несправностей](/uk/troubleshooting/)
+30
View File
@@ -0,0 +1,30 @@
---
title: Теми
description: Налаштуйте OpenChamber за допомогою вбудованих і власних тем.
---
# Теми
OpenChamber підтримує вбудовані теми та власні JSON-файли тем.
## Додати власну тему
1. Створіть директорію тем:
```bash
mkdir -p ~/.config/openchamber/themes
```
2. Додайте свій JSON-файл у цю директорію (наприклад, `my-theme.json`).
3. Відкрийте OpenChamber, потім перейдіть до **Settings -> Theme -> Reload themes**.
4. Оберіть свою тему зі спадного списку.
## Розташування тем
- macOS/Linux: `~/.config/openchamber/themes/`
## Повний довідник формату JSON
Скористайтеся повним посібником із формату в доках основного репозиторію:
- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md)
@@ -0,0 +1,30 @@
---
title: Усунення несправностей
description: Типові проблеми з налаштуванням і запуском та швидкі рішення.
---
# Усунення несправностей
## Команда OpenChamber завершується або не запускається
- переконайтеся, що Node.js `>=20`
- виконайте `openchamber --version`
- за потреби перевстановіть найновіший CLI
## Веб-UI недоступний
- перегляньте логи сервера командою `openchamber logs`
- перевірте активний порт (типово `3000`)
- спершу відкрийте `http://localhost:3000` напряму, перш ніж тестувати посилання-тунелі
## Віддалене посилання / тунель не працює
- виконайте `openchamber tunnel status --all`
- перезапустіть тунель із того самого інстансу/порту
- згенеруйте нове посилання для підключення, якщо попередній токен уже було використано
## Розширення VS Code не підключається
- переконайтеся, що сервер OpenChamber запущено
- перевірте, що розширення оновлено
- перезавантажте вікно VS Code і повторіть підключення
+77
View File
@@ -0,0 +1,77 @@
---
title: Тунелі
description: Безпечно відкрийте OpenChamber для віддаленого та мобільного доступу.
---
# Тунелі
Використовуйте `openchamber tunnel`, щоб відкрити запущений інстанс OpenChamber.
## Швидкий старт (швидкий режим Cloudflare)
1. Запустіть OpenChamber:
```bash
openchamber
```
2. Запустіть тунель:
```bash
openchamber tunnel start --provider cloudflare --mode quick
```
3. Перевірте статус:
```bash
openchamber tunnel status
```
Типово OpenChamber виводить QR-код в інтерактивних TTY-сесіях. Використовуйте `--qr`, щоб примусово вивести QR, або `--no-qr`, щоб вимкнути його.
## Керовані режими
### Кероване віддалене
Використовуйте токен + хостнейм, керовані Cloudflare:
```bash
openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com
```
### Кероване локальне
Використовуйте локальний конфіг `cloudflared`:
```bash
openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
```
## Профілі (managed-remote)
Збережіть багаторазовий профіль:
```bash
openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token
```
Запуск зі збереженим профілем:
```bash
openchamber tunnel start --profile prod-main
```
## Корисні команди
```bash
openchamber tunnel providers
openchamber tunnel ready --provider cloudflare
openchamber tunnel doctor --provider cloudflare
openchamber tunnel stop --port 3000
```
## Нотатки щодо поведінки
- один активний тунель на інстанс OpenChamber (порт)
- запуск нового режиму/провайдера на тому самому інстансі замінює попередній тунель
- генерація нового посилання для підключення відкликає попереднє невикористане
@@ -0,0 +1,25 @@
---
title: OpenChamber 文档
description: 在 Web、桌面与 VS Code 上设置和使用 OpenChamber 的指南。
---
# OpenChamber 文档
OpenChamber 是围绕 OpenCode 的可视化工作空间。
使用本文档来:
- 为你的工作流安装合适的平台
- 安全地将 OpenChamber 开放给远程使用
- 自定义外观并排查常见问题
## 请先阅读
- [安装](/zh-cn/install/)
- [快速开始](/zh-cn/quickstart/)
- [隧道](/zh-cn/tunnels/)
- [问题排查](/zh-cn/troubleshooting/)
## OpenChamber 用于什么
OpenChamber 面向 AI 编程中那些受益于控制中枢的部分:为会话分支、审查代码差异、管理终端、观察工具进度、运行项目操作,并在智能体工作时让整个面板尽收眼底。
@@ -0,0 +1,33 @@
---
title: 安装
description: 为桌面、Web 或 VS Code 安装 OpenChamber。
---
# 安装
OpenChamber 有三个主要平台:
- 面向 macOS 的桌面应用
- 由 CLI 托管、可安装为 PWA 的 Web 应用
- VS Code 扩展
## 前提条件
请先安装 [OpenCode](https://opencode.ai)。
## Web + PWA
```bash
curl -fsSL https://raw.githubusercontent.com/openchamber/openchamber/main/scripts/install.sh | bash
openchamber --ui-password be-creative-here
```
然后打开 CLI 输出的 URL(通常是 `http://localhost:3000`)。
## 桌面
从 GitHub 发布页或 OpenChamber 下载页下载最新的桌面版本。
## VS Code
从 VS Code Marketplace 安装,并登录你常用的 OpenCode 工作流。
@@ -0,0 +1,22 @@
---
title: 快速开始
description: 快速启动 OpenChamber,并为任务选择合适的平台。
---
# 快速开始
## 最快路径
1. 安装 OpenCode。
2. 安装 OpenChamber CLI。
3. 运行 `openchamber --ui-password be-creative-here`。
4. 在你的机器上打开 Web UI。
5. 如有需要,启动隧道并用手机扫描二维码。
请使用强 UI 密码,尤其是当你打算将实例开放到远程时。
## 我应该使用哪个平台?
- 在以 macOS 为主的日常工作中使用 **桌面**
- 在远程访问和移动端审查时使用 **Web**
- 在代码旁进行编辑器原生会话时使用 **VS Code**
@@ -0,0 +1,347 @@
---
title: 反向代理
description: 在 Nginx、Nginx Proxy Manager 或其他反向代理后正确配置 OpenChamber。
---
# 反向代理
如果你在 Nginx、Nginx Proxy Manager、Caddy、Cloudflare 或其他反向代理后运行 OpenChamber,请使用本页。
## 在代理之前
1. 先确认 OpenChamber 可以直接工作。
2. 从同一网络打开 `http://<server-ip>:3000` 或你的自定义端口。
3. 只有在直接连接可用之后,才添加反向代理。
## 代理必须支持的内容
- 用于实时消息传输的 WebSocket:
- `/api/event/ws`
- `/api/global/event/ws`
- `/api/terminal/ws`
- 不带缓冲的 SSE
- `/api/event`
- `/api/global/event`
- `/api/notifications/stream`
- `/api/openchamber/events`
- `/api/terminal/:sessionId/stream`
- 用于附件和文件操作的大请求体
- 用于实时流和终端会话的长读取超时
## 重要规则
- 启用 WebSocket 代理。
- 在 SSE 路由上禁用缓冲。
- 如果 OpenChamber 已经压缩响应,请在代理上禁用 gzip。
- 仅在一层中保持压缩开启。
- 转发常规代理标头,例如 `Host`、`X-Forwarded-For` 和 `X-Forwarded-Proto`。
- 如果用户上传文件,请增大请求体大小限制。
## 快速检查清单
- OpenChamber 可在 LAN 内直接访问
- 代理中已启用 WebSocket
- SSE 路由已关闭缓冲
- 代理主机上 `gzip off`,或以其他方式禁用代理压缩
- `client_max_body_size` 足够大以容纳附件
- `proxy_read_timeout` 足够长以容纳流
## 示例:Nginx
<details>
<summary>显示示例配置</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/(event|global/event|notifications/stream|openchamber/events)$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
## 示例:Nginx Proxy Manager
<details>
<summary>显示 Advanced 选项卡示例</summary>
```nginx
client_max_body_size 50M;
client_body_buffer_size 50M;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_set_header X-Forwarded-Host $host;
gzip off;
location = /api/terminal/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event/ws {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/global/event {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/notifications/stream {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location = /api/openchamber/events {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location ~ ^/api/terminal/.+/stream$ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Accept "text/event-stream";
proxy_set_header Cache-Control "no-cache";
proxy_buffering off;
proxy_cache off;
gzip off;
add_header X-Accel-Buffering "no" always;
add_header Cache-Control "no-cache, no-transform" always;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 30s;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
```
</details>
另外,请在 Nginx Proxy Manager 中为此主机启用 `Websockets Support`。
## 常见故障迹象
### 页面能加载,但发送消息失败
- 代理中未启用 WebSocket
- `/api/event/ws` 或 `/api/global/event/ws` 未正确传递
### 通知或实时状态不更新
- 某个 SSE 路由被缓冲或缓存
- 缺少 `X-Accel-Buffering "no"`
### 文件上传失败
- `client_max_body_size` 太小
### 本地一切正常,但仅在代理后出问题
- 代理正在压缩和缓冲实时流量
- 代理缺少 WebSocket 支持
## 示例:Caddy
<details>
<summary>显示示例配置</summary>
```caddy
reverse_proxy 127.0.0.1:3000 {
# WebSocket support is automatic in Caddy
# Flush SSE responses immediately
flush_interval -1
# Pass through Host and proxy headers
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
# Increase timeouts for long-lived streams
transport http {
read_timeout 3600s
write_timeout 3600s
}
}
```
</details>
Caddy 会自动处理 WebSocket 升级 — 无需额外配置。`flush_interval -1` 指令可确保 SSE 数据块立即转发,不带缓冲。
## CDN 与双重压缩警告
如果你在反向代理前面放置 CDN(例如 Cloudflare),请注意双重压缩:
- OpenChamber 使用 gzip 压缩 HTTP 响应(阈值 1 KB)。
- Cloudflare 和其他 CDN 默认也会压缩响应。
- 这可能导致响应被双重压缩或 `Content-Encoding` 标头不正确。
为避免这种情况,请在**一**层中禁用压缩:
- **Cloudflare** Rules → Compression → disable(或使用 "Passthrough" 模式)。
- **Nginx** `gzip off`(上面的示例已展示)。
- **Caddy** 如果上游已发送压缩内容,Caddy 默认不会重新压缩。
SSE 流式路由已被 OpenChamber 排除在压缩之外,但 CDN 仍可能缓冲它们。请查阅你的 CDN 文档,了解如何在 SSE 路径上禁用缓冲。
## 相关
- [隧道](/zh-cn/tunnels/)
- [问题排查](/zh-cn/troubleshooting/)
@@ -0,0 +1,30 @@
---
title: 主题
description: 使用内置主题和用户自定义主题来自定义 OpenChamber。
---
# 主题
OpenChamber 支持内置主题和自定义主题 JSON 文件。
## 添加自定义主题
1. 创建主题目录:
```bash
mkdir -p ~/.config/openchamber/themes
```
2. 将你的 JSON 文件添加到该目录(例如 `my-theme.json`)。
3. 打开 OpenChamber,然后前往 **Settings -> Theme -> Reload themes**。
4. 从下拉菜单中选择你的主题。
## 主题位置
- macOS/Linux`~/.config/openchamber/themes/`
## 完整 JSON 格式参考
请使用主仓库文档中的完整格式指南:
- [`docs/CUSTOM_THEMES.md`](https://github.com/openchamber/openchamber/blob/main/docs/CUSTOM_THEMES.md)
@@ -0,0 +1,30 @@
---
title: 问题排查
description: 常见的设置与运行问题及快速解决方法。
---
# 问题排查
## OpenChamber 命令退出或无法启动
- 确认 Node.js `>=20`
- 运行 `openchamber --version`
- 如有需要,重新安装最新的 CLI
## 无法访问 Web UI
- 用 `openchamber logs` 查看服务器日志
- 确认活动端口(默认 `3000`
- 在测试隧道链接之前,先直接打开 `http://localhost:3000`
## 远程/隧道链接无法使用
- 运行 `openchamber tunnel status --all`
- 从同一实例/端口重启隧道
- 如果之前的令牌已被使用,请重新生成连接链接
## VS Code 扩展无法连接
- 确认 OpenChamber 服务器正在运行
- 确认扩展已更新
- 重新加载 VS Code 窗口并重试连接
@@ -0,0 +1,77 @@
---
title: 隧道
description: 安全地将 OpenChamber 开放给远程和移动访问。
---
# 隧道
使用 `openchamber tunnel` 来开放正在运行的 OpenChamber 实例。
## 快速开始(Cloudflare 快速模式)
1. 启动 OpenChamber
```bash
openchamber
```
2. 启动隧道:
```bash
openchamber tunnel start --provider cloudflare --mode quick
```
3. 查看状态:
```bash
openchamber tunnel status
```
默认情况下,OpenChamber 会在交互式 TTY 会话中输出二维码。使用 `--qr` 强制输出二维码,或使用 `--no-qr` 将其禁用。
## 托管模式
### 托管远程
使用由 Cloudflare 托管的令牌 + 主机名:
```bash
openchamber tunnel start --provider cloudflare --mode managed-remote --token-file ~/.secrets/cf-token --hostname app.example.com
```
### 托管本地
使用本地的 `cloudflared` 配置:
```bash
openchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
```
## 配置文件(managed-remote
保存一个可重用的配置文件:
```bash
openchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token-file ~/.secrets/cf-token
```
使用已保存的配置文件启动:
```bash
openchamber tunnel start --profile prod-main
```
## 实用命令
```bash
openchamber tunnel providers
openchamber tunnel ready --provider cloudflare
openchamber tunnel doctor --provider cloudflare
openchamber tunnel stop --port 3000
```
## 行为说明
- 每个 OpenChamber 实例(端口)只有一个活动隧道
- 在同一实例上启动新的模式/提供商会替换之前的隧道
- 生成新的连接链接会吊销之前未使用的链接
+108 -7
View File
@@ -2,24 +2,125 @@
"sections": [
{
"label": "Start here",
"translations": {
"uk": "Почніть тут",
"zh-CN": "从这里开始",
"es": "Empieza aquí",
"pt-BR": "Comece aqui",
"ko": "여기서 시작",
"pl": "Zacznij tutaj"
},
"items": [
{ "label": "Overview", "link": "/" },
{ "label": "Install", "link": "/install/" },
{ "label": "Quickstart", "link": "/quickstart/" },
{ "label": "Tunnels", "link": "/tunnels/" }
{
"label": "Overview",
"link": "/",
"translations": {
"uk": "Огляд",
"zh-CN": "概览",
"es": "Visión general",
"pt-BR": "Visão geral",
"ko": "개요",
"pl": "Przegląd"
}
},
{
"label": "Install",
"link": "/install/",
"translations": {
"uk": "Встановлення",
"zh-CN": "安装",
"es": "Instalación",
"pt-BR": "Instalação",
"ko": "설치",
"pl": "Instalacja"
}
},
{
"label": "Quickstart",
"link": "/quickstart/",
"translations": {
"uk": "Швидкий старт",
"zh-CN": "快速开始",
"es": "Inicio rápido",
"pt-BR": "Início rápido",
"ko": "빠른 시작",
"pl": "Szybki start"
}
},
{
"label": "Tunnels",
"link": "/tunnels/",
"translations": {
"uk": "Тунелі",
"zh-CN": "隧道",
"es": "Túneles",
"pt-BR": "Túneis",
"ko": "터널",
"pl": "Tunele"
}
}
]
},
{
"label": "Customize",
"translations": {
"uk": "Налаштування",
"zh-CN": "自定义",
"es": "Personalizar",
"pt-BR": "Personalizar",
"ko": "맞춤 설정",
"pl": "Dostosuj"
},
"items": [
{ "label": "Themes", "link": "/themes/" }
{
"label": "Themes",
"link": "/themes/",
"translations": {
"uk": "Теми",
"zh-CN": "主题",
"es": "Temas",
"pt-BR": "Temas",
"ko": "테마",
"pl": "Motywy"
}
}
]
},
{
"label": "Help",
"translations": {
"uk": "Допомога",
"zh-CN": "帮助",
"es": "Ayuda",
"pt-BR": "Ajuda",
"ko": "도움말",
"pl": "Pomoc"
},
"items": [
{ "label": "Reverse Proxy", "link": "/reverse-proxy/" },
{ "label": "Troubleshooting", "link": "/troubleshooting/" }
{
"label": "Reverse Proxy",
"link": "/reverse-proxy/",
"translations": {
"uk": "Зворотний проксі",
"zh-CN": "反向代理",
"es": "Proxy inverso",
"pt-BR": "Proxy reverso",
"ko": "리버스 프록시",
"pl": "Reverse proxy"
}
},
{
"label": "Troubleshooting",
"link": "/troubleshooting/",
"translations": {
"uk": "Усунення несправностей",
"zh-CN": "问题排查",
"es": "Resolución de problemas",
"pt-BR": "Solução de problemas",
"ko": "문제 해결",
"pl": "Rozwiązywanie problemów"
}
}
]
}
]