
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.