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

Тема в разделе "Инструкции и основная информация", создана пользователем AfterWork, 06.05.16.

  1. AfterWork

    AfterWork Новичок

    Сообщения:
    1
    Репутация:
    5
    Рейтинг:
    +0 / -0
    Оставлю и тут инструкцию.

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

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

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

    /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 на имя вашего домена.

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