バックアップ · 3 min read · Dec 02, 2025

完璧なサーバーの拡張 - Debian Squeeze [ISPConfig 3] - ページ 6

10. クライアントのバックアップ

スクリプトの内容は2011年3月29日に変更されました。更新してください

このスクリプトはISPConfig v. 3.0.5以降では正しく動作しません。多くの変更を行う必要があり、お勧めできません。ISPConfigの新しいバックアップ方法を使用してください。

以下のスクリプトは、クライアントのデータとクライアントのデータベースをそのウェブサイトフォルダにバックアップする簡単な方法です。ご存知のように、ISPConfig3では各クライアントは/var/www/clients/clientXYという形式のフォルダを持ち、その中にすべてのウェブサイトがあります。このスクリプトは、各ウェブフォルダ内のすべてのウェブサイトをバックアップし、データベースとともにクライアントがダウンロードできるようにします。クライアントが複数のデータベースを持っている場合、すべてのデータベースは最初の(webIDに基づく)サイトにバックアップされます。このスクリプトは、これらのファイルの最後の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ユーザーを使用するか、rootユーザーを使用します  
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 || :  
   
# このスクリプトのフォルダ内のバックアップへのアクセスをrootのみに制限  
$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]}=clientID / システムグループ ,  
        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]}=clientID / システムグループ , ${col[4]}=ウェブサイトへのパス  
do  
echo "          DB: "${col[0]}   
echo "-------------------------------------------------------------"  
echo "DBをバックアップ中:" ${col[0]}  "in :"  ${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]}=clientID / システムグループ ,  
        while read -a col   # ${col[2]}=ウェブサイトへのパス, ${col[3]}=ドメイン名  
do  
echo "                                                             "  
echo "         サイト:" ${col[3]}  
echo "-------------------------------------------------------------"  
echo "サイトをバックアップ中: " ${col[2]}/  "in :"  ${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

または、cronジョブとして追加できます(例:毎日22:30):

crontab -e

次の行を追加します:

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

最後の注意

このチュートリアルに関して何かコメントがあれば、HowtoForgeフォーラムの適切なスレッドで自由にコメントしてください。役立つコメントは、将来の更新版に含まれます。

これは最初のバージョンであり、注意深く作成したにもかかわらず、チュートリアルにはエラーが含まれている可能性があります。できるだけ早く修正できるように、エラーを教えてください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。