Узнайте, как три простых bash-скрипта могут значительно упростить вашу работу с LAMP-стеком на Ubuntu. Создание и удаление виртуальных хостов, настройка баз данных MySQL — всё это становится доступным даже для начинающих разработчиков!

Если вы когда-либо чувствовали себя как кот, который случайно зашел в комнату с работающей стиральной машиной (все вокруг гудит, а ты стоишь и думаешь, что происходит), то вы, возможно, понимаете, о чем я говорю. Работа с командной строкой в Linux может быть пугающей, особенно если вы видите её второй раз в жизни (первый опыт был скорее всего при установке и настройке LAMP-стека).

Но я попрошу вас не относиться к командной строке как к монстру, живущему под кроватью, консоль просто хочет, чтобы вы научились ей правильно пользоваться. А пока я хочу поделиться с вами тремя bash-скриптами, которые помогут вам автоматизировать рутинные задачи и сделать ваши первые шаги в разработке сайтов проще.

Скрипт 1: Создание виртуального хоста

Когда я только начал заниматься веб-разработкой под Linux, и запустил свой первый web-сервер под Ubuntu 18.04, то меня напрягало, что каждый мой новый проект требовал от меня выполнения одних и тех же действий: создание директории, настройка Apache, изменение файла /etc/hosts и так далее. Это было похоже на выпекание хлеба с нуля каждый раз, когда я захотел бутерброд. Вспаши поле, посей рожь, собери урожай и т.д.

Поэтому, опираясь на свой опыт в автоматизации технологических процессов и устройства умного дома, я решил написать скрипт, который делает всю грязную работу за нас.

Просто запустите его, укажите название вашего проекта и доменное имя (например, mysite.local), и ваш сайт уже будет готов к работе. Остается только открыть файл в редакторе, а сам сайт в браузере по указанному адресу и погнали!

Что делает 1-й скрипт?

1 — Создает директорию для сайта.
2 — Настраивает виртуальный хост Apache.
3 — Добавляет запись в файл /etc/hosts.
4 — Создает базовый файл index.html.

#!/bin/bash

# Проверяем, запущен ли скрипт с правами суперпользователя
if [ "$EUID" -ne 0 ]; then
  echo "Пожалуйста, запустите этот скрипт с правами sudo."
  exit 1
fi

# Запрашиваем у пользователя название проекта и домена
read -p "Введите название проекта (например, mysite): " project_name
read -p "Введите доменное имя (например, mysite.local): " domain_name

# Создаем директорию для сайта внутри /var/www
site_dir="/var/www/$project_name"
echo "Создание директории $site_dir..."
mkdir -p "$site_dir"

# Устанавливаем права доступа для созданной директории
chown -R $USER:$USER "$site_dir"
chmod -R 755 "$site_dir"

# Создаем файл index.html с приветственным сообщением
index_file="$site_dir/index.html"
echo "<html><body><h1>Welcome to your new site - $domain_name!</h1></body></html>" > "$index_file"

# Настройка виртуального хоста Apache
echo "Настройка виртуального хоста для $domain_name..."
config_file="/etc/apache2/sites-available/$project_name.conf"
cat <<EOF > "$config_file"
<VirtualHost *:80>
    ServerAdmin webmaster@$domain_name
    ServerName $domain_name
    DocumentRoot $site_dir

    <Directory $site_dir>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/$project_name-error.log
    CustomLog \${APACHE_LOG_DIR}/$project_name-access.log combined
</VirtualHost>
EOF

# Включаем созданный виртуальный хост
a2ensite "$project_name.conf"

# Обновляем конфигурацию Apache
systemctl reload apache2

# Добавляем запись в файл /etc/hosts
echo "Добавление записи в /etc/hosts..."
echo "127.0.0.1 $domain_name" >> /etc/hosts

# Сообщение об успешном завершении
echo "Сайт успешно создан и доступен по адресу http://$domain_name"

Если внимательно посмотреть на этот скрипт, то можно легко понять все его шаги и в случае необходимости — скорректировать под себя. Каждое действие сопровождается подробным комментарием как в самом скрипте, так и при его запуске.

Скрипт 2: Удаление виртуального хоста

А теперь представьте ситуацию: вы создали несколько тестовых сайтов, но они больше не нужны. Что делать? Конечно, можно вручную удалить файлы конфигурации Apache, очистить /etc/hosts и стереть директории. Но почему бы не воспользоваться вторым скриптом, который сделает это за вас?

Этот скрипт покажет список всех активных виртуальных хостов, предложит выбрать тот, который нужно удалить, и выполнит все необходимые действия. Проще простого!

Что он делает?

