225 lines
5.5 KiB
Bash
225 lines
5.5 KiB
Bash
#!/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 "✅ Готово"
|