Мне часто приходится устанавливать и проводить начальную настройку WordPress. Процесс сам по себе не очень долгий, но однообразный и нудный, особенно если проделывать это несколько раз подряд. Поскольку я ленивый, то я решил все упростить, сведя все к минимуму действий.
Обычно установка WordPress проходит в несколько этапов.
- Создание базы данных.
- Создание каталогов сайта.
- Собственно сама установка wordpress.
- Небольшая начальная настройка (формат ссылок, пользователи, плагины и т.д.)
- Добавление нового сайта в logrotate для ротации лог-файлов.
Всю эту последовательность действий нужно было автоматизировать и приспособить для постоянного многоразового использования. Для этого я написал скрипт, который можно изменять под нужды нового сайта.
Я не претендую на оригинальность, так как подобные скрипты существуют давно. При желании их можно найти на Github или в гугле. Но поскольку все они рассчитаны под нужды написавшего их админа, то приходится искать или максимально подходящий, или переписывать под себя.
В данной статье я подробно опишу создание скрипта и его работу. Для примера я буду использовать виртуальную машину (Ubuntu Server 16.04, PHP 7, Nginx, MariaDB, WP-CLI) выступающую в роли локального сервера. Готовый скрипт можно скачать в конце статьи.
База данных для wordpress
Начать стоит с создания базы данных для нового сайта. Обычно я захожу в консоль MariaDB и выполняю определенную последовательность команд.
# Вхожу в консоль mysql -u root -p # Создаю пользователя для базы данных (если нужен) create user 'username'@'localhost' identified by 'password'; # Создаю базу данных create database basename; # Назначаю привилегии для пользователя grant all on basename.* to 'username'@'localhost'; # Применяю изменения в привилегиях flush privileges; # Выхожу из консоли quit
В виде скрипта приведенные выше команды будут выглядеть примерно так.
#!/bin/bash # ------------------------------------------------------------------------- # Переменные базы данных (имя базы, имя пользователя, пароль пользователя). # ------------------------------------------------------------------------- # basename, username, password - заменить на свои значения. DBNAME=basename DBUSER=username DBPASS=password # Переменная пароля root-пользователя mysql/mariadb, для входа в консоль. ROOTPASS=password # Переменная каталога в котором находятся базы данных - НЕ ИЗМЕНЯТЬ!!! DBDIR=/var/lib/mysql/ # ----------------------------------- # 1 - Создание базы данных для сайта. # ----------------------------------- echo "Создаю базу данных..." if [ -e "$DBDIR"/"$DBNAME" ]; then echo -e "\nБаза с таким именем уже есть. Выбери другое имя для базы данных. Работа скрипта остановлена." && exit fi # Создание пользователя (раскомментировать если нужен новый пользователь). #mysql -u root -p"$ROOTPASS" -e "create user "$DBUSER"@'localhost' identified by '$DBPASS';" # Создание базы данных и назначение привилегий пользователя. mysql -u root -p"$ROOTPASS" -e "create database "$DBNAME"; grant all on "$DBNAME".* to "$DBUSER"@'localhost'; flush privileges;" if [ "$?" != 0 ]; then echo -e "\nВо время создания базы возникла ошибка. Работа скрипта остановлена." && exit fi echo -e "\nБаза данных: "$DBNAME" Пользователь базы данных: "$DBUSER" Пароль пользователя: "$DBPASS" "
Скрипт удобен тем, что он использует так называемые переменные, обозначенные в начале скрипта. Во время работы значения переменных подставляются в тех частях, где переменные указаны знаком $.
Значения переменных можно изменять, кроме переменной DBDIR, ее изменять не нужно. В значении DBDIR указан каталог /var/lib/mysql/, в этом каталоге MariaDB создает и хранит базы данных.
DBDIR нужна только для того, чтобы проверить наличие создаваемой базы данных в каталоге /var/lib/mysql/. Если база с таким именем уже существует, скрипт завершит работу и предложит выбрать другое имя для базы данных.
if [ -e "$DBDIR"/"$DBNAME" ]; then echo -e "База с таким именем уже есть. Выбери другое имя для базы данных. Работа скрипта остановлена." && exit fi
Еще одно условие проверяет наличие ошибок могущих возникнуть при создании базы данных. Если ошибка выявлена (не создалась база и т.д.), то скрипт завершит работу.
if [ "$?" != 0 ]; then echo -e "\nВо время создания базы возникла ошибка. Работа скрипта остановлена." && exit fi
Иногда в создании нового пользователя нет необходимости и привилегии на новую базу назначаются уже существующему пользователю, для этого его имя и пароль нужно указать в значении переменных DBUSER и DBPASS, соответственно.
Если пользователь не нужен, то строку надо закомментировать и она не будет выполняться.
# Создание пользователя (раскомментировать если нужен новый пользователь). #mysql -u root -p"$ROOTPASS" -e "create user "$DBUSER"@'localhost' identified by '$DBPASS';"
Обратите внимание на вход в консоль MariaDB. После ключа "-p" будет подставлено значение переменной ROOTPASS (пароль root-пользователя mysql).
-u - пользователь которым будем заходить. (root-пользователь mysql, не путать с обычным root). -p - ввод пароля пользователя (написать свой пароль в значении переменной ROOTPASS). -e - выполнить указанные команды и выйти. mysql -u root -p"$ROOTPASS" -e
Каталоги сайта
Новый сайт будет располагаться в каталоге /var/www/localsite/public. Отдельно еще создаю каталог для лог-файлов /var/www/localsite/logs.
mkdir -p /var/www/localsite/public mkdir /var/www/localsite/logs
В виде скрипта это выглядит так.
#!/bin/bash # --------------------------------------------------- # Переменные каталогов (изменить на нужное значение). # --------------------------------------------------- SITEDIR=/var/www/localsite/public LOGDIR=/var/www/localsite/logs # -------------------------------- # 2 - Создание каталога для сайта. # -------------------------------- echo -e "\nСоздаю каталоги..." mkdir -p "$SITEDIR" mkdir "$LOGDIR"
Также задаем значения переменных SITEDIR и LOGDIR и подставляем переменные в команды создания каталогов mkdir.
Установка WordPress с помощью WP-CLI
Для установки WordPress я буду использовать WP-CLI - PHP приложение позволяющее устанавливать и настраивать WordPress через командную строку посредством ввода определенных команд.
WP-CLI устанавливается быстро и легко, не вызывая никаких проблем. Единственное требование для работы приложения - это наличие любой установленной версии PHP.
Сначала скачиваем файл wp-cli.phar.
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
Проверяем что приложение работает видит установленный PHP.
php wp-cli.phar --info
Если все в порядке, то должно быть нечто похожее (версия PHP, бинарный файл и т.д.)
OS: Linux 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 Shell: /bin/bash PHP binary: /usr/local/php7/bin/php PHP version: 7.2.3 php.ini used: /etc/php7/conf/php.ini WP-CLI root dir: phar://wp-cli.phar WP-CLI vendor dir: phar://wp-cli.phar/vendor WP_CLI phar path: /root WP-CLI packages dir: WP-CLI global config: WP-CLI project config: WP-CLI version: 1.5.1
Делаем файл wp-cli.phar исполняемым.
chmod +x wp-cli.phar
Перемещаем файл wp-cli.phar в каталог /usr/bin/ попутно переименовав его в wp.
mv wp-cli.phar /usr/bin/wp
Теперь команду wp можно выполнять из любого каталога. Если выполнить просто выполнить команду wp от имени пользователя root, то возникнет вот такая ошибка.
Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress install exists under. If you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this site will then have full control of your server, making it quite DANGEROUS. If you'd like to continue as root, please run this again, adding this flag: --allow-root If you'd like to run it as the user that this site is under, you can run the following to become the respective user: sudo -u USER -i -- wp <command>
Ошибка сообщает что запуск от имени root небезопасен и советует запускать wp-cli от обычного пользователя используя sudo, но если вы все же желаете работать от имени root пользователя, то в таком случае к команде нужно добавлять флаг --allow-root.
wp --info --allow-root OS: Linux 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 Shell: /bin/bash PHP binary: /usr/local/php7/bin/php PHP version: 7.2.3 php.ini used: /etc/php7/conf/php.ini WP-CLI root dir: phar://wp-cli.phar WP-CLI vendor dir: phar://wp-cli.phar/vendor WP_CLI phar path: /root WP-CLI packages dir: WP-CLI global config: WP-CLI project config: WP-CLI version: 1.5.1
Перейдем в созданный ранее каталог /var/www/localsite/public.
cd /var/www/localsite/public
Скачиваем русскую версию WordPress (если не дописать локаль --locale=ru_RU, то по дефолту будет скачан английский архив).
# Скачиваем русскую версию wordpress wp core download --locale=ru_RU --allow-root
Следующим шагом будет создание файла wp-config.php. Во время обычной установки WordPress это выглядит так.
С помощью WP-CLI файл wp-config.php создается следующей командой (то же что и на картинке выше, разве что добавлена русская локаль).
wp core config --dbname=basename --dbuser=username --dbpass=password --dbhost=localhost --dbprefix=prefix_ --locale=ru_RU --allow-root
Далее происходит установка WordPress.
С помощью WP-CLI установка выполняется следующей командой.
wp core install --url=http://localsite.com --title=sitetitle --admin_user=username --admin_password=password --admin_email=admin@localsite.com --allow-root
Сайт готов. Уже можно заходить в консоль управления для дальнейшей настройки, но проще и быстрее все сделать в консоли.
В каждом новом сайте на WordPress есть ненужные записи, страницы, комментарии и плагины, которые я удаляю сразу после установки.
Запись "Привет, мир!" - чтобы ее удалить выполняем следующую команду.
wp post delete 1 --allow-root
Страницы "Пример страницы" и "Политика конфиденциальности" удаляются так.
wp post delete 2 --allow-root wp post delete 3 --allow-root
Удаляю дефолтные плагины "Akismet Anti-Spam" и "Hello Dolly".
wp plugin delete hello --allow-root wp plugin delete akismet --allow-root
Сразу устанавливаю вид постоянных ссылок на "Название записи".
wp rewrite structure "/%postname%/" --allow-root
Подобным образом можно настроить почти все, но для начала хватит и этого. В виде скрипта все вышеописанное будет выглядеть так.
#!/bin/bash # ------------------------------------------------ # Переменные для установки wordpress через wp-cli. # ------------------------------------------------ # Префикс таблиц базы данных (заменить на свой). DBPREFIX=prefix_ # localhost - значение по умолчанию. НЕ ИЗМЕНЯТЬ!!! DBHOST=localhost # Домен сайта. URL=http://localsite.com # Название сайта. TITLE=sitetitle # username, password - заменить на свои значения (Для входа на сайт, а не от базы данных). ADMINUSER=username ADMINPASS=password # Почта администратора сайта. ADMINEMAIL=admin@localsite.com # ----------------------------------------- # 3 - Установка wordpress c помощью wp-cli. # ----------------------------------------- echo -e "\nУстанавливаю wordpress..." cd "$SITEDIR" # Скачиваем русскую версию wordpress wp core download --locale=ru_RU --allow-root # Создание wp-config.php wp core config --dbname="$DBNAME" --dbuser="$DBUSER" --dbpass="$DBPASS" --dbhost="$DBHOST" --dbprefix="$DBPREFIX" --locale=ru_RU --allow-root # Установка wordpress wp core install --url="$URL" --title="$TITLE" --admin_user="$ADMINUSER" --admin_password="$ADMINPASS" --admin_email="$ADMINEMAIL" --allow-root # Удаление записей wp post delete 1 --allow-root # Удаление страниц wp post delete 2 --allow-root wp post delete 3 --allow-root # Удаление плагинов wp plugin delete hello --allow-root wp plugin delete akismet --allow-root # Установка вида постоянных ссылок wp rewrite structure "/%postname%/" --allow-root wp rewrite flush --allow-root
Logrotate и все остальное
Назначаем права на каталоги сайта и перезагружаем сервер.
# Назначаем права для пользователя nginx на каталог сайта chown -R nginx:nginx /var/www/localsite/public chmod 775 /var/www/localsite/public # В скрипте будет так chown -R nginx:nginx "$SITEDIR" chmod 775 "$SITEDIR" # Перезагружаем сервер systemctl restart nginx
Осталось добавить сайт в ротацию лог-файлов утилиты logrotate. Обычно я создаю файл sites в каталоге /etc/logrotate.d и добавляю в него такое содержимое.
#localsite.com /var/www/localsite/logs/*.log { rotate 30 daily compress dateext missingok create 0640 nginx nginx sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript notifempty }
После чего запускаю сайт в ротацию.
logrotate -v -f /etc/logrotate.d/sites rotating pattern: /var/www/localsite/logs/*.log forced from command line (30 rotations) empty log files are not rotated, old logs are removed considering log /var/www/localsite/logs/access.log log does not need rotating considering log /var/www/localsite/logs/error.log log does not need rotating not running postrotate script, since no logs were rotated
В связи с особенностями обработки скриптом специальных символов и переменных, я применил два вида кавычек (двойные и одиночные), поэтому конструкция разбита на две части.
# Создаю файл sites и добавляю в него содержимое (изменить при необходимости). echo -e "\n# localsite.com $LOGDIR/*.log { rotate 30 daily compress dateext missingok create 0640 nginx nginx sharedscripts postrotate" >> sites echo -e '\t[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript notifempty }' >> sites # Добавляю сайт в ротацию logrotate -v -f /etc/logrotate.d/sites
Как использовать скрипт
Готовый скрипт.
#!/bin/bash # ------------------------------------------------------------------------- # Переменные базы данных (имя базы, имя пользователя, пароль пользователя). # ------------------------------------------------------------------------- # basename, username, password - заменить на свои значения. DBNAME=basename DBUSER=username DBPASS=password # Переменная пароля root-пользователя mysql/mariadb для входа в консоль. ROOTPASS=password # Переменная каталога в котором находятся базы данных - НЕ ИЗМЕНЯТЬ!!! DBDIR=/var/lib/mysql/ # ------------------------------------------------ # Переменные для установки wordpress через wp-cli. # ------------------------------------------------ # Префикс таблиц базы данных (заменить на свой). DBPREFIX=prefix_ # localhost - значение по умолчанию. НЕ ИЗМЕНЯТЬ!!! DBHOST=localhost # Домен сайта. URL=http://localsite.com # Название сайта. TITLE=sitetitle # username, password - заменить на свои значения (Для входа на сайт, а не от базы данных). ADMINUSER=username ADMINPASS=password # Почта администратора сайта. ADMINEMAIL=admin@localsite.com # --------------------------------------------------------- # Переменные каталогов сайта (изменить на нужное значение). # --------------------------------------------------------- SITEDIR=/var/www/localsite/public LOGDIR=/var/www/localsite/logs # ----------------------------------- # 1 - Создание базы данных для сайта. # ----------------------------------- echo "Создаю базу данных..." if [ -e "$DBDIR"/"$DBNAME" ]; then echo -e "\nБаза с таким именем уже есть. Выбери другое имя для базы данных. Работа скрипта остановлена." && exit fi # Создание пользователя (раскомментировать если нужен новый пользователь). #mysql -u root -p"$ROOTPASS" -e "create user "$DBUSER"@'localhost' identified by '$DBPASS';" # Создание базы данных и назначение привилегий пользователя. mysql -u root -p"$ROOTPASS" -e "create database "$DBNAME"; grant all on "$DBNAME".* to "$DBUSER"@'localhost'; flush privileges;" if [ "$?" != 0 ]; then echo -e "\nВо время создания базы возникла ошибка. Работа скрипта остановлена." && exit fi echo -e "\nБаза данных: "$DBNAME" Пользователь базы данных: "$DBUSER" Пароль пользователя: "$DBPASS" " # -------------------------------- # 2 - Создание каталога для сайта. # -------------------------------- echo -e "\nСоздаю каталоги..." mkdir -p "$SITEDIR" mkdir "$LOGDIR" # ----------------------------------------- # 3 - Установка wordpress c помощью wp-cli. # ----------------------------------------- echo -e "\nУстанавливаю wordpress..." cd "$SITEDIR" # Скачиваем русскую версию wordpress wp core download --locale=ru_RU --allow-root # Создание wp-config.php wp core config --dbname="$DBNAME" --dbuser="$DBUSER" --dbpass="$DBPASS" --dbhost="$DBHOST" --dbprefix="$DBPREFIX" --locale=ru_RU --allow-root # Установка wordpress wp core install --url="$URL" --title="$TITLE" --admin_user="$ADMINUSER" --admin_password="$ADMINPASS" --admin_email="$ADMINEMAIL" --allow-root # Удаление записей wp post delete 1 --allow-root # Удаление страниц wp post delete 2 --allow-root wp post delete 3 --allow-root # Удаление плагинов wp plugin delete hello --allow-root wp plugin delete akismet --allow-root # Установка вида постоянных ссылок wp rewrite structure "/%postname%/" --allow-root wp rewrite flush --allow-root # --------------------------------------------- # 4 - Назначение прав доступа к каталогу сайта. # --------------------------------------------- echo -e "\nНазначаю права и владельца каталога..." chown -R nginx:nginx "$SITEDIR" chmod 775 "$SITEDIR" # -------------------------------- # 5 - Перезагрузка конфигов nginx. # -------------------------------- echo -e "\nПерезагружаю NGINX..." systemctl restart nginx # --------------------------------- # 6 - Добавление сайта в logrotate. # --------------------------------- echo -e "\nДобавляю сайт в logrotate..." # Перехожу в каталог /etc/logrotate.d cd /etc/logrotate.d # Создаю файл sites и добавляю в него содержимое (изменить при необходимости). echo -e "\n# localsite.com $LOGDIR/*.log { rotate 30 daily compress dateext missingok create 0640 nginx nginx sharedscripts postrotate" >> sites echo -e '\t[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript notifempty }' >> sites # Добавляю сайт в ротацию logrotate -v -f /etc/logrotate.d/sites echo -e "\nРабота скрипта успешно завершена." exit 0
Скачиваем скрипт с моего сайта.
wget https://techlist.top/wp-content/uploads/2018/06/newsite.zip
Распаковываем архив и удаляем его.
unzip newsite.zip && rm newsite.zip
Делаем скрипт исполняемым.
chmod +x newsite.sh
Перемещаем скрипт в каталог /usr/bin попутно переименовывая его в newsite.
mv newsite.sh /usr/bin/newsite
Открываем скрипт любым текстовым редактором (например nano) и изменяем значения переменных под свои нужды.
nano /usr/bin/newsite
Сохраняем изменения в файле и запускаем скрипт. Работу скрипта можно вызывать командой newsite.
newsite
При написании статьи использовалась следующая литература.
Advanced Bash-Scripting Guide - http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html
WP-CLI Commands - https://developer.wordpress.org/cli/commands/