1 — Показывает список включенных виртуальных хостов.
2 — Удаляет файл конфигурации Apache.
3 — Удаляет запись из /etc/hosts.
4 — Удаляет директорию сайта.

#!/bin/bash

# Проверяем, запущен ли скрипт с правами суперпользователя
if [ "$EUID" -ne 0 ]; then
  echo "Пожалуйста, запустите этот скрипт с правами sudo."
  exit 1
fi

# Получаем список включенных виртуальных хостов
echo "Получение списка включенных виртуальных хостов..."
enabled_sites=$(ls /etc/apache2/sites-enabled/ | sed 's/\.conf$//' | awk '{gsub(/^[0-9]*_/,""); print $0}')

# Если список пустой, выходим
if [ -z "$enabled_sites" ]; then
  echo "Нет включенных виртуальных хостов."
  exit 0
fi

# Выводим список виртуальных хостов
echo "Список включенных виртуальных хостов:"
select site in $enabled_sites; do
  if [ -n "$site" ]; then
    break
  else
    echo "Неверный выбор. Пожалуйста, выберите номер из списка."
  fi
done

# Подтверждение удаления
read -p "Вы уверены, что хотите удалить хост '$site'? (y/n): " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
  echo "Операция отменена."
  exit 0
fi

# Удаление файла конфигурации Apache
config_file="/etc/apache2/sites-available/${site}.conf"
echo "Удаление файла конфигурации Apache: $config_file..."
rm -f "$config_file"

# Отключение виртуального хоста
echo "Отключение виртуального хоста $site..."
a2dissite "$site"

# Обновляем конфигурацию Apache
systemctl reload apache2

# Удаление записи из /etc/hosts
echo "Удаление записи из /etc/hosts..."
sed -i "/127.0.0.1\s\+$site/d" /etc/hosts

# Удаление директории сайта
site_dir="/var/www/$site"
echo "Удаление директории сайта: $site_dir..."
rm -rf "$site_dir"

# Сообщение об успешном завершении
echo "Хост '$site' успешно удален."

Если вы создавали хосты первым скриптом, то второй скрипт точно отработает свою задачу на отлично без всякой правки. Однако, если же вы создаете хосты по другому алгоритму, то, возможно вам придется внести некоторые изменения. Опять таки весь скрипт хорошо откомментирован, что поможет вам разобраться в его структуре и последовательности действий.

Скрипт 3: Создание пользователя MySQL и базы данных

Устанавливая в первый раз CMS на локальный хостинг, я испытал растерянность, когда приходилось вручную создавать пользователей и таблицы в MySQL. На тот момент я не имел никакого опыта работы с СУБД, а в мануале к CMS не было чутко указано как именно создавать базы, таблицы, пользователей и задавать им привилегии. Поэтому, этот последний, но не менее важный скрипт поможет вам создать нового пользователя MySQL и базу данных. Забудьте о сложных командах и требованиях к паролям — этот скрипт всё сделает за вас. Он даже проверит, соответствует ли ваш пароль всем современным стандартам безопасности (минимум 8 символов, заглавные и строчные буквы, специальные символы).

Просто укажите имя пользователя, пароль и название базы данных, и всё будет готово.

Что он делает?

1 — Создает нового пользователя MySQL.
2 — Проверяет надежность пароля.
3 — Создает базу данных.
4 — Назначает пользователю все привилегии для управления созданной базой.

#!/bin/bash

# Проверяем, запущен ли скрипт с правами суперпользователя
if [ "$EUID" -ne 0 ]; then
  echo "Пожалуйста, запустите этот скрипт с правами sudo."
  exit 1
fi

# Проверяем, установлен ли MySQL
if ! command -v mysql &> /dev/null; then
  echo "MySQL не найден. Убедитесь, что MySQL установлен."
  exit 1
fi

