diff --git a/old/autoXRAYselfTLS2.sh b/old/autoXRAYselfTLS2.sh new file mode 100644 index 0000000..b872868 --- /dev/null +++ b/old/autoXRAYselfTLS2.sh @@ -0,0 +1,1008 @@ +#!/bin/bash + +DOMAIN=$1 + +if [ -z "$DOMAIN" ]; then + echo "❌ Ошибка: домен не задан." + exit 1 +fi + +echo "Обновление и установка необходимых пакетов..." +apt update && apt install -y jq dnsutils + + +LOCAL_IP=$(hostname -I | awk '{print $1}') +DNS_IP=$(dig +short "$DOMAIN" | grep '^[0-9]') + +if [ "$LOCAL_IP" != "$DNS_IP" ]; then + echo "❌ Внимание: IP-адрес ($LOCAL_IP) не совпадает с A-записью $DOMAIN ($DNS_IP)." + echo "Правильно укажите одну A-запись для вашего домена в ДНС - $LOCAL_IP" + + read -p "Продолжить на ваш страх и риск? (y/N): " choice + if [[ ! "$choice" =~ ^[Yy]$ ]]; then + echo "Выполнение скрипта прервано." + exit 1 + fi + echo "Продолжение выполнения скрипта..." +fi + + +apt install nginx -y + +systemctl enable --now nginx + +apt install certbot -y + +mkdir -p /var/lib/xray/cert/ + +### Проверить +cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /var/lib/xray/cert/fullchain.pem +cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /var/lib/xray/cert/privkey.pem +chmod 744 /var/lib/xray/cert/privkey.pem +chmod 744 /var/lib/xray/cert/fullchain.pem + +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/privkey.pem /var/lib/xray/cert/privkey.pem; chmod 744 /var/lib/xray/cert/privkey.pem; chmod 744 /var/lib/xray/cert/fullchain.pem; systemctl restart xray" + +CONFIG_PATH="/etc/nginx/sites-available/default" + +path_xhttp=$(openssl rand -base64 15 | tr -dc 'a-z0-9' | head -c 6) + +echo "✅ Записываем конфигурацию в $CONFIG_PATH для домена $DOMAIN" + +bash -c "cat > $CONFIG_PATH" < "$WEB_PATH/index.html" < + + + + + $TITLE + + + + + +
+

$HEADER

