2026-04-15 11:38:26 +03:00
|
|
|
|
# NanoRouter — веб-панель управления сетью для Alpine Linux
|
2026-04-13 09:46:02 +03:00
|
|
|
|
|
|
|
|
|
|
Простая веб-панель для настройки сетевых интерфейсов на Alpine Linux.
|
|
|
|
|
|
Написана на Go (бэкенд) + чистый HTML/CSS/JS (фронтенд), без внешних зависимостей.
|
|
|
|
|
|
|
|
|
|
|
|
## Возможности
|
|
|
|
|
|
|
|
|
|
|
|
- Вкл/выкл/рестарт интерфейса (`ifup` / `ifdown`)
|
|
|
|
|
|
- Статистика трафика (rx/tx байт и пакетов) из `/proc/net/dev`
|
|
|
|
|
|
- Текущий IP (v4 и v6), маска сети, шлюз
|
|
|
|
|
|
- Режим DHCP или статический IP
|
|
|
|
|
|
- Редактирование всех параметров (IP, маска, шлюз, DNS)
|
|
|
|
|
|
- **Настройки применяются только после нажатия «Применить»**
|
|
|
|
|
|
- Автообновление данных каждые 10 секунд
|
|
|
|
|
|
|
|
|
|
|
|
## Структура проекта
|
|
|
|
|
|
|
|
|
|
|
|
```
|
2026-04-15 11:38:26 +03:00
|
|
|
|
NanoRouter/
|
2026-04-13 09:46:02 +03:00
|
|
|
|
├── 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
|
2026-04-15 11:38:26 +03:00
|
|
|
|
cd NanoRouter
|
2026-04-13 09:46:02 +03:00
|
|
|
|
go run .
|
|
|
|
|
|
# открыть http://localhost:8080
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> На не-Alpine системе панель запустится, но ifup/ifdown не сработают —
|
|
|
|
|
|
> зато статистика и отображение интерфейсов будут работать.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Деплой на Alpine Linux
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Установить зависимости
|
|
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
|
apk add go git ifupdown
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> Если `ifupdown` уже включён в базовой системе — пропустить.
|
|
|
|
|
|
|
|
|
|
|
|
### 2. Собрать бинарник
|
|
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
|
# На самом роутере или кросс-компиляцией:
|
2026-04-15 11:38:26 +03:00
|
|
|
|
cd NanoRouter
|
2026-04-13 09:46:02 +03:00
|
|
|
|
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://<IP-роутера>: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`
|