Веб-панель управления LLM-сервисами на базе Streamlit. Позволяет запускать, останавливать и мониторить systemd user-сервисы (llama.cpp, ComfyUI, AceStep.cpp и др.) через удобный веб-интерфейс на Linux-сервере.
- Linux с systemd
- Python >= 3.14
- uv — менеджер пакетов
- Опционально: GPU NVIDIA (для отображения метрик)
Запустить панель одной командой (без установки):
uvx https://github.com/Apkawa/web-panel.git --config ./config.jsonДля работы на удалённом сервере:
uvx https://github.com/Apkawa/web-panel.git --port 8501 --listen 0.0.0.0 --config ./config.jsonДля разработки или кастомной настройки:
git clone https://github.com/Apkawa/web-panel.git
cd web-panel
uv sync
uv run web-panel --config ./config.json$ uvx https://github.com/Apkawa/web-panel.git --help
usage: web-panel [-h] [--config CONFIG] [--port PORT] [--listen LISTEN]
LLM Node Control Panel
options:
-h, --help show this help message and exit
--config CONFIG Path to JSON config file with services definition
--port PORT Port to run the panel on (default: 8502)
--listen LISTEN Address to listen on (default: 0.0.0.0)-
Скопируйте юнит-файл из
examples/в директорию user-сервисов:cp examples/web-panel.service ~/.config/systemd/user/web-panel.service -
Отредактируйте
~/.config/systemd/user/web-panel.service:WorkingDirectory— путь к директории проектаExecStart— путь кuv(проверьте черезwhich uv)
-
Настройте сервисы в
config.json. Пример:{ "title": "Мой Сервер управления LLM", "allowed_ips": ["127.0.0.1", "192.168.1.0/24", "10.0.0.0/8", "192.168.0.*"], "services": { "web-panel": { "display": "Web panel (this)", "port": 8501 }, "llama.cpp": { "display": "Llama.cpp", "port": 8080 }, "marinara-engine": { "display": "Marinara Engine", "port": 7860 } } } -
Перезапустите systemd и запустите сервис:
systemctl --user daemon-reload systemctl --user enable --now web-panel.service systemctl --user restart web-panel.service -
Для корректной работы кнопки
Clean memдобавьте исключения для команд в sudoers:echo '%sudo ALL=NOPASSWD: /usr/bin/sync, /usr/sbin/sysctl -w vm.drop_caches=3' \ | sudo tee /etc/sudoers.d/clean_mem
Все пользовательские сервисы размещаются в ~/.config/systemd/user/.
Файлы примеров находятся в директории examples/.
[Unit]
Description=llama.cpp server
[Service]
Type=simple
WorkingDirectory=/path/to/workdir/
ExecStart=/path/to/script/llama-cpp-run.sh
Restart=no
# 1. Отключаем лимиты памяти (снимает ограничения systemd)
MemoryAccounting=yes
MemoryMax=infinity
MemoryHigh=infinity
# 2. Запрещаем systemd убивать сервис при нехватке памяти
OOMPolicy=continue
# 3. Защищаем от системного OOM-killer ядра Linux
OOMScoreAdjust=-1000
[Install]
WantedBy=default.target[Unit]
Description=Marinara Engine server
[Service]
Type=simple
WorkingDirectory=/path/to/marinara-engine/Marinara-Engine
ExecStart=/path/to/marinara-engine/Marinara-Engine/start.sh
Restart=no
[Install]
WantedBy=default.target- Статус — показывает текущее состояние systemd-сервиса (active/inactive)
- Запуск / Остановка / Перезапуск — через
systemctl --user - Логи — просмотр и динамическая подгрузка из journalctl
- Метрики — VRAM, загрузка GPU, температура, RAM
- Автообновление — настраиваемый интервал обновления в боковой панели
Сервисы задаются в config.json в формате:
{
"title": "Мой Сервер управления LLM",
"allowed_ips": ["127.0.0.1", "192.168.1.0/24", "10.0.0.0/8", "192.168.0.*"],
"services": {
"systemd-name": {
"display": "Отображаемое имя",
"port": 8080
}
}
}title— заголовок панели.allowed_ips— список разрешённых IP-адресов/подсетей (поддерживаются точные IP, CIDR-подсети и маски со звёздочкой).services— маппинг systemd-имён на отображаемое имя и порт.
При добавлении нового сервиса не забудьте создать соответствующий юнит-файл
в ~/.config/systemd/user/ и перезагрузить daemon.
web-panel/
├── AGENTS.md # Руководство для ИИ-агентов
├── TODO.md # План работ
├── README.md # Этот файл
├── pyproject.toml # Зависимости (uv)
├── uv.lock # Lock-файл uv
├── .python-version # Версия Python
├── .gitignore
├── config.json # Конфигурация сервисов
├── examples/ # Примеры юнит-файлов сервисов
│ ├── config.json
│ ├── llama.cpp.service
│ ├── marinara-engine.service
│ └── web-panel.service
└── src/
└── web_panel/ # Пакет приложения (src-layout)
├── __init__.py
├── main.py # CLI-точка входа (uv run web-panel)
├── app.py # Основной код Streamlit
└── utils.py # Утилиты (load_config и др.)
