cat > /root/add-cf-ws-inbound.sh <<'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail
DOMAIN="mainnet.assaxaq.online"
PORT=8443
CFG="/usr/local/etc/xray/config.json"
CERTDIR="/usr/local/etc/xray"
BAK="$CFG.bak.$(date +%s)"
UUID="dad0fb22-a795-4e0e-b401-56972684d98b"
WSPATH="/$(head -c 24 /dev/urandom | sha256sum | cut -c1-16)"
echo "===== inbound cfws:$PORT (VLESS+WS+TLS за Cloudflare) ====="
echo "Domain : $DOMAIN"
echo "Path : $WSPATH"
echo
echo "[1/6] python3 + бэкап..."
command -v python3 >/dev/null 2>&1 || { echo "[!] нет python3"; exit 1; }
cp "$CFG" "$BAK"; echo " бэкап: $BAK"
echo "[2/6] Самоподписанный серт (CF Full)..."
openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
-keyout "$CERTDIR/key.pem" -out "$CERTDIR/cert.pem" \
-subj "/CN=${DOMAIN}" -addext "subjectAltName=DNS:${DOMAIN}" >/dev/null 2>&1
chmod 600 "$CERTDIR/key.pem"; echo " ok"
echo "[3/6] Порт $PORT свободен?"
if ss -tlnp | grep -qE "[:.]${PORT}[[:space:]]"; then
echo "[!] Порт $PORT занят. Откат."; cp "$BAK" "$CFG"; exit 1
fi
echo " свободен"
echo "[4/6] Дописываю inbound cfws (python3, без перепечатки ключей)..."
export NEW_PORT="$PORT" NEW_UUID="$UUID" NEW_PATH="$WSPATH" \
NEW_CERT="$CERTDIR/cert.pem" NEW_KEY="$CERTDIR/key.pem"
if ! python3 - "$CFG" <<'PY'
import json, sys, os
cfg_path = sys.argv[1]
with open(cfg_path) as f:
cfg = json.load(f)
inbound = {
"tag": "cfws",
"listen": "0.0.0.0",
"port": int(os.environ["NEW_PORT"]),
"protocol": "vless",
"settings": {"clients": [{"id": os.environ["NEW_UUID"]}], "decryption": "none"},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {"alpn": ["http/1.1"],
"certificates": [{"certificateFile": os.environ["NEW_CERT"],
"keyFile": os.environ["NEW_KEY"]}]},
"wsSettings": {"path": os.environ["NEW_PATH"]}
},
"sniffing": {"enabled": True, "destOverride": ["http", "tls"]}
}
cfg["inbounds"] = [i for i in cfg.get("inbounds", []) if i.get("tag") != "cfws"]
cfg["inbounds"].append(inbound)
tmp = cfg_path + ".new"
with open(tmp, "w") as f:
json.dump(cfg, f, indent=2)
os.replace(tmp, cfg_path)
print(" добавлено, всего inbound'ов:", len(cfg["inbounds"]))
PY
then
echo "[!] Ошибка python. Откат."; cp "$BAK" "$CFG"; exit 1
fi
echo "[5/6] Рестарт xray..."
systemctl restart xray; sleep 3
echo "[6/6] Проверка..."
if systemctl is-active --quiet xray && ss -tlnp | grep -qE "[:.]${PORT}[[:space:]]"; then
echo
echo "================= ГОТОВО ================="
LINK="vless://${UUID}@${DOMAIN}:${PORT}?encryption=none&security=tls&type=ws&path=${WSPATH}&host=${DOMAIN}&sni=${DOMAIN}&fp=chrome&alpn=http%2F1.1#CF-VDS"
echo "Ссылка (импорт в v2rayNG / v2rayN / Karing):"
echo "$LINK"
echo
echo "Cloudflare: SSL=Full, A-запись ${DOMAIN}->109.69.57.149, оранжевое облако ВКЛ."
echo "Существующие 2054/2055 и Hysteria продолжают работать."
echo "=========================================="
else
echo "[!] Xray не поднялся или порт не слушается. Лог:"
journalctl -u xray -n 25 --no-pager
echo "[!] Откат к бэкапу..."
cp "$BAK" "$CFG"; systemctl restart xray
echo " откат выполнен, старый конфиг восстановлен."
exit 1
fi
SCRIPT
chmod +x /root/add-cf-ws-inbound.sh
/root/add-cf-ws-inbound.sh