Мне был нужен свой прокси за границей, но платить за 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
В репозитории три скрипта:
-
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
На 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#<аккаунт>
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
Грабли
Сама идея простая. Интересное началось, когда я гонял это на настоящем 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}"
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"] }
Настоящий 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; }
Скачанный архив проверяется по 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
Обратная сторона: следующий релиз может снова поменять формат конфига. Поэтому перед выдачей ссылки 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"
Два флага на стороне сервера появились из-за 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:
Никаких временных файлов не остаётся. Если конфиг не собрался, установка остановится до того, как вы получите ссылку.
Что в итоге
- Место: около 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. Выбрать страну нельзя.
Ссылки
AppsGanin
/
alwaysdata-xray
Your own VLESS proxy (Xray over XHTTP) on the free alwaysdata hosting in a single command
Your own VLESS proxy on free hosting in a single command. No VPS, no payment card.
🚀 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)