백업 스크립트 · 4 min read · Dec 02, 2025

완벽한 서버 확장 - 데비안 스퀴즈 [ISPConfig 3] - 페이지 6

10. 클라이언트 백업

스크립트의 내용은 2011년 3월 29일에 변경되었습니다. 업데이트해 주세요

이 스크립트는 ISPConfig v. 3.0.5 이상에서 올바르게 작동하지 않습니다. 많은 변경을 해야 하며 권장되지 않습니다. ISPConfig의 새로운 백업 방법을 사용해 주세요.

다음 스크립트는 클라이언트의 데이터와 클라이언트 데이터베이스를 웹사이트 폴더에 백업하는 간단한 방법입니다. ISPConfig3에서 각 클라이언트는 /var/www/clients/clientXY 형식의 폴더를 가지고 있으며, 그 안에 모든 웹사이트가 있습니다. 이 스크립트는 각 웹 폴더에 있는 모든 웹사이트와 데이터베이스를 백업하고 클라이언트가 다운로드할 수 있도록 합니다. 클라이언트가 데이터베이스를 여러 개 가지고 있는 경우, 모든 데이터베이스는 그의 첫 번째(웹ID 기준) 사이트에 백업됩니다. 이 스크립트는 또한 이러한 파일의 마지막 3일과 관리 사용을 위한 마지막 3일의 일요일을 선택한 디렉토리에 보관합니다(기본값은 /var/backup/sites입니다).

이것은 매우 간단한 스크립트입니다. 더 고급 솔루션은 이 게시물을 참조하세요.

스크립트를 생성하고 실행 가능하게 만든 후 편집합니다:

cd /root/scripts/  
touch mybackup.sh  
chmod 0700 mybackup.sh  
nano mybackup.sh

내용은 다음과 같아야 합니다:(변수 ispUSER, ispPASS, ispHOST, DEST 및 SITES를 필요에 맞게 변경하세요):

#!/bin/bash  
# MySql 데이터베이스 및 클라이언트 웹사이트 백업을 위한 셸 스크립트  
#   
# 마지막 업데이트: 2011년 3월  
# --------------------------------------------------------------------  
# 이것은 GNU GPL 버전 2.0 이상에 따른 무료 셸 스크립트입니다  
# 저작권 (C) 2011 iopen.gr  
# 피드백/댓글/제안: http://iopen.gr  
# --------------------------------------------------------------------  
#   
#           ISPConfig 3.0.x 및 그 이상을 위한 것입니다  
#   
# 이 스크립트는 모든 클라이언트의 웹 폴더(웹, 통계, cgi 등)를 백업합니다  
# 모든 클라이언트의 DB와 함께  
# 백업은 웹사이트 클라이언트 폴더에 배치됩니다  
# 스크립트는 현재 및 이전 2개의 백업을 유지합니다  
# 마지막 3개의 일요일도 유지합니다  
# --------------------------------------------------------------------  
  
# 데이터베이스 자격 증명. 전체 읽기 액세스가 있는 DB 사용자 또는 루트 사용자 사용  
ispUSER="root"                  # DB 사용자  
ispPASS="---yourpass---"        # 사용자 비밀번호  
ispHOST="localhost"             # 호스트 이름  
  
CURDIR="$(pwd)"   
# 바이너리에 대한 전체 경로가 있는 변수  
MYSQL="$(which mysql)"  
MYSQLDUMP="$(which mysqldump)"  
CHOWN="$(which chown)"  
CHMOD="$(which chmod)"  
GZIP="$(which gzip)"  
TAR="$(which tar)"   
  
# 서버의 주요 백업 디렉토리  
DEST="/var/backup"  
   
# 주요 백업 디렉토리의 사이트(전용) 백업 디렉토리  
SITES="$DEST/sites"  
    
# yymmdd 형식의 날짜 변수  
TODAY=`date +%Y%0m%0d`  
YESTERDAY=`date -d '1 day ago' +%Y%0m%0d`  
BACK2=`date -d '2 day ago' +%Y%0m%0d`  
BACK3=`date -d '3 day ago' +%Y%0m%0d`  
BACK22=`date -d '22 day ago' +%Y%0m%0d`  
   
[ ! -d $SITES ] && mkdir -p $SITES || :  
   
# 이 스크립트 폴더의 백업에 대한 루트 액세스만 부여  
$CHOWN 0.0 -R $SITES  
$CHMOD 0600 $SITES  
  
# --------------------------------------------------------------------------   
# 클라이언트 디렉토리의 이전(현재) 백업 제거  
# 백업은 다음 형식입니다:  
# *BU*gz  
# -------- 주의 ---------  
# 클라이언트 디렉토리에 이 형식의 다른 파일을 저장하지 마세요  
# --------------------------------------------------------------------------   
echo "-------------------------------------------------------------"  
  
