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

Налаштування

Питання, на яке тут є відповідь: що я встановлюю де, і де насправді живуть розмови?

Кожна машина запускає весь продукт і зберігає власну копію журналу подій. Одна з них - домашня (home); решта - клієнти. Клієнт штовхає те, що записав, на домашню машину й слухає все інше; домашня машина розсилає далі.

Домашня машина - не майстер. Вона зберігає той самий підписаний журнал, що й усі інші; якщо вона згорить, кожна машина все одно матиме всю розмову, і будь-яка з них може стати домашньою зміною одного налаштування. Вона існує тому, що до закритого ноутбука не достукатися, а два ноутбуки, які ніколи не відкриті одночасно, ніколи не зійдуться.

Машина без налаштованої домашньої адреси і є домашньою. Це також випадок однієї машини: свіже встановлення спілкується саме з собою і не потребує жодного налаштування.

Як машини досягають одна одної

Section titled “Як машини досягають одна одної”

Чотири схеми; відмінність у тому, яка машина може звернутися до якої. Виберіть одну в Settings → Relay на домашній машині; решта машин зчитують вибір із журналу.

Що це Потрібен секрет
Одна локальна мережа Усі машини в одній будівлі. Нічого встановлювати не треба; поза цією мережею нічого не працює. Ні
Tailscale Кожна машина отримує адресу, що працює звідусіль, за будь-яким NAT. Ні - tailnet приватний
Одна завжди ввімкнена машина вдома Типовий варіант. Клієнти під’єднуються звідки завгодно. Ні
Домашня машина на публічній адресі VPS або порт, прокинутий на машину вдома. Так - налаштування відмовляє без нього

Клієнт лише ініціює з’єднання назовні, тож машина за NAT оператора або хот-спотом сьогодні працює як клієнт; вона просто не може бути машиною, до якої всі під’єднуються. Публічна адреса - це така, до якої може приєднатися інтернет - спершу задайте MAVEN_TEAMS_SECRET одним і тим самим рядком на кожній машині. Це не шифрування; воно купує рівно одну властивість - незнайомець не може приєднатися. Задайте його всюди за один підхід: збій проходить мовчки.

1 · Встановіть на кожній машині

Section titled “1 · Встановіть на кожній машині”

Node 22.22+ (для node:sqlite), git, POSIX-оболонка.

Terminal window
git clone <your-repository-url> ~/maven-teams
cd ~/maven-teams
npm ci
npm run build
npm 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.0
Environment=PORT=3400

Користувацький (user) сервіс systemd, щоб він працював від вашого імені й міг читати ваші ключі:

~/.config/systemd/user/maven-teams.service
[Unit]
Description=MAVEN Teams
After=network-online.target
[Service]
WorkingDirectory=%h/maven-teams
Environment=NODE_ENV=production
Environment=PORT=3400
Environment=MAVEN_MACHINE=%H
ExecStart=/usr/bin/npm run start
Restart=always
[Install]
WantedBy=default.target
Terminal window
systemctl --user daemon-reload
systemctl --user enable --now maven-teams
loginctl enable-linger "$USER" # or it stops when you log out

2 · Спрямуйте клієнтів на домашню машину

Section titled “2 · Спрямуйте клієнтів на домашню машину”

На домашній машині відкрийте Settings → Relay. Під першим рядком є “reach me at” - адреси, які може використати інша машина, порт уже підставлено. Скопіюйте одну. На кожному клієнті вставте її в поле домашньої машини й натисніть SET HOME. За кілька секунд панель покаже connected, і прибуде вся історія робочого простору.

Щоб пізніше перенести домашню машину, натисніть MAKE THIS MACHINE THE HOME на новій і задайте її адресу на інших. Нічого не втрачається: кожна машина вже зберігає журнал.

Якщо клієнт не може досягти домашньої машини, перевірте напрямок, який має значення, - з клієнта:

Terminal window
curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 http://<home-address>:3400/api/relay

200 означає, що мережа в порядку, а проблема в конфігурації. Для мереж, які не бачать одна одну, поставте машини на WireGuard або Tailscale і використовуйте ту адресу; кожна машина оголошує всі адреси, які має.

3 · Перевірте, що спрацювало

Section titled “3 · Перевірте, що спрацювало”
Terminal window
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 називає порядковий номер, де стався розрив.

$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 freely

identity.json - єдиний незамінний файл. Втратите його - і машина не зможе підписувати нові події; нова ідентичність означає новий ланцюжок під тим самим іменем. index.db одноразовий - якщо пошук поводиться дивно, видаліть його.

Розмови, які ви очищаєте, також записуються до вашого сховища (vault) Obsidian у форматі Markdown у memories/channels/<room>/.

Журнал несе те, що сталося: повідомлення, патчі, запуски, погодження, рішення. Він не несе ваших ключів - .env.local залишається на машині, де його було записано, а агенти працюють на машині, за якою ви сидите, з вашими обліковими даними. Приватний канал прихований, а не зашифрований: журнал реплікується всюди; налаштування вирішує, що показує інтерфейс у списку.