Browse Source

se cambio readme

main
parent
commit
80b05b61ff
  1. 155
      README.md
  2. 46
      backup_cron.sh.example

155
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
```

46
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