#!/bin/bash # Xray Balancer — installer using local/remote backup # Run: bash setup_omv.sh set -e echo "==========================================" echo " Xray Balancer Installer" echo "==========================================" echo "" CONFIG_DIR="/etc/xray_balancer" BACKUP_DIR="$CONFIG_DIR/backups" REMOTE_HOST="212.15.49.181" # 1. Dependencies echo "[1/6] Installing dependencies..." apt-get update -qq || true apt-get install -y -qq curl jq python3 iputils-ping > /dev/null 2>&1 || true echo "✓ Dependencies installed" # 2. Directories echo "[2/6] Creating directories..." mkdir -p "$CONFIG_DIR" mkdir -p "$BACKUP_DIR" echo "✓ Directories created" # 3. Acquire backup archive echo "[3/6] Acquiring backup archive..." LATEST_BACKUP="" # Try local first if ls "$BACKUP_DIR"/*.tar.gz 1>/dev/null 2>&1; then LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/*.tar.gz | head -1) echo " Using local backup: $(basename "$LATEST_BACKUP")" else echo " No local backup found. Fetching from $REMOTE_HOST..." LATEST_BACKUP="/tmp/xb_fetched.tar.gz" rm -f "$LATEST_BACKUP" if ! scp -i ~/.ssh/id_rsa -q "root@$REMOTE_HOST:/tmp/xb_backup_*.tar.gz" "$LATEST_BACKUP"; then echo "✗ Failed to fetch backup from remote" echo " Make sure SSH key is installed on $REMOTE_HOST" exit 1 fi # Save locally for future use cp "$LATEST_BACKUP" "$BACKUP_DIR/xb_backup_$(date +%Y%m%d_%H%M%S).tar.gz" echo " ✓ Backup saved to $BACKUP_DIR" fi # Verify if [ ! -s "$LATEST_BACKUP" ]; then echo "✗ Archive is empty: $LATEST_BACKUP" exit 1 fi if ! tar -tzf "$LATEST_BACKUP" &>/dev/null; then echo "✗ Archive is corrupted or not a tar.gz: $LATEST_BACKUP" exit 1 fi echo " ✓ Archive verified" # 4. Extract (copy to temp to avoid deleting archive during cleanup) echo "[4/6] Extracting files..." TMP_EXTRACT="/tmp/xb_inst_$$.tar.gz" cp "$LATEST_BACKUP" "$TMP_EXTRACT" rm -rf "$CONFIG_DIR"/* tar -xzf "$TMP_EXTRACT" -C "$CONFIG_DIR" rm -f "$TMP_EXTRACT" echo "✓ Files extracted to $CONFIG_DIR" # 5. Permissions echo "[5/6] Setting permissions..." chmod +x "$CONFIG_DIR"/*.sh 2>/dev/null || true chmod +x "$CONFIG_DIR"/*.py 2>/dev/null || true chmod 644 "$CONFIG_DIR"/*.json 2>/dev/null || true echo "✓ Permissions set" # 6. Auto-detect xray binary echo "[6/7] Detecting Xray binary..." XRAY_BIN="" if command -v xray &>/dev/null; then XRAY_BIN="$(command -v xray)" else for p in /usr/local/bin/xray /usr/bin/xray /usr/local/x-ui/bin/xray; do if [ -x "$p" ]; then XRAY_BIN="$p" break fi done fi if [ -z "$XRAY_BIN" ]; then echo "⚠ Xray binary not found. Please install it first:" echo " bash <(curl -sL https://raw.githubusercontent.com/XTLS/Xray-install/main/install-release.sh)" XRAY_BIN="/usr/local/bin/xray" else echo " Found: $XRAY_BIN" fi # 7. Systemd services echo "[7/7] Installing and starting services..." SERVICE_FILE="/etc/systemd/system/xray_balancer.service" if [ -f "$SERVICE_FILE" ]; then sed -i "s|^ExecStart=.*|ExecStart=$XRAY_BIN run -c $CONFIG_DIR/config.json|" "$SERVICE_FILE" echo " Updated xray_balancer.service ExecStart" else cat > "$SERVICE_FILE" << SERVICE [Unit] Description=Xray Balancer Service After=network.target Wants=network.target [Service] Type=simple ExecStart=$XRAY_BIN run -c $CONFIG_DIR/config.json Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target SERVICE echo " Created xray_balancer.service" fi WATCHDOG_FILE="/etc/systemd/system/xray_balancer_watchdog.service" if [ ! -f "$WATCHDOG_FILE" ]; then cat > "$WATCHDOG_FILE" << WATCHDOG [Unit] Description=Xray Balancer Port Watchdog (127.0.0.1:10001) After=xray_balancer.service Wants=xray_balancer.service [Service] Type=simple ExecStart=/bin/bash $CONFIG_DIR/port_watchdog.sh Restart=always RestartSec=5 User=root [Install] WantedBy=multi-user.target WATCHDOG echo " Created xray_balancer_watchdog.service" fi systemctl daemon-reload systemctl enable xray_balancer 2>/dev/null || true systemctl enable xray_balancer_watchdog 2>/dev/null || true echo "✓ Services installed" # 8. Generate/refresh config echo "" echo "[8/8] Generating config and starting services..." if [ -f "$CONFIG_DIR/generator.py" ]; then echo " Running generator..." if python3 "$CONFIG_DIR/generator.py"; then echo " ✓ generator completed" else echo " ⚠ generator failed (continuing)" fi if [ -f "$CONFIG_DIR/balancer.json" ]; then cp -f "$CONFIG_DIR/balancer.json" "$CONFIG_DIR/config.json" echo " ✓ config.json created" else echo " ⚠ balancer.json not generated" fi else echo " ⚠ generator.py not found, skipping generation" fi if [ -f "$CONFIG_DIR/checker.py" ]; then echo " Running checker (once)..." python3 "$CONFIG_DIR/checker.py" --once &>/dev/null || true echo " ✓ checker completed" fi # Start services echo " Starting services..." systemctl restart xray_balancer 2>/dev/null || systemctl start xray_balancer sleep 2 systemctl restart xray_balancer_watchdog 2>/dev/null || systemctl start xray_balancer_watchdog if systemctl is-active --quiet xray_balancer; then echo "✓ Xray balancer started successfully" else echo "✗ Xray balancer failed to start" echo " Check logs: journalctl -u xray_balancer -n 20" fi # Menu if [ -f "$CONFIG_DIR/menu.sh" ]; then chmod +x "$CONFIG_DIR/menu.sh" ln -sf "$CONFIG_DIR/menu.sh" /usr/local/bin/xb echo "✓ Menu installed: run 'xb'" else echo "⚠ Menu not found" fi echo "" echo "==========================================" echo " INSTALLATION COMPLETE" echo "==========================================" echo "" echo "Commands:" echo " xb - management menu" echo " systemctl status xray_balancer" echo " systemctl status xray_balancer_watchdog" echo " tail -f /var/log/xray_balancer/watchdog.log" echo ""