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

Развёртывание в 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. Восстановите из резервной копии; не чините вручную.