Легкопереносимый вариант установки Ксены

AfterWork

Регистрация
06.05.16
Сообщения
1
Симпатии
0
#1
Оставлю и тут инструкцию.

Сразу прошу сильно ногами не пинать за кривизну некоторых решений и корявость кода. Все было написано и собрано за пару часов. Кроме этого моё общение с docker на тот момент исчислялось чуть больше чем теми-же парой часов.
Задумка была такой:
Хотелось сделать скрипт автоустановки ксены на чистую ВПС с восстановлением форума из бакапа причем в режиме "без заморочек". Типа ткнул кнопку и пошел курить.
Надеюсь кому-то будет полезно. Критика приветствуется.

Процесс вышел простым и незатейливым.
В качестве хост системы используется Debian 8.3 x64. На этой-же платформе сделаны и контейнеры docker.
1. Копируем архив нашего форума на удаленный хост в /root и распаковываем.

Код:
scp backup.tar.gz [email protected]:
Немного о структуре архива. В скриптах всё прибито гвоздями по этому структуру каталогов стоит первично разок воспроизвести.

/root/Data/ - Основной каталог архива. В нем лежат все скрипты.
/root/Data/www/site.com/ - каталог с файлами ксены.
/root/Data/sql/ - каталог с бакапом БД ксены.
/root/Data/conf/site.com/ - конфиг nginx.conf
/root/Data/conf.d/site.com/ - и еще конфиг default.conf

Структура получилась именно такой просто потому что в процессе написания всего этого время поджимало и задачи постепенно сужались. :)

В качестве основы было решено использовать docker и в него завернуть по отдельности nginx, php-fpm и mariadb. После все слинковать.

nginx.conf
Код:
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid  /var/run/nginx.pid;


events {
  worker_connections  1024;
}


