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

Развёртывание в 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 maven-teams \
--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 "" maven
su - maven
Terminal window
git clone <your-repository-url> ~/maven-teams
cd ~/maven-teams
npm install
npm run build
export MAVEN_FORCE_CLOUD=1

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

~/.config/systemd/user/maven-teams.service:

[Unit]
Description=MAVEN Teams
After=network.target
[Service]
Type=simple
WorkingDirectory=%h/maven-teams
Environment=NODE_ENV=production
Environment=PORT=3400
Environment=HOST=0.0.0.0
Environment=MAVEN_STATE_DIR=%h/.maven-teams
Environment=MAVEN_FORCE_CLOUD=1
Environment=MAVEN_MACHINE=proxmox
ExecStart=/usr/bin/npm start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target

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

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

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

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

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

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

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

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

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

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

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

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