Status page per machine: CPU load, RAM and disk of the client, sampled by the agent only while the page is open and visible (one reading serves every open tab), plus a button that has the agent measure its link to the host: ping, down and up. Online/offline now comes from the control polls the hub holds open, so a dropped agent shows offline at once instead of 45 s later, and the dashboard keeps the status column live. A forward rule can be created "without ufw": the panel opens nothing in ufw for it and so revokes nothing when it is deleted. The checkbox is shown only while the ufw integration is on. Dashboard row actions are icons; a status action is added.
LPRA — LongPolling Remote Access
Лёгкий self-hosted сервис для доступа к Linux-машинам без белого IP (за NAT). Агент на клиенте сам исходяще подключается к серверу по HTTP long-polling; админ в веб-панели видит список машин и открывает по каждой терминал в браузере (по умолчанию от root, пользователя можно сменить).
браузер ──WS──> [nginx :8445 TLS] ──> [Go server 127.0.0.1:8091] <──long-poll── агент (root, за NAT)
│
SQLite
Компоненты
- Сервер (
cmd/server) — админ-панель + точка встречи для агентов. За nginx (TLS). - Агент (
cmd/agent) — Linux-бинарь, systemd-сервис от root, PTY по запросу. - install.sh — интерактивный установщик, отдаётся сервером как статика.
Сборка
./build.sh
Получаются bin/lpra-server и dist/agent-linux-{amd64,arm64}.
Запуск сервера
./bin/lpra-server -addr 127.0.0.1:8091 -dist ./dist -db ./lpra.db
Поставьте перед ним nginx по deploy/nginx.conf.example (TLS, long-poll/WS).
Локально без TLS можно добавить -insecure-cookies.
Первый запуск: откройте /setup — мастер создаст администратора. Дальше /settings:
адрес хоста (по умолчанию https://localhost:8445), enroll-секрет и готовая
команда установки.
Установка агента на клиент
Одной командой (под root):
curl -fsSL https://localhost:8445/install.sh | sudo HOST=https://localhost:8445 ENROLL_SECRET=<секрет> sh
Или интерактивно (спросит секрет, а если агент уже стоит — предложит удалить):
curl -fsSL https://localhost:8445/install.sh | sudo sh
Проброс портов и прямой туннель
Правила проброса создаются на странице машины. Режим http идёт через адрес панели (long-poll),
режимы tcp/udp — через прямой туннель: агент держит исходящее соединение к порту туннеля хоста
(по умолчанию 8446, флаг -tunnel / LPRA_TUNNEL_ADDR).
Порт туннеля и хост, к которому для него подключаются агенты (например, IP вместо домена панели),
меняются в /settings → «Прямой туннель». Агенты забирают адрес с панели сами — при подключении и
при каждом опросе, переустановка не нужна. Локальные TUNNEL_ADDR / TUNNEL_PORT в окружении агента
имеют приоритет над настройкой панели (TUNNEL_ADDR=off отключает туннель).
Если на хосте активен ufw и сервер запущен от root, панель сама открывает порт хоста правила
(tcp для http/tcp, udp для udp) и порт туннеля для прямых режимов, а при удалении правила — закрывает.
При ProtectSystem=strict в systemd-юните ufw нужны права на запись: ReadWritePaths=/etc/ufw /run.
Версия
Версия задаётся в одном месте — VERSION.txt; файл вшивается в сервер и агент при сборке.
Пользователь терминала
По умолчанию терминал открывается от пользователя, под которым запущен агент (на Linux — root). В окне «Изменить машину» можно выбрать другого пользователя машины или создать нового (имя, пароль, опционально — добавить в sudo). Смена и создание работают, только если агент запущен от root. Файловый менеджер по-прежнему работает от пользователя агента.
Безопасность
- Пароли админов — bcrypt; сессии в HttpOnly/Secure/SameSite куках; CSRF на формах; rate-limit логина.
- Агенты: общий enroll-секрет → индивидуальный токен (хранится хешем, сверка constant-time).
- Открытие терминала пишется в таблицу
audit(терминал даёт root-доступ), как и смена/создание пользователя.