- Implemented migration 067 to set up Cloudflare WARP with automatic routing for VPN client TCP traffic through a redsocks proxy. - Included installation scripts for WARP and redsocks, along with iptables rules for traffic redirection. - Added detection for X-Ray and patching of its outbound configuration. - Created uninstall scripts to clean up configurations and remove installed packages. fix(migrations): Enhance WARP install script for heredoc compatibility - Implemented migration 068 to fix nested heredoc conflicts and streamline the WARP installation script for panel compatibility. - Removed duplicate `set -eo pipefail` and adjusted formatting for better readability. feat(migrations): Auto-detect AIVPN subnet for routing in WARP setup - Implemented migration 069 to enhance the WARP installation script by adding detection for AIVPN subnets alongside existing AWG container detection. - Updated routing logic to handle both container IPs and host-level VPN subnets. - Ensured proper configuration of iptables for seamless traffic routing through the WARP proxy.
19 KiB
Amnezia VPN Web Panel
Веб-панель управления для VPN-серверов Amnezia AWG (WireGuard).
Возможности
- Развертывание VPN-серверов через SSH (пароль или SSH-ключ)
- Импорт из существующих VPN-панелей (wg-easy, 3x-ui)
- Расширенное управление протоколами (WireGuard, AmneziaWG, OpenVPN, Shadowsocks и др.)
- AI-настройка протоколов через OpenRouter (опционально)
- Управление клиентскими конфигурациями с датами истечения
- Лимиты трафика для клиентов с автоматическим применением
- Резервное копирование и восстановление серверов
- Тестирование сценариев: определение и проверка различных сценариев подключения VPN across протоколов
- Расширенное управление логами: просмотр, поиск и управление системными и контейнерными логами
- Мониторинг статистики трафика
- Генерация QR-кодов для мобильных приложений
- Многоязычный интерфейс (английский, русский, испанский, немецкий, французский, китайский)
- REST API с JWT-аутентификацией
- Аутентификация пользователей и контроль доступа
- Автоматическая проверка истечения срока действия клиентов и лимитов трафика через cron
Доступные протоколы
- AmneziaWG Advanced (
amnezia-wg-advanced) - AmneziaWG 2.0 (
awg2) - WireGuard Standard (
wireguard-standard) - OpenVPN (
openvpn) - Shadowsocks (
shadowsocks) - XRay VLESS (
xray-vless) - MTProxy (Telegram) (
mtproxy) - SMB Server (
smb) - AIVPN (
aivpn) - https://github.com/infosave2007/aivpn - Cloudflare WARP Proxy (
cf-warp) — прозрачное проксирование трафика через Cloudflare
Требования
- Docker
- Docker Compose
Установка
git clone https://github.com/infosave2007/amneziavpnphp.git
cd amneziavpnphp
cp .env.example .env
# Для Docker Compose V2 (рекомендуется)
docker compose up -d
docker compose exec web composer install
# Дождитесь готовности БД (начальные SQL-файлы миграции применяются автоматически через MySQL entrypoint)
until [ "$(docker inspect -f '{{.State.Health.Status}}' amnezia-panel-db 2>/dev/null)" = "healthy" ]; do
sleep 2
done
# Или для старой Docker Compose V1
docker-compose up -d
docker-compose exec web composer install
until [ "$(docker inspect -f '{{.State.Health.Status}}' amnezia-panel-db 2>/dev/null)" = "healthy" ]; do
sleep 2
done
# Ручной режим миграции (для существующих установок / обновлений)
set -a; source .env; set +a
for f in migrations/*.sql; do
docker compose exec -T db mysql -u"$DB_USERNAME" -p"$DB_PASSWORD" "$DB_DATABASE" < "$f" || true
done
# Для Docker Compose V1 ручной режим миграции:
# for f in migrations/*.sql; do
# docker-compose exec -T db mysql -u"$DB_USERNAME" -p"$DB_PASSWORD" "$DB_DATABASE" < "$f" || true
# done
Доступ: http://localhost:8082
Данные для входа по умолчанию: admin@amnez.ia / admin123
Предварительные требования для удаленного сервера
Для развертывания протоколов на чистом удаленном хосте, Docker Engine должен быть доступен на этом хосте. Если Docker отсутствует, установите его сначала (пример для Ubuntu):
apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --batch --yes --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
. /etc/os-release
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
Настройка
Отредактируйте .env:
DB_HOST=db
DB_PORT=3306
DB_DATABASE=amnezia_panel
DB_USERNAME=amnezia
DB_PASSWORD=amnezia
ADMIN_EMAIL=admin@amnez.ia
ADMIN_PASSWORD=admin123
JWT_SECRET=your-secret-key-change-this
Использование
Добавление VPN-сервера
- Серверы → Добавить сервер
- Введите: имя, IP хоста, SSH-порт, имя пользователя
- Выберите метод аутентификации: Пароль или SSH-ключ
- Для SSH-ключа: вставьте ваш приватный ключ (формат PEM/OpenSSH)
- (Опционально) Включите импорт из существующей панели:
- Отметьте "Импортировать из существующей панели"
- Выберите тип панели (wg-easy или 3x-ui)
- Загрузите файл резервной копии (JSON)
- Нажмите "Создать сервер"
- Дождитесь развертывания
- Клиенты будут импортированы автоматически, если импорт был включен
Создание клиента
- Откройте детали сервера
- Введите имя клиента
- Выберите период истечения (опционально, по умолчанию: бессрочно)
- Выберите лимит трафика (опционально, по умолчанию: безлимитно)
- Нажмите "Создать клиента"
- Скачайте конфигурацию или отсканируйте QR-код
Управление истечением срока действия клиента
Установите истечение через UI или API:
# Установить конкретную дату
curl -X POST http://localhost:8082/api/clients/123/set-expiration \
-H "Authorization: Bearer <token>" \
-d '{"expires_at": "2025-12-31 23:59:59"}'
# Продлить на 30 дней
curl -X POST http://localhost:8082/api/clients/123/extend \
-H "Authorization: Bearer <token>" \
-d '{"days": 30}'
# Получить клиентов, у которых скоро истекает срок (в течение 7 дней)
curl http://localhost:8082/api/clients/expiring?days=7 \
-H "Authorization: Bearer <token>"
Управление лимитами трафика
Установите и отслеживайте лимиты трафика через UI или API:
# Установить лимит трафика (10 ГБ = 10737418240 байт)
curl -X POST http://localhost:8082/api/clients/123/set-traffic-limit \
-H "Authorization: Bearer <token>" \
-d '{"limit_bytes": 10737418240}'
# Удалить лимит трафика (установить безлимитный)
curl -X POST http://localhost:8082/api/clients/123/set-traffic-limit \
-H "Authorization: Bearer <token>" \
-d '{"limit_bytes": null}'
# Проверить статус лимита трафика
curl http://localhost:8082/api/clients/123/traffic-limit-status \
-H "Authorization: Bearer <token>"
# Получить клиентов, превысивших лимит трафика
curl http://localhost:8082/api/clients/overlimit \
-H "Authorization: Bearer <token>"
Резервное копирование серверов
Создавайте и восстанавливайте резервные копии через UI или API:
# Создать резервную копию
curl -X POST http://localhost:8082/api/servers/1/backup \
-H "Authorization: Bearer <token>"
# Список резервных копий
curl http://localhost:8082/api/servers/1/backups \
-H "Authorization: Bearer <token>"
# Восстановить из резервной копии
curl -X POST http://localhost:8082/api/servers/1/restore \
-H "Authorization: Bearer <token>" \
-d '{"backup_id": 123}'
Управление протоколами
Управляйте VPN-протоколами через Настройки → Протоколы:
- Установка/удаление протоколов (WireGuard, AmneziaWG, OpenVPN и др.)
- Настройка параметров протокола (порты, транспорт, маскировка)
- AI-ассистент: используйте "Спросить AI" для генерации сложных конфигураций протоколов, адаптированных к вашим потребностям (требуется API-ключ OpenRouter).
Cloudflare WARP Proxy
WARP прозрачно проксирует весь TCP-трафик от VPN-клиентов через сеть Cloudflare, скрывая реальный IP-адрес сервера.
⚠️ Устанавливайте WARP последним — после всех других протоколов (AWG, X-Ray, AIVPN и др.). Во время установки WARP автоматически обнаруживает активные VPN-контейнеры и интерфейсы и настраивает маршрутизацию для каждого из них.
Поддерживаемые протоколы:
- AWG / AWG2 — маршрутизация через IP контейнера + хост redsocks
- X-Ray VLESS — исходящий
warp-outчерез SOCKS5 в конфигурации X-Ray - AIVPN / WireGuard — маршрутизация через iptables + redsocks на уровне хоста
Проверка: подключитесь к VPN и откройте https://1.1.1.1/cdn-cgi/trace — поле warp=on подтверждает работоспособность.
Тестирование сценариев и логи
Тестирование сценариев:
- Создавайте тестовые сценарии для проверки подключения через различные протоколы и сетевые условия.
- Запускайте автоматические тесты для обеспечения надежности вашей VPN-инфраструктуры.
Управление логами:
- Централизованный просмотр всех системных, контейнерных и прикладных логов.
- Возможности поиска и фильтрации для быстрой диагностики проблем.
AI-ассистент
Настройте API-ключ OpenRouter in Настройки для включения:
- Автоматический перевод интерфейса
- AI-помощник для настройки протоколов
- Интеллектуальные предложения по устранению неполадок
Автоматический мониторинг и сбор метрик
Сборщик метрик запускается автоматически при старте контейнера и отслеживается cron каждые 3 минуты. Если процесс падает, он автоматически перезапускается.
Проверить логи сборщика метрик:
docker compose exec web tail -f /var/log/metrics_collector.log
Проверить логи скрипта мониторинга:
docker compose exec web tail -f /var/log/metrics_monitor.log
Перезапустить сборщик метрик вручную:
docker compose exec web pkill -f collect_metrics.php
# Он будет автоматически перезапущен в течение 3 минут скриптом мониторинга
Автоматическая проверка истечения срока действия клиентов
Запускается автоматически в Docker-контейнере каждый час для отключения истекших клиентов.
Проверить логи cron:
docker compose exec web tail -f /var/log/cron.log
Запустить вручную:
docker compose exec web php /var/www/html/bin/check_expired_clients.php
Автоматическая проверка лимитов трафика
Запускается автоматически в Docker-контейнере каждый час для отключения клиентов, превысивших лимит трафика.
Проверить логи cron:
docker compose exec web tail -f /var/log/cron.log
Запустить вручную:
docker compose exec web php /var/www/html/bin/check_traffic_limits.php
API-аутентификация
Получить JWT-токен:
curl -X POST http://localhost:8082/api/auth/token \
-d "email=admin@amnez.ia&password=admin123"
Использовать токен:
curl -H "Authorization: Bearer <token>" \
http://localhost:8082/api/servers
API Endpoints
Аутентификация
POST /api/auth/token - Получить JWT-токен
POST /api/tokens - Создать постоянный API-токен
GET /api/tokens - Список API-токенов
DELETE /api/tokens/{id} - Отозвать токен
Серверы
GET /api/servers - Список всех серверов
POST /api/servers/create - Создать новый сервер
Параметры: name, host, port, username, password
DELETE /api/servers/{id}/delete - Удалить сервер по ID
GET /api/servers/{id}/clients - Список клиентов на сервере
Протоколы
GET /api/protocols/active - Список всех доступных протоколов (JWT-дружественный, включает ID протоколов)
GET /api/protocols - Управление протоколами (требует session admin auth, не JWT)
GET /api/servers/{id}/protocols - Список установленных протоколов на сервере
POST /api/servers/{id}/protocols/install - Установить протокол
Клиенты
GET /api/clients - Список всех клиентов
GET /api/clients/{id}/details - Получить детали клиента со статистикой, конфигурацией и QR-кодом
GET /api/clients/{id}/qr - Получить QR-код клиента
POST /api/clients/create - Создать нового клиента (возвращает конфигурацию и QR-код)
Параметры: server_id, name, protocol_id (опционально, по умолчанию: установлен), expires_in_days (опционально)
POST /api/clients/{id}/revoke - Отозвать доступ клиента
POST /api/clients/{id}/restore - Восстановить доступ клиента
DELETE /api/clients/{id}/delete - Удалить клиента по ID (удаляет из БД и сервера)
POST /api/clients/{id}/set-expiration - Установить дату истечения клиента
Параметры: expires_at (Y-m-d H:i:s или null)
POST /api/clients/{id}/extend - Продлить истечение клиента
Параметры: days (int)
GET /api/clients/expiring - Получить клиентов, у которых скоро истекает срок
Параметры: days (по умолчанию: 7)
POST /api/clients/{id}/set-traffic-limit - Установить лимит трафика клиента
Параметры: limit_bytes (int или null для безлимитного)
GET /api/clients/{id}/traffic-limit-status - Получить статус лимита трафика
GET /api/clients/overlimit - Получить клиентов, превысивших лимит трафика
Резервные копии
POST /api/servers/{id}/backup - Создать резервную копию сервера
GET /api/servers/{id}/backups - Список резервных копий сервера
POST /api/servers/{id}/restore - Восстановить из резервной копии
Параметры: backup_id
DELETE /api/backups/{id} - Удалить резервную копию
Импорт панели
POST /api/servers/{id}/import - Импортировать клиентов из существующей панели
Параметры: panel_type (wg-easy|3x-ui), backup_file (multipart/form-data)
GET /api/servers/{id}/imports - Получить историю импорта для сервера
Перевод
Добавьте API-ключ OpenRouter в настройках, затем запустите:
docker compose exec web php bin/translate_all.php
Или переведите через веб-интерфейс: Настройки → Автоперевод
Структура
public/index.php - Маршруты
inc/ - Основные классы
Auth.php - Аутентификация
DB.php - Подключение к базе данных
Router.php - Маршрутизация URL
View.php - Twig-шаблоны
VpnServer.php - Управление серверами
VpnClient.php - Управление клиентами
Translator.php - Многоязычность
JWT.php - Токен-аутентификация
QrUtil.php - Генерация QR-кодов
PanelImporter.php - Импорт из wg-easy/3x-ui
InstallProtocolManager.php - Ядро управления протоколами
OpenRouterService.php - AI-интеграция
templates/ - Twig-шаблоны
migrations/ - SQL-миграции (выполняются в алфавитном порядке)
Технологический стек
- PHP 8.2
- MySQL 8.0
- Twig 3
- Tailwind CSS
- Docker
Лицензия
MIT
Поддержать проект
Если вы находите этот проект полезным, вы можете поддержать его разработку через пожертвование через Tribute: https://t.me/tribute/app?startapp=dzX1