Под катом расскажу, как реализовал свою 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-лицензия — можно дорабатывать под свои задачи

Быстрый старт

  1. Клонируем репозиторий:

    git clone https://github.com/infosave2007/amneziavpnphp.git
    cd amneziavpnphp
    cp .env.example .env
    docker compose up -d
    docker compose exec web composer install
  2. Доступ через браузер: http://localhost:8082

Чем это может быть полезно

  • Стартапам и компаниям с распределённой командой, которые не хотят зависеть от сторонних VPN-сервисов.

  • DevOps для быстрого прототипирования защищённых сред.

  • Разработчикам, ищущим готовое решение для интеграции через API.

  • Тем, кому важен контролируемый доступ и автомасштабирование.


Увидели баг, нужна интеграция, есть идеи по улучшению — пишите, проект живой. Рад любой обратной связи!

Комментарии (38)


  1. Bro-Bro
    07.11.2025 15:53

    Спасибо милый человек


  1. beast2017
    07.11.2025 15:53

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


    1. infosave Автор
      07.11.2025 15:53

      Спасибо за отзыв! Сделаю.


    1. infosave Автор
      07.11.2025 15:53


      1. beast2017
        07.11.2025 15:53

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


        1. 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


          1. beast2017
            07.11.2025 15:53

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


            1. infosave Автор
              07.11.2025 15:53

              да, можно сделаю в отдельной ветке


  1. lostfreearea
    07.11.2025 15:53

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


    1. infosave Автор
      07.11.2025 15:53

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


    1. infosave Автор
      07.11.2025 15:53


      1. lostfreearea
        07.11.2025 15:53

        Вау, спасибо! Могли бы вы ещё добавить генерацию QR не только для приложения AmneziaVPN но и я для AmneziaWG? (В аппстор с ру регионом приложения AmneziaVPN нет а конфигом не всегда удобно)

        Так же было бы замечательно если бы получилось реализовать не только скачивание конфига а и копирование ключа для авторизации в AmneziaVPN как это работает в оригинальном приложении.

        Так же в голову приходит вопрос можно ли подключать уже действующие развернутые Амнезии? Возможно ли это реализовать?

        Про миграции уже говорили другие пользователи.

        Ещё раз больше спасибо, считаю что несколько доработок и это будет просто шикарная панель коих нет в интернетах


        1. infosave Автор
          07.11.2025 15:53

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


          1. lostfreearea
            07.11.2025 15:53

            Миграцию через бэкап с приложения амнезии тоже полезно было бы


          1. lostfreearea
            07.11.2025 15:53

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


            1. infosave Автор
              07.11.2025 15:53

              Добавил, санитизацию имени клиента и валидацию с автозаменой в форме


              1. lostfreearea
                07.11.2025 15:53

                Оперативно, ещё в голову пришло, когда с основными идеями управитель, если будет возможность, прикрутите в панель инфографику которая будет отображать загрузку сервера, процессор, память, сеть, диск.

                Скорость каждого клиента по отдельности. Вы большой молодец!


                1. infosave Автор
                  07.11.2025 15:53

                  Когда начинал делать не думал что так востребовано окажется, делал для своего проекта чтобы упростить задачу, как в поговорке "Лучший сисадмин, ленивый сисадмин!" Сделаю, это не очень сложно будет.


                1. infosave Автор
                  07.11.2025 15:53


                  1. lostfreearea
                    07.11.2025 15:53

                    Круто, подскажите как обновиться на новую версию полностью автоматически, мне докер предлагает вручную исправлять расхождения в файлах


                    1. infosave Автор
                      07.11.2025 15:53

                      добавил для этого скрипт в git - update.sh только перед запуском

                      chmod +x update.sh

                      ./update.sh

                      проверь у меня обновилось все нормально


                      1. lostfreearea
                        07.11.2025 15:53

                        Обновилось с одной ошибкой, в файле с лимитом трафика, инфографика не заработала и бэкапы не создаются к сожалению


                      1. Vilinux94
                        07.11.2025 15:53

                        Такая же ошибка, после обновления через update.sh
                        при обновлении была ошибка


                      1. lostfreearea
                        07.11.2025 15:53

                        Сейчас накачу на чистую, может у меня что то сломалось


                      1. lostfreearea
                        07.11.2025 15:53

                        На чистую всё также


                      1. infosave Автор
                        07.11.2025 15:53

                        поправил скрипты, была проблема в старой миграции, сейчас если на чистую поставишь заработает, проверил установкой, если будут ошибки пиши в личку поправлю, посмотри readme там команда запуска скрипта метрик добавилась


  1. DenisVV
    07.11.2025 15:53

    Это и правда лучшая новость за ГОД! Дай Бог тебе здоровья мил человек)!!!


  1. VecH
    07.11.2025 15:53

    А монстра в виде MySQL можно на что то менее требовательное по железу поменять?

    UptimeKuma тоже перешел на MySQL, на простеньком железе где стоит WG сервер, даже эта кума тормозить начала и ложные срабатывания появились


    1. infosave Автор
      07.11.2025 15:53

      Я в 2001 году с этим "монстром" познакомился теперь как родной стал куда же без MySQL ) Вы можете сделать Fork и нейронке дать задание перевести на SqlLite или работу с файлами, можно еще установить без Docker будет меньше ресурсов потреблять, если несколько слабых серверов, то можно вынести в облачную базу подключение


  1. mogaec
    07.11.2025 15:53

    Добрый день. Подскажите примерные требования по железу для комфортной работы? Я так понял, что на qnap с целероном в докере не потянет.


    1. infosave Автор
      07.11.2025 15:53

      Да, твой QNAP на Celeron спокойно потянет панель в Docker. Там всего-то PHP 8.2 и MySQL 8.0, которой хватит 256-512 мегов оперативки. По ресурсам это вообще легко, процессор почти не грузится.

      Только учти один нюанс — сами VPN-серверы лучше поднимать на отдельных VPS, а не на этом же QNAP. Панель через SSH подключается к удалённым машинам и управляет ими, то есть QNAP у тебя будет как центр управления.

      Теоретически можно и на самом QNAP VPN-сервер крутить, технически это реально. Но практика показывает, что надёжнее держать их на выделенных VPS


  1. sonic_youth
    07.11.2025 15:53

    Вау, спасибо! Планируется ли поддержка XRay? Если нет, то какие причины? Жаль, что Амнезия не поддерживает отдельные для юзеров ключи для x-ray, но держать все в одной панели было бы удобно.


    1. infosave Автор
      07.11.2025 15:53

      сделать можно, нужен полный сценарий последовательности запуска команд с приложения например для Amnezia для Android, документация или исходные коды с примером установки на любом языке


      1. koctak
        07.11.2025 15:53

        Просто пушка бомба, огромнейшее человеческое спасибо от всего коллектива, решили многие проблемы данным решением в нынешних условиях . Разместите куда донаты кидать , думаю многие отблагодарят, P.S. мы очень благодарны !


  1. NecroSpider
    07.11.2025 15:53

    Спасибо огромное за панель. А сложно добавить LDAP синхронизацию по группам доступа? Было бы очень удобно


  1. rostma
    07.11.2025 15:53

    Присоединяюсь к вопросу про LDAP. По сути это единственное, что тормозит массовое внедрение WG у меня в конторе. Например генерация конфигов для пользователей состоящих в определенной группе.


  1. PhantomCat71
    07.11.2025 15:53

    Не понял как задать порт вручную.. ну и если получится с Xray - порт и SNI (маскировка).
    Проект крут, вы молодец!


  1. ruffus
    07.11.2025 15:53

    Очень интересный проект, спасибо! У меня есть боль в невозможности легкого переноса с одного сервера на другой, возможно ли такое реализовать?