ispmanager 6

/
/
Массовое добавление доменов в ispmanager 6

Массовое добавление доменов в ispmanager 6

Массово добавить домены в ispmanager 6, вы можете воспользоваться нашим скриптом. Скрипт позволяет добавлять домены через CLI в полуавтоматическом режиме.

Содержимое скрипта

#!/bin/bash

set -euo pipefail

# Конфигурационные параметры
DEFAULT_USER="www-root"              # Имя пользователя по умолчанию
AVAILABLE_PHP_MODES=(php_mode_fcgi_nginxfpm php_mode_fcgi_apache php_mode_cgi php_mode_mod)
AVAILABLE_TECHNOLOGIES=(nodejs python)  # Поддерживаемые альтернативные технологии

# Проверяем наличие mgrctl
if ! command -v /usr/local/mgr5/sbin/mgrctl &>/dev/null; then
   echo "Error: mgrctl not found. Please check ispmanager installation."
   exit 1
fi

# Проверяем наличие файла domains.txt
if [[ ! -f "domains.txt" ]]; then
   echo "Error: File 'domains.txt' not found."
   exit 1
fi

# Функция для проверки, включён ли NAT
is_nat_enabled() {
   local nat_settings=$(/usr/local/mgr5/sbin/mgrctl -m ispmgr nat.settings 2>/dev/null)
   if echo "$nat_settings" | grep -q 'use_nat=on'; then
       return 0  # NAT включён
   else
       return 1  # NAT выключен
   fi
}

# Функция для получения NAT настроек (внешний IP)
get_nat_public_ip() {
   /usr/local/mgr5/sbin/mgrctl -m ispmgr nat.settings 2>/dev/null | grep -oP 'public_ip_0=\K[0-9.]+' || true
}

# Функция для получения приватного IP
get_nat_private_ip() {
   /usr/local/mgr5/sbin/mgrctl -m ispmgr nat.settings 2>/dev/null | grep -oP 'private_ip_0=\K[0-9.]+' || true
}

# Функция для получения списка IP-адресов из панели
get_available_ips() {
   /usr/local/mgr5/sbin/mgrctl -m ispmgr ipaddrlist 2>/dev/null | grep -oP 'name=\K[0-9.]+' || true
}

# Функция для получения default IP из панели
get_default_ip() {
   /usr/local/mgr5/sbin/mgrctl -m ispmgr ipaddrlist 2>/dev/null | grep 'default=yes' | grep -oP 'name=\K[0-9.]+' || true
}

# Загружаем домены из файла, пропуская пустые строки
mapfile -t DOMAINS_RAW < domains.txt
DOMAINS=()
for DOMAIN in "${DOMAINS_RAW[@]}"; do
   DOMAIN=$(echo "$DOMAIN" | tr -d '\r' | xargs)
   if [[ -n "$DOMAIN" ]]; then
       DOMAINS+=("$DOMAIN")
   fi
done