# Функция для проверки пароля на соответствие требованиям
check_password_strength() {
  local password=$1
  if [[ ${#password} -lt 8 ]]; then
    echo "Ошибка: Пароль должен содержать минимум 8 символов."
    return 1
  fi
  if ! [[ "$password" =~ [A-Z] ]]; then
    echo "Ошибка: Пароль должен содержать хотя бы одну заглавную букву."
    return 1
  fi
  if ! [[ "$password" =~ [a-z] ]]; then
    echo "Ошибка: Пароль должен содержать хотя бы одну строчную букву."
    return 1
  fi
  if ! [[ "$password" =~ [\!\@\#\$\%\^\&\*\(\)\,\.\?\"\'\:\{\}\|\<\>] ]]; then
    echo "Ошибка: Пароль должен содержать хотя бы один специальный символ (!@#$%^&*(),.?\":{}|<>)."
    return 1
  fi
  return 0
}

# Запрашиваем у пользователя имя нового пользователя MySQL
read -p "Введите имя нового пользователя MySQL: " mysql_user

# Запрашиваем пароль дважды для подтверждения
while true; do
  read -s -p "Введите пароль для пользователя (минимум 8 символов, ВЕРХНИЙ и нижний РеГиСТРы, минимум 1 спецсимвол) $mysql_user: " mysql_password
  echo ""
  read -s -p "Подтвердите пароль для пользователя $mysql_user: " mysql_password_confirm
  echo ""

  # Проверяем совпадение паролей
  if [ "$mysql_password" != "$mysql_password_confirm" ]; then
    echo "Пароли не совпадают. Попробуйте снова."
    continue
  fi

  # Проверяем надежность пароля
  if ! check_password_strength "$mysql_password"; then
    continue
  fi

  break
done

# Запрашиваем название новой базы данных
read -p "Введите название новой базы данных: " db_name

# Подключение к MySQL с использованием root-пароля через интерактивный ввод
echo "Введите пароль root MySQL:"
mysql_root_password=$(mysql -u root -p -e "SELECT 1" 2>&1 >/dev/null)

# Создание пользователя и базы данных
echo "Создание пользователя и базы данных..."

# SQL-команды для создания пользователя, базы данных и назначения привилегий
mysql -u root -p <<EOF
  CREATE USER '$mysql_user'@'localhost' IDENTIFIED BY '$mysql_password';
  CREATE DATABASE IF NOT EXISTS $db_name;
  GRANT ALL PRIVILEGES ON $db_name.* TO '$mysql_user'@'localhost';
  FLUSH PRIVILEGES;
EOF

# Проверка результата выполнения команд
if [ $? -eq 0 ]; then
  echo "Пользователь '$mysql_user' и база данных '$db_name' успешно созданы."
else
  echo "Произошла ошибка при создании пользователя или базы данных."
  exit 1
fi

Теперь вы можете сосредоточиться на кодировании, а не на настройке баз данных.

Все три скрипта можно просто скопировать и вставить в удобный вам текстовый редактор и сохранить файл с расширением .sh, или же скачать архив по ссылке. Распакуйте его в удобное вам место для дальнейшего использования.

А как же запускать скрипты???

Все скрипты написаны для запуска из консоли. Да, я обещал в заголовке, что мы ее просто обойдем, но, я вам всё равно рано или поздно придётся погрузиться в консольный мир, особенно, если в дальнейшем вы планируете работать над серьезными проектами, выводить их в общий доступ да и вообще навык работы с терминалом полезен не только пользователям Linux, но и под Windows бывает иногда полезно в него заглянуть.

И так, перейдем к запуску скриптов.

Откройте консоль на своем ПК. Если у вас, как и у меня установлена OS Ubuntu, то для быстрого открытия консоли можно воспользоваться горячими клавишами Ctrl+Alt+T (сочетание работает во многих системах, основанных на Debian или Ubuntu), или найдите в списке приложение терминал или консоль.

Запустили? Отлично! Перед вами командная строка вашей системы. Для запуска наших скриптов автоматизации — вам необходимо в терминале перейти в директорию, в которой последние хранятся. Для навигации по директориям используется команда cd, которая означает «change directory» (переместиться в другую директорию).

Например, если ваши скрипты находятся в папке ~/scripts (~ — означает петь относительно домашней папки пользователя и в данном случае это будет /home/username/scripts), выполните следующую команду:

cd ~/scripts

Используя «~» вы можете быстро указывать путь относительно домашней папки. Если вы не знаете точное имя файла со скриптом, то можете воспользоваться командой ls, которая выводит список всех файлов, находящейся в текущей директории:

:~/scripts$ ls
 create-host.sh
 remove-host.sh
 create_mysql_user_db.sh

Теперь, когда мы видим список наших скриптов, чтобы запустить скрипт, используйте от имени суперпользователя (sudo) команду bash, за которой следует имя необходимого скрипта. Например, чтобы запустить скрипт создания виртуального хоста, введите:

sudo bash create-vhost.sh

Если вы получаете сообщение об ошибке, говорящее, что файл «не исполняемый», возможно, нужно добавить права на выполнение. Выполните команду chmod перед запуском скрипта:

chmod +x create-vhost.sh

Не бойтесь экспериментировать! Каждая команда — это инструмент, который помогает вам управлять вашей системой. А эти три скрипта станут вашими первыми помощниками на пути к автоматизации рутинных задач.

Если что-то пойдет не так, не отчаивайтесь — терминал всегда готов повторить команду, пока всё не станет работать идеально. Ну или привести к «смерти» вашей системы.

Совет начинающим

Перед тем как запустить какой-либо скрипт из недостоверного источника — изучите его внимательно.

Think twice! Don’t Drink and Root!