Налаштування
Питання, на яке тут є відповідь: що я встановлюю де, і де насправді живуть розмови?
Загальна форма
Section titled “Загальна форма”Кожна машина запускає весь продукт і зберігає власну копію журналу подій. Одна з них - домашня (home); решта - клієнти. Клієнт штовхає те, що записав, на домашню машину й слухає все інше; домашня машина розсилає далі.
Домашня машина - не майстер. Вона зберігає той самий підписаний журнал, що й усі інші; якщо вона згорить, кожна машина все одно матиме всю розмову, і будь-яка з них може стати домашньою зміною одного налаштування. Вона існує тому, що до закритого ноутбука не достукатися, а два ноутбуки, які ніколи не відкриті одночасно, ніколи не зійдуться.
Машина без налаштованої домашньої адреси і є домашньою. Це також випадок однієї машини: свіже встановлення спілкується саме з собою і не потребує жодного налаштування.
Як машини досягають одна одної
Section titled “Як машини досягають одна одної”Чотири схеми; відмінність у тому, яка машина може звернутися до якої. Виберіть одну в Settings → Relay на домашній машині; решта машин зчитують вибір із журналу.
| Що це | Потрібен секрет | |
|---|---|---|
| Одна локальна мережа | Усі машини в одній будівлі. Нічого встановлювати не треба; поза цією мережею нічого не працює. | Ні |
| Tailscale | Кожна машина отримує адресу, що працює звідусіль, за будь-яким NAT. | Ні - tailnet приватний |
| Одна завжди ввімкнена машина вдома | Типовий варіант. Клієнти під’єднуються звідки завгодно. | Ні |
| Домашня машина на публічній адресі | VPS або порт, прокинутий на машину вдома. | Так - налаштування відмовляє без нього |
Клієнт лише ініціює з’єднання назовні, тож машина за NAT оператора або хот-спотом сьогодні
працює як клієнт; вона просто не може бути машиною, до якої всі під’єднуються. Публічна адреса -
це така, до якої може приєднатися інтернет - спершу задайте MAVEN_TEAMS_SECRET одним і тим самим
рядком на кожній машині. Це не шифрування; воно купує рівно одну властивість - незнайомець не може
приєднатися. Задайте його всюди за один підхід: збій проходить мовчки.
1 · Встановіть на кожній машині
Section titled “1 · Встановіть на кожній машині”Node 22.22+ (для node:sqlite), git, POSIX-оболонка.
git clone <your-repository-url> ~/maven-teamscd ~/maven-teamsnpm cinpm run buildnpm start # http://localhost:3400Скопіюйте .env.example у .env.local і заповніть ключі, які маєте; кожен із них
необов’язковий. Змінні, що визначають поведінку машини в мережі:
| Змінна | Що робить |
|---|---|
MAVEN_STATE_DIR |
Де живуть журнал, ключ підпису, налаштування й завдання. Типово ~/.maven-teams - навмисно не ~/.maven M.A.V.E.N, з яким збігаються сімнадцять імен файлів. |
MAVEN_MACHINE |
Ім’я цієї машини в журналі та в кожному рядку аудиту. Типово - hostname. |
MAVEN_HOME_URL |
Адреса домашньої машини. Задайте її - і ця машина стає клієнтом; залиште порожньою - і вона домашня. Settings → Relay теж може її задати, без перезапуску; якщо є обидва, перемагає змінна. |
MAVEN_TEAMS_SECRET |
Спільний секрет робочого простору. Відсутній означає відкритий - це правильно за роутером і неправильно на публічній адресі. |
MAVEN_FORCE_CLOUD |
1 відправляє кожну можливість провайдеру незалежно від обладнання. Дивіться Обчислення. |
PORT / HOST |
Типово 3000 / 127.0.0.1; сервіс задає 3400. Машині, до якої мають достукатися інші, потрібен HOST=0.0.0.0. |
Той випадок, що схожий на мережеву несправність
Section titled “Той випадок, що схожий на мережеву несправність”Оголошувана адреса машини зчитується з її мережевого інтерфейсу; а те, на чому вона
слухає, - це HOST. Залиште типове значення - і машина впевнено опублікує
http://192.168.1.42:3400, приймаючи лише з’єднання від самої себе: вона чудово
працює як клієнт, ніколи не може бути домашньою, і кожен екран каже, що все гаразд.
Environment=HOST=0.0.0.0Environment=PORT=3400Постійний запуск
Section titled “Постійний запуск”Користувацький (user) сервіс systemd, щоб він працював від вашого імені й міг читати ваші ключі:
[Unit]Description=MAVEN TeamsAfter=network-online.target
[Service]WorkingDirectory=%h/maven-teamsEnvironment=NODE_ENV=productionEnvironment=PORT=3400Environment=MAVEN_MACHINE=%HExecStart=/usr/bin/npm run startRestart=always
[Install]WantedBy=default.targetsystemctl --user daemon-reloadsystemctl --user enable --now maven-teamsloginctl enable-linger "$USER" # or it stops when you log out2 · Спрямуйте клієнтів на домашню машину
Section titled “2 · Спрямуйте клієнтів на домашню машину”На домашній машині відкрийте Settings → Relay. Під першим рядком є “reach me at” - адреси, які може використати інша машина, порт уже підставлено. Скопіюйте одну. На кожному клієнті вставте її в поле домашньої машини й натисніть SET HOME. За кілька секунд панель покаже connected, і прибуде вся історія робочого простору.
Щоб пізніше перенести домашню машину, натисніть MAKE THIS MACHINE THE HOME на новій і задайте її адресу на інших. Нічого не втрачається: кожна машина вже зберігає журнал.
Якщо клієнт не може досягти домашньої машини, перевірте напрямок, який має значення, - з клієнта:
curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 http://<home-address>:3400/api/relay200 означає, що мережа в порядку, а проблема в конфігурації. Для мереж, які
не бачать одна одну, поставте машини на WireGuard або Tailscale і використовуйте ту
адресу; кожна машина оголошує всі адреси, які має.
3 · Перевірте, що спрацювало
Section titled “3 · Перевірте, що спрацювало”curl -s localhost:3400/api/relay | jq '{me: .me.machine, role: .hub.role, connected: .hub.connected}'curl -s localhost:3400/api/events/verify | jqЛанцюжок кожної машини перевіряється окремо; ok: false називає порядковий номер,
де стався розрив.
Де що живе
Section titled “Де що живе”$MAVEN_STATE_DIR/ (defaults to ~/.maven-teams)├── events/│ ├── log.jsonl this machine's own chain - the one it signs│ └── peers/<machine>.jsonl one file per machine, exactly as received├── teams/│ ├── identity.json this machine's keypair. BACK THIS UP.│ ├── peers.json addresses of machines to pull from directly│ └── hub.json the home's address, if this machine is a client└── index.db SQLite full-text index - derived, delete it freelyidentity.json - єдиний незамінний файл. Втратите його - і машина не зможе
підписувати нові події; нова ідентичність означає новий ланцюжок під тим самим іменем.
index.db одноразовий - якщо пошук поводиться дивно, видаліть його.
Розмови, які ви очищаєте, також записуються до вашого сховища (vault) Obsidian у форматі Markdown у
memories/channels/<room>/.
Що передається, а що ні
Section titled “Що передається, а що ні”Журнал несе те, що сталося: повідомлення, патчі, запуски, погодження, рішення. Він
не несе ваших ключів - .env.local залишається на машині, де його було записано, а
агенти працюють на машині, за якою ви сидите, з вашими обліковими даними. Приватний канал
прихований, а не зашифрований: журнал реплікується всюди; налаштування вирішує, що
показує інтерфейс у списку.
Дивіться також
Section titled “Дивіться також”- Розгортання на Proxmox - безголовий контейнер без GPU.
- Обчислення (Local / Cloud)