#!/bin/bash # # Server Setup Script — воссоздание конфигурации сервера kirgysia # OS: Ubuntu 22.04 LTS # Запуск: sudo bash setup.sh # # Перед запуском: # 1. Положите рядом файлы: # - ../data/x-ui.db (база 3x-ui — скопировать с оригинала) # - ../data/fullchain.pem (SSL-сертификат) # - ../data/privkey.pem (SSL-ключ) # - ../data/authorized_keys (SSH-ключи для доступа) # 2. Отредактируйте переменные ниже под новый сервер # set -euo pipefail # ============================================================ # НАСТРОЙКИ — отредактируйте под новый сервер # ============================================================ NEW_USER="eberkheev" SSH_PORT="10001" TIMEZONE="UTC" # Сетевой интерфейс (узнать: ip link show) NET_IFACE="ens18" # Статический IP (оставьте пустым для DHCP) STATIC_IP="" # например: "5.144.180.119/24" GATEWAY="" # например: "5.144.180.1" DNS="8.8.8.8,8.8.4.4" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DATA_DIR="$SCRIPT_DIR/../data" # ============================================================ # Проверки # ============================================================ if [ "$(id -u)" -ne 0 ]; then echo "ERROR: Запустите с sudo: sudo bash $0" exit 1 fi if [ ! -d "$DATA_DIR" ]; then echo "ERROR: Директория $DATA_DIR не найдена." echo "Создайте её и положите туда: x-ui.db, fullchain.pem, privkey.pem, authorized_keys" exit 1 fi echo "=== [1/8] Обновление системы ===" apt update && apt upgrade -y echo "=== [2/8] Установка пакетов ===" apt install -y \ curl \ wget \ git \ htop \ mc \ nmap \ net-tools \ unzip \ fail2ban \ certbot \ docker.io \ docker-compose \ ufw systemctl enable docker systemctl start docker echo "=== [3/8] Настройка часового пояса ===" timedatectl set-timezone "$TIMEZONE" echo "=== [4/8] Создание пользователя ===" if ! id "$NEW_USER" &>/dev/null; then adduser --disabled-password --gecos "" "$NEW_USER" usermod -aG sudo "$NEW_USER" # Разрешить sudo без пароля (опционально — удалите если не нужно) echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$NEW_USER" chmod 440 "/etc/sudoers.d/$NEW_USER" echo "Пользователь $NEW_USER создан" else echo "Пользователь $NEW_USER уже существует" fi usermod -aG docker "$NEW_USER" # SSH-ключи USER_HOME="/home/$NEW_USER" mkdir -p "$USER_HOME/.ssh" if [ -f "$DATA_DIR/authorized_keys" ]; then cp "$DATA_DIR/authorized_keys" "$USER_HOME/.ssh/authorized_keys" chmod 600 "$USER_HOME/.ssh/authorized_keys" fi chown -R "$NEW_USER:$NEW_USER" "$USER_HOME/.ssh" echo "=== [5/8] Настройка SSH ===" cat > /etc/ssh/sshd_config < /etc/netplan/01-netcfg.yaml < "$XUI_DIR/docker-compose.yml" <<'DCEOF' services: 3xui: image: ghcr.io/mhsanaei/3x-ui:latest container_name: 3xui_app volumes: - ./db/:/etc/x-ui/ - ./cert/:/root/cert/ environment: XRAY_VMESS_AEAD_FORCED: "false" XUI_ENABLE_FAIL2BAN: "true" tty: true network_mode: host restart: unless-stopped DCEOF chown -R "$NEW_USER:$NEW_USER" "$XUI_DIR" # Скрипт обновления cat > "$USER_HOME/update.sh" <<'UPDATEEOF' #!/bin/bash set -e BACKUP_PATH="/home/eberkheev/x-ui-backup.db" XUI_PATH="/home/eberkheev/3x-ui" DOCKER_IMAGE="ghcr.io/mhsanaei/3x-ui:latest" BUILD_MODE="pull" if [ "$1" = "--build" ]; then BUILD_MODE="build" fi echo "=== Mode: $BUILD_MODE ===" echo "=== System update ===" sudo apt update && sudo apt upgrade -y echo "=== Finding x-ui container ===" CONTAINER=$(sudo docker ps --format "{{.Names}}" | grep -i "xui\|x-ui\|3xui" | head -n 1) if [ -z "$CONTAINER" ]; then echo "WARNING: x-ui container not found, skipping backup..." if [ ! -f "$BACKUP_PATH" ]; then echo "ERROR: No container and no backup found, aborting!" exit 1 fi echo "Existing backup found at $BACKUP_PATH, continuing..." else echo "Found container: $CONTAINER" echo "=== Backup x-ui database ===" sudo docker cp $CONTAINER:/etc/x-ui/x-ui.db $BACKUP_PATH echo "Backup saved to $BACKUP_PATH" fi echo "=== Pulling latest from main ===" cd $XUI_PATH sudo git checkout main sudo git pull origin main echo "=== Stopping old container ===" sudo docker-compose down if [ "$BUILD_MODE" = "build" ]; then echo "--- Building from source ---" sudo docker-compose build --no-cache sudo docker-compose up -d else echo "--- Pulling prebuilt image: $DOCKER_IMAGE ---" sudo docker pull $DOCKER_IMAGE sudo docker rm -f 3xui_app 2>/dev/null || true sudo docker run -d \ --name 3xui_app \ --restart unless-stopped \ --network host \ --env XRAY_VMESS_AEAD_FORCED=false \ --env XUI_ENABLE_FAIL2BAN=true \ -v $XUI_PATH/db/:/etc/x-ui/ \ -v $XUI_PATH/cert/:/root/cert/ \ -t \ $DOCKER_IMAGE fi echo "=== Restoring database from backup ===" NEW_CONTAINER=$(sudo docker ps --format "{{.Names}}" | grep -i "xui\|x-ui\|3xui" | head -n 1) if [ -z "$NEW_CONTAINER" ]; then echo "ERROR: Container not found after restart!" exit 1 fi sudo docker cp $BACKUP_PATH $NEW_CONTAINER:/etc/x-ui/x-ui.db echo "Database restored, restarting container..." sudo docker restart $NEW_CONTAINER echo "=== Status ===" sudo docker ps | grep -i "xui\|x-ui\|3xui" sudo docker logs $NEW_CONTAINER --tail=30 echo "=== Done! ===" UPDATEEOF chown "$NEW_USER:$NEW_USER" "$USER_HOME/update.sh" echo "=== [8/8] Запуск 3x-ui ===" cd "$XUI_DIR" docker pull ghcr.io/mhsanaei/3x-ui:latest docker run -d \ --name 3xui_app \ --restart unless-stopped \ --network host \ --env XRAY_VMESS_AEAD_FORCED=false \ --env XUI_ENABLE_FAIL2BAN=true \ -v "$XUI_DIR/db/:/etc/x-ui/" \ -v "$XUI_DIR/cert/:/root/cert/" \ -t \ ghcr.io/mhsanaei/3x-ui:latest echo "" echo "============================================" echo " Сервер настроен!" echo "============================================" echo "" echo " SSH: порт $SSH_PORT, пользователь $NEW_USER" echo " 3x-ui: запущен в Docker (network_mode: host)" echo " Панель: https://:10002 (или порт из x-ui.db)" echo "" echo " Для обновления: bash ~/update.sh" echo " Для проверки: docker ps" echo ""