82 lines
2.2 KiB
Bash
Executable File
82 lines
2.2 KiB
Bash
Executable File
#!/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}"
|
|
DOCKER_BIN="${DOCKER_BIN:-$(command -v docker || true)}"
|
|
DOCKER_CMD=()
|
|
|
|
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 "${DOCKER_BIN}" || ! -x "${DOCKER_BIN}" ]]; then
|
|
echo "Docker is required for the PostgreSQL client container." >&2
|
|
exit 1
|
|
fi
|
|
if "${DOCKER_BIN}" info >/dev/null 2>&1; then
|
|
DOCKER_CMD=("${DOCKER_BIN}")
|
|
elif sudo -n "${DOCKER_BIN}" info >/dev/null 2>&1; then
|
|
DOCKER_CMD=(sudo -n "${DOCKER_BIN}")
|
|
else
|
|
echo "Docker daemon is not accessible for this user." >&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
|
|
|
|
export BACKUP_DIR
|
|
"${DOCKER_CMD[@]}" run --rm --network host \
|
|
--env-file "${ENV_FILE}" \
|
|
-e "PGHOST=${DB_HOST}" \
|
|
-e "PGPORT=${DB_PORT}" \
|
|
-e "PGDATABASE=${DB_NAME}" \
|
|
-e "PGUSER=${DB_USER}" \
|
|
-e "PGPASSWORD=${DB_PASSWORD}" \
|
|
-v "${BACKUP_DIR}:/backup" \
|
|
postgres:17.7-alpine \
|
|
pg_dump --format=custom --no-owner --no-privileges --file=/backup/current.dump
|
|
|
|
if [[ ! -s "${BACKUP_DIR}/current.dump" ]]; then
|
|
echo "Backup failed: container dump file is empty." >&2
|
|
exit 1
|
|
fi
|
|
|
|
mv -f "${BACKUP_DIR}/current.dump" "${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}"
|