QRY="use dbispconfig; SELECT web_domain.system_user, web_domain.system_group, \  
web_domain.document_root, web_domain.domain FROM web_domain WHERE  \  
web_domain.type!='alias' AND web_domain.system_user IS NOT NULL AND (LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;"  
  
echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line  
do  # ${col[0]}=도메인 사용자 / 폴더 이름 / 시스템 사용자, ${col[1]}=클라이언트ID / 시스템 그룹 ,  
        while read -a col  # ${col[2]}=웹사이트 경로, ${col[3]}= 도메인 이름  
do  
echo "    ${col[2]} 폴더에서 오래된 백업 정리 중 "  
for delfile in ${col[2]}/*BU*gz ;   
do [ -f $delfile ] && rm $delfile;   
done  
done  
done  
  
# --------------------------------------------------------------------------   
# 서버의 $SITES 디렉토리에서 22일 된 형식의 모든 항목 제거:  
# *[22일 된 날짜]*gz  
# --------------------------------------------------------------------------   
                echo "-------------------------------------------------------------"  
                echo "    SITES 폴더에서 오래된 백업 정리 중 "  
                for delfile in $SITES/*$BACK22*gz ;   
do [ -f $delfile ] && rm $delfile;    
done  
echo "-------------------------------------------------------------"  
echo "                                                             "  
echo "                                                             "  
  
# --------------------------------------------------------------------------   
# 각 클라이언트에 대해, 그의 웹사이트 폴더에 데이터베이스 백업  
# 여러 사이트가 있는 클라이언트의 경우 첫 번째 사이트에 모든 db 백업  
# 또한 오늘의 백업을 서버의 $SITES 디렉토리에 복사  
# 서버의 $SITES 디렉토리에서 3일 이상 된 백업 제거  
# 마지막 3개의 일요일 유지  
# --------------------------------------------------------------------------   
  
QRY="use dbispconfig; SELECT web_database.database_name , web_database.database_user ,\  
 min(web_domain.system_user) as muser, web_domain.system_group, min(web_domain.document_root) as mpath, \  
web_domain.domain FROM web_database, web_domain WHERE web_database.sys_userid=web_domain.sys_userid \  
AND web_database.sys_groupid=web_domain.sys_groupid AND web_domain.type='vhost' \  
AND web_domain.system_user IS NOT NULL AND (LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) \  
 GROUP BY web_database.database_name , web_database.database_user,  web_domain.system_group;"  
  
echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line  
do  # ${col[0]} = dbname, ${col[1]}=dbuser , ${col[2]}=도메인 사용자 / 폴더 이름 / 시스템 사용자,  
        while read -a col   #${col[3]}=클라이언트ID / 시스템 그룹 , ${col[4]}=웹사이트 경로  
do  
echo "          DB: "${col[0]}   
echo "-------------------------------------------------------------"  
echo "DB 백업 중:" ${col[0]}  "위치:"  ${col[4]}/${col[0]}BU.gz  
$MYSQLDUMP -u $ispUSER -h $ispHOST -p$ispPASS -c --add-drop-table --add-locks \  
 --quick --lock-tables ${col[0]} | $GZIP -9 > ${col[4]}/${col[0]}BU.gz  
cp ${col[4]}/${col[0]}BU.gz $SITES/${col[0]}.$TODAY.gz  
        if [ `date -d '3 day ago' +%u` -ne 7 ] # 3일 전이 일요일이 아닌 경우  
        then    #백업 제거  
                [ -f $SITES/${col[0]}.$BACK3.gz ] && rm $SITES/${col[0]}.$BACK3.gz  
        fi  
$CHOWN ${col[2]}:${col[3]} ${col[4]}/${col[0]}BU.gz  
$CHMOD 0660 ${col[4]}/${col[0]}BU.gz  
echo "-------------------------------------------------------------"  
echo "                                                             "  
done  
done  
  
# --------------------------------------------------------------------------   
# 각 클라이언트에 대해, 그의 웹사이트 폴더에 사이트 백업  
# 또한 오늘의 백업을 서버의 $SITES 디렉토리에 복사  
# 서버의 $SITES 디렉토리에서 3일 이상 된 백업 제거  
# 마지막 3개의 일요일 유지  
# --------------------------------------------------------------------------   
  
QRY="use dbispconfig; SELECT web_domain.system_user, web_domain.system_group,\  
 web_domain.document_root, web_domain.domain FROM web_domain WHERE  \  
web_domain.type!='alias' AND web_domain.system_user \  
IS NOT NULL AND (LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;"  
  
echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line  
do     # ${col[0]}=도메인 사용자 / 폴더 이름 / 시스템 사용자, ${col[1]}=클라이언트ID / 시스템 그룹 ,  
        while read -a col   # ${col[2]}=웹사이트 경로, ${col[3]}= 도메인 이름  
do  
echo "                                                             "  
echo "         사이트:" ${col[3]}  
echo "-------------------------------------------------------------"  
echo "사이트 백업 중: " ${col[2]}/  "위치:"  ${col[2]}/${col[3]}BU.tar.gz  
cd ${col[2]}  
sudo -u ${col[0]} $TAR -czf ${col[2]}/${col[3]}BU.tar.gz .  
cp ${col[2]}/${col[3]}BU.tar.gz $SITES/${col[3]}.$TODAY.tar.gz  
        if [ `date -d '3 day ago' +%u` -ne 7 ] # 3일 전이 일요일이 아닌 경우  
        then    #백업 제거  
                [ -f $SITES/${col[3]}.$BACK3.tar.gz ] && rm $SITES/${col[3]}.$BACK3.tar.gz  
        fi  
$CHOWN ${col[0]}:${col[1]} ${col[2]}/${col[3]}BU.tar.gz  
$CHMOD 0660 ${col[2]}/${col[3]}BU.tar.gz  
  
echo "-------------------------------------------------------------"  
echo "                                                             "  
done  
done  
cd $CURDIR

백업 스크립트는 다음과 같이 실행할 수 있습니다:

/root/scripts/mybackup.sh

또는 크론 작업으로 추가할 수 있습니다(예: 매일 22:30):

crontab -e

다음 줄을 추가합니다:

30 22 * * * /root/scripts/mybackup.sh > /dev/null 2>> /var/log/backup.log

최종 노트

이 튜토리얼에 대한 의견은 HowtoForge 포럼의 적절한 스레드에 자유롭게 댓글을 남겨 주세요. 유용한 댓글은 향후 업데이트된 버전에 포함될 것입니다.

이것은 첫 번째 버전이며, 제가 주의 깊게 작성했지만, 튜토리얼에 오류가 있을 수 있습니다. 오류를 알려주시면 가능한 한 빨리 수정하겠습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.