Перейти к содержимому

Развёртывание в Proxmox

Вся разница между установкой в Proxmox и установкой на рабочей станции — в одном факте: у контейнера нет видеокарты. Всё остальное следует из этого, плюс обычная осторожность со службой, которая должна пережить выход из сессии. Здесь описано только то, что отличается от Установки.

Непривилегированный LXC — правильная форма: ни модулей ядра, ни проброса устройств, ни Docker.

Шаблон Debian 13 или Ubuntu 24.04
Ядра 4 (2 работают; сборки медленнее)
RAM 4 ГБ (на 2 ГБ запускается, но next build впритык)
Диск 20 ГБ — node_modules и .next занимают ~2 ГБ
Непривилегированный да · Nesting: не нужен
Сеть статический IP или резервирование DHCP — вы будете набирать его часто
Terminal window
pct create 120 local:vztmpl/debian-13-standard_amd64.tar.zst \
--hostname erebros-t \
--cores 4 --memory 4096 --rootfs local-lvm:20 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 --features nesting=0 \
--onboot 1
pct start 120
pct enter 120

--onboot 1 важен: контейнер, который не стартует вместе с узлом, — это служба, исчезающая после следующей перезагрузки хоста.

Собственный nodejs Debian слишком стар — node:sqlite там не будет.

Terminal window
apt update && apt install -y curl git ca-certificates
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node --version # must be >= 22.22.0

3 · Пользователь, от имени которого запускать

Заголовок раздела «3 · Пользователь, от имени которого запускать»

Не запускайте это от root — у Воркфлоу есть shell-шаги, а у CLI агентов есть доступ к файлам.

Terminal window
adduser --disabled-password --gecos "" erebros
su - erebros
Terminal window
git clone <your-repository-url> ~/erebros-t
cd ~/erebros-t
npm install
npm run build
export EREBROS_FORCE_CLOUD=1

EREBROS_FORCE_CLOUD полностью переопределяет пробу GPU. Ключи провайдеров теперь обязательны, а не опциональны: без GPU и без ключа возможности негде выполняться, и экран Local / Cloud так и говорит. Вставьте ключи в Настройки → Секреты и ключи, прежде чем решать, что что-то сломано. Для более тонкого контроля оставьте переменную незаданной и настройте каждую возможность на том экране.

~/.config/systemd/user/erebrost.service:

[Unit]
Description=Erebros-T
After=network.target
[Service]
Type=simple
WorkingDirectory=%h/erebros-t
Environment=NODE_ENV=production
Environment=PORT=3401
Environment=HOST=0.0.0.0
Environment=EREBROS_STATE_DIR=%h/.erebros-t
Environment=EREBROS_FORCE_CLOUD=1
Environment=EREBROS_MACHINE=proxmox
ExecStart=/usr/bin/npm start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target

EREBROS_MACHINE — имя, которым эта машина подписывает свои события; «proxmox» лучше, чем hostname контейнера, который вы не узнаете через полгода.

Terminal window
systemctl --user daemon-reload
systemctl --user enable --now erebrost.service
exit # back to root
loginctl enable-linger erebros

Без lingering служба умирает, когда закрывается SSH-сессия. Она будет выглядеть идеально, пока вы тестируете, и исчезнет в момент отключения. Проверьте, что она выживает: отключитесь полностью, подключитесь снова и выполните su - erebros -c 'systemctl --user status erebros-t --no-pager'.

По умолчанию Teams слушает только 127.0.0.1 — в контейнере это бесполезно. Юнит выше задаёт HOST=0.0.0.0; проверьте, что это действительно применилось:

Terminal window
ss -tlnp | grep 3401 # expect 0.0.0.0:3401, not 127.0.0.1:3401

Затем из LAN: http://<container-ip>:3401. Не пробрасывайте этот порт в интернет. Гейт с PIN и защита same-origin не дают браузеру в вашей собственной сети действовать от вашего имени; это не система аутентификации. Удалённый доступ — за VPN (WireGuard на хосте Proxmox) или за обратным прокси с настоящей аутентификацией.

Proxmox делает резервную копию контейнера, и это покрывает всё; та часть, что действительно важна, достаточно мала, чтобы копировать её отдельно:

Terminal window
# from the host
pct exec 120 -- tar czf - -C /home/erebros/.erebros-t events \
> /var/lib/vz/dump/erebros-t-events-$(date +%F).tar.gz

Восстановление — tar xzf в то же место и перезапуск; индекс догонит при первом запросе. Сохраняйте identity.json — его перегенерация означает, что эта машина будет подписывать будущие события как другая машина.

Terminal window
su - erebros
cd ~/erebros-t && git pull && npm install && npm run build
systemctl --user restart erebros-t

Сделайте снапшот Proxmox перед версией, которую ещё не запускали; откат снапшота мгновенный.

Симптом Куда смотреть
Ничего на :3401 systemctl --user status erebros-t, затем journalctl --user -u erebros-t -n 100
Служба исчезает после выхода из сессии loginctl show-user erebros | grep Linger — должно быть yes
Транскрибация занимает минуты EREBROS_FORCE_CLOUD=1 не задан, либо задан в вашем shell, но не в юните
«Ни один путь пока не работает» у возможности Нет GPU и нет ключа провайдера. Вставьте ключ.
Приложение стартует, каждая страница с ошибкой node --version — ниже 22.22 импорт индекса бросает исключение
Поиск ничего не находит curl -X POST http://localhost:3401/api/events/verify перестраивает индекс
Журнал аудита говорит, что цепочка разорвана Кто-то редактировал log.jsonl. Восстановите из резервной копии; не чините вручную.