http {
  include  /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile  on;
  #tcp_nopush  on;

  keepalive_timeout  65;

  #gzip  on;

  include /etc/nginx/conf.d/*.conf;
default.conf
Код:
server {
  listen  80;
  listen 443 ssl;
  server_name  site.com;

  root  /home/site.com;

  client_max_body_size 100m;

  location / {
  index  index.html index.htm index.php;
  try_files $uri /index.php$is_args$args;
  }

  location ~ \.php$ {
  include fastcgi_params;
  fastcgi_pass  phpfpm:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
  }
}
Ничего примечательного. Работает. Думаю каждый на свой вкус поправит как ему надо.

В основном каталоге еще лежит 5 исполняемых файлов скриптов. Содержимое ниже.

Backup.sh
Код:
#!/bin/bash

#Удаление предидущего резерва.
cd /root/BackUp/
rm *.tar.gz

#Делаем резервную копию БД.
docker exec mariadb /var/lib/mysql/bakBD.sh

#Копируем файлы.
mkdir /root/BackUp/Data
cd /root/BackUp/Data
mkdir conf conf.d www sql
cp -a /root/nginx/conf/* ./conf/
cp -a /root/nginx/conf.d/* ./conf.d/
cp -a /root/www/* ./www/
cp -a /root/mysql/*.sql ./sql/
cp /root/mysql/restBD.sh restBD.sh
cp /root/mysql/bakBD.sh bakBD.sh
cp /root/BackUp/Backup.sh Backup.sh
cp /root/BackUp/Rotate.sh Rotate.sh
cp /root/BackUp/Inst_forum.sh Inst_forum.sh

#Перезапуск контейнеров.
service docker restart

# Пакуем и удаляем.
tar cvvzf "/root/BackUp/bak-`date +%F-%X`.tar.gz" /root/BackUp/Data/
cd /root/BackUp
rm /root/mysql/*.sql
rm -r Data
cp *.tar.gz ./ThisWeek/
bakBD.sh
Код:
#!/bin/bash

var_data=`date -u +%d%m%Y`

mysqldump -u root -pПАРОЛЬ test_xeno > /var/lib/mysql/test_xeno_$var_data.sql
Inst_forum.sh
Код:
#!/bin/bash

#Создаем структуру папок и файлов.
cd /root
mkdir BackUp BackUp/ThisWeek BackUp/LastWeek

#Ставим MariaDB.
docker run --restart=always --name mariadb -v /root/mysql:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=ПАРОЛЬ -d mariadb:latest

#Ставим nginx проксю. Может быть позже.
#docker run -d -p 80:80 -p 443:443 --restart=always --name proxy -v /root/nginx/htpasswd:/etc/nginx/htpasswd -v /root/nginx/ssl:/etc/nginx/certs  -v /var/run/docker.sock:/tmp/docker.sock:ro  jwilder/nginx-proxy

#Ставим PHP+FPM.
docker run -it --restart=always --name phpfpm --link mariadb:mysqlip -v /root/www:/home antares127/xen-phpfpm

#Ставим nginx.
docker run -e VIRTUAL_HOST=site.com,www.site.com --restart=always --name site.com --link mariadb:mysqlip --link phpfpm:phpfpm -v /root/nginx/conf.d/site.com:/etc/nginx/conf.d -v /root/nginx/conf/site.com:/etc/nginx/conf:ro -v /root/nginx/ssl/site.com:/etc/nginx/ssl -v /root/www/site.com:/home/site.com -d -p 80:80 nginx

#Рестартуем docker
service docker restart

#Разворачиваем бакап.
cd /root/Data
cp -a ./conf/* /root/nginx/conf/
cp -a ./conf.d/* /root/nginx/conf.d/
cp -a ./www/* /root/www/
cp -a ./sql/test_xeno*.sql /root/mysql/test_xeno.sql
cp Inst_forum.sh /root/BackUp/Inst_forum.sh
chmod +x /root/BackUp/Inst_forum.sh
cp restBD.sh /root/mysql/
chmod +x /root/mysql/restBD.sh
cp bakBD.sh /root/mysql/
chmod +x /root/mysql/bakBD.sh
cp Backup.sh /root/BackUp/Backup.sh
chmod +x /root/BackUp/Backup.sh
cp Rotate.sh /root/BackUp/Rotate.sh
chmod +x /root/BackUp/Rotate.sh


#Восстанавливаем базу.
docker exec -it mariadb /var/lib/mysql/restBD.sh

#Рестартуем docker
service docker restart

#Делаем первую резервную копию.
docker exec mariadb /var/lib/mysql/bakBD.sh

mkdir /root/BackUp/Data
cd /root/BackUp/Data
mkdir sql conf conf.d www
cp -a /root/nginx/conf/* ./conf/
cp -a /root/nginx/conf.d/* ./conf.d/
cp -a /root/www/* ./www/
cp -a /root/mysql/*.sql ./sql/
cp /root/mysql/restBD.sh restBD.sh
cp /root/mysql/bakBD.sh bakBD.sh
cp /root/BackUp/Backup.sh Backup.sh
cp /root/BackUp/Rotate.sh Rotate.sh
cp /root/BackUp/Inst_forum.sh Inst_forum.sh
tar cvvzf "/root/BackUp/bak-`date +%F-%X`.tar.gz" /root/BackUp/Data/
cd /root/BackUp
rm -r Data
rm /root/mysql/*.sql
cp *.tar.gz ./ThisWeek/


#Настраиваем крон для резервного копирования.
touch test
echo "08 04 * * * /root/BackUp/Backup.sh" >> test
echo "01 04 * * 3 /root/BackUp/Rotate.sh" >> test
crontab test
rm test
restBD.sh
Код:
#!/bin/bash

var_data=`date -u +%d%m%Y`

mysqldump -uroot -pПАРОЛЬ test_xeno > /var/lib/mysql/tcc1_test_$var_data.sql

mysql -u root -pПАРОЛЬ -e"DROP DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"CREATE DATABASE test_xeno"
mysql -u root -pПАРОЛЬ -e"USE test_xeno"
mysql -u root -pПАРОЛЬ -e"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ПАРОЛЬ'"
mysql -u root -pПАРОЛЬ -e"FLUSH PRIVILEGES"
mysql -u root -pПАРОЛЬ test_xeno < /var/lib/mysql/test_xeno.sql
mysql -u root -pПАРОЛЬ -e"SHOW DATABASES"
Rotate.sh
Код:
#!/bin/bash

#Копируем файлы.
cd /root/BackUp/
rm -r ./LastWeek/
mkdir LastWeek
mv ./ThisWeek/* ./LastWeek/
Чуть не забыл. Нам нужен еще два файлика чтобы подготовить чистую машину для работы с docker.
Я их так и не удосужился запихать внутрь архива. Вот они.
fw.sh
Код:
#!/bin/sh
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -X
iptables -t nat -X
iptables -t mangle -X
/etc/init.d/docker restart
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -i eth0 --match state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 --match state --state NEW -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1193 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o eth0 --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Inst_Dock.sh
Код:
#!/bin/bash
#variables to file
echo "IP_ADDR=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`" > .vars
apt-get update
echo "deb http://apt.dockerproject.org/repo debian-jessie main" >> /etc/apt/sources.list
apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
apt-get update
apt-cache policy docker-engine
sudo apt-get update
apt-get install -y docker-engine curl fail2ban

curl -L https://github.com/docker/compose/releases/download/1.5.0/run.sh > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
/etc/init.d/fail2ban restart
cp fw.sh /etc/init.d/fw.sh
chmod +x /etc/init.d/fw.sh
update-rc.d fw.sh defaults
/etc/init.d/fw.sh
Содержимое файла config.php в каталоге ксены будет в этом случае таким
Код:
<?php

$config['db']['host'] = 'mysqlip';
$config['db']['port'] = '3306';
$config['db']['username'] = 'root';
$config['db']['password'] = 'ПАРОЛЬ';
$config['db']['dbname'] = 'test_xeno';
Что мы в итоге получаем на выходе:
1. Полностью рабочий форум.
2. Выполняется ежедневное резервное копирование форума с недельной ротацией. (Хоть и на локальный диск сервера) :)
3. Все необходимые для развертывания форума на новой машине скрипты лежат в самом бакапе.
4. Логичную и удобную структуру данных на машине с форумом.
5. Возможность автоматом и не заморачиваясь сделать немедленно резервную копию форума.
6. Условно настроенный iptables. :)

Вполне логично что во всех скриптах везде нужно заменить слово ПАРОЛЬ на пароль от вашей BD, test_xeno на имя вашей BD, а site.com на имя вашего домена.

Как-то так. Думаю новичкам будет не бесполезно.
Спасибо человеку который написал часть этих скриптов и подал идею.