Nuestra aplicación en Django tan solo se compone de una base de datos PostgreSQL, el código de la propia aplicación, algunos ficheros de configuración de Nginx y el script RC de Daphne. En este artÃculo programaremos un pequeño script con el que realizaremos los backups de las partes anteriormente comentadas.
Antes de comenzar es recomendable leer los artÃculos anteriores sobre Django ya que son los pasos previos a este artÃculo:
- Django: Venv bajo FreeBSD
- Django: MVT, Apps y URLs
- Django: Modelos de base de datos
- Django: Interfaz de administración
- Django: DTL(Django Template Language)
- Django: Debug Toolbar
- Django: Registro y autenticación de usuarios
- Django: Webpack
- Django: Bootstrap mediante WebPack
- Django: Proyecto en producción
- Django: Traducciones
- Django: Comandos administrativos
- Django: Updates
En mi caso se trata de una Jail bajo Iocage , por lo tanto voy a poner a su disposición el directorio donde realizar los backups editando el fstab de la Jail en cuestión.
Ejecutamos en el host padre:
iocage console rxWod
mkdir -p /storage/backups/rxWod
exit
iocage fstab -a rxWod “/storage/backups/rxWod /storage/backups/rxWod nullfs rw 0 0”
Ahora ya podemos proceder con el script de backup:
#! /usr/local/bin/bash
DATE=$(date +%d_%m_%Y)
SHORT_HOSTNAME=$(hostname -s)
BACKUPSDIR="/storage/backups/$SHORT_HOSTNAME/BACKUP"
rm -rf $BACKUPSDIR 2>/dev/null
mkdir -p $BACKUPSDIR
# -- Common data --
cp -rp /root/.scripts/ $BACKUPSDIR/scripts
crontab -l > $BACKUPSDIR/crontab
cp /etc/hosts $BACKUPSDIR/hosts
cp /etc/rc.conf $BACKUPSDIR/rc.conf
# -----------------
# -- Custom data --
cd /home/kr0m/rxWod/
tar czf rxWodProject.tar.gz --exclude=rxWodProject/node_modules rxWodProject
mv rxWodProject.tar.gz $BACKUPSDIR/
pg_dump -U postgres rxwod > $BACKUPSDIR/rxwod.psql
cp /usr/local/etc/nginx/nginx.conf $BACKUPSDIR/
cp /usr/local/etc/nginx/rxwod.conf $BACKUPSDIR/
cp /usr/local/etc/rc.d/daphne $BACKUPSDIR/usr_local_etc_rc.d_daphne
# ------------------
DIRNAME=$(dirname $BACKUPSDIR)
cd $DIRNAME
tar czf backup_"$DATE".tar.gz BACKUP
chmod 600 backup_"$DATE".tar.gz
# Sleep 5s to let disk sync data and get correct backup size
sleep 5
BACKUPSIZE=$(du backup_"$DATE".tar.gz|awk '{print$1}')
BACKUPSIZEHUMAN=$(du -h backup_"$DATE".tar.gz|awk '{print$1}')
# 574276 -> 575 MB
if [ $BACKUPSIZE -lt 574276 ]; then
python3.7 /root/.scripts/tg.py "$SHORT_HOSTNAME: Abnormal backup size -> /storage/backups/$SHORT_HOSTNAME/backup_$DATE.tar.gz $BACKUPSIZEHUMAN"
else
python3.7 /root/.scripts/tg.py "$SHORT_HOSTNAME: Backup successfully -> /storage/backups/$SHORT_HOSTNAME/backup_$DATE.tar.gz $BACKUPSIZEHUMAN"
fi
rm -rf BACKUP
NOTA: Como podemos ver el script emplea un segungo script en Python para enviar avisos en caso de que el backup resulte de un tamaño mas pequeño de lo normal, dicho script se basa en este artÃculo anterior .
Le asignamos los permisos necesarios:
Ya podemos ejecutar el script:
Podemos ver el fichero en el directorio correcto:
-rw-------  1 root  wheel  230827 Mar 27 19:43 /storage/backups/rxWod/backup_27_03_2021.tar.gz
Ahora tan solo queda crontabearlo para que se ejecute diariamente:
00 00 * * * /root/.scripts/backup.sh >/dev/null 2>&1