diff --git a/misc/tools.func b/misc/tools.func index f36889452..3ee194cf0 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -6729,219 +6729,6 @@ _configure_pg_cron_preload() { 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. #