* ADD: initial commit

This commit is contained in:
2024-01-20 11:52:52 +01:00
parent 95fc557025
commit 31054ebf7d
41 changed files with 1466 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
#!/bin/bash
. /app/includes.sh
function clear_dir() {
rm -rf "${BACKUP_DIR}"
}
function backup_init() {
NOW="$(date +"${BACKUP_FILE_DATE_FORMAT}")"
# backup postgresql database file
BACKUP_FILE_DB_POSTGRESQL="${BACKUP_DIR}/db.${NOW}.dump"
# backup zip file
BACKUP_FILE_ZIP="${BACKUP_DIR}/../backup.${NOW}.7z"
mkdir -p "${BACKUP_DIR}"
}
function backup_db_postgresql() {
echo "backup postgresql database"
pg_dump -Fc -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -d "${POSTGRES_DB}" -U "${POSTGRES_USER}" -f "${BACKUP_FILE_DB_POSTGRESQL}"
if [[ $? != 0 ]]; then
echo "backup postgresql database failed"
exit 1
fi
}
function backup_package() {
echo "package backup file"
7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -mhe=on "${BACKUP_FILE_ZIP}" "${BACKUP_DIR}"/*
ls -lah "${BACKUP_DIR}"
echo "display backup ${ZIP_TYPE} file list"
7z l "${BACKUP_FILE_ZIP}"
chown 1000:100 "${BACKUP_FILE_ZIP}"
}
function clear_history() {
if [[ "${BACKUP_KEEP_DAYS}" -gt 0 ]]; then
echo find "${BACKUP_DIR}" -mtime +"${BACKUP_KEEP_DAYS}" -exec rm -rf {} \;
fi
}
echo "running the backup program at $(date +"%Y-%m-%d %H:%M:%S %Z")"
init_env
clear_dir
backup_init
backup_db_postgresql
backup_package
clear_dir
clear_history
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
. /app/includes.sh
# restore
if [[ "$1" == "restore" ]]; then
#. /app/restore.sh
#shift
#restore $*
echo "not implemented yet"
exit 0
fi
function configure_cron() {
local FIND_CRON_COUNT="$(grep -c 'backup.sh' "${CRON_CONFIG_FILE}" 2> /dev/null)"
if [[ "${FIND_CRON_COUNT}" -eq 0 ]]; then
echo "${CRON} bash /app/backup.sh" >> "${CRON_CONFIG_FILE}"
fi
}
init_env
configure_postgresql
configure_cron
# backup manually
if [[ "$1" == "backup" ]]; then
echo "Manually triggering a backup will only execute the backup script once, and the container will exit upon completion."
bash "/app/backup.sh"
exit 0
fi
# foreground run crond
exec supercronic -passthrough-logs -quiet "${CRON_CONFIG_FILE}"
+10
View File
@@ -0,0 +1,10 @@
#!/bin/sh
# shellcheck disable=SC1091
. /app/includes.sh
if [ ! -f "${HEALTHCHECK_FILE}" ]; then
printf 0 > "${HEALTHCHECK_FILE}"
fi
exit "$(cat "${HEALTHCHECK_FILE}")"
+166
View File
@@ -0,0 +1,166 @@
#!/bin/bash
ENV_FILE="/.env"
CRON_CONFIG_FILE="${HOME}/crontabs"
BACKUP_DIR="/backups/tmp"
RESTORE_DIR="/restore"
RESTORE_EXTRACT_DIR="/extract"
########################################
# Check file is exist.
# Arguments:
# file
########################################
function check_file_exist() {
if [[ ! -f "$1" ]]; then
echo "cannot access $1: No such file"
exit 1
fi
}
########################################
# Check directory is exist.
# Arguments:
# directory
########################################
function check_dir_exist() {
if [[ ! -d "$1" ]]; then
echo "cannot access $1: No such directory"
exit 1
fi
}
########################################
# Configure PostgreSQL password file.
# Arguments:
# None
########################################
function configure_postgresql() {
echo "${POSTGRES_HOST}:${POSTGRES_PORT}:${POSTGRES_DB}:${POSTGRES_USER}:${POSTGRES_PASSWORD}" > ~/.pgpass
chmod 0600 ~/.pgpass
}
########################################
# Export variables from .env file.
# Arguments:
# None
# Outputs:
# variables with prefix 'DOTENV_'
# Reference:
# https://gist.github.com/judy2k/7656bfe3b322d669ef75364a46327836#gistcomment-3632918
########################################
function export_env_file() {
if [[ -f "${ENV_FILE}" ]]; then
echo "find \"${ENV_FILE}\" file and export variables"
set -a
source <(cat "${ENV_FILE}" | sed -e '/^#/d;/^\s*$/d' -e 's/\(\w*\)[ \t]*=[ \t]*\(.*\)/DOTENV_\1=\2/')
set +a
fi
}
########################################
# Get variables from
# environment variables,
# secret file in environment variables,
# secret file in .env file,
# environment variables in .env file.
# Arguments:
# variable name
# Outputs:
# variable value
########################################
function get_env() {
local VAR="$1"
local VAR_FILE="${VAR}_FILE"
local VAR_DOTENV="DOTENV_${VAR}"
local VAR_DOTENV_FILE="DOTENV_${VAR_FILE}"
local VALUE=""
if [[ -n "${!VAR:-}" ]]; then
VALUE="${!VAR}"
elif [[ -n "${!VAR_FILE:-}" ]]; then
VALUE="$(cat "${!VAR_FILE}")"
elif [[ -n "${!VAR_DOTENV_FILE:-}" ]]; then
VALUE="$(cat "${!VAR_DOTENV_FILE}")"
elif [[ -n "${!VAR_DOTENV:-}" ]]; then
VALUE="${!VAR_DOTENV}"
fi
export "${VAR}=${VALUE}"
}
########################################
# Initialization environment variables.
# Arguments:
# None
# Outputs:
# environment variables
########################################
function init_env() {
# export
export_env_file
init_env_db
# CRON
get_env CRON
CRON="${CRON:-"5 * * * *"}"
# BACKUP_KEEP_DAYS
get_env BACKUP_KEEP_DAYS
BACKUP_KEEP_DAYS="${BACKUP_KEEP_DAYS:-"0"}"
# BACKUP_FILE_DATE_FORMAT
get_env BACKUP_FILE_SUFFIX
get_env BACKUP_FILE_DATE
get_env BACKUP_FILE_DATE_SUFFIX
BACKUP_FILE_DATE="$(echo "${BACKUP_FILE_DATE:-"%Y%m%d"}${BACKUP_FILE_DATE_SUFFIX}" | sed 's/[^0-9a-zA-Z%_-]//g')"
BACKUP_FILE_DATE_FORMAT="$(echo "${BACKUP_FILE_SUFFIX:-"${BACKUP_FILE_DATE}"}" | sed 's/\///g')"
# HEALTHCHECK_FILE
get_env HEALTHCHECK_FILE
HEALTHCHECK_FILE="${HEALTHCHECK_FILE:-/app/health}"
# TIMEZONE
get_env TIMEZONE
local TIMEZONE_MATCHED_COUNT=$(ls "/usr/share/zoneinfo/${TIMEZONE}" 2> /dev/null | wc -l)
if [[ "${TIMEZONE_MATCHED_COUNT}" -ne 1 ]]; then
TIMEZONE="UTC"
fi
echo "========================================"
echo "DB_URL: postgresql://${POSTGRES_USER}:***(${#POSTGRES_PASSWORD} Chars)@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
echo "========================================"
echo "CRON: ${CRON}"
echo "BACKUP_FILE_DATE_FORMAT: ${BACKUP_FILE_DATE_FORMAT} (example \"[filename].$(date +"${BACKUP_FILE_DATE_FORMAT}").[ext]\")"
echo "BACKUP_KEEP_DAYS: ${BACKUP_KEEP_DAYS}"
echo "TIMEZONE: ${TIMEZONE}"
echo HEALTHCHECK_FILE="${HEALTHCHECK_FILE:-$APP_DIR/health}"
echo "========================================"
}
function init_env_db() {
DB_TYPE="POSTGRESQL"
# POSTGRES_HOST
get_env POSTGRES_HOST
# PG_PORT
get_env POSTGRES_PORT
POSTGRES_PORT="${POSTGRES_PORT:-"5432"}"
# POSTGRES_DB
get_env POSTGRES_DB
POSTGRES_DB="${POSTGRES_DB:-"postgres"}"
# POSTGRES_USER
get_env POSTGRES_USER
POSTGRES_USER="${POSTGRES_USER:-"postgres"}"
# POSTGRES_PASSWORD
get_env POSTGRES_PASSWORD
}