Add shared backup helpers

This commit is contained in:
3wc 2021-02-24 17:03:28 +02:00
parent 29b22fe162
commit e5b2a426f0

86
abra
View File

@ -3,6 +3,7 @@
GIT_URL="https://git.autonomic.zone/coop-cloud/" GIT_URL="https://git.autonomic.zone/coop-cloud/"
ABRA_DIR="${ABRA_DIR:-$HOME/.abra}" ABRA_DIR="${ABRA_DIR:-$HOME/.abra}"
ABRA_VERSION="0.4.1" ABRA_VERSION="0.4.1"
ABRA_BACKUP_DIR="${ABRA_BACKUP_DIR:-$ABRA_DIR/backups}"
####################################### #######################################
# Global help # Global help
@ -345,6 +346,22 @@ debug() {
echo "$(tput setaf 13)DEBUG: $*$(tput sgr0)" echo "$(tput setaf 13)DEBUG: $*$(tput sgr0)"
} }
# 3wc: temporarily disable debug and verbose
silence() {
# FIXME 3wc: required otherwise we get debug output in the password
_abra___debug="$abra___debug"
_abra___verbose="$abra___verbose"
abra___verbose="false"
abra___debug="false"
}
unsilence() {
# FIXME 3wc: required otherwise we get debug output in the password
abra___verbose="$_abra___verbose"
abra___debug="$_abra___debug"
}
###### Default settings ###### Default settings
if [ -z "$COMPOSE_FILE" ]; then if [ -z "$COMPOSE_FILE" ]; then
@ -480,7 +497,7 @@ load_instance_env() {
APP_DIR="$ABRA_DIR/apps/$TYPE" APP_DIR="$ABRA_DIR/apps/$TYPE"
export DOCKER_CONTEXT="$SERVER" export DOCKER_CONTEXT="$SERVER"
info "Setting DOCKER_CONTEXT=$DOCKER_CONTEXT" info "Setting DOCKER_CONTEXT=$DOCKER_CONTEXT"
export DOMAIN export DOMAIN
} }
@ -777,6 +794,73 @@ sub_app_restore (){
$FUNCTION "$abra__backup_file_" $FUNCTION "$abra__backup_file_"
} }
###### backup utility functions
# Usage: _abra_backup_dir service:/path/to/src
_abra_backup_dir() {
{
abra__src_="$1"
abra__dst_="-"
}
# shellcheck disable=SC2154
FILENAME="$ABRA_BACKUP_DIR/${abra__app_}_$(basename "$1")_$(date +%F).tar.gz"
debug "Copying '$1' to '$FILENAME'"
silence
sub_app_cp | gzip > "$FILENAME"
success "Backed up '$1' to $FILENAME"
unsilence
}
_abra_backup_db_prep() {
# shellcheck disable=SC2034
abra__service_="$1"
# 3wc: necessary because $abra__service_ won't be set if we're coming from
# `abra_backup`, i.e. `abra app ... backup --all`
# What's the name of the Docker secret? Default to db_root_password
DB_PASSWORD_NAME=${4:-db_root_password}
debug "Looking up secret '$DB_PASSWORD_NAME'"
silence
DB_PASSWORD="$(sub_app_run cat "/run/secrets/$DB_PASSWORD_NAME")"
unsilence
# 3wc: strip newline \r from variable
DB_PASSWORD="${DB_PASSWORD//$'\015'}"
# shellcheck disable=SC2154
FILENAME="$ABRA_BACKUP_DIR/${abra__app_}_$(date +%F).sql.gz"
}
# usage: _abra_backup_postgres <service> <database> [<user> <secret name>]
_abra_backup_postgres() {
_abra_backup_db_prep "$@"
debug "Running pg_dump to '$FILENAME'"
silence
# shellcheck disable=SC2034
PGPASSWORD="$DB_PASSWORD"
sub_app_run pg_dump -U "${3:-postgres}" "$2" | gzip > "$FILENAME"
unsilence
success "Backed up '$abra__service_:$2' to '$FILENAME'"
}
_abra_backup_mysql() {
_abra_backup_db_prep "$@"
silence
# shellcheck disable=SC2086
sub_app_run mysqldump -u root -p"${DB_PASSWORD}" "$2" | gzip > "$FILENAME"
unsilence
success "Backed up '$abra__service_:$2' to $FILENAME"
}
###### .. app deploy ###### .. app deploy
help_app_deploy (){ help_app_deploy (){
echo "abra [options] app <app> deploy [--skip-check] echo "abra [options] app <app> deploy [--skip-check]