DEV Community

Cover image for Свой VLESS-прокси бесплатно одной командой: Xray + XHTTP на Alwaysdata
Dmitry
Dmitry

Posted on AI-assisted

Свой VLESS-прокси бесплатно одной командой: Xray + XHTTP на Alwaysdata

Мне был нужен свой прокси за границей, но платить за VPS ради него не хотелось. Бесплатные варианты быстро кончились. Oracle Cloud просит иностранную карту. Render у меня открывается только через VPN. А почти все бесплатные площадки пускают снаружи только HTTP.

В итоге всё заработало на бесплатном тарифе французского хостинга alwaysdata. Получился небольшой проект alwaysdata-xray: три shell-скрипта, которые одной командой ставят Xray (VLESS поверх XHTTP) и выдают готовую ссылку для клиента.

Ниже расскажу, как это устроено и на какие грабли я наступил по дороге.

⚠️ Сразу честно. Правила бесплатного тарифа alwaysdata запрещают прокси. Аккаунт могут заблокировать в любой момент, поэтому держите это как бесплатный запасной вариант, а не единственный.

Почему alwaysdata

  • Бесплатно и без карты. 100 МБ места, Debian 12, доступ по SSH.
  • Можно запустить свою программу. Тип сайта User program: alwaysdata сам держит процесс запущенным и перезапускает его.
  • HTTPS уже настроен. Перед программой стоит прокси alwaysdata с нормальным сертификатом на <аккаунт>.alwaysdata.net. Настраивать TLS не нужно.

Главное ограничение: снаружи доступен только HTTP(S). Своих TCP-портов и UDP нет, так что WireGuard и прочие протоколы поверх UDP отпадают. Нужно что-то, что ходит через обычный HTTPS-прокси. Для этого в Xray есть транспорт XHTTP: трафик VLESS идёт обычными HTTP-запросами.

Как это устроено

Клиент (v2rayNG, Happ, …)
   │  VLESS + XHTTP, HTTPS :443
   ▼
Прокси alwaysdata  (<аккаунт>.alwaysdata.net)
   │  HTTP на внутренний IPv6 аккаунта
   ▼
Xray  (его запускает start.sh)
   │
   ▼
Интернет, выход с французского IP alwaysdata
Enter fullscreen mode Exit fullscreen mode

В репозитории три скрипта:

  • install.sh (или install.cmd на Windows) запускается на вашем компьютере. Он заливает файлы по SSH и запускает установку.
  • setup.sh выполняется на сервере: ставит Xray, создаёт секреты и печатает ссылку.
  • start.sh тоже на сервере, его запускает сайт alwaysdata. Он собирает конфиг Xray и стартует его.

Установка за четыре шага

1. Зарегистрируйтесь на alwaysdata и включите SSH в панели: Remote access → SSH.

2. Запустите установщик:

git clone https://github.com/AppsGanin/alwaysdata-xray
cd alwaysdata-xray
./install.sh <аккаунт>@ssh-<аккаунт>.alwaysdata.net
Enter fullscreen mode Exit fullscreen mode

На Windows 10/11 вместо этого install.cmd <аккаунт>@ssh-<аккаунт>.alwaysdata.net.

Скрипт спросит пароль SSH один раз, поставит свежий Xray, проверит конфиг и выведет ссылку:

Configuration OK.
Site: User program, command /home/<аккаунт>/start.sh (restart the site after updates)
vless://<uuid>@<аккаунт>.alwaysdata.net:443?encryption=none&security=tls&…&mode=packet-up#<аккаунт>
Enter fullscreen mode Exit fullscreen mode

3. В панели откройте Web → Sites, отредактируйте сайт <аккаунт>.alwaysdata.net:

Поле Значение
Type User program
Command /home/<аккаунт>/start.sh
Working directory /home/<аккаунт>

4. Импортируйте ссылку vless://… в клиент на ядре Xray: v2rayNG, Happ, v2RayTun, Streisand.

Если ссылка потерялась, она лежит на сервере:

