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