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:
@@ -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.
|
||||
@@ -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/)
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user