AfterWork
Только чтение
- Сообщения
- 64
- Реакции
- 11
- Баллы
- 1,705
Сразу прошу сильно ногами не пинать за кривизну некоторых решений и корявость кода. Все было написано и собрано за пару часов. Кроме этого моё общение с docker на тот момент исчислялось чуть больше чем теми-же парой часов.
Задумка была такой:
Хотелось сделать скрипт автоустановки ксены на чистую ВПС с восстановлением форума из бакапа причем в режиме "без заморочек". Типа ткнул кнопку и пошел курить.
Надеюсь кому-то будет полезно. Критика приветствуется.
Процесс вышел простым и незатейливым.
В качестве хост системы используется Debian 8.3 x64. На этой-же платформе сделаны и контейнеры docker.
1. Копируем архив нашего форума на удаленный хост в /root и распаковываем.
Немного о структуре архива. В скриптах всё прибито гвоздями по этому структуру каталогов стоит первично разок воспроизвести.
/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
default.conf
Ничего примечательного. Работает. Думаю каждый на свой вкус поправит как ему надо.
В основном каталоге еще лежит 5 исполняемых файлов скриптов. Содержимое ниже.
Backup.sh
bakBD.sh
Inst_forum.sh
restBD.sh
Rotate.sh
Чуть не забыл. Нам нужен еще два файлика чтобы подготовить чистую машину для работы с docker.
Я их так и не удосужился запихать внутрь архива. Вот они.
fw.sh
Inst_Dock.sh
Содержимое файла config.php в каталоге ксены будет в этом случае таким
Что мы в итоге получаем на выходе:
1. Полностью рабочий форум.
2. Выполняется ежедневное резервное копирование форума с недельной ротацией. (Хоть и на локальный диск сервера) :-)
3. Все необходимые для развертывания форума на новой машине скрипты лежат в самом бакапе.
4. Логичную и удобную структуру данных на машине с форумом.
5. Возможность автоматом и не заморачиваясь сделать немедленно резервную копию форума.
6. Условно настроенный iptables. :-)
Вполне логично что во всех скриптах везде нужно заменить слово ПАРОЛЬ на пароль от вашей BD, test_xeno на имя вашей BD, а site.com на имя вашего домена.
Как-то так. Думаю новичкам будет не бесполезно.
Задумка была такой:
Хотелось сделать скрипт автоустановки ксены на чистую ВПС с восстановлением форума из бакапа причем в режиме "без заморочек". Типа ткнул кнопку и пошел курить.
Надеюсь кому-то будет полезно. Критика приветствуется.
Процесс вышел простым и незатейливым.
В качестве хост системы используется 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/
Код:
#!/bin/bash
var_data=`date -u +%d%m%Y`
mysqldump -u root -pПАРОЛЬ test_xeno > /var/lib/mysql/test_xeno_$var_data.sql
Код:
#!/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
Код:
#!/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"
Код:
#!/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
Код:
#!/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 на имя вашего домена.
Как-то так. Думаю новичкам будет не бесполезно.