2 changed files with 200 additions and 1 deletions
@ -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 |
||||||
|
|
||||||
|
``` |
||||||
|
|||||||
@ -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 |
||||||
Reference in new issue