+
+
+ + +
+
+ + +
+ +
+
+ + +EOF + + + +# Установка Xray +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install + + +# Определяем директорию скрипта +#SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) +SCRIPT_DIR=/usr/local/etc/xray + +# Генерируем переменные +xray_uuid_vrv=$(xray uuid) + +key_output=$(xray x25519) +xray_privateKey_vrv=$(echo "$key_output" | awk -F': ' '/PrivateKey/ {print $2}') +xray_publicKey_vrv=$(echo "$key_output" | awk -F': ' '/Password/ {print $2}') + +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_sspasw_vrv=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20) +xray_sspasw_vrv=$(openssl rand -base64 32) + +path_subpage=$(openssl rand -base64 15 | tr -dc 'A-Za-z0-9' | head -c 20) + +socksUser=$(openssl rand -base64 20 | tr -dc 'A-Za-z0-9' | head -c 5) +socksPasw=$(openssl rand -base64 20 | tr -dc 'A-Za-z0-9' | head -c 10) + +# ipserv=$(hostname -I | awk '{print $1}') + + + +# Экспортируем переменные для envsubst +export xray_uuid_vrv xray_privateKey_vrv xray_publicKey_vrv xray_shortIds_vrv xray_sspasw_vrv 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": "vsTCPxtls", + "port": 443, + "listen": "0.0.0.0", + "protocol": "vless", + "settings": { + "clients": [ + { + "flow": "xtls-rprx-vision", + "id": "${xray_uuid_vrv}" + } + ], + "decryption": "none", + "fallbacks": [ + { + "path": "/${path_xhttp}22", + "dest": "@vless-ws", + "xver": 2 + }, + { + "path": "/${path_xhttp}33", + "dest": "@vless-tcp", + "xver": 2 + }, + { + "alpn": "h2", + "dest": "/dev/shm/nginx_h2.sock", + "xver": 2 + }, + { + "dest": "/dev/shm/nginx.sock", + "xver": 2 + } + ] + }, + "streamSettings": { + "network": "raw", + "security": "tls", + "tlsSettings": { + "certificates": [ + { + "certificateFile": "/var/lib/xray/cert/fullchain.pem", + "keyFile": "/var/lib/xray/cert/privkey.pem" + } + ], + "minVersion": "1.2", + "cipherSuites": "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", + "alpn": [ + "h2", "http/1.1" + ] + } + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls", + "quic" + ] + } + }, + { + "tag": "vsXHTTPtls", + "port": 8400, + "listen": "127.0.0.1", + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "${xray_uuid_vrv}" + } + ], + "decryption": "none" + }, + "streamSettings": { + "network": "xhttp", + "xhttpSettings": { + "mode": "auto", + "path": "/${path_xhttp}" + }, + "security": "none", + "sockopt": { + "acceptProxyProtocol": false + } + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls", + "quic" + ] + } + }, + { + "tag": "vsGRPCtls", + "port": 8411, + "listen": "127.0.0.1", + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "${xray_uuid_vrv}" + } + ], + "decryption": "none" + }, + "streamSettings": { + "network": "grpc", + "grpcSettings": { + "serviceName": "${path_xhttp}11" + }, + "security": "none" + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls", + "quic" + ] + } + }, + { + "listen": "@vless-ws", + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "${xray_uuid_vrv}" + } + ], + "decryption": "none" + }, + "streamSettings": { + "network": "ws", + "wsSettings": { + "acceptProxyProtocol": true, + "path": "/${path_xhttp}22" + }, + "security": "none" + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls", + "quic" + ] + } + }, + { + "listen": "@vless-tcp", + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "${xray_uuid_vrv}" + } + ], + "decryption": "none" + }, + "streamSettings": { + "network": "raw", + "security": "none", + "rawSettings": { + "acceptProxyProtocol": true, + "header": { + "type": "http", + "request": { + "path": [ + "/${path_xhttp}33" + ] + } + } + } + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls", + "quic" + ] + } + }, + { + "tag": "ShadowSocks2022", + "port": 8443, + "listen": "0.0.0.0", + "protocol": "shadowsocks", + "settings": { + "method": "2022-blake3-aes-256-gcm", + "password": "${xray_sspasw_vrv}", + "network": "tcp,udp" + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls", + "quic" + ] + } + }, + { + "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" + }, + { + "protocol": [ + "bittorrent" + ], + "outboundTag": "block" + }, + { + "domain": [ + "geosite:category-ads", + "geosite:win-spy", + "geosite:private" + ], + "outboundTag": "block" + }, + { + "outboundTag": "direct", + "domain": ["geosite:google-gemini","geosite:category-ru","habr.com"] + } + ], + "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" + ], + "outboundTag": "proxy" + }, + { + "domain": [ + "geosite:private", + "geosite:apple", + "geosite:google-play", + "geosite:yandex", + "geosite:vk", + "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 +} + +# --- 1. VLESS TCP XTLS-Vision (Основной, самый быстрый) --- +OUT_VISION='{ + "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": "tls", + "tlsSettings": { + "serverName": "$DOMAIN", + "fingerprint": "chrome" + } + } +}' + +# --- 2. VLESS XHTTP (Через Fallback Nginx) --- +OUT_XHTTP='{ + "tag": "proxy", + "protocol": "vless", + "settings": { + "vnext": [{ + "address": "$DOMAIN", + "port": 443, + "users": [{ "id": "${xray_uuid_vrv}", "encryption": "none" }] + }] + }, + "streamSettings": { + "network": "xhttp", + "xhttpSettings": { + "extra": { + "headers": { + }, + "noGRPCHeader": false, + "scMaxEachPostBytes": 1500000, + "scMinPostsIntervalMs": 20, + "scStreamUpServerSecs": "60-240", + "xPaddingBytes": "400-800", + "xmux": { + "cMaxReuseTimes": "1000-3000", + "hKeepAlivePeriod": 0, + "hMaxRequestTimes": "400-700", + "hMaxReusableSecs": "1200-1800", + "maxConcurrency": "3-5", + "maxConnections": 0 + } + }, + "mode": "auto", "path": "/${path_xhttp}" }, + "security": "tls", + "tlsSettings": { "serverName": "$DOMAIN", "fingerprint": "chrome" } + } +}' + +# --- 3. VLESS gRPC (Через Fallback Nginx) --- +# Важно: alpn h2 обязателен для корректной работы через Nginx +OUT_GRPC='{ + "tag": "proxy", + "protocol": "vless", + "settings": { + "vnext": [{ + "address": "$DOMAIN", + "port": 443, + "users": [{ "id": "${xray_uuid_vrv}", "encryption": "none" }] + }] + }, + "streamSettings": { + "network": "grpc", + "grpcSettings": { "serviceName": "${path_xhttp}11", "multiMode": false }, + "security": "tls", + "tlsSettings": { "serverName": "$DOMAIN", "alpn": ["h2"], "fingerprint": "chrome" } + } +}' + +# --- 4. VLESS WebSocket (Внутренний Fallback Xray path...22) --- +OUT_WS='{ + "tag": "proxy", + "protocol": "vless", + "settings": { + "vnext": [{ + "address": "$DOMAIN", + "port": 443, + "users": [{ "id": "${xray_uuid_vrv}", "encryption": "none" }] + }] + }, + "streamSettings": { + "network": "ws", + "wsSettings": { "path": "/${path_xhttp}22" }, + "security": "tls", + "tlsSettings": { "serverName": "$DOMAIN", "fingerprint": "chrome" } + } +}' + +# --- 5. VLESS TCP Header (Внутренний Fallback Xray path...33) --- +OUT_TCP_HTTP='{ + "mux": { + "concurrency": 5, + "enabled": true, + "xudpConcurrency": 8, + "xudpProxyUDP443": "allow" + }, + "tag": "proxy", + "protocol": "vless", + "settings": { + "vnext": [{ + "address": "$DOMAIN", + "port": 443, + "users": [{ "id": "${xray_uuid_vrv}", "encryption": "none" }] + }] + }, + "streamSettings": { + "network": "raw", + "rawSettings": { + "header": { "type": "http", "request": { "path": ["/${path_xhttp}33"] } } + }, + "security": "tls", + "tlsSettings": { "serverName": "$DOMAIN", "fingerprint": "chrome" } + } +}' + +# --- 6. ShadowSocks 2022 (Порт 8443) --- +OUT_SS='{ + "tag": "proxy", + "protocol": "shadowsocks", + "settings": { + "servers": [{ + "address": "$DOMAIN", + "port": 8443, + "method": "2022-blake3-aes-256-gcm", + "password": "${xray_sspasw_vrv}" + }] + } +}' + +# 3. Сборка и генерация файла +# Используем subshell ( ) чтобы объединить выводы и передать в envsubst один раз +( + echo "[" + print_config "$OUT_VISION" "🇪🇺 VLESS RAW XTLS-Vision" + echo "," + print_config "$OUT_XHTTP" "🇪🇺 VLESS XHTTP TLS EXTRA" + echo "," + print_config "$OUT_GRPC" "🇪🇺 VLESS gRPC TLS" + echo "," + print_config "$OUT_WS" "🇪🇺 VLESS WebSocket TLS" + echo "," + print_config "$OUT_TCP_HTTP" "🇪🇺 VLESS RAW TLS MUX" + echo "," + print_config "$OUT_SS" "🇪🇺 ShadowSocks2022" + echo "]" +) | envsubst > "$WEB_PATH/$path_subpage.json" + + +# Перезапуск Xray +echo "Перезапуск Xray..." +systemctl restart xray +echo -e "Готово!\n" + +# Формирование ссылок +subPageLink="https://$DOMAIN/$path_subpage.json" + +# Формирование ссылок +link01="vless://${xray_uuid_vrv}@$DOMAIN:443?security=tls&type=tcp&headerType=&path=&host=&flow=xtls-rprx-vision&sni=$DOMAIN&fp=chrome&spx=%2F#vlessTCPxtlsVision-autoXRAY" + +link012="vless://${xray_uuid_vrv}@$DOMAIN:443?security=tls&type=tcp&headerType=http&path=%2F${path_xhttp}33&host=&sni=$DOMAIN&fp=chrome&spx=%2F#vlessTCPtls-autoXRAY" + +link02="vless://${xray_uuid_vrv}@$DOMAIN:443?security=tls&type=xhttp&headerType=&path=%2F${path_xhttp}&host=&mode=auto&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%3A0%2C%22hMaxRequestTimes%22%3A%22400-700%22%2C%22hMaxReusableSecs%22%3A%221200-1800%22%7D%2C%22headers%22%3A%7B%7D%2C%22noGRPCHeader%22%3Afalse%2C%22xPaddingBytes%22%3A%22400-800%22%2C%22scMaxEachPostBytes%22%3A1500000%2C%22scMinPostsIntervalMs%22%3A20%2C%22scStreamUpServerSecs%22%3A%2260-240%22%7D&sni=$DOMAIN&fp=chrome&spx=%2F#vlessXHTTPtls-autoXRAY" + +link03="vless://${xray_uuid_vrv}@$DOMAIN:443?security=tls&type=ws&headerType=&path=%2F${path_xhttp}22&host=&sni=$DOMAIN&fp=chrome&spx=%2F#vlessWStls-autoXRAY" + +link04="vless://${xray_uuid_vrv}@$DOMAIN:443?security=tls&type=grpc&headerType=&serviceName=${path_xhttp}11&host=&sni=$DOMAIN&fp=chrome&spx=%2F#vlessGRPCtls-autoXRAY" + + +ENCODED_STRING=$(echo -n "2022-blake3-aes-256-gcm:${xray_sspasw_vrv}" | base64 -w 0) +linkSS="ss://${ENCODED_STRING}@${DOMAIN}:8443#Shadowsocks2022-autoXRAY" + +configListLink="https://$DOMAIN/$path_subpage.html" + + +# Создаем html файл с конфигами +cat > "$WEB_PATH/$path_subpage.html" < + + + + + +AutoXRAY configs + + + + + +

