Массовое добавление доменов в 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 "========================================"
Чтобы массово добавить домены, выполните следующие шаги:
- Подключитесь к серверу по SSH как пользователь root;
- Скачайте и поместите скрипт в любой доступный каталог, например
/root; - Сделайте скрипт исполняемым, выполнив команду
chmod +x add_domains_ispmgr.sh; - Подготовьте и поместите рядом текстовый файл с именем domains.txt, который будет содержать имена нужных доменов (одна строка - один домен);
- Запустите скрипт с помощью команды
./sh add_domains_ispmgr.shи пройдите все этапы для каждого из доменов:- Ввод имени пользователя, которому будет добавлен домен;
- Выбор обработчика;
- Выбор режима работы обработчика;
- Решение о добавлении 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.