if (( ${#DOMAINS[@]} == 0 )); then
   echo "Error: No domains found in domains.txt"
   exit 1
fi

echo "Processing ${#DOMAINS[@]} domains..."

# Проверяем NAT настройки
NAT_PUBLIC_IP=$(get_nat_public_ip)
NAT_PRIVATE_IP=$(get_nat_private_ip)
PANEL_IPS=$(get_available_ips)
DEFAULT_IP=$(get_default_ip)

# Определяем IP для создания доменов
if is_nat_enabled && [[ -n "$NAT_PUBLIC_IP" ]]; then
   echo -e "\nNAT configuration detected:"
   echo "  Private IP: $NAT_PRIVATE_IP"
   echo "  Public IP:  $NAT_PUBLIC_IP"
   DOMAIN_IP="$NAT_PUBLIC_IP"
   echo -e "\nUsing public IP for domains: $DOMAIN_IP"
else
   # Без NAT - используем IP из панели
   if [[ -z "$PANEL_IPS" ]]; then
       echo "Error: No IP addresses found in ispmanager!"
       echo "Please add IP addresses first: ispmanager → Settings → IP addresses"
       exit 1
   fi
   
   mapfile -t IP_LIST <<< "$PANEL_IPS"
   
   echo -e "\nAvailable IP addresses in ispmanager:"
   for i in "${!IP_LIST[@]}"; do
       ip="${IP_LIST[$i]}"
       mark=""
       if [[ "$ip" == "$DEFAULT_IP" ]]; then
           mark=" [DEFAULT]"
       fi
       echo "  $((i+1))) ${ip}${mark}"
   done
   
   if (( ${#IP_LIST[@]} == 1 )); then
       DOMAIN_IP="${IP_LIST[0]}"
       echo -e "\nUsing IP: $DOMAIN_IP"
   else
       # Если есть default IP, предлагаем его как выбор по умолчанию
       if [[ -n "$DEFAULT_IP" ]]; then
           echo -e "\nDefault IP detected: $DEFAULT_IP"
           read -p "Use default IP for all domains? (y/n) [default: y]: " USE_DEFAULT
           USE_DEFAULT=${USE_DEFAULT:-y}
           if [[ "$USE_DEFAULT" =~ ^[Yy]$ ]]; then
               DOMAIN_IP="$DEFAULT_IP"
               echo "Using default IP: $DOMAIN_IP"
           else
               echo -e "\nSelect IP for all domains:"
               select IP_CHOICE in "${IP_LIST[@]}"; do
                   if [[ -n "$IP_CHOICE" ]]; then
                       DOMAIN_IP="$IP_CHOICE"
                       echo "Selected IP: $DOMAIN_IP"
                       break
                   fi
                   echo "Invalid selection. Try again."
               done
           fi
       else
           echo -e "\nSelect IP for all domains:"
           select IP_CHOICE in "${IP_LIST[@]}"; do
               if [[ -n "$IP_CHOICE" ]]; then
                   DOMAIN_IP="$IP_CHOICE"
                   echo "Selected IP: $DOMAIN_IP"
                   break
               fi
               echo "Invalid selection. Try again."
           done
       fi
   fi
fi

for DOMAIN in "${DOMAINS[@]}"; do
   echo -e "\n========================================"
   echo "Processing domain: $DOMAIN"
   echo "========================================"
   
   # Инициализация переменных для каждой итерации
   PHP_MODE=""
   TECHNOLOGY=""
   HANDLER=""
   CMD_ARGS=""
   SSL_ALLOWED=false
   
   # Запрашиваем пользователя для домена (с повторным запросом при ошибке)
   while true; do
       read -p "Enter user for the domain ($DOMAIN) [default: ${DEFAULT_USER}]: " USERNAME
       if [[ -z "$USERNAME" ]]; then
           USERNAME="${DEFAULT_USER}"
       fi

       # Проверяем, что имя пользователя не является числом (UID)
       if [[ "$USERNAME" =~ ^[0-9]+$ ]]; then
           echo "Error: Username cannot be a number. Please enter a valid username."
           read -p "Try again? (y/n) [default: y]: " TRY_AGAIN
           if [[ -z "$TRY_AGAIN" ]] || [[ "$TRY_AGAIN" =~ ^[Yy]$ ]]; then
               continue
           else
               echo "Skipping domain creation."
               continue 2
           fi
       fi

       # Проверяем существование пользователя по имени
       if getent passwd "$USERNAME" &>/dev/null; then
           echo "User exists: $USERNAME"
           break
       else
           echo "Error: User does not exist: $USERNAME"
           read -p "Try again? (y/n) [default: y]: " TRY_AGAIN
           if [[ -z "$TRY_AGAIN" ]] || [[ "$TRY_AGAIN" =~ ^[Yy]$ ]]; then
               continue
           else
               echo "Skipping domain creation."
               continue 2  # Пропускаем текущую итерацию цикла for
           fi
       fi
   done

   # Получаем информацию о возможностях пользователя
   USER_PROFILE=$(/usr/local/mgr5/sbin/mgrctl -m ispmgr user.edit elid="$USERNAME" 2>&1)

   # Проверяем, разрешено ли пользователю использовать SSL/Let's Encrypt
   if echo "$USER_PROFILE" | grep -q "limit_ssl=on"; then
       SSL_ALLOWED=true
       echo "✓ SSL certificates allowed for user $USERNAME"
   else
       SSL_ALLOWED=false
       echo "⚠ SSL certificates DISABLED for user $USERNAME (limit_ssl=off)"
   fi

   # Проверяем, какие технологии доступны
   ENABLED_PHP_MODES=()
   ENABLED_TECHNOLOGIES=()
   
   # Проверяем доступные PHP режимы
   for MODE in "${AVAILABLE_PHP_MODES[@]}"; do
       if echo "$USER_PROFILE" | grep -q "$MODE=on"; then
           ENABLED_PHP_MODES+=( "$MODE" )
       fi
   done
   
   # Проверяем доступные альтернативные технологии
   for TECH in "${AVAILABLE_TECHNOLOGIES[@]}"; do
       if echo "$USER_PROFILE" | grep -q "limit_$TECH=on"; then
           ENABLED_TECHNOLOGIES+=( "$TECH" )
       fi
   done

   # Собираем все доступные технологии для выбора
   AVAILABLE_OPTIONS=()
   
   if (( ${#ENABLED_PHP_MODES[@]} > 0 )); then
       AVAILABLE_OPTIONS+=( "php" )
   fi
   
   for TECH in "${ENABLED_TECHNOLOGIES[@]}"; do
       AVAILABLE_OPTIONS+=( "$TECH" )
   done

   # Если нет доступных технологий
   if (( ${#AVAILABLE_OPTIONS[@]} == 0 )); then
       echo "Error: No technologies enabled for user $USERNAME."
       echo "   Please enable at least one of: PHP, Node.js, or Python"
       continue
   fi

   # Если доступна только одна технология
   if (( ${#AVAILABLE_OPTIONS[@]} == 1 )); then
       TECHNOLOGY="${AVAILABLE_OPTIONS[0]}"
       echo "Using technology: $TECHNOLOGY"
   else
       # Если доступно несколько технологий, предлагаем выбор
       echo "Available technologies for user $USERNAME:"
       select TECH_SELECTION in "${AVAILABLE_OPTIONS[@]}"; do
           if [[ -n "$TECH_SELECTION" ]]; then
               TECHNOLOGY="$TECH_SELECTION"
               echo "Selected technology: $TECHNOLOGY"
               break
           fi
           echo "Invalid selection. Try again."
       done
   fi

   # Формируем параметры в зависимости от выбранной технологии
   if [[ "$TECHNOLOGY" == "php" ]]; then
       # Выбор PHP режима
       if (( ${#ENABLED_PHP_MODES[@]} > 1 )); then
           echo -e "\nAvailable PHP modes:"
           select MODE in "${ENABLED_PHP_MODES[@]}"; do
               if [[ -n "$MODE" ]]; then
                   PHP_MODE="$MODE"
                   break
               fi
               echo "Invalid selection. Try again."
           done
       else
           PHP_MODE="${ENABLED_PHP_MODES[0]}"
       fi
       echo "Using PHP mode: $PHP_MODE"
       HANDLER="handler_php"
       CMD_ARGS="site_php=on site_nodejs=off site_python=off site_php_mode=$PHP_MODE"
       
   elif [[ "$TECHNOLOGY" == "nodejs" ]]; then
       NODEJS_VERSION=$(echo "$USER_PROFILE" | grep -Eo 'limit_nodejs_version=[^[:space:]]+' | cut -d '=' -f 2)
       HANDLER="handler_nodejs"
       if [[ -n "$NODEJS_VERSION" ]]; then
           CMD_ARGS="site_php=off site_nodejs=on site_python=off site_nodejs_version=$NODEJS_VERSION"
           echo "Using Node.js version: $NODEJS_VERSION"
       else
           CMD_ARGS="site_php=off site_nodejs=on site_python=off"
           echo "Using Node.js (default version)"
       fi
       
   elif [[ "$TECHNOLOGY" == "python" ]]; then
       PYTHON_VERSION=$(echo "$USER_PROFILE" | grep -Eo 'limit_python_version=[^[:space:]]+' | cut -d '=' -f 2)
       HANDLER="handler_python"
       if [[ -n "$PYTHON_VERSION" ]]; then
           CMD_ARGS="site_php=off site_nodejs=off site_python=on site_python_version=$PYTHON_VERSION site_python_server_path=server.py"
           echo "Using Python version: $PYTHON_VERSION"
       else
           CMD_ARGS="site_php=off site_nodejs=off site_python=on site_python_server_path=server.py"
           echo "Using Python (default version)"
       fi
   fi

   # Определяем домашнюю директорию сайта
   HOME_DIR="www/$DOMAIN"
   
   # Создаем домен через site.edit
   echo -e "\nCreating domain '$DOMAIN' with user '$USERNAME'..."
   echo "Home: $HOME_DIR"
   echo "IP Address: $DOMAIN_IP"
   echo "Handler: $HANDLER"
   if [[ -n "$CMD_ARGS" ]]; then
       echo "Parameters: $CMD_ARGS"
   fi
   
   if RESULT=$(/usr/local/mgr5/sbin/mgrctl -m ispmgr site.edit \
       site_name="$DOMAIN" \
       site_home="$HOME_DIR" \
       site_ipaddrs="$DOMAIN_IP" \
       site_ipsrc=manual \
       site_owner="$USERNAME" \
       site_email="webmaster@$DOMAIN" \
       site_handler="$HANDLER" \
       $CMD_ARGS \
       sok=ok 2>&1); then
       
       echo "✓ Domain created successfully."
       
       # Генерация SSL сертификата (только если разрешено для пользователя)
       echo -e "\nSSL Certificate:"
       if [[ "$SSL_ALLOWED" == false ]]; then
           echo "⚠ SSL certificate requestion SKIPPED: SSL is disabled in user profile ($USERNAME)"
           echo "   To enable: ispmanager → Users → Edit user → Access → 'SSL' option"
       else
           read -p "Request SSL certificate for this domain? (y/n) [default: y]: " CERTIFICATE
           if [[ -z "$CERTIFICATE" ]] || [[ "$CERTIFICATE" =~ ^[Yy]$ ]]; then
               echo "Requesting SSL certificate for domain '$DOMAIN'..."
               
               if GEN_RESULT=$(/usr/local/mgr5/sbin/mgrctl -m ispmgr letsencrypt.generate \
                   username="$USERNAME" \
                   domain_name="$DOMAIN" \
                   domain="$DOMAIN" \
                   email="webmaster@$DOMAIN" \
                   enable_cert=on \
                   sok=ok 2>&1); then
                   
                   echo "✓ SSL certificate requested successfully."
               else
                   echo "✗ Error generating SSL certificate:"
                   echo "$GEN_RESULT"
                   echo "   Hint: Check if 'SSL' option is enabled for user $USERNAME"
               fi
           else
               echo "SSL certificate requestion skipped by user request."
           fi
       fi
   else
       echo "✗ Error creating domain:"
       echo "$RESULT"
       continue
   fi

done

echo -e "\n========================================"
echo "✓ All domains have been processed!"
echo "========================================"

Чтобы массово добавить домены, выполните следующие шаги:

  1. Подключитесь к серверу по SSH как пользователь root;
  2. Скачайте и поместите скрипт в любой доступный каталог, например /root;
  3. Сделайте скрипт исполняемым, выполнив команду chmod +x add_domains_ispmgr.sh;
  4. Подготовьте и поместите рядом текстовый файл с именем domains.txt, который будет содержать имена нужных доменов (одна строка - один домен);
  5. Запустите скрипт с помощью команды ./sh add_domains_ispmgr.sh  и пройдите все этапы для каждого из доменов:
    1. Ввод имени пользователя, которому будет добавлен домен;
    2. Выбор обработчика;
    3. Выбор режима работы обработчика;
    4. Решение о добавлении SSL-сертификата от Let's Encrypt.

Например, так будет выглядеть добавление домена domain.com с режимом работы PHP-FPM и выпуском сертификата для пользователя user01:

Processing domain: domain.com 
========================================
Enter user for the domain (domain.com ) [default: www-root]: 
User exists: user01
✓ SSL certificates allowed for user user01
Available technologies for user user01:
1) php
2) nodejs
3) python
#? 1
Selected technology: php

Available PHP modes:
1) php_mode_fcgi_nginxfpm
2) php_mode_cgi
3) php_mode_mod
#? 1
Using PHP mode: php_mode_fcgi_nginxfpm

Creating domain 'domain.com' with user 'user01'...
Docroot: /var/www/user01/data/www/domain.com
Parameters: php=on php_mode=php_mode_fcgi_nginxfpm
✓ Domain created successfully.

SSL Certificate:
Request SSL certificate for this domain? (y/n) [default: y]: y
Requesting SSL certificate for domain 'domain.com'...
✓ SSL certificate requested successfully.