#!/usr/bin/env bash # install.sh — Установка и настройка Xray на Ubuntu VM # Запускать от root: sudo bash install.sh set -euo pipefail ### ── Цвета ──────────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERR]${NC} $*"; exit 1; } ### ── Проверка root ───────────────────────────────────────────────────────── [[ $EUID -ne 0 ]] && error "Запускай от root (sudo bash install.sh)" ### ── Загрузка параметров ────────────────────────────────────────────────── PARAMS_FILE="/etc/xray/params.env" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [[ -f "$PARAMS_FILE" ]]; then info "Загружаю параметры из $PARAMS_FILE" # shellcheck disable=SC1090 source "$PARAMS_FILE" elif [[ -f "$SCRIPT_DIR/params.env" ]]; then info "Загружаю параметры из $SCRIPT_DIR/params.env" source "$SCRIPT_DIR/params.env" else error "Файл параметров не найден!\nСкопируй params.env.example → params.env и заполни значения." fi # Обязательные переменные : "${VLESS_SERVER_IP:?Укажи VLESS_SERVER_IP в params.env}" : "${VLESS_UUID:?Укажи VLESS_UUID в params.env}" : "${VLESS_PUBLIC_KEY:?Укажи VLESS_PUBLIC_KEY в params.env}" : "${VLESS_SHORT_ID:?Укажи VLESS_SHORT_ID в params.env}" : "${VLESS_SNI:?Укажи VLESS_SNI в params.env}" ### ── Обновление системы ──────────────────────────────────────────────────── info "Обновляю пакеты..." apt-get update -qq apt-get install -y -qq curl wget unzip iptables iptables-persistent netfilter-persistent ### ── Установка Xray ──────────────────────────────────────────────────────── info "Устанавливаю Xray (последняя версия)..." XRAY_VERSION=$(curl -fsSL "https://api.github.com/repos/XTLS/Xray-core/releases/latest" \ | grep '"tag_name"' | sed 's/.*"tag_name": *"\(.*\)".*/\1/') info "Версия: $XRAY_VERSION" ARCH=$(uname -m) case "$ARCH" in x86_64) XRAY_ARCH="64" ;; aarch64) XRAY_ARCH="arm64-v8a" ;; *) error "Неизвестная архитектура: $ARCH" ;; esac XRAY_URL="https://github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}/Xray-linux-${XRAY_ARCH}.zip" TMP_DIR=$(mktemp -d) wget -q "$XRAY_URL" -O "$TMP_DIR/xray.zip" unzip -q "$TMP_DIR/xray.zip" -d "$TMP_DIR/xray" install -m 755 "$TMP_DIR/xray/xray" /usr/local/bin/xray rm -rf "$TMP_DIR" info "Xray установлен: $(xray --version | head -1)" ### ── Создание директорий и params.env ──────────────────────────────────── mkdir -p /etc/xray /var/log/xray if [[ ! -f "$PARAMS_FILE" ]]; then info "Создаю $PARAMS_FILE..." cp "$SCRIPT_DIR/params.env" "$PARAMS_FILE" 2>/dev/null || \ cp "$SCRIPT_DIR/params.env.example" "$PARAMS_FILE" fi chmod 600 "$PARAMS_FILE" ### ── Генерация config.json ──────────────────────────────────────────────── info "Генерирую /etc/xray/config.json..." cat > /etc/xray/config.json < /dev/null sysctl -w net.ipv6.conf.all.forwarding=1 > /dev/null grep -qxF 'net.ipv4.ip_forward=1' /etc/sysctl.conf \ || echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf grep -qxF 'net.ipv6.conf.all.forwarding=1' /etc/sysctl.conf \ || echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.conf ### ── systemd сервис ──────────────────────────────────────────────────────── info "Создаю systemd сервис xray..." cat > /etc/systemd/system/xray.service <<'UNIT' [Unit] Description=Xray Service Documentation=https://github.com/xtls/xray-core After=network.target nss-lookup.target [Service] User=root CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW NoNewPrivileges=false ExecStart=/usr/local/bin/xray run -config /etc/xray/config.json Restart=on-failure RestartPreventExitStatus=23 LimitNPROC=10000 LimitNOFILE=1000000 [Install] WantedBy=multi-user.target UNIT systemctl daemon-reload systemctl enable xray systemctl restart xray sleep 2 if systemctl is-active --quiet xray; then info "✓ Xray запущен и работает" else error "Xray не запустился! Смотри: journalctl -u xray -n 50" fi ### ── Итог ───────────────────────────────────────────────────────────────── echo "" info "══════════════════════════════════════════════════════" info " Установка завершена!" info " HTTP прокси: http://$(hostname -I | awk '{print $1}'):8888" info " SOCKS5: socks5://$(hostname -I | awk '{print $1}'):1080" info " Tproxy порт: 12345" info "" info " Следующий шаг: настроить прозрачный прокси для TV:" info " sudo bash transparent-proxy.sh" info "══════════════════════════════════════════════════════"