diff --git a/README.md b/README.md index 0ece5f7..ecf8197 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,155 @@ -# mysql-container +# MySQL Database Container +## Dependencias + +- Docker (Apéndice) + +## Configuración + +```bash +cp .env.example .env +nano .env +``` + +## Iniciar + +```bash +docker compose up -d prod +``` + +Quitando la opción *-d* se ven los logs del contenedor. + +## Detener + +```bash +# Si estan corriendo con logs visibles +# detener con Ctr+C +docker compose down +``` + +## Database (MySQL) + +Toda la base de datos queda guardada en **/database/data** + +Para conectarse a una terminal del contenedor (sólo para debug) + +**CONTAINER_NAME**: está en el archivo *.env* + +```bash +docker container exec -it CONTAINER_NAME bash +``` + +## Backups + +Se creó un volumen para guardar los *backups* en **/backups**. + +### Realizar backup + +Para hacer el backup tenemos que entrar a una shell del contenedor y generar el archivo de backup en la carpeta donde esta montado el volumen. +Usar los datos configurados previamente en **.env**. + +**CONTAINER_NAME**: está en el archivo *.env* + +**MYSQL_DATABASE**: está en el archivo *.env* + +**MYSQL_ROOT_PASSWORD**: está en el archivo *.env* + +```bash +docker container exec -it CONTAINER_NAME bash + +# DENTRO DEL CONTENEDOR +mysqldump -p ${MYSQL_DATABASE} > /backups/${MYSQL_DATABASE}$(date "+%Y%m%d-%H_%M")hs.sql +# MYSQL_ROOT_PASSWORD +exit +``` + +### Restaurar backup + +Para restaurar el backup tenemos que entrar a una shell del contenedor y restaurar el backup que se encuentra en el volumen montado. + +1. Hay que asegurarse de tener el backup en la carpeta **/backups**. + +**CONTAINER_NAME**: está en el archivo *.env* + +**MYSQL_ROOT_PASSWORD**: está en el archivo *.env* + +```bash +# Descomprimo el backup +cd backups +sudo unzip NOMBRE_BACKUP.zip +cd .. +# Elimino la base datos que existe actualmente +docker compose down +sudo rm -rf database +docker compose up -d prod +# Levanto el backup +docker container exec -it CONTAINER_NAME bash + +# DENTRO DEL CONTENEDOR +mysql -p ${MYSQL_DATABASE} < /backups/NOMBRE_BACKUP.sql +# MYSQL_ROOT_PASSWORD +exit +``` + +## Programar backups automáticos (CRON) + +### Prerrequisitos + +En el servidor de destino tiene que estar configurado ssh para aceptar autenticación con Public Keys. + +```bash +# En el servidor de destino +sudo nano /etc/ssh/sshd_config +# Descomentar la linea que tiene: PubkeyAuthentication yes +sudo systemctl restart sshd.service + +#------------------------------------------------------------------------------ + +# En el servidor de origen del backup (USUARIO ROOT) +# Generar las claves del usuario que va a ejecutar el script en este equipo +ssh-keygen +ssh-copy-id USUARIO@SERVIDOR_DESTINO +``` + +### Programar tarea + +```bash +# En el servidor de origen del backup +cp backup_cron.sh.example backup_cron.sh +# Configurar el destino. Editar la linea #DEST=usuaro@host:/path +nano backup_cron.sh +# Programar la tarea con cron (USUARIO ROOT) +crontab -e +# En cron: + # Para probar un backup cada 5 minutos + */5 * * * * /ruta_al_script/backup_cron.sh + + # Para dejar el backup 1 vez por dia + 0 0 * * * /ruta_al_script/backup_cron.sh +``` + +## Apéndice + +## Instalación de docker en ubuntu 18.04/20.04/22.04 + +Fuente: [Instalación docker ubuntu](https://docs.docker.com/engine/install/ubuntu). + +```bash +sudo apt-get update +sudo apt-get install \ + ca-certificates \ + curl \ + gnupg \ + lsb-release + +sudo mkdir -p /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg + +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +sudo apt-get update +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin + +``` diff --git a/backup_cron.sh.example b/backup_cron.sh.example new file mode 100644 index 0000000..f231194 --- /dev/null +++ b/backup_cron.sh.example @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +#Ruta de destino backup +#DEST=usuaro@host:/path +DEST=usuaro@host:/path + +#Variables de entorno (LAS MISMAS INGRESADAS EN .env) +CONTAINER_NAME=mysql_db +MYSQL_DATABASE=mysql +MYSQL_ROOT_PASSWORD=mysql + + +SCRIPT_PATH=$(realpath $0) +WORKDIR=$(dirname ${SCRIPT_PATH}) +DIR=$(pwd) +LOG_DIR=${WORKDIR}/backup.log +FECHA=`date +%Y%m%d` + +echo [`date`] ========== Comenzando script Backup - MYSQL ========== >> $LOG_DIR +cd ${WORKDIR} + +echo [`date`] ::Volcando DB a ${WORKDIR}/backups/${MYSQL_DATABASE}${FECHA}.sql >> $LOG_DIR +docker container exec -it ${CONTAINER_NAME} bash -c "mysqldump -p${MYSQL_ROOT_PASSWORD} ${MYSQL_DATABASE} > backups/${MYSQL_DATABASE}${FECHA}.sql" +echo [`date`] ___ OK >> $LOG_DIR +echo ------------------------------------ >> $LOG_DIR + +echo [`date`] ::Comprimiendo ${WORKDIR}/backups/${MYSQL_DATABASE}${FECHA}.sql a ${WORKDIR}/backups/${MYSQL_DATABASE}${FECHA}.zip >> $LOG_DIR +cd backups +zip -r ${MYSQL_DATABASE}${FECHA}.zip ${MYSQL_DATABASE}${FECHA}.sql +cd ${WORKDIR} +echo [`date`] ___ OK >> $LOG_DIR +echo ------------------------------------ >> $LOG_DIR + +echo [`date`] ::Copiando de ${WORKDIR}/backups/${MYSQL_DATABASE}${FECHA}.zip a ${DEST} >> $LOG_DIR +scp backups/${MYSQL_DATABASE}${FECHA}.zip ${DEST} +echo [`date`] ___ OK >> $LOG_DIR +echo ------------------------------------ >> $LOG_DIR + +echo [`date`] ::Eliminando ${WORKDIR}/backups/${MYSQL_DATABASE}${FECHA}.* >> $LOG_DIR +rm backups/${MYSQL_DATABASE}${FECHA}.* +echo [`date`] ___ OK >> $LOG_DIR +echo ------------------------------------ >> $LOG_DIR + +# Vuelvo al directorio actual +cd ${DIR} +exit 0