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