Files
vpn/README.md
T
2026-07-25 22:34:22 +03:00

111 lines
4.5 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.
# VpnPanel
**Версия 1.0.0**
Веб‑панель (сайт) для управления **WireGuard**, **AmneziaWG 2.0** и панелями **3x-ui** на VPS.
В отличие от BandjuPanel это не десктопное приложение через SSH, а обычный веб‑сайт с админкой, который крутится на сервере (Dokploy / Docker Compose) и хранит данные в PostgreSQL.
## Что есть в 1.0
- Лендинг `/` и админка `/admin` (логин из ENV)
- Серверы WireGuard / AWG 2.0: SSH, установка VPN на VPS, синхронизация конфигов
- Клиенты WG/AWG: создать / вкл-выкл / удалить, `.conf` и QR
- Панели **3x-ui**: подключение по API, VLESS / WireGuard клиенты
- Выбор inbound’ов, доступных пользователям; клиенты, созданные через сайт
- 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/H1H4)
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/ # миграции
```
## Дальше (после 1.0)
- Пользовательский кабинет (не только admin)
- Статистика handshake / трафика
- Редактирование endpoint/DNS сервера из админки