ssh <аккаунт>@ssh-<аккаунт>.alwaysdata.net cat link.txt
Enter fullscreen mode Exit fullscreen mode

Грабли

Сама идея простая. Интересное началось, когда я гонял это на настоящем alwaysdata.

1. Порт не 8080, а какой выдадут

alwaysdata передаёт программе переменные IP и PORT. IP — внутренний IPv6 аккаунта вида fd00::…, а порт назначает хостинг. Я поначалу зашил 8080, потому что его слушал стандартный Apache сайта. На деле программе выдали 8100, и с жёстким 8080 relay сломался бы при первом же перезапуске.

Слушать все адреса (::) тоже нельзя: на том же сервере работают сайты других аккаунтов. Поэтому start.sh берёт оба значения из окружения и без них сразу падает с понятной ошибкой:

: "${IP:?IP is not set: start.sh is meant to be run by alwaysdata}"
: "${PORT:?PORT is not set: start.sh is meant to be run by alwaysdata}"
Enter fullscreen mode Exit fullscreen mode

2. Прокси не пропускает потоковую загрузку

У XHTTP несколько режимов. Я прогнал все через прокси alwaysdata:

Режим Результат
packet-up ✅ работает, около 75–80 Мбит/с на скачивание
auto ✅ в моём тесте клиент сам выбрал packet-up
stream-up ❌ прокси рвёт соединение (http2: server sent GOAWAY)
stream-one ❌ то же самое

В stream-up клиент отправляет данные одним долгим потоковым POST-запросом, а прокси alwaysdata так не умеет. В packet-up отправка идёт множеством коротких POST, а приём — через один длинный GET. Такое проходит через любой обычный HTTP-прокси.

Сервер принимает любой режим ("mode": "auto"), а в ссылке режим зафиксирован явно: mode=packet-up. Иначе другой клиент в режиме auto может выбрать stream-up и не подключиться.

3. Предупреждение в лог на каждый запрос

В свежих версиях Xray у серверов XHTTP и WebSocket появилась настройка sockopt.trustedXForwardedFor. Если её нет, а запрос пришёл с заголовком X-Forwarded-For, Xray пишет предупреждение в лог. Через прокси alwaysdata этот заголовок есть у каждого запроса. В моём тесте один запрос curl через туннель давал 6 предупреждений, а логи alwaysdata лежат в тех же 100 МБ квоты.

Лечится одной строкой в конфиге:

"sockopt": { "trustedXForwardedFor": ["X-Forwarded-For"] }
Enter fullscreen mode Exit fullscreen mode

Настоящий IP клиента нам не нужен, поэтому заголовку можно доверять. Журнал соединений я тоже выключил ("access": "none"). Иначе каждое соединение вместе с адресом назначения оседало бы в логах хостинга: это и лишнее место, и лишние данные у провайдера.

4. Стабильный Xray слишком старый

Весной 2026 года в конфиге Xray переименовали clients в users. Последний стабильный релиз на GitHub (v26.3.27) нового поля не знает, а все следующие версии на момент написания помечены как pre-release. Поэтому setup.sh ставит самый свежий выпуск, включая pre-release.

Номер версии берётся не из GitHub API, а из RSS-ленты релизов. У alwaysdata исходящий IP общий для множества аккаунтов, и анонимный лимит запросов к API там легко исчерпать:

