Под катом расскажу, как реализовал свою web-панель для управления Amnezia AWG (WireGuard) VPN на Ubuntu 22–24. Почему не хватило официального приложения, какие задачи решил с помощью простого PHP-интерфейса и чем это может быть полезно другим компаниям или разработчикам. Код и инструкции — в открытом доступе.
Проект на GitHub: amneziavpnphp
Зачем всё это?
Если кратко, мне понадобился автоматизированный способ выдавать VPN-доступ сотрудникам и управлять ключами не через десктопные клиенты, а через браузер и API. Многие корпоративные сценарии требуют централизованного контроля, интеграции с HR/DevOps-процессами и простоты обслуживания.
Стандартная схема Amnezia работает через приложения с автоматической настройкой серверов, но когда серверов становится больше и появляется потребность в массовой работе с пользователями, снова делать всё руками — не вариант.
Что реализовано
Веб-панель для установки и управления Amnezia VPN серверами через SSH. Поддерживается быстрая настройка на любых VPS с Ubuntu 22–24.
Управление клиентами: создание, отзыв и восстановление VPN-доступа одним кликом.
QR-коды для быстрого подключения через мобильные приложения.
REST API с JWT-авторизацией — удобно автоматизировать процессы: выдавать ключи, интегрировать в внутренние системы.
Мультиязычный интерфейс: есть русский, английский, испанский, немецкий, французский, китайский.
Мониторинг статистики по каждому клиенту.
Часть реального сценария
Пример: новая компания, удалённые сотрудники, задача — обеспечить доступ к внутренним ресурсам через VPN, сделать процесс простым для нетехнических коллег.
Админ разворачивает веб-панель за пару минут (Docker + докер-композ).
Через интерфейс заводит серверы — можно управлять сразу несколькими.
Добавляет пользователей, генерирует конфиги и QR-коды, рассылает ключи.
В любой момент может отозвать доступ или восстановить по необходимости.
REST API позволяет автоматизировать регистрацию — например, интегрировать в вашу HR-систему и выдавать VPN автоматически при onboard’инге новых сотрудников.
Технологии
PHP 8.2, Twig 3
Docker, Docker Compose
MySQL 8.0
MIT-лицензия — можно дорабатывать под свои задачи
Быстрый старт
-
Клонируем репозиторий:
git clone https://github.com/infosave2007/amneziavpnphp.git cd amneziavpnphp cp .env.example .env docker compose up -d docker compose exec web composer install Доступ через браузер: http://localhost:8082
Чем это может быть полезно
Стартапам и компаниям с распределённой командой, которые не хотят зависеть от сторонних VPN-сервисов.
DevOps для быстрого прототипирования защищённых сред.
Разработчикам, ищущим готовое решение для интеграции через API.
Тем, кому важен контролируемый доступ и автомасштабирование.
Увидели баг, нужна интеграция, есть идеи по улучшению — пишите, проект живой. Рад любой обратной связи!
Комментарии (18)

beast2017
07.11.2025 15:53Это лучшее что я видел на Хабр за последнее время. Можно как-то реализовать сроки действия клиентов на серверах, а также настройку резервного копирования и восстановления на каждом сервере?

infosave Автор
07.11.2025 15:53

beast2017
07.11.2025 15:53Вот это оперативность!!! Спасибо, будем тестить.

infosave Автор
07.11.2025 15:53добавил endpoints для API
POST /api/clients/{id}/set-expiration - Set client expiration date
Parameters: expires_at (Y-m-d H:i:s or null)
POST /api/clients/{id}/extend - Extend client expiration
Parameters: days (int)
GET /api/clients/expiring - Get clients expiring soon
Parameters: days (default: 7)
добавил cron в докер
# Проверить, что cron запущен
docker compose exec web ps aux | grep cron
# Посмотреть задачи cron
docker compose exec web crontab -l
# Запустить вручную
docker compose exec web php /var/www/html/bin/check_expired_clients.php
# Посмотреть логи
docker compose exec web tail -f /var/log/cron.log

beast2017
07.11.2025 15:53а можно реализовать возможность миграции со сторонних панелей? например, брать резервные копии от панелей wg-easy и 3x-ui c их настройками (ip и порт хоста и списка клиентов) разворачивать через amneziavpnphp панель и туда уже восстанавливать настройки и клиентов из прошлых панелей

lostfreearea
07.11.2025 15:53Не хватает автоотключения клиента по лимиту трафика и по времени, по времени варианты работает минут, часов, суток, месяцев, лет. И работает до определенной даты. А так конечно очень круто!

infosave Автор
07.11.2025 15:53+ Скорее всего сегодня протестирую и выложу, возможность добавление сроков для клиентов, бекапы серверов

infosave Автор
07.11.2025 15:53

lostfreearea
07.11.2025 15:53Вау, спасибо! Могли бы вы ещё добавить генерацию QR не только для приложения AmneziaVPN но и я для AmneziaWG? (В аппстор с ру регионом приложения AmneziaVPN нет а конфигом не всегда удобно)
Так же было бы замечательно если бы получилось реализовать не только скачивание конфига а и копирование ключа для авторизации в AmneziaVPN как это работает в оригинальном приложении.
Так же в голову приходит вопрос можно ли подключать уже действующие развернутые Амнезии? Возможно ли это реализовать?
Про миграции уже говорили другие пользователи.
Ещё раз больше спасибо, считаю что несколько доработок и это будет просто шикарная панель коих нет в интернетах

infosave Автор
07.11.2025 15:53Да хорошие идеи, сейчас QR в формате AmneziaWG, сейчас действующие конфигурации будут перестраиваются, я пока не нашел способ бережного ) обхода, попробую решить, вообще хорошо было бы все протоколы внедрить которые есть в AmnaziaVPN

lostfreearea
07.11.2025 15:53Если создать клиента и его имя будет с пробелом то потом AmneziaVPN не цепляется к нему пишет 1000 ошибку

VecH
07.11.2025 15:53А монстра в виде MySQL можно на что то менее требовательное по железу поменять?
UptimeKuma тоже перешел на MySQL, на простеньком железе где стоит WG сервер, даже эта кума тормозить начала и ложные срабатывания появились
Bro-Bro
Спасибо милый человек