# Network Manager — веб-панель управления сетью для Alpine Linux Простая веб-панель для настройки сетевых интерфейсов на Alpine Linux. Написана на Go (бэкенд) + чистый HTML/CSS/JS (фронтенд), без внешних зависимостей. ## Возможности - Вкл/выкл/рестарт интерфейса (`ifup` / `ifdown`) - Статистика трафика (rx/tx байт и пакетов) из `/proc/net/dev` - Текущий IP (v4 и v6), маска сети, шлюз - Режим DHCP или статический IP - Редактирование всех параметров (IP, маска, шлюз, DNS) - **Настройки применяются только после нажатия «Применить»** - Автообновление данных каждые 10 секунд ## Структура проекта ``` alpine-router/ ├── main.go — точка входа, HTTP-роутинг ├── go.mod ├── handlers/ │ └── api.go — REST-обработчики ├── network/ │ ├── interfaces.go — чтение состояния интерфейсов │ ├── config.go — парсинг/запись /etc/network/interfaces │ └── apply.go — применение конфига (ifup/ifdown) ├── public/ │ ├── index.html │ ├── style.css │ └── app.js └── alpine-init/ └── network-manager — OpenRC-скрипт ``` ## Быстрый запуск (разработка, Linux/macOS) ```bash cd alpine-router go run . # открыть http://localhost:8080 ``` > На не-Alpine системе панель запустится, но ifup/ifdown не сработают — > зато статистика и отображение интерфейсов будут работать. --- ## Деплой на Alpine Linux ### 1. Установить зависимости ```sh apk add go git ifupdown ``` > Если `ifupdown` уже включён в базовой системе — пропустить. ### 2. Собрать бинарник ```sh # На самом роутере или кросс-компиляцией: cd alpine-router go build -o network-manager . ``` Кросс-компиляция с x86_64 → ARM (например, для Raspberry Pi): ```sh GOOS=linux GOARCH=arm64 go build -o network-manager . ``` ### 3. Установить файлы ```sh # Бинарник install -m 755 network-manager /usr/local/bin/network-manager # Фронтенд (панель ищет папку ./public относительно cwd) mkdir -p /usr/local/share/network-manager cp -r public/ /usr/local/share/network-manager/public ``` Если хотите запускать из `/usr/local/share/network-manager`: ```sh cd /usr/local/share/network-manager && network-manager ``` Либо укажите путь к public через переменную окружения: ```sh # Добавьте в OpenRC-скрипт: directory="/usr/local/share/network-manager" ``` ### 4. Настроить автозапуск (OpenRC) ```sh cp alpine-init/network-manager /etc/init.d/network-manager chmod +x /etc/init.d/network-manager rc-service network-manager start rc-update add network-manager default ``` ### 5. Открыть панель ``` http://:8080 ``` Порт можно изменить переменной окружения: ```sh PORT=8888 network-manager ``` --- ## API | Метод | Путь | Описание | |-------|------|----------| | GET | `/api/interfaces` | Список всех интерфейсов со статистикой | | GET | `/api/interfaces/{name}` | Статистика одного интерфейса | | POST | `/api/interfaces/{name}/up` | Поднять интерфейс | | POST | `/api/interfaces/{name}/down` | Опустить интерфейс | | POST | `/api/interfaces/{name}/restart` | Рестарт интерфейса | | GET | `/api/config/{name}` | Получить конфиг (pending или из файла) | | POST | `/api/config/{name}` | Сохранить конфиг как pending | | DELETE | `/api/config/{name}` | Удалить pending конфиг | | GET | `/api/pending` | Список интерфейсов с pending изменениями | | POST | `/api/apply` | Записать pending конфиги и перезапустить интерфейсы | --- ## Формат `/etc/network/interfaces` Панель читает и пишет стандартный Debian/Alpine формат: ``` auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0 gateway 192.168.0.1 dns-nameservers 8.8.8.8 1.1.1.1 ``` Перед каждой записью создаётся резервная копия `/etc/network/interfaces.bak`. --- ## Требования - Alpine Linux (или любой Linux с `/proc/net/dev` и `/sys/class/net`) - Go 1.21+ - `ifupdown` или `busybox` с поддержкой `ifup`/`ifdown`