Развёртывание в Proxmox
Вся разница между установкой в Proxmox и установкой на рабочей станции - в одном факте: у контейнера нет видеокарты. Всё остальное следует из этого, плюс обычная осторожность со службой, которая должна пережить выход из сессии. Здесь описано только то, что отличается от Установки.
1 · Контейнер
Заголовок раздела «1 · Контейнер»Непривилегированный LXC - правильная форма: ни модулей ядра, ни проброса устройств, ни Docker.
| Шаблон | Debian 13 или Ubuntu 24.04 |
| Ядра | 4 (2 работают; сборки медленнее) |
| RAM | 4 ГБ (на 2 ГБ запускается, но next build впритык) |
| Диск | 20 ГБ - node_modules и .next занимают ~2 ГБ |
| Непривилегированный | да · Nesting: не нужен |
| Сеть | статический IP или резервирование DHCP - вы будете набирать его часто |
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 1pct start 120pct enter 120--onboot 1 важен: контейнер, который не стартует вместе с узлом, - это служба, исчезающая
после следующей перезагрузки хоста.
2 · Node 22.22+, из NodeSource
Заголовок раздела «2 · Node 22.22+, из NodeSource»Собственный nodejs Debian слишком стар - node:sqlite там не будет.
apt update && apt install -y curl git ca-certificatescurl -fsSL https://deb.nodesource.com/setup_22.x | bash -apt install -y nodejsnode --version # must be >= 22.22.03 · Пользователь, от имени которого запускать
Заголовок раздела «3 · Пользователь, от имени которого запускать»Не запускайте это от root - у Воркфлоу есть shell-шаги, а у CLI агентов есть доступ к файлам.
adduser --disabled-password --gecos "" mavensu - maven4 · Установка и принудительное облако
Заголовок раздела «4 · Установка и принудительное облако»git clone <your-repository-url> ~/maven-teamscd ~/maven-teamsnpm installnpm run buildexport MAVEN_FORCE_CLOUD=1MAVEN_FORCE_CLOUD полностью переопределяет пробу GPU. Ключи провайдеров теперь
обязательны, а не опциональны: без GPU и без ключа возможности негде выполняться, и экран
Local / Cloud так и говорит. Вставьте ключи в Настройки →
Секреты и ключи, прежде чем решать, что что-то сломано. Для более тонкого контроля
оставьте переменную незаданной и настройте каждую возможность на том экране.
5 · Служба, и то, в чём ошибаются все
Заголовок раздела «5 · Служба, и то, в чём ошибаются все»~/.config/systemd/user/maven-teams.service:
[Unit]Description=MAVEN TeamsAfter=network.target
[Service]Type=simpleWorkingDirectory=%h/maven-teamsEnvironment=NODE_ENV=productionEnvironment=PORT=3400Environment=HOST=0.0.0.0Environment=MAVEN_STATE_DIR=%h/.maven-teamsEnvironment=MAVEN_FORCE_CLOUD=1Environment=MAVEN_MACHINE=proxmoxExecStart=/usr/bin/npm startRestart=on-failureRestartSec=5
[Install]WantedBy=default.targetMAVEN_MACHINE - имя, которым эта машина подписывает свои события; «proxmox» лучше,
чем hostname контейнера, который вы не узнаете через полгода.
systemctl --user daemon-reloadsystemctl --user enable --now maven-teams.serviceexit # back to rootloginctl enable-linger mavenБез lingering служба умирает, когда закрывается SSH-сессия. Она будет выглядеть идеально,
пока вы тестируете, и исчезнет в момент отключения. Проверьте, что она выживает: отключитесь
полностью, подключитесь снова и выполните
su - maven -c 'systemctl --user status maven-teams --no-pager'.
6 · Доступ
Заголовок раздела «6 · Доступ»По умолчанию Teams слушает только 127.0.0.1 - в контейнере это бесполезно. Юнит выше задаёт
HOST=0.0.0.0; проверьте, что это действительно применилось:
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) или за обратным прокси с настоящей
аутентификацией.
7 · Резервные копии
Заголовок раздела «7 · Резервные копии»Proxmox делает резервную копию контейнера, и это покрывает всё; та часть, что действительно важна, достаточно мала, чтобы копировать её отдельно:
# from the hostpct 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 - его перегенерация означает, что эта машина будет подписывать
будущие события как другая машина.
8 · Обновление
Заголовок раздела «8 · Обновление»su - mavencd ~/maven-teams && git pull && npm install && npm run buildsystemctl --user restart maven-teamsСделайте снапшот Proxmox перед версией, которую ещё не запускали; откат снапшота мгновенный.
9 · Когда что-то не так
Заголовок раздела «9 · Когда что-то не так»| Симптом | Куда смотреть |
|---|---|
Ничего на :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. Восстановите из резервной копии; не чините вручную. |