📂 Ссылка на подписку (готовый конфиг клиента с роутингом)

+
+ + +
+ +

📱 Приложение HAPP (Windows/Android/iOS/MAC/Linux)

+

Маршрутизацию нужно выключить, она тут встроенная. По умолчанию она выключена - включатся, если вы пользовались сторонними сервисами.

+ + +

➡️ vless TCP xtls-Vision

+
+
$link01
+ +
+ +

➡️ vless TCP tls

+
+
$link012
+ +
+ +

➡️ vless XHTTP tls

+
+
$link02
+ +
+ +

➡️ vless WS tls

+
+
$link03
+ +
+ +

➡️ vless GRPC tls

+
+
$link04
+ +
+ +

➡️ Shadowsocks2022blake3 - новый и быстрый

+
+
$linkSS
+ +
+ +

💠 Все конфиги вместе

+
+ +
$link01
$link012
$link02
$link03
$link04
$linkSS
+ +
+ + + +EOF + + + +echo -e " +Ваша json страничка подписки: +\033[32m$subPageLink\033[0m + +Ссылка на сохраненные конфиги: +\033[32m$configListLink\033[0m + +Скопируйте подписку в специализированное приложение: +- iOS: Happ или v2RayTun или v2rayN +- Android: Happ или v2RayTun или v2rayNG +- Windows: конфиги Happ или winLoadXRAY или v2rayN + для vless v2RayTun или Throne + +Открыт локальный socks5 на порту 10808, 2080 и http на 10809. + +Поддержать автора: https://github.com/xVRVx/autoXRAY + +v444 +" diff --git a/old/gen_page.sh b/old/gen_page.sh new file mode 100644 index 0000000..98402f7 --- /dev/null +++ b/old/gen_page.sh @@ -0,0 +1,186 @@ +#!/bin/bash + +TARGET_DIR=$1 + +if [ -z "$TARGET_DIR" ]; then + echo "Err: Target directory required." + exit 1 +fi + +HEADERS=("Welcome to FileShare" "Login to Your CloudBox" "Enter Your Secure Vault" "Access Your DataVault" "Sign in to EasyFiles" "Connect to QuickAccess" "Welcome to VaultZone" "Login to SkyDrive" "Enter Your SafeData" "Sign in to FlexShare" "Access Your DropZone" "Welcome to SecureStorage" "Login to FastFiles" "Enter Your SharePoint" "Welcome to MegaVault" "Sign in to Boxify" "Access Your DataBank" "Welcome to DriveSecure" "Login to FileStream" "Connect to AccessHub") +BUTTON_TEXTS=("Sign In" "Log In" "Login" "Access Account" "Enter Account" "Sign In to Continue" "Sign In to Dashboard" "Log In to Your Account" "Continue to Account" "Access Your Dashboard" "Let’s Go" "Welcome Back!" "Get Started" "Join Us Again" "Back Again? Sign In" "Secure Sign In" "Protected Login" "Sign In Securely" "Enter" "Go") + +ERROR_MESSAGES=( + "Invalid username or password." + "Connection timeout. Please try again." + "Access denied by security policy." + "Account is temporarily locked." + "Network error: Handshake failed." + "Invalid authentication token." + "Session expired. Please refresh." + "Error 502: Bad Gateway." + "LDAP Server not responding." +) + +FAVICONS=( + # 1. Cloud (Blue) - Классическое облако + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMjU2M0VCIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE3LjUgMTlhMy41IDMuNSAwIDAgMCAwLTdoLTVhNC41IDQuNSAwIDAgMC04LjggMi4xQSA0IDQgMCAwIDAgNiAyMWgxMS41eiIvPjwvc3ZnPg==" + + # 2. Lock (Green) - Замок (безопасность) + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHJlY3QgeD0iMyIgeT0iMTEiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMSIgcng9IjIiIHJ5PSIyIi8+PHBhdGggZD0iTTcgMTEVdi00YTUgNSAwIDAgMSAxMCAwdjQiLz48L3N2Zz4=" + + # 3. Shield (Red/Orange) - Щит (защищенная зона) + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjREM1RjAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEyIDIybDguMTMtOC44NWMuNDgtLjUyLjU2LTEuMzMuMi0xLjkxbC01LjI0LTguNDZhMiAyIDAgMCAwLTEuNzItLjkzSDguNjNhMiAyIDAgMCAwLTEuNzIuOTNMMS42NyAxMS4yNWMtLjM2LjU4LS4yOCAxLjM5LjIgMS45MUwxMiAyMnoiLz48L3N2Zz4=" + + # 4. Folder (Yellow/Amber) - Папка (файловый менеджер) + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRjU5RTBCIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6Ii8+PC9zdmc+" + + # 5. Server (Slate) - Серверная стойка (IT инфраструктура) + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDc1NTY5IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjIwIiBoZWlnaHQ9IjgiIHJ4PSIyIiByeT0iMiIvPjxyZWN0IHg9IjIiIHk9IjE0IiB3aWR0aD0iMjAiIGhlaWdodD0iOCIgcng9IjIiIHJ5PSIyIi8+PGxpbmUgeDE9IjYiIHkxPSI2IiB4Mj0iNi4wMSIgeTI9IjYiLz48bGluZSB4MT0iNiIgeTE9IjE4IiB4Mj0iNi4wMSIgeTI9IjE4Ii8+PC9zdmc+" + + # 6. Cube (Purple) - Куб (продукты, контейнеры, Box) + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjN0MZM0Y3IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDE2VjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M2w3IDRhMiAyIDAgMCAwIDIgMGw3LTRBMiAyIDAgMCAwIDIxIDE2eiIvPjxwb2x5bGluZSBwb2ludHM9IjMuMjcgNi45NiAxMiAxMi4wMSAyMC43MyA2Ljk2Ii8+PGxpbmUgeDE9IjEyIiB5MT0iMjIuMDgiIHgyPSIxMiIgeTI9IjEyIi8+PC9zdmc+" + + # 7. User Circle (Indigo) - Аккаунт пользователя + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDMzOENBIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIwIDIxdi0yYTQgNCAwIDAgMC00LTRIODRhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iMTIiIGN5PSI3IiByPSI0Ii8+PC9zdmc+" + + # 8. Key (Teal) - Ключ доступа + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMEY3NjZFIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDJsLTIgMm0tNy42MSA3LjYxYTUuNSA1LjUgMCAxIDEtNy43NzggNy43NzggNS41IDUuNSAwIDAgMSA3Ljc3Ny03Ljc3N3ptMCAwTDE1LjUgNy41bTAgMGwzIDNMMjIgN2wtMy0zbS0zLjUgMy41TDE5IDQiLz48L3N2Zz4=" + + # 9. Globe (Cyan) - Сеть / Интернет + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDg5MUIyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48bGluZSB4MT0iMiIgeTE9IjEyIiB4Mj0iMjIiIHkyPSIxMiIvPjxwYXRoIGQ9Ik0xMiAybTUuNSA1LjVhMTUuMTUgMTUuMTUgMCAwIDEgMCA5bS0xMSAwYTE1LjE1IDE1LjE1IDAgMCAxIDAtOSIvPjwvc3ZnPg==" + + # 10. File Text (Gray) - Документ + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE0IDJINmEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMCAyIDJ4MTJhMiAyIDAgMCAwIDItMlY4eiIvPjxwb2x5bGluZSBwb2ludHM9IjE0IDIgMTQgOCAyMCA4Ii8+PGxpbmUgeDE9IjE2IiB5MT0iMTMiIHgyPSI4IiB5Mj0iMTMiLz48bGluZSB4MT0iMTYiIHkxPSIxNyIgeDI9IjgiIHkyPSIxNyIvPjxsaW5lIHgxPSIxMCIgeTE9IjkiIHgyPSI4IiB5Mj0iOSIvPjwvc3ZnPg==" +) + +FONTS_DATA=( + "Inter|Inter:wght@400;600;700" + "Poppins|Poppins:wght@400;600;700" + "Roboto|Roboto:wght@400;500;700" + "Lato|Lato:wght@400;700" + "Montserrat|Montserrat:wght@400;600;700" + "Open Sans|Open+Sans:wght@400;600;700" + "Raleway|Raleway:wght@400;600;700" +) + +ROUNDNESS_OPTS=("rounded-lg" "rounded-xl" "rounded-2xl") +BUTTON_COLORS=("bg-blue-600 hover:bg-blue-700" "bg-green-600 hover:bg-green-700" "bg-red-600 hover:bg-red-700" "bg-purple-600 hover:bg-purple-700" "bg-indigo-600 hover:bg-indigo-700" "bg-teal-600 hover:bg-teal-700" "bg-orange-600 hover:bg-orange-700" "bg-pink-600 hover:bg-pink-700" "bg-cyan-600 hover:bg-cyan-700" "bg-emerald-600 hover:bg-emerald-700" "bg-rose-600 hover:bg-rose-700" "bg-slate-800 hover:bg-slate-900" "bg-violet-600 hover:bg-violet-700" "bg-gradient-to-r from-blue-500 to-cyan-500 hover:opacity-90" "bg-gradient-to-r from-purple-500 to-pink-500 hover:opacity-90" "bg-gradient-to-r from-orange-400 to-red-500 hover:opacity-90") + +BG_GRADIENTS=( + "bg-gradient-to-br from-blue-50 via-white to-blue-50" + "bg-gradient-to-tr from-gray-100 to-gray-200" + "bg-gradient-to-br from-slate-900 via-gray-900 to-black" + "bg-gradient-to-r from-blue-900 to-slate-900" + "bg-gradient-to-br from-blue-100 via-blue-300 to-blue-500" + "bg-gradient-to-tr from-purple-200 via-purple-400 to-purple-800" + "bg-gradient-to-bl from-teal-200 to-lime-200" + "bg-gradient-to-r from-rose-100 to-teal-100" + "bg-gradient-to-tl from-gray-700 via-gray-900 to-black" + "bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900" + "bg-gradient-to-tr from-indigo-500 via-purple-500 to-pink-500" + "bg-gradient-to-b from-gray-900 to-gray-600 bg-gradient-to-r" + "bg-gradient-to-bl from-indigo-900 via-slate-800 to-indigo-900" +) + +HEADER=${HEADERS[$RANDOM % ${#HEADERS[@]}]} +BUTTON_TEXT=${BUTTON_TEXTS[$RANDOM % ${#BUTTON_TEXTS[@]}]} +ERROR_TEXT=${ERROR_MESSAGES[$RANDOM % ${#ERROR_MESSAGES[@]}]} +BUTTON_COLOR=${BUTTON_COLORS[$RANDOM % ${#BUTTON_COLORS[@]}]} +BG_STYLE=${BG_GRADIENTS[$RANDOM % ${#BG_GRADIENTS[@]}]} +ROUNDING=${ROUNDNESS_OPTS[$RANDOM % ${#ROUNDNESS_OPTS[@]}]} +FAVICON=${FAVICONS[$RANDOM % ${#FAVICONS[@]}]} + +FONT_PAIR=${FONTS_DATA[$RANDOM % ${#FONTS_DATA[@]}]} +FONT_NAME=$(echo $FONT_PAIR | cut -d'|' -f1) +FONT_URL_PART=$(echo $FONT_PAIR | cut -d'|' -f2) + +RANDOM_TOKEN=$(openssl rand -hex 16) + +if [[ "$BG_STYLE" == *"slate-900"* || "$BG_STYLE" == *"black"* ]]; then + THEME_MODE=1 +else + THEME_MODE=0 +fi + +if [ $THEME_MODE -eq 1 ]; then + TEXT_MAIN="text-white" + TEXT_MUTED="text-gray-400" + TEXT_INPUT="text-white" + CARD_BG="bg-gray-900/50 backdrop-blur-xl border border-gray-700/50 shadow-2xl" + INPUT_BG="bg-gray-800/50 border-gray-600 focus:border-blue-500 placeholder-gray-500" + ERROR_BOX="bg-red-900/20 border-red-800 text-red-300" +else + TEXT_MAIN="text-gray-900" + TEXT_MUTED="text-gray-500" + TEXT_INPUT="text-gray-900" + CARD_BG="bg-white/90 backdrop-blur-xl border border-gray-100 shadow-xl" + INPUT_BG="bg-white border-gray-300 focus:border-blue-600 focus:ring-4 focus:ring-blue-600/10 placeholder-gray-400" + ERROR_BOX="bg-red-50 border-red-100 text-red-600" +fi + +cat > "$TARGET_DIR/index.html" < + + + + + $HEADER + + + + + + + +
+
+
+ +
+

$HEADER

+
+ + + +
+ + + +
+ + +
+ +
+ + +
+ + +
+ + +
+ + + + +EOF + +echo "Generated in $TARGET_DIR" \ No newline at end of file