Files
backup-server/backup.sh
gyurix 1b9851cb63
All checks were successful
continuous-integration/drone/push Build is passing
Add backup script for database services with Kubernetes and Docker support
2025-08-28 13:27:09 +02:00

154 lines
12 KiB
Bash

#!/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;