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

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

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

Кожна машина запускає весь продукт і зберігає власну копію журналу подій. Одна з них — домашня (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 залишається на машині, де його було записано, а агенти працюють на машині, за якою ви сидите, з вашими обліковими даними. Приватний канал прихований, а не зашифрований: журнал реплікується всюди; налаштування вирішує, що показує інтерфейс у списку.