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

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

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

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

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

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

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

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

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

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

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

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

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

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

Terminal window
git clone <your-repository-url> ~/erebros-t
cd ~/erebros-t
npm ci
npm run build
npm start # http://localhost:3401

Скопіюйте .env.example у .env.local і заповніть ключі, які маєте; кожен із них необов’язковий. Змінні, що визначають поведінку машини в мережі:

Змінна Що робить
EREBROS_STATE_DIR Де живуть журнал, ключ підпису, налаштування й завдання. Типово ~/.erebros-t, навмисно не ~/.erebros Erebros, з яким збігаються сімнадцять імен файлів.
EREBROS_MACHINE Ім’я цієї машини в журналі та в кожному рядку аудиту. Типово, hostname.
EREBROS_HOME_URL Адреса домашньої машини. Задайте її, і ця машина стає клієнтом; залиште порожньою, і вона домашня. Settings → Relay теж може її задати, без перезапуску; якщо є обидва, перемагає змінна.
EREBROS_TEAMS_SECRET Спільний секрет робочого простору. Відсутній означає відкритий, це правильно за роутером і неправильно на публічній адресі.
EREBROS_FORCE_CLOUD 1 відправляє кожну можливість провайдеру незалежно від обладнання. Дивіться Обчислення.
PORT / HOST Типово 3000 / 127.0.0.1; сервіс задає 3400. Машині, до якої мають достукатися інші, потрібен HOST=0.0.0.0.

Той випадок, що схожий на мережеву несправність

Section titled “Той випадок, що схожий на мережеву несправність”

Оголошувана адреса машини зчитується з її мережевого інтерфейсу; а те, на чому вона слухає, це HOST. Залиште типове значення, і машина впевнено опублікує http://192.168.1.42:3401, але прийматиме лише з’єднання від самої себе: вона чудово працює як клієнт, ніколи не може бути домашньою, і кожен екран каже, що все гаразд.

Environment=HOST=0.0.0.0
Environment=PORT=3401

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

~/.config/systemd/user/erebrost.service
[Unit]
Description=Erebros-T
After=network-online.target
[Service]
WorkingDirectory=%h/erebros-t
Environment=NODE_ENV=production
Environment=PORT=3401
Environment=EREBROS_MACHINE=%H
ExecStart=/usr/bin/npm run start
Restart=always
[Install]
WantedBy=default.target
Terminal window
systemctl --user daemon-reload
systemctl --user enable --now erebros-t
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>:3401/api/relay

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

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

Section titled “3 · Перевірте, що спрацювало”
Terminal window
curl -s localhost:3401/api/relay | jq '{me: .me.machine, role: .hub.role, connected: .hub.connected}'
curl -s localhost:3401/api/events/verify | jq

Ланцюжок кожної машини перевіряється окремо; ok: false називає порядковий номер, де стався розрив.

$EREBROS_STATE_DIR/ (defaults to ~/.erebros-t)
├── 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 залишається на машині, де його було записано, а агенти працюють на машині, за якою ви сидите, з вашими обліковими даними. Приватний канал прихований, а не зашифрований: журнал реплікується всюди; налаштування вирішує, що показує інтерфейс у списку.