xhttp config
This commit is contained in:
224
remna_xhttp.sh
Normal file
224
remna_xhttp.sh
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# ==========================================
|
||||||
|
# XHTTP NODE SETUP SCRIPT (PRODUCTION READY)
|
||||||
|
# ==========================================
|
||||||
|
# Что делает:
|
||||||
|
# 1. Генерирует конфиг ноды
|
||||||
|
# 2. Ждет подтверждения
|
||||||
|
# 3. Перезапускает node контейнер
|
||||||
|
# 4. Вставляет location блок в nginx
|
||||||
|
# 5. Проверяет nginx конфиг
|
||||||
|
# 6. В случае ошибки — открывает nano
|
||||||
|
# 7. Финальный чек-лист + XHTTP config
|
||||||
|
# ==========================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# CONFIG
|
||||||
|
# =========================
|
||||||
|
NGINX_CONF="/opt/remnawave/nginx.conf"
|
||||||
|
NODE_CONTAINER="remnanode"
|
||||||
|
NGINX_CONTAINER="remnawave-nginx"
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# UTILS
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
# Yes/No (Enter = YES)
|
||||||
|
ask_yes_no() {
|
||||||
|
while true; do
|
||||||
|
read -r -p "$1 [Y/n]: " answer
|
||||||
|
|
||||||
|
if [[ -z "$answer" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$answer" in
|
||||||
|
[Yy]*) return 0 ;;
|
||||||
|
[Nn]*) echo "Повторите подтверждение." ;;
|
||||||
|
*) echo "Введите Y или N (Enter = Y)" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute command safely
|
||||||
|
run_cmd() {
|
||||||
|
echo ">> $1"
|
||||||
|
if ! eval "$1"; then
|
||||||
|
echo "❌ Ошибка выполнения"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# STEP 1 — NODE CONFIG
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
read -r -p "Введите название ноды (например USA): " NODE_NAME
|
||||||
|
TAG="${NODE_NAME}_XHTTP"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "========== СКОПИРУЙ И ВСТАВЬ =========="
|
||||||
|
cat <<EOF
|
||||||
|
{
|
||||||
|
"tag": "${TAG}",
|
||||||
|
"listen": "/dev/shm/xrxh.socket,0666",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"clients": [],
|
||||||
|
"fallbacks": [],
|
||||||
|
"decryption": "none"
|
||||||
|
},
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": [
|
||||||
|
"http",
|
||||||
|
"tls",
|
||||||
|
"quic"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "xhttp",
|
||||||
|
"xhttpSettings": {
|
||||||
|
"mode": "auto",
|
||||||
|
"path": "/xhttppath/",
|
||||||
|
"extra": {
|
||||||
|
"noSSEHeader": true,
|
||||||
|
"xPaddingBytes": "100-1000",
|
||||||
|
"scMaxBufferedPosts": 30,
|
||||||
|
"scMaxEachPostBytes": 1000000,
|
||||||
|
"scStreamUpServerSecs": "20-80"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
echo "======================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
ask_yes_no "Вы вставили конфиг?"
|
||||||
|
|
||||||
|
echo "Перезапуск ноды..."
|
||||||
|
run_cmd "docker restart ${NODE_CONTAINER}"
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# STEP 2 — NGINX PATCH
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Проверка nginx конфига..."
|
||||||
|
|
||||||
|
if grep -q "grpc_pass unix:/dev/shm/xrxh.socket;" "$NGINX_CONF"; then
|
||||||
|
echo "✔ Блок уже существует"
|
||||||
|
else
|
||||||
|
echo "Добавляю location блок..."
|
||||||
|
|
||||||
|
# Backup
|
||||||
|
cp "$NGINX_CONF" "${NGINX_CONF}.bak"
|
||||||
|
|
||||||
|
TMP_FILE=$(mktemp)
|
||||||
|
|
||||||
|
# Insert after add_header
|
||||||
|
awk '
|
||||||
|
BEGIN { inserted=0 }
|
||||||
|
{
|
||||||
|
print
|
||||||
|
|
||||||
|
if ($0 ~ /add_header X-Robots-Tag/ && inserted==0) {
|
||||||
|
print " location /xhttppath/ {"
|
||||||
|
print " client_max_body_size 0;"
|
||||||
|
print " grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;"
|
||||||
|
print " client_body_timeout 5m;"
|
||||||
|
print " grpc_read_timeout 315;"
|
||||||
|
print " grpc_send_timeout 5m;"
|
||||||
|
print " grpc_pass unix:/dev/shm/xrxh.socket;"
|
||||||
|
print " }"
|
||||||
|
inserted=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' "$NGINX_CONF" > "$TMP_FILE"
|
||||||
|
|
||||||
|
mv "$TMP_FILE" "$NGINX_CONF"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# VALIDATE NGINX
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Проверка nginx конфигурации..."
|
||||||
|
|
||||||
|
if docker exec ${NGINX_CONTAINER} nginx -t; then
|
||||||
|
echo "✔ nginx конфиг валиден"
|
||||||
|
echo "Перезапуск nginx..."
|
||||||
|
run_cmd "docker restart ${NGINX_CONTAINER}"
|
||||||
|
else
|
||||||
|
echo "❌ nginx конфиг сломан!"
|
||||||
|
echo "Открываю nano..."
|
||||||
|
|
||||||
|
nano "$NGINX_CONF"
|
||||||
|
|
||||||
|
echo "Повторная проверка..."
|
||||||
|
|
||||||
|
if ! docker exec ${NGINX_CONTAINER} nginx -t; then
|
||||||
|
echo "❌ Ошибка не исправлена"
|
||||||
|
echo "Восстанавливаю бэкап..."
|
||||||
|
cp "${NGINX_CONF}.bak" "$NGINX_CONF"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✔ Исправлено, перезапуск nginx..."
|
||||||
|
run_cmd "docker restart ${NGINX_CONTAINER}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# STEP 3 — FINAL CHECKLIST
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "=== Финальная проверка ==="
|
||||||
|
|
||||||
|
ask_yes_no "Создали хост?"
|
||||||
|
|
||||||
|
ask_yes_no "Настроили ли вы пути и защиту? (путь: /xhttppath/)"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "========== ДОБАВЬ В XHTTP CONFIG =========="
|
||||||
|
cat <<EOF
|
||||||
|
{
|
||||||
|
"xmux": {
|
||||||
|
"cMaxReuseTimes": 0,
|
||||||
|
"maxConcurrency": "16-32",
|
||||||
|
"maxConnections": 0,
|
||||||
|
"hKeepAlivePeriod": 0,
|
||||||
|
"hMaxRequestTimes": "600-900",
|
||||||
|
"hMaxReusableSecs": "1800-3000"
|
||||||
|
},
|
||||||
|
"noGRPCHeader": false,
|
||||||
|
"xPaddingBytes": "100-1000",
|
||||||
|
"scMaxEachPostBytes": 1000000,
|
||||||
|
"scMinPostsIntervalMs": 30,
|
||||||
|
"scStreamUpServerSecs": "20-80"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
echo "==========================================="
|
||||||
|
echo
|
||||||
|
|
||||||
|
ask_yes_no "Добавили ли вы XHTTP конфиг?"
|
||||||
|
|
||||||
|
ask_yes_no "Включили хост?"
|
||||||
|
ask_yes_no "Добавили конфиг к ноде?"
|
||||||
|
ask_yes_no "Добавили в внутренний сквад?"
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# FINAL STEP
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Финальный перезапуск ноды..."
|
||||||
|
run_cmd "docker restart ${NODE_CONTAINER}"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "✅ Готово"
|
||||||
Reference in New Issue
Block a user