Перейти до вмісту

Розгортання на 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 · Користувач, від імені якого запускати

Section titled “3 · Користувач, від імені якого запускати”

Не запускайте це від root - у Workflows є shell-кроки, а CLI агентів мають доступ до файлів.

Terminal window
adduser --disabled-password --gecos "" maven
su - maven

4 · Встановлення та примусове хмарне розміщення

Section titled “4 · Встановлення та примусове хмарне розміщення”
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 так і каже. Вставте ключі в Settings → Secrets, перш ніж вирішувати, що щось зламано. Для точнішого контролю залиште змінну незаданою і натомість задайте кожну можливість на тому екрані.

5 · Сервіс і те, що всі роблять неправильно

Section titled “5 · Сервіс і те, що всі роблять неправильно”

~/.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

Потім із локальної мережі: 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

Зробіть знімок (snapshot) 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 не задано, або задано у вашій оболонці, але не в юніті
«Neither path works yet» на якійсь можливості Немає GPU і немає ключа провайдера. Вставте ключ.
Застосунок стартує, кожна сторінка дає помилку node --version - нижче 22.22 імпорт індексу кидає виняток
Пошук нічого не знаходить curl -X POST http://localhost:3400/api/events/verify перебудовує індекс
Журнал аудиту каже, що ланцюжок зламано Хтось редагував log.jsonl. Відновіть із резервної копії; не лагодьте вручну.