WordPress одной кнопкой - установка и настройка.

Мне часто приходится устанавливать и проводить начальную настройку 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 wordpress install установка

С помощью 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 wordpress install установкаС помощью 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 Guidehttp://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html

WP-CLI Commandshttps://developer.wordpress.org/cli/commands/

2 КОММЕНТАРИИ

  1. Интересный сайт, очень много полезного почерпнул здесь для себя.
    Хотелось бы побольше статей.

Ответить:

Please enter your comment!
Please enter your name here