Налаштування
Питання, на яке тут є відповідь: що я встановлюю де, і де насправді живуть розмови?
Загальна форма
Section titled “Загальна форма”Кожна машина запускає весь продукт і зберігає власну копію журналу подій. Одна з них — домашня (home); решта — клієнти. Клієнт штовхає те, що записав, на домашню машину й слухає все інше; домашня машина розсилає далі.
Домашня машина — не майстер. Вона зберігає той самий підписаний журнал, що й усі інші; якщо вона згорить, кожна машина все одно матиме всю розмову, і будь-яка з них може стати домашньою зміною одного налаштування. Вона існує тому, що до закритого ноутбука не достукатися, а два ноутбуки, які ніколи не відкриті одночасно, ніколи не зійдуться.
Машина без налаштованої домашньої адреси і є домашньою. Це також випадок однієї машини: свіже встановлення спілкується саме з собою і не потребує жодного налаштування.
Як машини досягають одна одної
Section titled “Як машини досягають одна одної”Чотири схеми; відмінність у тому, яка машина може звернутися до якої. Виберіть одну в Settings → Relay на домашній машині; решта машин зчитують вибір із журналу.
| Що це | Потрібен секрет | |
|---|---|---|
| Одна локальна мережа | Усі машини в одній будівлі. Нічого встановлювати не треба; поза цією мережею нічого не працює. | Ні |
| Tailscale | Кожна машина отримує адресу, що працює звідусіль, за будь-яким NAT. | Ні — tailnet приватний |
| Одна завжди ввімкнена машина вдома | Типовий варіант. Клієнти під’єднуються звідки завгодно. | Ні |
| Домашня машина на публічній адресі | VPS або порт, прокинутий на машину вдома. | Так — налаштування відмовляє без нього |
Клієнт лише ініціює з’єднання назовні, тож машина за NAT оператора або хот-спотом сьогодні
працює як клієнт; вона просто не може бути машиною, до якої всі під’єднуються. Публічна адреса —
це така, до якої може приєднатися інтернет — спершу задайте EREBROS_TEAMS_SECRET одним і тим самим
рядком на кожній машині. Це не шифрування; воно купує рівно одну властивість — незнайомець не може
приєднатися. Задайте його всюди за один підхід: збій проходить мовчки.
1 · Встановіть на кожній машині
Section titled “1 · Встановіть на кожній машині”Node 22.22+ (для node:sqlite), git, POSIX-оболонка.
git clone <your-repository-url> ~/erebros-tcd ~/erebros-tnpm cinpm run buildnpm 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.0Environment=PORT=3401Постійний запуск
Section titled “Постійний запуск”Користувацький (user) сервіс systemd, щоб він працював від вашого імені й міг читати ваші ключі:
[Unit]Description=Erebros-TAfter=network-online.target
[Service]WorkingDirectory=%h/erebros-tEnvironment=NODE_ENV=productionEnvironment=PORT=3401Environment=EREBROS_MACHINE=%HExecStart=/usr/bin/npm run startRestart=always
[Install]WantedBy=default.targetsystemctl --user daemon-reloadsystemctl --user enable --now erebros-tloginctl 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>:3401/api/relay200 означає, що мережа в порядку, а проблема в конфігурації. Для мереж, які
не бачать одна одну, поставте машини на WireGuard або Tailscale і використовуйте ту
адресу; кожна машина оголошує всі адреси, які має.
3 · Перевірте, що спрацювало
Section titled “3 · Перевірте, що спрацювало”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 називає порядковий номер,
де стався розрив.
Де що живе
Section titled “Де що живе”$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 freelyidentity.json — єдиний незамінний файл. Втратите його — і машина не зможе
підписувати нові події; нова ідентичність означає новий ланцюжок під тим самим іменем.
index.db одноразовий — якщо пошук поводиться дивно, видаліть його.
Розмови, які ви очищаєте, також записуються до вашого сховища (vault) Obsidian у форматі Markdown у
memories/channels/<room>/.
Що передається, а що ні
Section titled “Що передається, а що ні”Журнал несе те, що сталося: повідомлення, патчі, запуски, погодження, рішення. Він
не несе ваших ключів — .env.local залишається на машині, де його було записано, а
агенти працюють на машині, за якою ви сидите, з вашими обліковими даними. Приватний канал
прихований, а не зашифрований: журнал реплікується всюди; налаштування вирішує, що
показує інтерфейс у списку.
Дивіться також
Section titled “Дивіться також”- Розгортання на Proxmox — безголовий контейнер без GPU.
- Обчислення (Local / Cloud)