[[ $(curl -fsSL https://github.com/XTLS/Xray-core/releases.atom) =~ releases/tag/(v[0-9.]+) ]] ||
    { echo "Could not determine the latest Xray version" >&2; exit 1; }
Enter fullscreen mode Exit fullscreen mode

Скачанный архив проверяется по SHA-256 из файла .dgst, который Xray публикует рядом с каждым релизом:

curl -fsSLO "https://github.com/XTLS/Xray-core/releases/download/$XRAY_VERSION/$zip{,.dgst}"
echo "$(sed -n 's/^SHA2-256= //p' $zip.dgst)  $zip" | sha256sum -c --quiet
Enter fullscreen mode Exit fullscreen mode

Обратная сторона: следующий релиз может снова поменять формат конфига. Поэтому перед выдачей ссылки setup.sh проверяет конфиг через start.sh --check. После обновления всё равно стоит убедиться, что подключение работает.

5. Одна команда для macOS, Linux и Windows

install.sh по сути одна строка: упаковать скрипты в tar и распаковать на сервере в том же SSH-соединении. Пароль спрашивается один раз.

tar -cf - start.sh setup.sh | ssh "$1" \
    "tar -xf - -C ~ --exclude='._*' --warning=no-unknown-keyword && bash ~/setup.sh"
Enter fullscreen mode Exit fullscreen mode

Два флага на стороне сервера появились из-за macOS. Её tar добавляет в архив служебные файлы ._* и свои расширенные атрибуты, а GNU tar на Linux на них ругается. Проще отфильтровать мусор при распаковке, чем подбирать флаги под каждую ОС.

В Windows 10/11 уже есть ssh и tar, поэтому install.cmd — та же самая команда. Именно .cmd, а не PowerShell: Windows PowerShell 5.1 передаёт вывод между программами как текст и портит бинарный поток tar.

6. Проверка конфига без записи на диск

start.sh --check подставляет заглушки вместо IP и PORT и отдаёт конфиг Xray через stdin:

config | ./xray run -test -c stdin:
Enter fullscreen mode Exit fullscreen mode

Никаких временных файлов не остаётся. Если конфиг не собрался, установка остановится до того, как вы получите ссылку.

Что в итоге

  • Место: около 38 МБ из 100 МБ, почти всё занимает бинарник Xray.
  • Скорость: в моих замерах около 75–80 Мбит/с на скачивание.
  • Обновление: повторный запуск install.sh обновляет Xray и скрипты, UUID и ссылка не меняются. После этого нужно перезапустить сайт в панели.
  • Секреты: UUID и случайный путь XHTTP живут только на сервере, в secrets.env с правами 600.

Ограничения

  • Правила хостинга. Прокси на бесплатном тарифе запрещены, и аккаунт могут заблокировать. Для надёжного варианта нужен свой недорогой VPS. Я для этого сделал RosPanel, панель для Xray, которая ставится одной командой.
  • Раз в 120 дней нужно заходить в панель alwaysdata. Иначе бесплатный аккаунт приостановят.
  • Клиент должен быть на ядре Xray. Клиенты на sing-box (Hiddify, NekoBox и подобные) XHTTP могут не поддерживать.
  • Выход всегда с французского IP alwaysdata. Выбрать страну нельзя.

Ссылки

GitHub logo AppsGanin / alwaysdata-xray

Your own VLESS proxy (Xray over XHTTP) on the free alwaysdata hosting in a single command

Alwaysdata Xray

Your own VLESS proxy on free hosting in a single command. No VPS, no payment card.

Stars Xray-core VLESS over XHTTP alwaysdata free plan License: MIT

🚀 Quick start  ·  📱 Clients  ·  ❓ FAQ  ·  💝 Support

If the project helped you, give it a star! It's free and really keeps it going.

A personal Xray proxy (VLESS over XHTTP) on the free alwaysdata plan. Clients connect to https://<account>.alwaysdata.net traffic exits to the internet from a French alwaysdata IP.

Warning

The alwaysdata free plan forbids proxies, so the account may get suspended at any time. Keep a fallback.

✨ Features

  • 💸 Free: runs on the alwaysdata free plan, no VPS to rent or maintain
  • 🔒 Real HTTPS: alwaysdata serves the certificate for <account>.alwaysdata.net, Xray sits behind its proxy
  • One command: installs from macOS, Linux or Windows over a single SSH connection, so the password is asked once
  • Verified download: the Xray archive is…




Если проект пригодился, поставьте звезду на GitHub. Если нашли баг или есть идея, открывайте issue или присылайте PR.

Top comments (0)