Add backup script for database services with Kubernetes and Docker support
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
153
backup.sh
Normal file
153
backup.sh
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
BACKUP=$BACKUP;
|
||||||
|
BACKUP_LOG=$BACKUP_LOG;
|
||||||
|
SERVICE_FILES_DIRECTORIES=$SERVICE_FILES_DIRECTORIES;
|
||||||
|
SECRET_DIRECTORY=$SECRET_DIRECTORY;
|
||||||
|
|
||||||
|
BACKUP_PERIOD=$BACKUP_PERIOD;
|
||||||
|
|
||||||
|
if [ "$SECRET_DIRECTORY" == "" ]; then
|
||||||
|
SECRET_DIRECTORY=$SERVICE_FILES_DIRECTORIES;
|
||||||
|
else
|
||||||
|
SECRET_DIRECTORY="";
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
mkdir -p $BACKUP_LOG;
|
||||||
|
|
||||||
|
# Kubernetes elements
|
||||||
|
KUBERNETES=$KUBERNETES
|
||||||
|
|
||||||
|
db_backup() {
|
||||||
|
|
||||||
|
if [ "$BACKUP_PERIOD" == "infinite" ]; then
|
||||||
|
DATE=$(date +"%Y-%m-%d_%H_%M");
|
||||||
|
else
|
||||||
|
DATE=$(date +%w);
|
||||||
|
fi
|
||||||
|
|
||||||
|
DBTYPE="";
|
||||||
|
|
||||||
|
if [ "$KUBERNETES" == "true" ]; then
|
||||||
|
|
||||||
|
if [ "$(echo $ROLE | grep -o 'postgres-db')" != "" ] ; then
|
||||||
|
|
||||||
|
# Define database pod name
|
||||||
|
CONTAINER_NAME=$(echo $CONTAINER_NAME | sed s/_/-/g);
|
||||||
|
CONTAINER_NAME=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -n $NAMESPACE | grep $CONTAINER_NAME |grep '\-0');
|
||||||
|
|
||||||
|
if [ "$USER" == "" ]; then
|
||||||
|
USER=postgres
|
||||||
|
fi
|
||||||
|
|
||||||
|
kubectl exec $CONTAINER_NAME -n $NAMESPACE -- pg_dumpall -U "$USER" > $BACKUPS/$CONTAINER_NAME'_'$DATE.sql ;
|
||||||
|
gzip $BACKUPS/$CONTAINER_NAME'_'$DATE.sql;
|
||||||
|
echo `date` "$CONTAINER_NAME service $BACKUPS/$CONTAINER_NAME.$DATE.sql.gz backup created" >> $BACKUPS_LOG/$DATE.txt;
|
||||||
|
|
||||||
|
elif [ "$(echo $ROLE | grep -o 'mysql-db')" != "" ] ; then
|
||||||
|
|
||||||
|
# Define database pod name
|
||||||
|
CONTAINER_NAME=$(echo $CONTAINER_NAME | sed s/_/-/g);
|
||||||
|
CONTAINER_NAME=$(kubectl get pods --no-headers -o custom-columns=":metadata.name" -n $NAMESPACE | grep $CONTAINER_NAME |grep '\-0');
|
||||||
|
|
||||||
|
kubectl exec $CONTAINER_NAME -n $NAMESPACE -- sh -c "mysqldump -uroot -p'$PASSWD' --all-databases" > $BACKUPS/$CONTAINER_NAME'_'$DATE.sql ;
|
||||||
|
echo `date` "$CONTAINER_NAME service $BACKUPS/$CONTAINER_NAME.$DATE.sql backup created" >> $BACKUPS_LOG/$DATE.txt;
|
||||||
|
|
||||||
|
#else
|
||||||
|
#CONTAINER_NAME=$(echo $CONTAINER_NAME | sed s/_/-/g);
|
||||||
|
#CONTAINER_NAME=$CONTAINER_NAME"-pp-0";
|
||||||
|
|
||||||
|
#kubectl exec $CONTAINER_NAME -n $NAMESPACE -- bash -c 'pg_dumpall -U postgres' | gzip > $BACKUPS/$CONTAINER_NAME'_'$DATE.sql.gz ;
|
||||||
|
#echo `date` "$CONTAINER_NAME service $BACKUPS/$CONTAINER_NAME.$DATE.sql.gz backup created" >> $BACKUPS_LOG/$DATE.txt;
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$(echo $ROLE | grep 'mysql-db')" != "" ] ; then
|
||||||
|
docker exec $CONTAINER_NAME mysqldump -u root -p$PASSWD --all-databases | cat > $BACKUPS/$CONTAINER_NAME.$DATE.sql ;
|
||||||
|
echo `date` "$CONTAINER_NAME service $BACKUPS/$CONTAINER_NAME.$DATE.sql backup created" >> $BACKUPS_LOG/$DATE.txt;
|
||||||
|
elif [ "$(echo $ROLE | grep 'postgres-db')" != "" ] ; then
|
||||||
|
docker exec $CONTAINER_NAME pg_dumpall -U $USER | gzip > $BACKUPS/$CONTAINER_NAME.$DATE.sql.gz ;
|
||||||
|
echo `date` "$CONTAINER_NAME service $BACKUPS/$CONTAINER_NAME.$DATE.sql.gz backup created" >> $BACKUPS_LOG/$DATE.txt;
|
||||||
|
else
|
||||||
|
echo `date` "$CONTAINER_NAME service: unknown database type in ROLES field: $ROLE" >> $BACKUPS_LOG/$DATE.txt;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
DIR=$SERVICE_FILES_DIRECTORIES;
|
||||||
|
|
||||||
|
if [ "$DIR" == "" ]; then
|
||||||
|
|
||||||
|
if [ "$COMMUNITY_URL" == "" ]; then
|
||||||
|
echo "No COMMUNITY URL added, exiting backup";
|
||||||
|
exit;
|
||||||
|
fi
|
||||||
|
|
||||||
|
FILES=$(find $COMMUNITY_URL -name 'service-*.json' -exec grep -l 'ROLES' {} \;) ;
|
||||||
|
else
|
||||||
|
FILES=$(grep -rl 'ROLES' $DIR/*.json);
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
for F in `echo $FILES`; do
|
||||||
|
FILE=$(grep -l '\-db' $F)
|
||||||
|
if [ "$FILE" != "" ]; then
|
||||||
|
echo $FILE;
|
||||||
|
|
||||||
|
if [ "$BACKUP" == "" ]; then
|
||||||
|
|
||||||
|
ID=$(echo $F | sed s#$COMMUNITY_URL##g | cut -d '/' -f2);
|
||||||
|
BACKUPS="$COMMUNITY_URL/$ID/backups";
|
||||||
|
mkdir -p $BACKUPS
|
||||||
|
|
||||||
|
BACKUPS_LOG="$COMMUNITY_URL/$ID/backups";
|
||||||
|
else
|
||||||
|
BACKUPS=$BACKUP
|
||||||
|
BACKUPS_LOG=$BACKUP_LOG
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$KUBERNETES" == "true" ]; then
|
||||||
|
NAMESPACE=$(jq -r .main.SERVICE_NAME $FILE);
|
||||||
|
fi
|
||||||
|
|
||||||
|
ROLES=$(jq -r .containers[].ROLES $FILE | grep -oE 'mysql-db|postgres-db');
|
||||||
|
for ROLE in `echo $ROLES`; do
|
||||||
|
CONTAINER=$(jq -r --arg ROLE "$ROLE" '.containers[] | select(.ROLES | contains($ROLE))' $FILE)
|
||||||
|
CONTAINER_NAME=$(echo $CONTAINER | jq -r .NAME);
|
||||||
|
echo "CONTAINER NAME: "$CONTAINER_NAME;
|
||||||
|
|
||||||
|
ENV_FILES=$(echo $CONTAINER | jq -r '.ENV_FILES | join(" ")');
|
||||||
|
USER=$(echo $CONTAINER |jq -r '.ENVS[].POSTGRES_USER | select(.!=null)');
|
||||||
|
|
||||||
|
if [[ "$USER" != "" && "$USER" != "null" ]]; then
|
||||||
|
db_backup;
|
||||||
|
|
||||||
|
elif [ -n "$ENV_FILES" ]; then
|
||||||
|
for ENV_FILE in `echo $ENV_FILES`; do
|
||||||
|
if [ -f "$SECRET_DIRECTORY/$ENV_FILE" ]; then
|
||||||
|
SERVICE_NAME=$(echo $CONTAINER_NAME | cut -d '-' -f1);
|
||||||
|
SECRET=$(jq -r .$SERVICE_NAME $SECRET_DIRECTORY/$ENV_FILE);
|
||||||
|
|
||||||
|
if [ "$SECRET" != "null" ]; then
|
||||||
|
if [ "$(echo $ROLE | grep 'mysql-db')" != "" ] ; then
|
||||||
|
PASSWD=$(jq -r .$SERVICE_NAME.MYSQL_ROOT_PASSWORD $SECRET_DIRECTORY/$ENV_FILE);
|
||||||
|
elif [ "$(echo $ROLE | grep 'postgres-db')" != "" ] ; then
|
||||||
|
USER="";
|
||||||
|
USER=$(jq -r .$SERVICE_NAME.POSTGRES_USER $SECRET_DIRECTORY/$ENV_FILE );
|
||||||
|
fi
|
||||||
|
db_backup;
|
||||||
|
else
|
||||||
|
echo "SERVICE NOT FOUND IN SECRET FILE: $SERVICE_NAME";
|
||||||
|
fi;
|
||||||
|
else
|
||||||
|
echo "FILE NOT FOUND: $ENV_FILE";
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
else
|
||||||
|
echo "Neither $ENV_FILE nor ENVS values found, exiting";
|
||||||
|
fi
|
||||||
|
done;
|
||||||
|
fi;
|
||||||
|
done;
|
Reference in New Issue
Block a user