Разворачиваем блог на WordPress в Docker контейнере за Nginx
— Звучит запутанно ? — Да нет же, все просто и даже очень удобно.
Часто удобнее разместить свой блог на хостинге через удобную cPanel в два клика, благо на данный момент они на любой вкус и кошелек. Но визуальные установщики и всякие там панели нам не подходят, только консоль, только хардкор. Тем более что сервисы, предоставляющие инфраструктуру как сервис (IaaS), будут в разы дешевле.
— Почему Docker ? — Это действительно дико удобно. Изолированная среда, быстрое развертывание и еще целый ряд преимуществ.
Так что если Вам это интересно добро пожаловать под кат.
Разворачиваем WordPress
Установку Docker пожалуй описывать не буду, так как она хорошо задокументирована на официальном сайте, на данный момент я использую Ubuntu потому мне сюда.
Далее нам понадобится docker-compose — это утилита, позволяющая запускать одновременно несколько контейнеров, используя при этом единый файл конфигурации всего стека сервисов, нужных нашему приложению. Как Вы уже догадались база данных будет в отдельном контейнере.
Создаем каталог с проектом и переходим в него
1 2 |
mkdir my-blog cd my-blog |
Создаем каталог в котором будет развернут блог, далее мы подключим его к контейнеру
1 2 |
mkdir wordpress chmod -R 777 wordpress/ |
Создаем файл docker-compose.yml
1 2 |
touch docker-compose.yml vim docker-compose.yml |
Используем официальные контейнеры wordpress и mysql.
Не забываем установить пароль пользователя root к базе данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
version: '3.6' services: db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: ***** MYSQL_DATABASE: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - ./wordpress:/var/www/html ports: - "8081:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_PASSWORD: ***** |
Все запросы к порту 8081 на локальном хосте будут перенаправляться в контейнер wordpress. Вместо 8081 можно установить любой незанятый порт. Порты 80 и 443 будет прослушивать Nginx и проксировать запросы к Apache на порт 8081.
Поднимаем контейнеры
1 |
docker-compose up -d |
Дожидаемся загрузки образов контейнеров и их запуска и завершаем установку wordpress перейдя по ссылке http://localhost:8081
Вуаля! Мы развернули сайт на WordPress в Docker контейнерах.
Если у Вас уже есть сайт и перед вами цель развернуть его в docker контейнерах из архивов, необходимо:
- скопировать весь контент сайта в каталог wordpress
- добавить в раздел db: строки вида:
1 2 |
volumes: - ./wordpress.sql.gz:/docker-entrypoint-initdb.d/backup.sql.gz |
где wordpress.sql.gz архив базы данных.
Настройка Nginx
Nginx часто используется в качестве реверс прокси для приложений использующих Apache, это дает некоторые преимущества для горизонтального масштабирования и распределения нагрузки, подробнее про совместное использование и различия можно почитать тут.
Документацию по установке можно найти на официальном сайте Nginx
Создаем файл blog.conf в каталоге /etc/nginx/conf.d и откроем его.
1 2 |
sudo touch /etc/nginx/conf.d/blog.conf vim /etc/nginx/conf.d/blog.conf |
Конфигурация проксирования запросов по адресу blog.simonyan.org в контейнер с wordpress на localhost:8081 выглядит так.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { server_name blog.simonyan.org; # change this listen 80; location / { proxy_set_header X-Original-Request $request_uri; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_pass http://localhost:8081; } } |
Перезапускаем nginx и проверяем blog.simonyan.org
1 |
sudo systemctl restart nginx |
Настройка архивирования данных по расписанию.
Ни один сайт и тем более база данных не должна работать без организации процесса резервного копирования, займемся.
Настройка архивирования сайта на wordpress состоит из:
- Копирования всех файлов с контентом сайта, которые находятся в каталоге wordpress.
- Создание резервной копии базы данных
- Сжатие данных архива
- Хранение определенного количества копий (например 5)
Создаем скрипт который будет выполнять вышеперечисленную работу
1 2 |
touch wp-backup.sh vim wp-backup.sh |
Наполнение и детальное описание в тесте скрипта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/bin/bash NOW=$(date +"%Y-%m-%d_%H:%M:%S") BACKUP_DIR="your/local/path/to/dir/backups" DB_USER="root" DB_PASS="******" #change this DB_NAME="wordpress" DB_DOCKER_NAME="" #change this WWW_DIR="wordpress" FILE="wp.$NOW.tar" DB_FILE="$DB_NAME.sql" DB_TRANSFORM='s,tmp/,/,' # Create backup dir if not exist if ! [ -d $BACKUP_DIR ]; then mkdir -p $BACKUP_DIR fi # Add wordpres dir to archive tar -cf $BACKUP_DIR/$FILE $WWW_DIR # Make dump for db to tmp dir docker exec $DB_DOCKER_NAME sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"' > /tmp/$DB_FILE # Append db dump file to archive tar --append --file=$BACKUP_DIR/$FILE --transform $DB_TRANSFORM /tmp/$DB_FILE # Delete tmp files rm /tmp/$DB_FILE # Compression gzip -9 $BACKUP_DIR/$FILE # get count files in dir count=$(find $BACKUP_DIR -maxdepth 1 -type f | wc -l) if [ $count -ge 5 ]; then # if files more then 5 delete first that was written cd $BACKUP_DIR && ls -rt | head -n 1 | xargs rm -f fi |
Проверяем скрипт в действии
1 |
sh wp-backup.sh |
Все работает, двигаемся дальше.
Настроим запуск выполнения скрипта по расписанию с помощью cron.
1 |
crontab -e |
Откроет файл конфигурации заданий для текущего пользователя
Добавляем строки вида
1 2 |
# Backup wordpress blog.simonyan.org 0 1 * * * ~/your/path/to/backup/script/wp-backup.sh >/dev/null 2>&1 |
В данном виде запуск будут производиться каждый день в 1:00. Более подробно об использование cron в Ubuntu тут
И не забываем дать скрипту права на выполнение.
1 |
chmod +x wp-backup.sh |
Рекомендуется также копировать архивы сайта в облачное хранилище, иначе какой смысл хранить их рядом с сайтом на одном жестком диске.
Я для этих целей использую Dropbox. И поскольку он установлен локально просто указываем в скрипте архивирования каталог за которым смотрит Drpopbox, и получаем синхронизацию с облаком. Можно конечно настроить Dropbox Uploader, но это уже совсем другая история.