tensorgrid-server
v0.4.1
Published
TENSOR GRID — сервер компании: учётные записи сотрудников, общая база чатов, модели через сервер с наборами и учётом расходов
Readme
TENSOR GRID — сервер компании
Учётные записи сотрудников и общая база всех чатов TENSOR GRID. Работает на Linux-сервере в сети компании. Без внешних библиотек: нужен только Node.js 22.13 или новее.
Связь — только HTTPS (с 0.4.0). Сертификат сервер выпускает себе сам: у него свой центр сертификации (УЦ) компании. Программа сотрудника доверяет серверу по отпечатку этого УЦ — он вписан в команду установки.
Установка (один раз, на сервере)
sudo npx --yes tensorgrid-server installКоманда спросит логин и пароль администратора, заведёт службу, которая запускается сама при включении сервера, и напечатает:
- адрес кабинета, например
https://192.168.1.10:8443/admin; - отпечаток сертификата компании (64 знака);
- готовую команду установки для сотрудников.
Порты: --port 8443 (HTTPS), --http-port 8080 (на нём только подсказка
«идите на https» и сертификат компании). Обновление — та же команда:
программа заменяется, данные остаются.
Первый вход в кабинет
Браузер предупредит, что сертификат не подтверждён: его выпустил УЦ компании,
которого браузер не знает. Сверьте отпечаток (он же в журнале службы и в
выводе tensorgrid-server tls) и примите. Чтобы предупреждения не было,
скачайте https://АДРЕС:8443/tls/ca.crt, откройте и установите в
«Доверенные корневые центры сертификации».
Переход с 0.3 (сотрудники на программе до 2.66)
Прежние программы знают только http://…:8080. На время перехода запустите
службу с --legacy-http: порт 8080 будет отвечать им по-старому (без
шифрования). Когда все сотрудники переустановят программу командой из
кабинета, уберите --legacy-http. Правило брандмауэра прежних версий
(ufw allow 8080/tcp для всех) удалите вручную: sudo ufw delete allow 8080/tcp.
Сотрудники
- В кабинете администратора → «Сотрудники» → добавить: имя, логин, пароль.
- На компьютере сотрудника — Windows PowerShell (Win+R → powershell) и одна команда из кабинета («Сотрудники»). Она скачивает установку только с вашего сервера — сверяя отпечаток сертификата — и ставит закреплённую версию программы. Node.js ставится сам, если его нет (с nodejs.org, отпечаток сверяется).
- При первом запуске приложение попросит войти. После входа все чаты сотрудника отправляются на сервер сами — раз в минуту; без связи копятся и досылаются.
Отключить сотрудника — кнопка «Отключить» в кабинете: его устройства сразу перестают входить и отправлять. Смена пароля отключает все его устройства — в программе нужно войти заново. Устройство, молчавшее 90 дней, отключается само.
Согласие сотрудников и версия программы
Кабинет → «Настройки»:
- Согласие на сбор чатов. Текст, который сотрудник видит при первом входе и подтверждает кнопкой. Пока согласия нет, программа сотрудника закрыта (и экраном, и на уровне самой программы — агент не работает), а сервер не принимает её чаты. Изменили текст — версия растёт, и все подтверждают заново. На странице «Сотрудники» видно, кто и когда согласился, и у кого согласие на старый текст.
- Версия программы сотрудников. Программы на машинах компании ставят ровно эту версию — сами, без кнопок (в течение минуты после запуска), и вперёд, и назад. Команда установки ставит её же. Пусто — версия, проверенная с этим сервером. Обновление появляется у сотрудника строкой «Компания обновила программу до … — перезапустите».
У сотрудника в программе скрыты обновления, подписки и выбор моделей по провайдерам, а в подвале боковой панели видно: «Чаты сохраняются на сервере компании · последний обмен 14:05» (или что не так).
Модели и расходы
Запросы программы сотрудника к OpenRouter идут через сервер. У каждого сотрудника — личный ключ OpenRouter с лимитом, и лежит он только на сервере (в базе — зашифрованным): на компьютере сотрудника ключа нет.
- В OpenRouter: Settings → Management API Keys → Create. Ключ управления вставьте в кабинете: «Модели и расходы» → «Ключ управления OpenRouter».
- Там же задайте лимит для новых ключей. Если не задавать — 20 $ в месяц; «без лимита» — только отдельной отметкой. Нажмите «Выдать доступ» у сотрудников.
- Программа сотрудника в течение минуты сама переключится на сервер.
Расход за день и за месяц показывается из самого OpenRouter — это цифры счёта. Лимит соблюдает OpenRouter: сверх лимита запрос отклоняется. Отключение сотрудника гасит и его ключ в OpenRouter. Отозвать доступ можно и без ключа управления: сервер забывает личный ключ и больше не пересылает.
Наборы моделей
«Модели и расходы» → «Наборы моделей»: создайте набор (например «Стандарт»), отметьте галочками модели из списка OpenRouter — с поиском и ценами. Первый набор становится набором по умолчанию; у отдельного сотрудника можно выбрать другой набор прямо на странице расходов. Пока наборов нет, доступны все модели.
Запрет держится в трёх местах: сам OpenRouter (ограничитель на личном ключе сотрудника), сервер компании (при наборе каждый запрос обязан быть обычным JSON с названной моделью — сжатые, не-JSON и безымянные запросы отклоняются) и программа сотрудника (в выборе видны только разрешённые модели).
Качество не меняется. Агент, инструменты и файлы работают на компьютере
сотрудника, как и прежде; сервер только пересылает запрос к модели и ответ —
байт в байт, потоком, без ограничения по времени (test/real-ab.mjs).
Где что лежит
| Что | Где |
|---|---|
| программа | /opt/tensorgrid-server |
| данные (база, вложения) | /var/lib/tensorgrid |
| сертификаты (УЦ и сервер) | /var/lib/tensorgrid/tls — ca.key беречь как пароль |
| ключ шифра секретов | /var/lib/tensorgrid/secret.key (или TENSORGRID_SECRET_KEY_FILE) |
| служба | tensorgrid.service — systemctl status tensorgrid |
| журнал | journalctl -u tensorgrid -f |
Резервная копия — каталог /var/lib/tensorgrid целиком (лучше при
остановленной службе: systemctl stop tensorgrid). В копии — ключ УЦ и ключ
шифра: храните её как пароли.
Команды
tensorgrid-server tls отпечаток сертификата и команда установки
tensorgrid-server admin <логин> создать администратора / сменить пароль
tensorgrid-server serve --no-tls открытый HTTP — только за обратным прокси с HTTPS
tensorgrid-server serve --trust-proxy адрес клиента из X-Forwarded-For (за прокси)
tensorgrid-server serve --tls-name tg.company.local доп. имя в сертификатеЗабыт пароль администратора
sudo -u tensorgrid TENSORGRID_DATA=/var/lib/tensorgrid /opt/tensorgrid-server/node /opt/tensorgrid-server/bin/tensorgrid-server.js admin <логин>Безопасность
- HTTPS со своим УЦ; установка сотрудникам — только по HTTPS с закреплением
отпечатка и закреплённой версией программы; cookie кабинета —
Secure. - Пароли хранятся только отпечатками (scrypt), ключи устройств — только отпечатками SHA-256; время ответа не выдаёт, существует ли логин.
- Ключ управления и личные ключи OpenRouter в базе зашифрованы (AES-256-GCM).
- Кабинет — без JavaScript, со строгой политикой безопасности; изменения принимаются только со страниц самого кабинета.
- Перебор паролей: 8 неудач за 10 минут на пару «адрес + логин», 30 — на адрес. Сам логин не блокируется (чужой перебор не запирает владельца), а отвечает с задержкой.
- Сотрудник не может спрятать свой чат от администратора пометкой «подзадача»; тела запросов ограничены (чаты 16 МБ, вложения 50 МБ, запросы к моделям 64 МБ).
- Брандмауэр (ufw) открывает порты только для локальных сетей.
