Pull to refresh

Бэкапы своими руками для чайников

Reading time3 min
Views22K
Давно известно, что сисадмины делятся на две категории: те, кто еще не делает бэкапы и те кто уже делает. В то время, когда одни ДЦ горят, а вторые внезапно исчезают, лучше всего принадлежать ко второй категории.

Итак, хочу поделиться опытом простого автоматического резервирования данных для чайников.

Задача


Необходимо по расписанию создавать резервные копии файлов и базы данных. Эти два процесса должны быть независимы друг от друга, потому что бэкап БД делается чаще, чем бэкап файлов (или наоборот).
Дано

  • VPS на базе Centos 5 x86_64.
  • Панель управления ISP Manager. Стандартные средства ISP Manager не устраивают.
  • Свободного места на сервере очень мало.

Цель

Получить архивы файлов и БД на сервере в определенной папке. Архивы должны быть доступны по http-протоколу.


Решение


Так как это первый опыт написания скриптов — код может показаться кому-то слегка корявым.

Бэкап MySQL
Делает дампы всех БД, доступных для указанного пользователя.
#!/bin/sh

# ---- Константы --------------------------------------
# Папка, куда складываем бекапы
BACKUP_DIR="/var/www/wscms/data/www/site.ru/backup/"
# Имя файла бекапа
BACKUP_FILE="sql.tar"
# Пользователь, владелец файла с бекапами
USER="wscms"
# Папка для временных дампов MySQL
MDIR="mysql/"
# Сервер БД MySQL
MHOST="localhost"
# MYSQL root пользователь
MUSER="root"
# MYSQL root пароль
MPASS="***************"
# Поставьте "-zcf" если хотите сжимать данные или "-cf" в противном случае
PARAMS="-cf"

#--- Служебные переменные --------------------------
# Путь к mysql.
MYSQL="$(which mysql)"
# Путь к mysqldump
MYSQLDUMP="$(which mysqldump)"
# Путь к tar
TAR="$(which tar)"
# Путь к chown
CHOWN="$(which chown)"
# Путь к RM
RM="$(which rm)"
# Путь к MKDIR
MKDIR="$(which mkdir)"

# ---- Получаем список баз данных
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"

# ---- Чистим папку с дампами на случай, если она уже существовала
$RM -rf $BACKUP_DIR$MDIR
# ---- Создаем папку для дампов
$MKDIR -p $BACKUP_DIR$MDIR

# ---- Делаем дампы найденых баз. Старые дампы замещаются
for db in $DBS
do
    FILE=$BACKUP_DIR$MDIR$db.sql
    $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db > $FILE
done

# ---- Архивируем файлы
$TAR $PARAMS $BACKUP_DIR$BACKUP_FILE $BACKUP_DIR$MDIR

# ---- Удаляем уже не нужную нам папку с MySQL дампами
$RM -rf $BACKUP_DIR$MDIR

$CHOWN $USER $BACKUP_DIR
$CHOWN $USER $BACKUP_DIR$BACKUP_FILE
exit 0


Бэкап файлов
#!/bin/sh

# ---- Константы --------------------------------------
# Папка, куда складываем бекапы
BACKUP_DIR="/var/www/wscms/data/www/site.ru/backup/"
# Расширение файла бекапа
EXT=".tar"
# Директория, в которой лежат аккаунты
MAIN_DIR="/var/www/"
# Директория, в которой лежат сайты аккаунтов
DATA_DIR="/data/www/"
# Пользователь, владелец файла с бекапами
USER="wscms"
# Поставьте "-zcf" если хотите сжимать данные или "-cf" в противном случае
# используйте u для добавления только новых файлов
PARAMS="-cf"

#--- Служебные переменные --------------------------
# Путь к tar
TAR="$(which tar)"
# Путь к chown
CHOWN="$(which chown)"
RM="$(which rm)"
MKDIR="$(which mkdir)"

# ---- Создаем папку для дампов
$MKDIR -p $BACKUP_DIR
$CHOWN -R $USER $BACKUP_DIR

# ---- Для всех пользователей панели
for DIR in $(/usr/local/ispmgr/sbin/mgrctl -m ispmgr user | cut -d' ' -f1 | sed s/name=//)
do
    # ---- Архивируем файлы
    $TAR $PARAMS $BACKUP_DIR$DIR$EXT $MAIN_DIR$DIR$DATA_DIR
    $CHOWN $USER $BACKUP_DIR$DIR$EXT
done

$CHOWN -R $USER $BACKUP_DIR
exit 0


Добавляем в CRON от root-пользователя
/bin/sh /backup/backup.sh
/bin/sh /backup/sql.sh
Ставим нужное нам расписание

После работы этих двух скриптов мы имеем бэкапы файлов каждого пользователя по отдельности и бекап MySql.

Теперь мы можем делать с ними все что угодно: либо на стороннем сервере в другом ДЦ забирать их с помощью wget, либо (как это реализовано у меня) с помощью несложного windows-приложения, загруженного в планировщик, ежедневно скачивать бэкапы на локальную машину.

В целях безопасности в папку site.ru/backup/ советую положить следующий .htaccess
Order Deny,Allow
Deny from all
Allow from Ваш.IP.Адрес, IP.Адрес.ВПС.Если.Используете.wget

Удачи Вам, и не теряйте свои данные.
Tags:
Hubs:
+6
Comments14

Articles