Обновить autoXRAY.sh
This commit is contained in:
+843
@@ -0,0 +1,843 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Цвета для вывода
|
||||||
|
GRN='\033[1;32m'
|
||||||
|
RED='\033[1;31m'
|
||||||
|
YEL='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
[[ $EUID -eq 0 ]] || { echo -e "${RED}❌ скрипту нужны root права ${NC}"; exit 1; }
|
||||||
|
|
||||||
|
DOMAIN=$1
|
||||||
|
|
||||||
|
if [ -z "$DOMAIN" ]; then
|
||||||
|
echo -e "${RED}❌ Ошибка: домен не задан.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${YEL}Обновление и установка необходимых пакетов...${NC}"
|
||||||
|
apt-get update && apt-get install curl jq dnsutils openssl nginx certbot -y
|
||||||
|
systemctl enable --now nginx
|
||||||
|
|
||||||
|
LOCAL_IP=$(hostname -I | awk '{print $1}')
|
||||||
|
DNS_IP=$(dig +short "$DOMAIN" | grep '^[0-9]')
|
||||||
|
|
||||||
|
if [ "$LOCAL_IP" != "$DNS_IP" ]; then
|
||||||
|
echo -e "${RED}❌ Внимание: IP-адрес ($LOCAL_IP) не совпадает с A-записью $DOMAIN ($DNS_IP).${NC}"
|
||||||
|
echo -e "${YEL}Правильно укажите одну A-запись для вашего домена в ДНС - $LOCAL_IP ${NC}"
|
||||||
|
|
||||||
|
read -p "Продолжить на ваш страх и риск? (y/N):" choice
|
||||||
|
|
||||||
|
if [[ ! "$choice" =~ ^[Yy]$ ]]; then
|
||||||
|
echo -e "${RED}Выполнение скрипта прервано.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${YEL}Продолжение выполнения скрипта...${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Включаем BBR
|
||||||
|
bbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control)
|
||||||
|
if [ "$bbr" = "net.ipv4.tcp_congestion_control = bbr" ]; then
|
||||||
|
echo -e "${GRN}BBR уже запущен${NC}"
|
||||||
|
else
|
||||||
|
echo "net.core.default_qdisc=fq" > /etc/sysctl.d/999-autoXRAY.conf
|
||||||
|
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/999-autoXRAY.conf
|
||||||
|
sysctl --system
|
||||||
|
echo -e "${GRN}BBR активирован${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
cat <<EOF > /etc/security/limits.d/99-autoXRAY.conf
|
||||||
|
* soft nofile 65535
|
||||||
|
* hard nofile 65535
|
||||||
|
root soft nofile 65535
|
||||||
|
root hard nofile 65535
|
||||||
|
EOF
|
||||||
|
ulimit -n 65535
|
||||||
|
echo -e "${GRN}Лимиты применены. Текущий ulimit -n: $(ulimit -n) ${NC}"
|
||||||
|
|
||||||
|
|
||||||
|
# Создание директории сайта
|
||||||
|
WEB_PATH="/var/www/$DOMAIN"
|
||||||
|
mkdir -p "$WEB_PATH"
|
||||||
|
|
||||||
|
# Генерируем сайт маскировку
|
||||||
|
bash -c "$(curl -L https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/gen_page2.sh)" -- $WEB_PATH
|
||||||
|
|
||||||
|
# Установка Xray
|
||||||
|
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
|
||||||
|
|
||||||
|
# Блок CERTBOT - START
|
||||||
|
|
||||||
|
# Определяем путь к конфигу nginx
|
||||||
|
if [ -f /etc/nginx/sites-available/default ]; then
|
||||||
|
CONFIG_PATH="/etc/nginx/sites-available/default"
|
||||||
|
echo -e "${GRN}Обнаружена стандартная сборка nginx. ${NC}"
|
||||||
|
elif [ -f /etc/nginx/conf.d/default.conf ]; then
|
||||||
|
CONFIG_PATH="/etc/nginx/conf.d/default.conf"
|
||||||
|
echo -e "${YEL}Обнаружена нестандартная сборка nginx. Предварительная настройка NGINX для CERTBOT ${NC}"
|
||||||
|
mkdir -p /var/www/html
|
||||||
|
|
||||||
|
# Записываем временный конфиг
|
||||||
|
cat <<EOF > "$CONFIG_PATH"
|
||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/html;
|
||||||
|
allow all;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://\$host\$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
systemctl reload nginx
|
||||||
|
else
|
||||||
|
echo -e "${RED}Не найден ни один default конфиг nginx${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
mkdir -p /var/lib/xray/cert/
|
||||||
|
|
||||||
|
certbot certonly --webroot -w /var/www/html \
|
||||||
|
-d $DOMAIN \
|
||||||
|
-m mail@$DOMAIN \
|
||||||
|
--agree-tos --non-interactive \
|
||||||
|
--deploy-hook "systemctl reload nginx; cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /var/lib/xray/cert/fullchain.pem; cp /etc/letsencrypt/live/$DOMAIN/chain.pem /var/lib/xray/cert/chain.pem; cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /var/lib/xray/cert/privkey.pem; chmod 640 /var/lib/xray/cert/privkey.pem; chmod 644 /var/lib/xray/cert/fullchain.pem; chmod 644 /var/lib/xray/cert/chain.pem; systemctl restart xray"
|
||||||
|
|
||||||
|
RET=$?
|
||||||
|
|
||||||
|
if [ $RET -eq 0 ]; then
|
||||||
|
echo -e "\n${GRN}========================================"
|
||||||
|
echo "✅ Команда certbot успешно выполнена"
|
||||||
|
echo "✅ Сертификат https от letsencrypt ПОЛУЧЕН"
|
||||||
|
echo "========================================"
|
||||||
|
echo -e "${NC}"
|
||||||
|
# Копируем сертификаты для Xray и nginx (OCSP stapling)
|
||||||
|
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /var/lib/xray/cert/fullchain.pem
|
||||||
|
cp /etc/letsencrypt/live/$DOMAIN/chain.pem /var/lib/xray/cert/chain.pem
|
||||||
|
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /var/lib/xray/cert/privkey.pem
|
||||||
|
chmod 640 /var/lib/xray/cert/privkey.pem
|
||||||
|
chmod 644 /var/lib/xray/cert/fullchain.pem
|
||||||
|
chmod 644 /var/lib/xray/cert/chain.pem
|
||||||
|
else
|
||||||
|
echo -e "\n${RED}========================================"
|
||||||
|
echo "❌ CERTBOT ЗАВЕРШИЛСЯ С ОШИБКОЙ"
|
||||||
|
echo "❌ Сертификат https от letsencrypt НЕ ПОЛУЧЕН!"
|
||||||
|
echo "❌ Смотрите выше логи процесса получения сертификата"
|
||||||
|
echo "❌ Код возврата: $RET"
|
||||||
|
echo "========================================"
|
||||||
|
echo -e "${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Блок CERTBOT - END
|
||||||
|
|
||||||
|
# конфиг nginx
|
||||||
|
|
||||||
|
path_xhttp=$(openssl rand -base64 15 | tr -dc 'a-z0-9' | head -c 6)
|
||||||
|
|
||||||
|
path_subpage=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20)
|
||||||
|
configPageUser=$(cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 12)
|
||||||
|
configPagePass=$(cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%^&*_-' | head -c 20)
|
||||||
|
|
||||||
|
# Создаём http-уровневые директивы nginx: rate-limit зона и карта плохих ботов
|
||||||
|
mkdir -p /etc/nginx/conf.d
|
||||||
|
cat > /etc/nginx/conf.d/autoXRAY-security.conf <<'SECEOF'
|
||||||
|
limit_req_zone $binary_remote_addr zone=axray_proxy:10m rate=20r/m;
|
||||||
|
|
||||||
|
map $http_user_agent $axray_bad_bot {
|
||||||
|
default 0;
|
||||||
|
~*(masscan|zgrab|nmap|nikto|sqlmap|nuclei) 1;
|
||||||
|
}
|
||||||
|
SECEOF
|
||||||
|
echo "${configPageUser}:$(openssl passwd -apr1 "${configPagePass}")" > /etc/nginx/conf.d/autoXRAY-htpasswd
|
||||||
|
chmod 640 /etc/nginx/conf.d/autoXRAY-htpasswd
|
||||||
|
|
||||||
|
bash -c "cat > $CONFIG_PATH" <<EOF
|
||||||
|
server {
|
||||||
|
server_name $DOMAIN;
|
||||||
|
listen unix:/dev/shm/nginx.sock ssl http2 proxy_protocol;
|
||||||
|
set_real_ip_from unix:;
|
||||||
|
real_ip_header proxy_protocol;
|
||||||
|
server_tokens off;
|
||||||
|
|
||||||
|
root /var/www/$DOMAIN;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
ssl_session_timeout 1d;
|
||||||
|
ssl_session_cache shared:MozSSL:10m;
|
||||||
|
ssl_session_tickets off;
|
||||||
|
|
||||||
|
ssl_stapling on;
|
||||||
|
ssl_stapling_verify on;
|
||||||
|
ssl_trusted_certificate "/etc/letsencrypt/live/$DOMAIN/chain.pem";
|
||||||
|
resolver 8.8.8.8 1.1.1.1 valid=300s;
|
||||||
|
resolver_timeout 5s;
|
||||||
|
|
||||||
|
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header Referrer-Policy "no-referrer" always;
|
||||||
|
|
||||||
|
if (\$axray_bad_bot) {
|
||||||
|
return 444;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssl_certificate "/etc/letsencrypt/live/$DOMAIN/fullchain.pem";
|
||||||
|
ssl_certificate_key "/etc/letsencrypt/live/$DOMAIN/privkey.pem";
|
||||||
|
|
||||||
|
location = /${path_subpage}.json {
|
||||||
|
add_header profile-title "base64:YXV0b1hSQVk=";
|
||||||
|
add_header routing "happ://routing/onadd/eyJOYW1lIjoiYXV0b1hSQVkiLCJHbG9iYWxQcm94eSI6InRydWUiLCJSb3V0ZU9yZGVyIjoiYmxvY2stcHJveHktZGlyZWN0IiwiUmVtb3RlRE5TVHlwZSI6IkRvSCIsIlJlbW90ZUROU0RvbWFpbiI6Imh0dHBzOi8vZG5zLmdvb2dsZS9kbnMtcXVlcnkiLCJSZW1vdGVETlNJUCI6IjguOC40LjQiLCJEb21lc3RpY0ROU1R5cGUiOiJEb0giLCJEb21lc3RpY0ROU0RvbWFpbiI6Imh0dHBzOi8vY2xvdWRmbGFyZS1kbnMuY29tL2Rucy1xdWVyeSIsIkRvbWVzdGljRE5TSVAiOiIxLjEuMS4xIiwiR2VvaXB1cmwiOiJodHRwczovL2dpdGh1Yi5jb20vTG95YWxzb2xkaWVyL3YycmF5LXJ1bGVzLWRhdC9yZWxlYXNlcy9sYXRlc3QvZG93bmxvYWQvZ2VvaXAuZGF0IiwiR2Vvc2l0ZXVybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9Mb3lhbHNvbGRpZXIvdjJyYXktcnVsZXMtZGF0L3JlbGVhc2VzL2xhdGVzdC9kb3dubG9hZC9nZW9zaXRlLmRhdCIsIkxhc3RVcGRhdGVkIjoiMTc3NTIwNjEwOCIsIkRuc0hvc3RzIjp7fSwiRGlyZWN0U2l0ZXMiOlsiZ2Vvc2l0ZTpjYXRlZ29yeS1ydSIsImdlb3NpdGU6cHJpdmF0ZSJdLCJEaXJlY3RJcCI6WyJnZW9pcDpwcml2YXRlIl0sIlByb3h5U2l0ZXMiOltdLCJQcm94eUlwIjpbXSwiQmxvY2tTaXRlcyI6WyJnZW9zaXRlOmNhdGVnb3J5LWFkcyIsImdlb3NpdGU6d2luLXNweSJdLCJCbG9ja0lwIjpbXSwiRG9tYWluU3RyYXRlZ3kiOiJJUElmTm9uTWF0Y2giLCJGYWtlRE5TIjoiZmFsc2UiLCJVc2VDaHVua0ZpbGVzIjoiZmFsc2UifQ";
|
||||||
|
|
||||||
|
add_header routing-enable 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /${path_subpage}.html {
|
||||||
|
auth_basic "autoXRAY";
|
||||||
|
auth_basic_user_file /etc/nginx/conf.d/autoXRAY-htpasswd;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ /\.ht {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://\$host\$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl restart nginx
|
||||||
|
echo -e "${GRN}✅ Конфигурация nginx обновлена.${NC}"
|
||||||
|
|
||||||
|
|
||||||
|
SCRIPT_DIR=/usr/local/etc/xray
|
||||||
|
|
||||||
|
# Генерируем переменные
|
||||||
|
xray_uuid_vrv=$(xray uuid)
|
||||||
|
|
||||||
|
key_output=$(xray x25519)
|
||||||
|
xray_privateKey_vrv=$(echo "$key_output" | awk '/[Pp]rivate/ {print $NF}')
|
||||||
|
xray_publicKey_vrv=$(echo "$key_output" | awk '/[Pp]ublic/ {print $NF}')
|
||||||
|
|
||||||
|
key_mldsa65=$(xray mldsa65)
|
||||||
|
seed_mldsa65=$(echo "$key_mldsa65" | awk -F': ' '/Seed/ {print $2}')
|
||||||
|
verify_mldsa65=$(echo "$key_mldsa65" | awk -F': ' '/Verify/ {print $2}')
|
||||||
|
|
||||||
|
xray_shortIds_vrv=$(openssl rand -hex 8)
|
||||||
|
xray_shortIds_vrv2=$(openssl rand -hex 4)
|
||||||
|
xray_shortIds_vrv3=$(openssl rand -hex 6)
|
||||||
|
|
||||||
|
xray_fp="chrome"
|
||||||
|
|
||||||
|
# Случайный путь для Reality spider — имитирует реального посетителя
|
||||||
|
xray_spiderX="/$(openssl rand -base64 9 | tr -dc 'a-z' | head -c 6)/"
|
||||||
|
|
||||||
|
# xray_sspasw_vrv=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20)
|
||||||
|
xray_sspasw_vrv=$(openssl rand -base64 32)
|
||||||
|
|
||||||
|
# ipserv=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
|
socksUser=$(openssl rand -base64 16 | tr -dc 'A-Za-z0-9' | head -c 6)
|
||||||
|
socksPasw=$(openssl rand -base64 32 | tr -dc 'A-Za-z0-9' | head -c 16)
|
||||||
|
|
||||||
|
|
||||||
|
# Установка WARP-cli
|
||||||
|
# Посмотреть порт(2408): grep -r "Endpoint" /etc/wireguard/
|
||||||
|
if ss -tuln | grep -q ":40000 "; then
|
||||||
|
echo -e "${GRN}WARP-cli (Socks5 на порту 40000) уже работает. Пропускаем.${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GRN}Установка WARP-cli (автоматически)...${NC}"
|
||||||
|
echo -e "1\n1\n40000" | bash <(curl -fsSL https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh) w
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Экспортируем переменные для envsubst
|
||||||
|
export xray_uuid_vrv xray_privateKey_vrv xray_publicKey_vrv xray_shortIds_vrv xray_shortIds_vrv2 xray_shortIds_vrv3 xray_sspasw_vrv xray_fp xray_spiderX DOMAIN path_subpage path_xhttp WEB_PATH socksUser socksPasw
|
||||||
|
|
||||||
|
# Создаем JSON конфигурацию сервера
|
||||||
|
cat << 'EOF' | envsubst > "$SCRIPT_DIR/config.json"
|
||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"dnsLog": false,
|
||||||
|
"access": "/var/log/xray/access.log",
|
||||||
|
"error": "/var/log/xray/error.log",
|
||||||
|
"loglevel": "none"
|
||||||
|
},
|
||||||
|
"dns": {
|
||||||
|
"servers": [
|
||||||
|
"https+local://8.8.4.4/dns-query",
|
||||||
|
"https+local://8.8.8.8/dns-query",
|
||||||
|
"https+local://1.1.1.1/dns-query",
|
||||||
|
"localhost"
|
||||||
|
],
|
||||||
|
"queryStrategy": "UseIPv4"
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"tag": "vsRAWrtyVISION",
|
||||||
|
"port": 443,
|
||||||
|
"listen": "0.0.0.0",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"clients": [
|
||||||
|
{
|
||||||
|
"flow": "xtls-rprx-vision",
|
||||||
|
"id": "${xray_uuid_vrv}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"decryption": "none",
|
||||||
|
"fallbacks": [
|
||||||
|
{
|
||||||
|
"dest": "3333",
|
||||||
|
"xver": 2
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": [
|
||||||
|
"http",
|
||||||
|
"tls",
|
||||||
|
"quic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "raw",
|
||||||
|
"security": "reality",
|
||||||
|
"sockopt": {
|
||||||
|
"tcpFastOpen": true,
|
||||||
|
"tcpNoDelay": true
|
||||||
|
},
|
||||||
|
"realitySettings": {
|
||||||
|
"show": false,
|
||||||
|
"xver": 2,
|
||||||
|
"target": "/dev/shm/nginx.sock",
|
||||||
|
"spiderX": "${xray_spiderX}",
|
||||||
|
"shortIds": [
|
||||||
|
"${xray_shortIds_vrv}",
|
||||||
|
"${xray_shortIds_vrv2}",
|
||||||
|
"${xray_shortIds_vrv3}"
|
||||||
|
],
|
||||||
|
"privateKey": "${xray_privateKey_vrv}",
|
||||||
|
"serverNames": [
|
||||||
|
"$DOMAIN",
|
||||||
|
"www.microsoft.com",
|
||||||
|
"www.apple.com",
|
||||||
|
"discord.com",
|
||||||
|
"www.amazon.com"
|
||||||
|
],
|
||||||
|
"limitFallbackUpload": {
|
||||||
|
"afterBytes": 65536,
|
||||||
|
"bytesPerSec": 65536,
|
||||||
|
"burstBytesPerSec": 131072
|
||||||
|
},
|
||||||
|
"limitFallbackDownload": {
|
||||||
|
"afterBytes": 5242880,
|
||||||
|
"bytesPerSec": 262144,
|
||||||
|
"burstBytesPerSec": 2097152
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "vsXHTTPrty",
|
||||||
|
"port": 3333,
|
||||||
|
"listen": "127.0.0.1",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"clients": [
|
||||||
|
{
|
||||||
|
"id": "${xray_uuid_vrv}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"decryption": "none"
|
||||||
|
},
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": [
|
||||||
|
"http",
|
||||||
|
"tls",
|
||||||
|
"quic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "xhttp",
|
||||||
|
"xhttpSettings": {
|
||||||
|
"mode": "stream-one",
|
||||||
|
"path": "/${path_xhttp}"
|
||||||
|
},
|
||||||
|
"security": "none",
|
||||||
|
"sockopt": {
|
||||||
|
"acceptProxyProtocol": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "socks5",
|
||||||
|
"port": 10443,
|
||||||
|
"listen": "0.0.0.0",
|
||||||
|
"protocol": "mixed",
|
||||||
|
"settings": {
|
||||||
|
"ip": "0.0.0.0",
|
||||||
|
"udp": true,
|
||||||
|
"auth": "password",
|
||||||
|
"accounts": [
|
||||||
|
{
|
||||||
|
"user": "${socksUser}",
|
||||||
|
"pass": "${socksPasw}"
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"tag": "direct",
|
||||||
|
"protocol": "freedom",
|
||||||
|
"settings": {
|
||||||
|
"domainStrategy": "ForceIPv4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "block",
|
||||||
|
"protocol": "blackhole"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "warp",
|
||||||
|
"protocol": "socks",
|
||||||
|
"settings": {
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": 40000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"routing": {
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"ip": [
|
||||||
|
"geoip:private"
|
||||||
|
],
|
||||||
|
"outboundTag": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"port": "25",
|
||||||
|
"outboundTag": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"protocol": [
|
||||||
|
"bittorrent"
|
||||||
|
],
|
||||||
|
"outboundTag": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain": [
|
||||||
|
"geosite:category-ads",
|
||||||
|
"geosite:win-spy",
|
||||||
|
"geosite:private"
|
||||||
|
],
|
||||||
|
"outboundTag": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"outboundTag": "warp",
|
||||||
|
"domain": ["ifconfig.me","checkip.amazonaws.com","pify.org","2ip.io","habr.com","geosite:category-ip-geo-detect","geosite:google-gemini","geosite:canva","geosite:openai","geosite:whatsapp","geosite:category-ru"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"domainStrategy": "IPIfNonMatch"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создаем JSON конфигурацию клиента
|
||||||
|
print_config() {
|
||||||
|
local PROXY_OUTBOUND="$1"
|
||||||
|
local REMARK="$2"
|
||||||
|
|
||||||
|
cat << TPL
|
||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"loglevel": "warning"
|
||||||
|
},
|
||||||
|
"dns": {
|
||||||
|
"servers": [
|
||||||
|
"https://8.8.4.4/dns-query",
|
||||||
|
"https://8.8.8.8/dns-query",
|
||||||
|
"https://1.1.1.1/dns-query"
|
||||||
|
],
|
||||||
|
"queryStrategy": "UseIPv4"
|
||||||
|
},
|
||||||
|
"routing": {
|
||||||
|
"domainStrategy": "IPIfNonMatch",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"domain": [
|
||||||
|
"geosite:category-ads",
|
||||||
|
"geosite:win-spy"
|
||||||
|
],
|
||||||
|
"outboundTag": "block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"protocol": [
|
||||||
|
"bittorrent"
|
||||||
|
],
|
||||||
|
"outboundTag": "direct"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain": [
|
||||||
|
"habr.com", "apkmirror.com"
|
||||||
|
],
|
||||||
|
"outboundTag": "proxy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain": [
|
||||||
|
"geosite:private",
|
||||||
|
"ifconfig.me",
|
||||||
|
"checkip.amazonaws.com",
|
||||||
|
"pify.org",
|
||||||
|
"geosite:category-ip-geo-detect",
|
||||||
|
"geosite:apple",
|
||||||
|
"geosite:apple-pki",
|
||||||
|
"geosite:huawei",
|
||||||
|
"geosite:xiaomi",
|
||||||
|
"geosite:category-android-app-download",
|
||||||
|
"geosite:f-droid",
|
||||||
|
"geosite:yandex",
|
||||||
|
"geosite:vk",
|
||||||
|
"geosite:microsoft",
|
||||||
|
"geosite:win-update",
|
||||||
|
"geosite:win-extra",
|
||||||
|
"geosite:google-play",
|
||||||
|
"geosite:steam",
|
||||||
|
"geosite:category-ru"
|
||||||
|
],
|
||||||
|
"outboundTag": "direct"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip": [
|
||||||
|
"geoip:private"
|
||||||
|
],
|
||||||
|
"outboundTag": "direct"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"tag": "socks-in",
|
||||||
|
"protocol": "socks",
|
||||||
|
"listen": "127.0.0.1",
|
||||||
|
"port": 10808,
|
||||||
|
"settings": {
|
||||||
|
"udp": true
|
||||||
|
},
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": [
|
||||||
|
"http",
|
||||||
|
"tls",
|
||||||
|
"quic"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "socks-sb",
|
||||||
|
"protocol": "socks",
|
||||||
|
"listen": "127.0.0.1",
|
||||||
|
"port": 2080,
|
||||||
|
"settings": {
|
||||||
|
"udp": true
|
||||||
|
},
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": [
|
||||||
|
"http",
|
||||||
|
"tls",
|
||||||
|
"quic"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "http-in",
|
||||||
|
"protocol": "http",
|
||||||
|
"listen": "127.0.0.1",
|
||||||
|
"port": 10809,
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": [
|
||||||
|
"http",
|
||||||
|
"tls",
|
||||||
|
"quic"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outbounds": [
|
||||||
|
$PROXY_OUTBOUND,
|
||||||
|
{
|
||||||
|
"tag": "direct",
|
||||||
|
"protocol": "freedom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "block",
|
||||||
|
"protocol": "blackhole"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"remarks": "$REMARK"
|
||||||
|
}
|
||||||
|
TPL
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Config 1
|
||||||
|
OUT_REALITY_VISION='{
|
||||||
|
"mux": { "concurrency": -1, "enabled": false },
|
||||||
|
"tag": "proxy",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"vnext": [{
|
||||||
|
"address": "$DOMAIN",
|
||||||
|
"port": 443,
|
||||||
|
"users": [{ "id": "${xray_uuid_vrv}", "flow": "xtls-rprx-vision", "encryption": "none" }]
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "raw",
|
||||||
|
"security": "reality",
|
||||||
|
"realitySettings": {
|
||||||
|
"show": false, "fingerprint": "${xray_fp}", "serverName": "$DOMAIN",
|
||||||
|
"password": "${xray_publicKey_vrv}", "shortId": "${xray_shortIds_vrv}", "spiderX": "${xray_spiderX}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
# --- Config 2
|
||||||
|
OUT_REALITY_XHTTP='{
|
||||||
|
"mux": { "concurrency": -1, "enabled": false },
|
||||||
|
"tag": "proxy",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"vnext": [{
|
||||||
|
"address": "$DOMAIN",
|
||||||
|
"port": 443,
|
||||||
|
"users": [{ "id": "${xray_uuid_vrv}", "encryption": "none" }]
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "xhttp",
|
||||||
|
"security": "reality",
|
||||||
|
"xhttpSettings": {
|
||||||
|
"mode": "stream-one",
|
||||||
|
"path": "/${path_xhttp}",
|
||||||
|
"extra": {
|
||||||
|
"noGRPCHeader": true,
|
||||||
|
"scMaxEachPostBytes": 1500000,
|
||||||
|
"scMinPostsIntervalMs": 20,
|
||||||
|
"scStreamUpServerSecs": "60-240",
|
||||||
|
"xPaddingBytes": "100-1500",
|
||||||
|
"xmux": {
|
||||||
|
"cMaxReuseTimes": "1000-3000",
|
||||||
|
"hKeepAlivePeriod": 300,
|
||||||
|
"hMaxRequestTimes": "400-700",
|
||||||
|
"hMaxReusableSecs": "1200-1800",
|
||||||
|
"maxConcurrency": "3-5",
|
||||||
|
"maxConnections": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"realitySettings": {
|
||||||
|
"show": false, "fingerprint": "${xray_fp}", "serverName": "$DOMAIN",
|
||||||
|
"password": "${xray_publicKey_vrv}", "shortId": "${xray_shortIds_vrv}", "spiderX": "${xray_spiderX}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(
|
||||||
|
echo "["
|
||||||
|
print_config "$OUT_REALITY_XHTTP" "🇪🇺 VLESS XHTTP REALITY EXTRA"
|
||||||
|
echo ","
|
||||||
|
print_config "$OUT_REALITY_VISION" "🇪🇺 VLESS RAW REALITY VISION"
|
||||||
|
echo "]"
|
||||||
|
) | envsubst > "$WEB_PATH/$path_subpage.json"
|
||||||
|
|
||||||
|
systemctl restart xray
|
||||||
|
echo -e "Перезапуск XRAY"
|
||||||
|
|
||||||
|
# Формирование ссылок
|
||||||
|
subPageLink="https://$DOMAIN/$path_subpage.json"
|
||||||
|
|
||||||
|
# Формирование ссылок
|
||||||
|
linkRTY1="vless://${xray_uuid_vrv}@$DOMAIN:443?security=reality&type=tcp&headerType=&path=&host=&flow=xtls-rprx-vision&sni=$DOMAIN&fp=${xray_fp}&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#vlessRAWrealityVISION-autoXRAY"
|
||||||
|
|
||||||
|
linkRTY2="vless://${xray_uuid_vrv}@$DOMAIN:443?security=reality&type=xhttp&headerType=&path=%2F$path_xhttp&host=&mode=stream-one&extra=%7B%22xmux%22%3A%7B%22cMaxReuseTimes%22%3A%221000-3000%22%2C%22maxConcurrency%22%3A%223-5%22%2C%22maxConnections%22%3A0%2C%22hKeepAlivePeriod%22%3A300%2C%22hMaxRequestTimes%22%3A%22400-700%22%2C%22hMaxReusableSecs%22%3A%221200-1800%22%7D%2C%22headers%22%3A%7B%7D%2C%22noGRPCHeader%22%3Atrue%2C%22xPaddingBytes%22%3A%22100-1500%22%2C%22scMaxEachPostBytes%22%3A1500000%2C%22scMinPostsIntervalMs%22%3A20%2C%22scStreamUpServerSecs%22%3A%2260-240%22%7D&sni=$DOMAIN&fp=${xray_fp}&pbk=${xray_publicKey_vrv}&sid=${xray_shortIds_vrv}&spx=%2F#vlessXHTTPrealityEXTRA-autoXRAY"
|
||||||
|
|
||||||
|
configListLink="https://$DOMAIN/$path_subpage.html"
|
||||||
|
|
||||||
|
CONFIGS_ARRAY=(
|
||||||
|
"VLESS XHTTP REALITY EXTRA (для моста)|$linkRTY2"
|
||||||
|
"VLESS RAW REALITY VISION|$linkRTY1"
|
||||||
|
)
|
||||||
|
ALL_LINKS_TEXT=""
|
||||||
|
|
||||||
|
# --- ЗАПИСЬ HEAD (СТАТИКА, МИНИФИЦИРОВАННЫЕ СТИЛИ И JS) ---
|
||||||
|
cat > "$WEB_PATH/$path_subpage.html" <<'EOF'
|
||||||
|
<!DOCTYPE html><html lang="ru"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
|
<meta name="robots" content="noindex,nofollow">
|
||||||
|
<title>autoXRAY configs</title>
|
||||||
|
<link rel="icon" type="image/svg+xml" href='data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDBCRkZGIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDJsLTIgMm0tNy42MSA3LjYxYTUuNSA1LjUgMCAxIDEtNy43NzggNy43NzggNS41IDUuNSAwIDAgMSA3Ljc3Ny03Ljc3N3ptMCAwTDE1LjUgNy41bTAgMGwzIDNMMjIgN2wtMy0zbS0zLjUgMy41TDE5IDQiLz48L3N2Zz4='>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
|
||||||
|
<style>
|
||||||
|
body{font-family:monospace;background:#121212;color:#e0e0e0;padding:10px;max-width:900px;margin:0 auto}h2{color:#c3e88d;border-top:2px solid #333;padding-top:20px;margin:15px 0 10px;font-size:18px}.config-row{background:#1e1e1e;border:1px solid #333;border-radius:6px;padding:5px;display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px}.config-label{background:#2c2c2c;color:#82aaff;padding:6px 10px;border-radius:4px;font-weight:700;font-size:13px;white-space:nowrap;min-width:140px;text-align:center}.config-code{flex:1;white-space:nowrap;overflow-x:auto;padding:8px;background:#121212;border-radius:4px;color:#c3e88d;font-size:12px;scrollbar-width:none}.config-code::-webkit-scrollbar{display:none}.btn-action{border:1px solid #555;padding:6px 12px;border-radius:4px;cursor:pointer;font-weight:700;font-size:12px;transition:all .2s;height:32px;display:flex;align-items:center;justify-content:center}.copy-btn{background:#333;color:#e0e0e0;min-width:60px}.copy-btn:hover{background:#c3e88d;color:#121212;border-color:#c3e88d}.qr-btn{background:#333;color:#82aaff;border-color:#82aaff;min-width:40px}.qr-btn:hover{background:#82aaff;color:#121212}.btn-group{display:flex;gap:10px;margin:10px 0 20px}.btn{flex:1;background:#2c2c2c;color:#c3e88d;border:1px solid #c3e88d;padding:10px;text-align:center;border-radius:6px;text-decoration:none;font-weight:700;font-size:14px}.btn:hover{background:#c3e88d;color:#121212}.btn.download{border-color:#82aaff;color:#82aaff}.btn.download:hover{background:#82aaff;color:#121212}.btn.tg{border-color:#2AABEE;color:#2AABEE}.btn.tg:hover{background:#2AABEE;color:#fff}.modal-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.85);z-index:999;justify-content:center;align-items:center;backdrop-filter:blur(3px)}.modal-content{background:#1e1e1e;padding:20px;border-radius:10px;border:1px solid #82aaff;text-align:center}#qrcode{background:#fff;padding:10px;border-radius:6px;margin-bottom:10px}.close-modal-btn{background:#c31e1e;color:#fff;border:none;padding:8px 20px;border-radius:4px;cursor:pointer}@media(max-width:600px){.config-label{width:100%;margin-bottom:2px}.config-code{min-width:100%;order:3}.btn-action{flex:1;order:2}}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
function copyText(e,t){navigator.clipboard.writeText(document.getElementById(e).innerText).then(()=>{let o=t.innerText;t.innerText="OK",t.style.cssText="background:#c3e88d;color:#121212",setTimeout(()=>{t.innerText=o,t.style.cssText=""},1500)}).catch(e=>console.error(e))}function showQR(e){let t=document.getElementById(e).innerText,o=document.getElementById("qrModal"),n=document.getElementById("qrcode");n.innerHTML="",new QRCode(n,{text:t,width:256,height:256,colorDark:"#000000",colorLight:"#ffffff",correctLevel:QRCode.CorrectLevel.L}),o.style.display="flex"}function closeModal(){document.getElementById("qrModal").style.display="none"}window.onclick=function(e){e.target==document.getElementById("qrModal")&&closeModal()};
|
||||||
|
</script>
|
||||||
|
</head><body>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# --- ЗАПИСЬ BODY (ДИНАМИЧЕСКИЕ ДАННЫЕ) ---
|
||||||
|
cat >> "$WEB_PATH/$path_subpage.html" <<EOF
|
||||||
|
|
||||||
|
<h2>📂 Ссылка на подписку (готовый конфиг клиента с роутингом)</h2>
|
||||||
|
<div class="config-row">
|
||||||
|
<div class="config-label">Subscription</div>
|
||||||
|
<div class="config-code" id="subLink">$subPageLink</div>
|
||||||
|
<button class="btn-action copy-btn" onclick="copyText('subLink', this)">Copy</button>
|
||||||
|
<button class="btn-action qr-btn" onclick="showQR('subLink')">QR</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>📱 Приложение HAPP (Windows/Android/iOS/MAC/Linux)</h2>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<a href="happ://add/$subPageLink" class="btn">⚡ Add to HAPP</a>
|
||||||
|
<a href="https://www.happ.su/main/ru" target="_blank" class="btn download">⬇️ Download App</a>
|
||||||
|
</div>
|
||||||
|
<p>Маршрутизацию нужно выключить, она тут встроенная. По умолчанию она выключена - включается, если вы пользовались сторонними сервисами.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>➡️ Конфиги</h2>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Цикл генерации строк конфигов
|
||||||
|
idx=1
|
||||||
|
for item in "${CONFIGS_ARRAY[@]}"; do
|
||||||
|
title="${item%%|*}"
|
||||||
|
link="${item#*|}"
|
||||||
|
|
||||||
|
if [ -z "$ALL_LINKS_TEXT" ]; then ALL_LINKS_TEXT="$link"; else ALL_LINKS_TEXT="$ALL_LINKS_TEXT<br>$link"; fi
|
||||||
|
|
||||||
|
cat >> "$WEB_PATH/$path_subpage.html" <<EOF
|
||||||
|
<div class="config-row">
|
||||||
|
<div class="config-label">$title</div>
|
||||||
|
<div class="config-code" id="c$idx">$link</div>
|
||||||
|
<button class="btn-action copy-btn" onclick="copyText('c$idx', this)">Copy</button>
|
||||||
|
<button class="btn-action qr-btn" onclick="showQR('c$idx')">QR</button>
|
||||||
|
</div>
|
||||||
|
EOF
|
||||||
|
((idx++))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Дописываем Socks5, All links и подвал
|
||||||
|
cat >> "$WEB_PATH/$path_subpage.html" <<EOF
|
||||||
|
<div class="config-row">
|
||||||
|
<div class="config-label">Socks5 (TG)</div>
|
||||||
|
<div class="config-code" id="sock">server=$DOMAIN port=10443 user=${socksUser} pass=${socksPasw}</div>
|
||||||
|
<button class="btn-action copy-btn" onclick="copyText('sock', this)">Copy</button>
|
||||||
|
<a href="https://t.me/socks?server=$DOMAIN&port=10443&user=${socksUser}&pass=${socksPasw}" target="_blank" class="btn-action qr-btn" title="автодобавление в тг" style="text-decoration:none">✈️ Add to TG</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>💠 Все конфиги вместе</h2>
|
||||||
|
<div class="config-row">
|
||||||
|
<div class="config-code" id="cAll" style="max-height:60px;white-space:pre-wrap;word-break:break-all">$ALL_LINKS_TEXT</div>
|
||||||
|
<button class="btn-action copy-btn" onclick="copyText('cAll', this)">Copy ALL</button>
|
||||||
|
<button class="btn-action qr-btn" onclick="showQR('cAll')">QR</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div><a style="color:white;margin:40px auto 20px;display:block;text-align:center;" href="https://github.com/xVRVx/autoXRAY">https://github.com/xVRVx/autoXRAY</a></div>
|
||||||
|
|
||||||
|
<div id="qrModal" class="modal-overlay"><div class="modal-content"><div id="qrcode"></div><button class="close-modal-btn" onclick="closeModal()">Close</button></div></div>
|
||||||
|
</body></html>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# --- ФИНАЛЬНАЯ ПРОВЕРКА ---
|
||||||
|
echo -e "\n${YEL}=== Финальная проверка статусов ===${NC}"
|
||||||
|
|
||||||
|
# Проверка WARP-cli (Socks5 порт 40000)
|
||||||
|
if ss -nlt | grep -q ":40000\b"; then
|
||||||
|
echo -e "WARP-cli: ${GRN}LISTENING${NC}"
|
||||||
|
else
|
||||||
|
echo -e "WARP-cli: ${RED}NOT LISTENING${NC}"
|
||||||
|
echo "Возникла ошибка! Возможные пути решения проблемы смотрите здесь:"
|
||||||
|
echo "https://github.com/xVRVx/autoXRAY/blob/main/test/warp-readme.md"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка Nginx
|
||||||
|
if systemctl is-active --quiet nginx; then
|
||||||
|
echo -e "Nginx: ${GRN}RUNNING${NC}"
|
||||||
|
else
|
||||||
|
echo -e "Nginx: ${RED}STOPPED/ERROR${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка XRAY
|
||||||
|
if systemctl is-active --quiet xray; then
|
||||||
|
echo -e "XRAY: ${GRN}RUNNING${NC}"
|
||||||
|
else
|
||||||
|
echo -e "XRAY: ${RED}STOPPED/ERROR${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "
|
||||||
|
|
||||||
|
${YEL}VLESS XHTTP REALITY EXTRA (для моста) ${NC}
|
||||||
|
$linkRTY2
|
||||||
|
|
||||||
|
${YEL}VLESS RAW REALITY VISION ${NC}
|
||||||
|
$linkRTY1
|
||||||
|
|
||||||
|
${YEL}Ваша json страничка подписки ${NC}
|
||||||
|
$subPageLink
|
||||||
|
|
||||||
|
${YEL}Ссылка на сохраненные конфиги ${NC}
|
||||||
|
${GRN}$configListLink ${NC}
|
||||||
|
|
||||||
|
${YEL}Страница конфигов — Basic Auth:${NC}
|
||||||
|
Логин: ${GRN}$configPageUser${NC}
|
||||||
|
Пароль: ${GRN}$configPagePass${NC}
|
||||||
|
|
||||||
|
Скопируйте подписку в специализированное приложение:
|
||||||
|
- iOS: Happ или v2RayTun или v2rayN
|
||||||
|
- Android: Happ или v2RayTun или v2rayNG
|
||||||
|
- Windows: конфиги Happ или winLoadXRAY или v2rayN
|
||||||
|
для vless v2RayTun или Throne
|
||||||
|
|
||||||
|
Открыт локальный socks5 на порту 10808, 2080 и http на 10809.
|
||||||
|
|
||||||
|
${GRN}Поддержать автора: https://github.com/xVRVx/autoXRAY ${NC}
|
||||||
|
|
||||||
|
"
|
||||||
|
|||||||
Reference in New Issue
Block a user