Files
alpine-router/README.md
2026-04-15 11:38:26 +03:00

166 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`