logo

OpenChamber — это веб-интерфейс для агента OpenCode. В этой заметке я опишу, как поднять его на домашнем сервере с DietPi и получить доступ к веб-морде из любой точки через Tailscale.

Зачем это нужно Link to heading

OpenCode из коробки — это терминальный агент, да у него есть своя мордашка, но она страшная. OpenChamber добавляет к нему веб-морду: удобный UI, управление сессиями и просмотр того, что делает агент, прямо из браузера. Также он дает например удобную консоль. Связка «DietPi-сервер + Tailscale» позволяет держать агента дома, не открывая порты в интернет.

OpenChamber сам управляет OpenCode — то есть отдельно агента поднимать не нужно, веб-интерфейс запускает и контролирует его сам.

1. Подготовка системы Link to heading

OpenChamber — Node.js-приложение, а OpenCode — бинарь, который OpenChamber запускает.

# обновляем систему
sudo apt update && sudo apt upgrade -y

# Node.js + npm (на DietPi можно через dietpi-software или напрямую)
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version && npm --version

2. Установка OpenCode Link to heading

OpenChamber сам управляет OpenCode, но бинарь должен быть доступен в PATH. Официальный способ установки:

# через curl-инсталлятор
curl -fsSL https://opencode.ai/install | sh

# либо через npm:
npm install -g opencode-ai

После установки убедитесь, что бинарь доступен и лежит в каталоге, который попадёт в PATH сервиса (в примере — /root/.opencode/bin/opencode). Проверка:

opencode --version

Обновление OpenCode в будущем:

opencode upgrade

3. Установка OpenChamber Link to heading

OpenChamber ставится глобально через npm:

npm install -g @openchamber/web

После установки появляется команда openchamber:

which openchamber          # /usr/local/bin/openchamber
openchamber --version      # 1.16.2

Каталог данных OpenChamber по умолчанию: ~/.config/openchamber (в нашем случае /root/.config/openchamber).

UI-пароль (обязателен для не-loopback привязки) Link to heading

OpenChamber отказывается слушать не-loopback адрес** (например Tailscale-IP или 0.0.0.0), если не настроена UI-аутентификация.

Поэтому пароль всегда передаётся при запуске через env-переменную или флаг. Придумайте свой пароль и используйте его далее (в примерах ниже — YOUR_UI_PASSWORD).

Да, есть конечно OPENCHAMBER_ALLOW_UNAUTHENTICATED_LAN=true как обходной путь без пароля, но это сделает веб-интерфейс полностью открытым. Как-то не по христиански это.

4. Определяем адрес для привязки Link to heading

OpenChamber нужно привязать к IP, по которому вы будете заходить. Для доступа через Tailscale берём Tailscale-IP:

tailscale ip 

Порт выбираем любой свободный (в примере — 8094).

5. Автозапуск через systemd Link to heading

На сервере без активной пользовательской сессии systemctl --user и loginctl enable-linger обычно недоступны (нет user D-Bus). Поэтому используем system-сервис (PID 1 systemd).

Создайте файл /etc/systemd/system/openchamber.service:

[Unit]
Description=OpenChamber Web interface for OpenCode
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root
Environment=HOME=/root
Environment=XDG_RUNTIME_DIR=/run/user/0
# ЗАМЕНИТЕ на свой пароль:
Environment=OPENCHAMBER_UI_PASSWORD=YOUR_UI_PASSWORD
Environment=PATH=/root/.opencode/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ЗАМЕНИТЕ <TAILSCALE_IP> на ваш Tailscale-IP, порт — при необходимости:
ExecStartPre=/usr/bin/mkdir -p /run/user/0
ExecStartPre=/usr/bin/chown root:root /run/user/0
ExecStart=/usr/local/bin/openchamber serve --foreground --host <TAILSCALE_IP> --port 8094
Restart=on-failure
RestartSec=5
KillSignal=SIGTERM
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target

Пояснения:

  • ExecStart=/usr/local/bin/openchamber serve --foreground ... — ключ --foreground нужен для Type=simple, чтобы systemd держал процесс.
  • OPENCHAMBER_UI_PASSWORD — обязателен для привязки к не-loopback IP.
  • PATH явно включает /root/.opencode/bin, чтобы OpenChamber нашёл бинарь OpenCode (в системном сервисе PATH урезан).
  • ExecStartPre создаёт /run/user/0, т.к. этот каталог не существует в system-сервисе по умолчанию и стирается при перезагрузке.

Ограничьте права на файл (в нём лежит пароль):

chmod 600 /etc/systemd/system/openchamber.service

Активация:

sudo systemctl daemon-reload
sudo systemctl enable --now openchamber

Проверка:

systemctl status openchamber --no-pager
systemctl is-active openchamber     # active
systemctl is-enabled openchamber    # enabled

6. Проверяем работоспособность Link to heading

Health-эндпоинт (показывает, поднят ли managed OpenCode):

curl -s http://<TAILSCALE_IP>:8094/health | head -c 400; echo

Ожидаемый результат: "status":"ok" и openCodeRunning:true.

Статус самого OpenChamber:

openchamber status

Откройте в браузере: http://<TAILSCALE_IP>:8094 и введите свой UI-пароль.

Управление:

sudo systemctl restart openchamber   # перезапуск (также перезапускает OpenCode)
sudo systemctl stop openchamber
sudo systemctl start openchamber
openchamber logs -p 8094             # логи (follow)

Готово — веб-морда OpenCode крутится на домашнем сервере и доступна через Tailscale отовсюду.

Если хочется пофлексить с телефона, то OpenChamber отлично работает на как PWA.