112 lines
4.4 KiB
Markdown
112 lines
4.4 KiB
Markdown
# VpnPanel
|
||
|
||
Веб‑панель (сайт) для управления **WireGuard** и **AmneziaWG 2.0** на VPS.
|
||
|
||
В отличие от BandjuPanel это не десктопное приложение через SSH, а обычный веб‑сайт с админкой, который крутится на сервере (Dokploy / Docker Compose) и хранит данные в PostgreSQL.
|
||
|
||
## Что уже есть
|
||
|
||
- Лендинг `/`
|
||
- Админка `/admin` (логин из ENV)
|
||
- Серверы WireGuard и AWG 2.0 (создаются при старте)
|
||
- Клиенты: создать / вкл-выкл / удалить
|
||
- Скачивание `.conf` и QR‑код
|
||
- Запись серверных конфигов в volumes `/data/wireguard` и `/data/amneziawg`
|
||
- PostgreSQL + Alembic миграции
|
||
- Docker Compose под Dokploy
|
||
|
||
## Docker Compose (Dokploy)
|
||
|
||
Проект деплоится через `docker-compose.yml`:
|
||
|
||
| Сервис | Назначение |
|
||
|--------|------------|
|
||
| `postgres` | PostgreSQL 16 |
|
||
| `panel` | веб‑сайт + админка (FastAPI) |
|
||
|
||
1. В Dokploy создайте приложение **Docker Compose** из этого репозитория.
|
||
2. Compose file: `docker-compose.yml`
|
||
3. Задайте Environment Variables (минимум):
|
||
|
||
```env
|
||
SECRET_KEY=очень-длинный-секрет
|
||
ADMIN_USERNAME=admin
|
||
ADMIN_PASSWORD=надежный-пароль
|
||
ADMIN_EMAIL=admin@example.com
|
||
PUBLIC_HOST=ваш-домен-или-ip
|
||
POSTGRES_PASSWORD=надежный-пароль-бд
|
||
```
|
||
|
||
4. Deploy. Доступ через домен Dokploy (сервис `panel`, порт контейнера `20000`).
|
||
5. Вход: `/admin/login`
|
||
|
||
Не публикуйте host-порт в compose — иначе будет `port is already allocated`.
|
||
В ENV Dokploy удалите `PANEL_PORT`, если он остался от старых деплоев.
|
||
|
||
### Если Bad Gateway (502)
|
||
|
||
1. В Dokploy Domain укажите сервис **`panel`**, порт **`20000`** (не `postgres`).
|
||
2. Откройте логи сервиса `panel` — должны быть строки `Database is ready` и `Starting uvicorn`.
|
||
3. Ошибка `Name or service not known` значит `panel` не видит хост БД:
|
||
- `panel` и `postgres` связаны через внутреннюю сеть `vpn_internal`;
|
||
- `panel` также в `dokploy-network` для домена;
|
||
- если БД внешняя (Dokploy Postgres) — задайте `POSTGRES_HOST` на её хост.
|
||
4. Redeploy после правок.
|
||
|
||
Админ при каждом старте **синхронизируется из ENV**.
|
||
|
||
Файл `.env` на сервере **не обязателен** — все переменные читаются из Compose / Dokploy UI.
|
||
|
||
## Локально
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
docker compose up --build -d
|
||
docker compose ps
|
||
docker compose logs -f panel
|
||
```
|
||
|
||
Откройте http://localhost:20000
|
||
|
||
## Как связаны VPN‑демоны
|
||
|
||
Панель:
|
||
|
||
1. Хранит ключи и пиров в Postgres
|
||
2. Генерирует клиентские конфиги (и AWG‑параметры Jc/Jmin/Jmax/S1/S2/H1–H4)
|
||
3. Пишет серверный `wg0.conf` / `awg0.conf` в shared volume
|
||
|
||
Дальше volume монтируется в контейнер WireGuard / AmneziaWG (или на хост), и интерфейс поднимается отдельно. Это сделано специально: панель — веб‑сайт, а VPN‑ядро можно менять независимо.
|
||
|
||
Пример идеи для следующего шага (не включено в MVP):
|
||
|
||
```yaml
|
||
# wireguard:
|
||
# image: linuxserver/wireguard
|
||
# volumes:
|
||
# - wg_data:/config
|
||
# ports:
|
||
# - "51820:51820/udp"
|
||
```
|
||
|
||
## Структура
|
||
|
||
```
|
||
app/
|
||
main.py # FastAPI
|
||
models.py # Admin, VpnServer, VpnClient
|
||
routers/ # public + admin UI
|
||
services/ # ключи, конфиги WG/AWG
|
||
templates/ # HTML сайта и админки
|
||
docker-compose.yml
|
||
Dockerfile
|
||
alembic/ # миграции
|
||
```
|
||
|
||
## Дальше
|
||
|
||
- Редактирование endpoint/DNS сервера из админки
|
||
- Подключение XRay / Hysteria2 / MTProto
|
||
- Статистика handshake / трафика
|
||
- Пользовательский кабинет (не только admin)
|