From a4456dc4557474924438505c5b36201815461440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Wed, 12 Aug 2026 15:57:25 +0200 Subject: [PATCH] Fuege ERP-Datenbank-Backupskript hinzu --- scripts/db/synology_db_backup.sh | 71 ++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100755 scripts/db/synology_db_backup.sh diff --git a/scripts/db/synology_db_backup.sh b/scripts/db/synology_db_backup.sh new file mode 100755 index 0000000..425e4f2 --- /dev/null +++ b/scripts/db/synology_db_backup.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -euo pipefail + +PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:${PATH:-}" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" +ENV_FILE="${ROOT_DIR}/.env" +BACKUP_DIR="${BACKUP_DIR:-/volume1/naurua_db_backups/dev}" +FILE_PREFIX="${FILE_PREFIX:-erpnaurua_dev}" +PG_DUMP_BIN="${PG_DUMP_BIN:-$(command -v pg_dump || true)}" +PSQL_BIN="${PSQL_BIN:-$(command -v psql || true)}" + +if [[ ! -f "${ENV_FILE}" ]]; then + echo "Missing environment file: ${ENV_FILE}" >&2 + exit 1 +fi + +set -a +# shellcheck disable=SC1090 +. "${ENV_FILE}" +set +a + +for required_var in DB_HOST DB_PORT DB_NAME DB_USER DB_PASSWORD; do + if [[ -z "${!required_var:-}" ]]; then + echo "Missing required database setting: ${required_var}" >&2 + exit 1 + fi +done + +if [[ -z "${PG_DUMP_BIN}" || ! -x "${PG_DUMP_BIN}" ]]; then + echo "Compatible pg_dump is required. Set PG_DUMP_BIN to a PostgreSQL client binary." >&2 + exit 1 +fi +if [[ -z "${PSQL_BIN}" || ! -x "${PSQL_BIN}" ]]; then + echo "psql is required." >&2 + exit 1 +fi + +export PGPASSWORD="${DB_PASSWORD}" +server_version_num="$("${PSQL_BIN}" -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -X -Atqc 'SHOW server_version_num')" +client_version="$("${PG_DUMP_BIN}" --version | sed -E 's/.*PostgreSQL ([0-9]+).*/\1/')" +server_major="${server_version_num:0:${#server_version_num}-4}" + +if [[ -z "${server_major}" || -z "${client_version}" || "${server_major}" != "${client_version}" ]]; then + echo "pg_dump major version mismatch: server=${server_major:-unknown}, client=${client_version:-unknown}" >&2 + exit 1 +fi + +mkdir -p "${BACKUP_DIR}" +timestamp="$(date +%Y%m%d_%H%M%S)" +output_file="${BACKUP_DIR}/${FILE_PREFIX}_${DB_NAME}_${timestamp}.dump" +temporary_file="${output_file}.tmp" + +cleanup() { rm -f "${temporary_file}"; } +trap cleanup EXIT + +"${PG_DUMP_BIN}" -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" \ + --format=custom --no-owner --no-privileges > "${temporary_file}" + +if [[ ! -s "${temporary_file}" ]]; then + echo "Backup failed: dump file is empty." >&2 + exit 1 +fi + +mv -f "${temporary_file}" "${output_file}" +trap - EXIT + +find "${BACKUP_DIR}" -maxdepth 1 -type f -name "${FILE_PREFIX}_${DB_NAME}_*.dump" \ + -printf '%T@ %p\n' | sort -nr | tail -n +21 | cut -d' ' -f2- | xargs -r rm -f + +printf '%s\n' "Backup created: ${output_file}"