Database backup

For a database backup you must perform the following steps: Preliminary steps:

Make sure that:

  • There is enough free space on the hard disk.

df -h
  • There is an installed and operational version of postgresql, it is currently running.

sudo service postgresql status

Creating backup

Run the command

sudo staffcop info

If the staffcop version is higher than 3.0.233, run the command

sudo staffcop backup_db

Your backup will be placed in /var/lib/staffcop/staffcop_backup directory

To transfer to another computer, copy this folder over the network or onto a removable drive

In case your version of the staffcop is 2.x or older than 3.0.233 run the command

wget -P /tmp/ -N http://dist.staffcop.ru/utils/script/backup/bp_install.sh && sudo bash /tmp/bp_install.sh

It will download and install the necessary software components. After its implementation you need to repeat

sudo staffcop backup_db

Restore backup

To restore the backup run the following command:

sudo staffcop restore_db

If the backup file is not in /var/lib/staffcop/staffcop_backup, the path to it should be explicitly indicated, for example:

sudo staffcop restore_db /home/support/backup

Note

Full path to the directory is required

Source codes of scripts:

  • Installer script - bp_install.sh

#!/bin/bash -e
cd ~
wget -O ~/backup_db http://dist.staffcop.ru/utils/script/backup/backup_db
cp ~/backup_db /usr/share/staffcop/bin/
chmod +x /usr/share/staffcop/bin/backup_db

wget -O ~/restore_db http://dist.staffcop.ru/utils/script/backup/restore_db \
cp ~/restore_db /usr/share/staffcop/bin/restore_db \
chmod +x /usr/share/staffcop/bin/restore_db
  • Backup creation script - backup_db.sh

echo "Backup StaffCop"

if ! [ -f /bin/tar ]; then
 echo "No app tar. Please install 'sudo apt-get install tar'"
 exit 3
fi

if ! [ -f /usr/bin/pg_dump ]; then
 echo "No app pg_dump. Exit"
 exit 3
fi
#---------------------------
bname=${DBNAME}-db.dump
sname=${DBNAME}-setting.tar
cname=${DBNAME}-sert.tar
default_folder="staffcop_backup"
default_path="/var/lib/staffcop"
#--------------------------

function backup_path_dialog() {
    echo -e "\e[32mPath to backup database copy: '${default_path}'(Y/N)?:\e[0m"
    read var1
    case $var1 in
            Y|y)
            path=${default_path}
            ;;
            N|n)
            request_backup_path
            ;;
            *)
            error
            backup_path_dialog
            ;;
    esac
}

function request_backup_path() {
    echo -e "\e[32mSpecify path to backup database copy:\e[0m"
    read path
}

function error() {
    echo 'Can't recognize answer'
    echo 'Press Y or N'
}

if [ $1 ] ;  then
        path=$1
else
    backup_path_dialog
fi

#free space from hdd?
TREE_ROOT=$(df --output=avail $path | sed 1d)

echo "Free space in directory '${path}': ${TREE_ROOT}"

DBPATH=$(echo $(su - postgres -c "psql -t -U postgres $DBHOST_OPTION $DBPORT_OPTION -d $DBNAME -c \"show data_directory;\""))
SIZE_DB=`du -sk $DBPATH | cut -f1`

if [[ "$TREE_ROOT" -gt "$SIZE_DB" ]]; then
  echo -e "\e[32mCreate database backup copy...\e[0m"
else
  echo -e "\e[31mNot enough free space for database backup copy\e[0m"
  exit 1
fi

if ! [ -f /usr/bin/realpath ]; then
 echo "Warning. No app realpath. Please install 'sudo apt-get install realpath'"
else
 path=$(realpath $path)
fi

path=${path}/${default_folder}
echo "Backup path $path"

#Create backup path
echo "Create backup path"
mkdir -p $path
chmod 777 -R $path

if ! [ -d  "$path" ] ; then
        echo "directory does not exist. exit"
        exit 1
fi
echo "Remove old backup files"
rm $path/* || true

#File name
full_path=${path}/${bname}
sfull_path=${path}/${sname}
cfull_path=${path}/${cname}

echo "Backup path $full_path"
echo "Setting path $sfull_path"
echo "CA path $cfull_path"
echo "------------------------------------------"
echo "Backup config"
tar --absolute-names --create --verbose --file $sfull_path /etc/staffcop

echo "Backup CA"
tar --absolute-names --create --verbose --file $cfull_path /var/lib/staffcop/CA

echo "Backup DB"
sudo -u postgres pg_dump --host=$DBHOST_OPTION $DBPORT_OPTION --verbose --compress=7 --clean --create --blobs --format=c --file=$full_path --dbname=$DBNAME

echo "------------------------------------------"
echo "Backup path"

if ! [ -f $full_path ]; then
 echo 'No file db. Error'
 exit 1
else
 echo "File DB: $(du -h $full_path)"
fi

if ! [ -f $sfull_path ]; then
 echo 'No file setting. Error'
 exit 1
else
 echo "File seting: $(du -h $sfull_path)"
fi

if ! [ -f $sfull_path ]; then
 echo 'No file CA. Error'
 exit 1
else
 echo "File CA: $(du -h $sfull_path)"
fi
echo "-------------------------------------------"
echo "Finish Backup StaffCop"
  • Database restoring script - restore_db.sh:

bname=${DBNAME}-db.dump
sname=${DBNAME}-setting.tar
cname=${DBNAME}-sert.tar
def_folder="staffcop_backup"
def_path="/var/lib/staffcop/${def_folder}"

if [ $1 ] ;  then
    path=$1
else
    path=${def_path}
fi

path=$(realpath $path)

full_path=${path}/${bname}
cfull_path=${path}/${cname}

if ! [ -f $full_path ]; then
        echo "No db backup at $full_path"
else
        echo "Restore DB ${DBNAME} from $full_path"
        staffcop stop
        service postgresql restart
        echo "sudo -u postgres pg_restore  --host=$DBHOST_OPTION --port=$DBPORT_OPTION  --verbose --clean --create  --format=c $full_path -d postgres"
        sudo -u postgres pg_restore --host=$DBHOST_OPTION --port=$DBPORT_OPTION  --verbose --clean --create  --format=c $full_path -d postgres
        staffcop init
        echo "Done!"
fi

if ! [ -f $cfull_path ]; then
        echo "No license backup at $cfull_path"
else
        echo "Restore license"
        rm /var/lib/staffcop/CA/*
        tar --absolute-names --extract --verbose --file $cfull_path
        chown -R staffcop:staffcop /var/lib/staffcop/CA/
        chmod 775 -R /var/lib/staffcop/CA/
        staffcop restart
fi