mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-05-03 23:45:59 +00:00
Update tools.func
This commit is contained in:
-213
@@ -6729,219 +6729,6 @@ _configure_pg_cron_preload() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function setup_postgresql() {
|
|
||||||
local PG_VERSION="${PG_VERSION:-16}"
|
|
||||||
local PG_MODULES="${PG_MODULES:-}"
|
|
||||||
local USE_PGDG_REPO="${USE_PGDG_REPO:-true}"
|
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
|
||||||
|
|
||||||
# Ensure non-interactive mode for all apt operations
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
export NEEDRESTART_MODE=a
|
|
||||||
export NEEDRESTART_SUSPEND=1
|
|
||||||
|
|
||||||
# Get currently installed version
|
|
||||||
local CURRENT_PG_VERSION=""
|
|
||||||
if command -v psql >/dev/null; then
|
|
||||||
CURRENT_PG_VERSION="$(psql -V 2>/dev/null | awk '{print $3}' | cut -d. -f1)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Scenario 1: Use distro repository (default, most stable)
|
|
||||||
if [[ "$USE_PGDG_REPO" != "true" && "$USE_PGDG_REPO" != "TRUE" && "$USE_PGDG_REPO" != "1" ]]; then
|
|
||||||
msg_info "Setup PostgreSQL (distro package)"
|
|
||||||
|
|
||||||
# If already installed, just update
|
|
||||||
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
|
||||||
msg_info "Update PostgreSQL $CURRENT_PG_VERSION"
|
|
||||||
ensure_apt_working || return 1
|
|
||||||
upgrade_packages_with_retry "postgresql" "postgresql-client" || true
|
|
||||||
cache_installed_version "postgresql" "$CURRENT_PG_VERSION"
|
|
||||||
msg_ok "Update PostgreSQL $CURRENT_PG_VERSION"
|
|
||||||
|
|
||||||
# Still install modules if specified
|
|
||||||
if [[ -n "$PG_MODULES" ]]; then
|
|
||||||
IFS=',' read -ra MODULES <<<"$PG_MODULES"
|
|
||||||
for module in "${MODULES[@]}"; do
|
|
||||||
$STD apt install -y "postgresql-${CURRENT_PG_VERSION}-${module}" 2>/dev/null || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fresh install from distro repo
|
|
||||||
ensure_apt_working || return 1
|
|
||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
install_packages_with_retry "postgresql" "postgresql-client" || {
|
|
||||||
msg_error "Failed to install PostgreSQL from distro repository"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get installed version
|
|
||||||
local INSTALLED_VERSION=""
|
|
||||||
if command -v psql >/dev/null; then
|
|
||||||
INSTALLED_VERSION="$(psql -V 2>/dev/null | awk '{print $3}' | cut -d. -f1)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
$STD systemctl enable --now postgresql 2>/dev/null || true
|
|
||||||
|
|
||||||
# Add PostgreSQL binaries to PATH
|
|
||||||
if [[ -n "$INSTALLED_VERSION" ]] && ! grep -q '/usr/lib/postgresql' /etc/environment 2>/dev/null; then
|
|
||||||
echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/'"${INSTALLED_VERSION}"'/bin"' >/etc/environment
|
|
||||||
fi
|
|
||||||
|
|
||||||
cache_installed_version "postgresql" "${INSTALLED_VERSION:-distro}"
|
|
||||||
msg_ok "Setup PostgreSQL ${INSTALLED_VERSION:-from distro}"
|
|
||||||
|
|
||||||
# Install optional modules
|
|
||||||
if [[ -n "$PG_MODULES" && -n "$INSTALLED_VERSION" ]]; then
|
|
||||||
IFS=',' read -ra MODULES <<<"$PG_MODULES"
|
|
||||||
for module in "${MODULES[@]}"; do
|
|
||||||
$STD apt install -y "postgresql-${INSTALLED_VERSION}-${module}" 2>/dev/null || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Scenario 2: Use official PGDG repository (USE_PGDG_REPO=true)
|
|
||||||
# Scenario 2a: Already at correct version
|
|
||||||
if [[ "$CURRENT_PG_VERSION" == "$PG_VERSION" ]]; then
|
|
||||||
msg_info "Update PostgreSQL $PG_VERSION"
|
|
||||||
ensure_apt_working || return 1
|
|
||||||
|
|
||||||
# Perform upgrade with retry logic (non-fatal if fails)
|
|
||||||
upgrade_packages_with_retry "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}" 2>/dev/null || true
|
|
||||||
cache_installed_version "postgresql" "$PG_VERSION"
|
|
||||||
msg_ok "Update PostgreSQL $PG_VERSION"
|
|
||||||
|
|
||||||
# Still install modules if specified
|
|
||||||
if [[ -n "$PG_MODULES" ]]; then
|
|
||||||
IFS=',' read -ra MODULES <<<"$PG_MODULES"
|
|
||||||
for module in "${MODULES[@]}"; do
|
|
||||||
$STD apt install -y "postgresql-${PG_VERSION}-${module}" 2>/dev/null || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Scenario 2: Different version - backup, remove old, install new
|
|
||||||
if [[ -n "$CURRENT_PG_VERSION" ]]; then
|
|
||||||
msg_info "Upgrade PostgreSQL from $CURRENT_PG_VERSION to $PG_VERSION"
|
|
||||||
msg_info "Creating backup of PostgreSQL $CURRENT_PG_VERSION databases..."
|
|
||||||
local PG_BACKUP_FILE="/var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
|
|
||||||
$STD runuser -u postgres -- pg_dumpall >"$PG_BACKUP_FILE" || {
|
|
||||||
msg_error "Failed to backup PostgreSQL databases"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
$STD systemctl stop postgresql || true
|
|
||||||
$STD apt purge -y "postgresql-${CURRENT_PG_VERSION}" "postgresql-client-${CURRENT_PG_VERSION}" 2>/dev/null || true
|
|
||||||
else
|
|
||||||
msg_info "Setup PostgreSQL $PG_VERSION"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Scenario 3: Fresh install or after removal - setup repo and install
|
|
||||||
prepare_repository_setup "pgdg" "postgresql" || {
|
|
||||||
msg_error "Failed to prepare PostgreSQL repository"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
local SUITE
|
|
||||||
case "$DISTRO_CODENAME" in
|
|
||||||
trixie | forky | sid)
|
|
||||||
if verify_repo_available "https://apt.postgresql.org/pub/repos/apt" "trixie-pgdg"; then
|
|
||||||
SUITE="trixie-pgdg"
|
|
||||||
else
|
|
||||||
msg_warn "PGDG repo not available for ${DISTRO_CODENAME}, falling back to distro packages"
|
|
||||||
USE_PGDG_REPO=false setup_postgresql
|
|
||||||
return $?
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
SUITE=$(get_fallback_suite "$DISTRO_ID" "$DISTRO_CODENAME" "https://apt.postgresql.org/pub/repos/apt")
|
|
||||||
SUITE="${SUITE}-pgdg"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
setup_deb822_repo \
|
|
||||||
"pgdg" \
|
|
||||||
"https://www.postgresql.org/media/keys/ACCC4CF8.asc" \
|
|
||||||
"https://apt.postgresql.org/pub/repos/apt" \
|
|
||||||
"$SUITE" \
|
|
||||||
"main"
|
|
||||||
|
|
||||||
if ! $STD apt update; then
|
|
||||||
msg_error "APT update failed for PostgreSQL repository"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install ssl-cert dependency if available
|
|
||||||
if apt-cache search "^ssl-cert$" 2>/dev/null | grep -q .; then
|
|
||||||
$STD apt install -y ssl-cert 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Try multiple PostgreSQL package patterns with retry logic
|
|
||||||
local pg_install_success=false
|
|
||||||
|
|
||||||
if apt-cache search "^postgresql-${PG_VERSION}$" 2>/dev/null | grep -q . &&
|
|
||||||
install_packages_with_retry "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}"; then
|
|
||||||
pg_install_success=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$pg_install_success" == false ]] &&
|
|
||||||
apt-cache search "^postgresql-server-${PG_VERSION}$" 2>/dev/null | grep -q . &&
|
|
||||||
$STD apt install -y "postgresql-server-${PG_VERSION}" "postgresql-client-${PG_VERSION}" 2>/dev/null; then
|
|
||||||
pg_install_success=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$pg_install_success" == false ]] &&
|
|
||||||
apt-cache search "^postgresql$" 2>/dev/null | grep -q . &&
|
|
||||||
$STD apt install -y postgresql postgresql-client 2>/dev/null; then
|
|
||||||
pg_install_success=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$pg_install_success" == false ]]; then
|
|
||||||
msg_error "PostgreSQL package not available for suite ${SUITE}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v psql >/dev/null 2>&1; then
|
|
||||||
msg_error "PostgreSQL installed but psql command not found"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restore database backup if we upgraded from previous version
|
|
||||||
if [[ -n "$CURRENT_PG_VERSION" && -n "${PG_BACKUP_FILE:-}" && -f "${PG_BACKUP_FILE}" ]]; then
|
|
||||||
msg_info "Restoring PostgreSQL databases from backup..."
|
|
||||||
$STD runuser -u postgres -- psql <"$PG_BACKUP_FILE" 2>/dev/null || {
|
|
||||||
msg_warn "Failed to restore database backup - this may be expected for major version upgrades"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
$STD systemctl enable --now postgresql 2>/dev/null || {
|
|
||||||
msg_warn "Failed to enable/start PostgreSQL service"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add PostgreSQL binaries to PATH
|
|
||||||
if ! grep -q '/usr/lib/postgresql' /etc/environment 2>/dev/null; then
|
|
||||||
echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/'"${PG_VERSION}"'/bin"' >/etc/environment
|
|
||||||
fi
|
|
||||||
|
|
||||||
cache_installed_version "postgresql" "$PG_VERSION"
|
|
||||||
msg_ok "Setup PostgreSQL $PG_VERSION"
|
|
||||||
|
|
||||||
# Install optional modules
|
|
||||||
if [[ -n "$PG_MODULES" ]]; then
|
|
||||||
IFS=',' read -ra MODULES <<<"$PG_MODULES"
|
|
||||||
for module in "${MODULES[@]}"; do
|
|
||||||
$STD apt install -y "postgresql-${PG_VERSION}-${module}" 2>/dev/null || {
|
|
||||||
msg_warn "Failed to install PostgreSQL module: ${module}"
|
|
||||||
}
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Installs or upgrades PostgreSQL and optional extensions/modules.
|
# Installs or upgrades PostgreSQL and optional extensions/modules.
|
||||||
#
|
#
|
||||||
|
|||||||
Reference in New Issue
Block a user