# 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)