From e0fc2c8348f7f381591040fb4dce7981aeec6573 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sat, 15 Feb 2025 10:15:04 +0100 Subject: [PATCH] Fix addon config --- immich/config.json | 2 +- immich/rootfs/etc/cont-init.d/99-run.sh | 2 +- postgres/CHANGELOG.md | 5 + postgres/rootfs/etc/cont-init.d/99-run.sh | 214 ++++++++++++++++------ 4 files changed, 169 insertions(+), 54 deletions(-) diff --git a/immich/config.json b/immich/config.json index 53980b8c4..cb76ca999 100644 --- a/immich/config.json +++ b/immich/config.json @@ -141,6 +141,6 @@ "slug": "immich", "udev": true, "url": "https://github.com/alexbelgium/hassio-addons", - "version": "1.126.1-2", + "version": "1.126.1-3", "webui": "http://[HOST]:[PORT:8080]" } diff --git a/immich/rootfs/etc/cont-init.d/99-run.sh b/immich/rootfs/etc/cont-init.d/99-run.sh index 585b190f9..93229925d 100755 --- a/immich/rootfs/etc/cont-init.d/99-run.sh +++ b/immich/rootfs/etc/cont-init.d/99-run.sh @@ -87,7 +87,7 @@ setup_root_user() { else bashio::log.warning "DB_ROOT_PASSWORD not set. Generating a random 12-character alphanumeric password and storing it in the addon options." export DB_ROOT_PASSWORD="$(tr -dc 'A-Za-z0-9' "$PG_VERSION_FILE" fi -# Setup data directory -mkdir -p "$PGDATA" -chown -R postgres:postgres "$PGDATA" -chmod 700 "$PGDATA" - -# Set permissions -chmod -R 755 "$CONFIG_HOME" - -############## -# Launch App # -############## +############################### +# Launch PostgreSQL # +############################### cd /config || true +bashio::log.info "Starting PostgreSQL..." -bashio::log.info "Starting the app" - -# Start background tasks if [ "$(bashio::info.arch)" = "armv7" ]; then bashio::log.warning "ARMv7 detected: Starting without vectors.so" - docker-entrypoint.sh postgres & true - exit 0 + nohup docker-entrypoint.sh postgres > /dev/null 2>&1 & +else + nohup docker-entrypoint.sh postgres -c shared_preload_libraries=vectors.so -c search_path="public, vectors" > /dev/null 2>&1 & fi -# If not armv7 -docker-entrypoint.sh postgres -c shared_preload_libraries=vectors.so -c search_path="public, vectors" & true +############################### +# Wait for PostgreSQL Startup # +############################### -#################### -# Enable vector.rs # -#################### +bashio::log.info "Waiting for PostgreSQL to start..." +bashio::net.wait_for 5432 localhost 900 -bashio::log.info "Waiting for port 5432 to open..." +############################### +# PostgreSQL Major Version Upgrade Check # +############################### -# Wait for transmission to become available -( bashio::net.wait_for 5432 localhost 900 +OLD_PG_VERSION=$(cat "$PG_VERSION_FILE") +if [ "$OLD_PG_VERSION" != "$PG_MAJOR_VERSION" ]; then + bashio::log.warning "PostgreSQL major version changed ($OLD_PG_VERSION → $PG_MAJOR_VERSION). Running upgrade..." -bashio::log.info "Enabling vector.rs" + # Note: Ensure pg_upgrade is installed and the paths below match your environment. + pg_upgrade --old-datadir="$PGDATA" \ + --new-datadir="$PGDATA-new" \ + --old-bindir="/usr/lib/postgresql/$OLD_PG_VERSION/bin" \ + --new-bindir="/usr/lib/postgresql/$PG_MAJOR_VERSION/bin" -# Set variables for vector.rs + # Replace old data directory with upgraded one + mv "$PGDATA" "$PGDATA-old" + mv "$PGDATA-new" "$PGDATA" + rm -rf "$PGDATA-old" + + # Update the version file + echo "$PG_MAJOR_VERSION" > "$PG_VERSION_FILE" +fi + +##################################### +# Enable & Upgrade pgvector.rs # +##################################### + +# Set connection variables for Postgres DB_PORT=5432 DB_HOSTNAME=localhost DB_PASSWORD="$(bashio::config 'POSTGRES_PASSWORD')" DB_USERNAME=postgres -if bashio::config.has_value "POSTGRES_USER"; then DB_USERNAME="$(bashio::config "POSTGRES_USER")"; fi +if bashio::config.has_value "POSTGRES_USER"; then + DB_USERNAME="$(bashio::config "POSTGRES_USER")" +fi +export DB_PORT DB_HOSTNAME DB_USERNAME DB_PASSWORD -export DB_PORT -export DB_HOSTNAME -export DB_USERNAME -export DB_PASSWORD -echo "DROP EXTENSION IF EXISTS vectors; - CREATE EXTENSION vectors; -\q" > /setup_postgres.sql +# Function: Check if the "vectors" extension is enabled +check_vector_extension() { + bashio::log.info "Checking if 'vectors' extension is enabled..." + local result + result=$(psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" \ + -tAc "SELECT extname FROM pg_extension WHERE extname = 'vectors';") + if [[ "$result" == "vectors" ]]; then + bashio::log.info "'vectors' extension is enabled." + return 0 + else + bashio::log.error "'vectors' extension is NOT enabled." + return 1 + fi +} -# Enable vectors -psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" < /setup_postgres.sql >/dev/null || true -rm /setup_postgres.sql || true -) & true +# Function: Enable (or re-create) the "vectors" extension +enable_vector_extension() { + bashio::log.info "Enabling 'vectors' extension..." + cat < /setup_postgres.sql +DROP EXTENSION IF EXISTS vectors; +CREATE EXTENSION vectors; +EOF + psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" < /setup_postgres.sql >/dev/null 2>&1 + rm /setup_postgres.sql || true +} + +# Function: Store the current pgvector.rs extension version in a file +store_vector_version() { + local version + version=$(psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" \ + -tAc "SELECT extversion FROM pg_extension WHERE extname = 'vectors';") + echo "$version" > "$VECTOR_VERSION_FILE" +} + +# Function: Cleanup outdated vector indexes (adjust as needed) +cleanup_vector_indexes() { + bashio::log.info "Cleaning up outdated vector indexes..." + psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" \ + -c "DROP INDEX IF EXISTS clip_index;" >/dev/null 2>&1 +} + +# Function: Upgrade the "vectors" extension if a desired version is provided +upgrade_vector_extension() { + local current_version desired_version + current_version=$(psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" \ + -tAc "SELECT extversion FROM pg_extension WHERE extname = 'vectors';") + # Use the desired version from config; if not set, use current version + desired_version=$(bashio::config 'VECTOR_EXTENSION_VERSION' || echo "$current_version") + + if [[ "$current_version" != "$desired_version" ]]; then + bashio::log.warning "Upgrading 'vectors' extension from version $current_version to $desired_version..." + psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" \ + -c "ALTER EXTENSION vectors UPDATE TO '$desired_version';" >/dev/null 2>&1 + cleanup_vector_indexes + echo "$desired_version" > "$VECTOR_VERSION_FILE" + else + bashio::log.info "'vectors' extension is already at the desired version ($desired_version)." + fi +} + +# Function: Troubleshooting routine if extension checks fail +troubleshoot_vector_extension() { + bashio::log.error "Troubleshooting pgvector.rs installation:" + + bashio::log.info "Checking if PostgreSQL is running..." + if ! pg_isready -h "$DB_HOSTNAME" -p "$DB_PORT" -U "$DB_USERNAME" >/dev/null 2>&1; then + bashio::log.error "PostgreSQL is not running or unreachable. Start the database and check network settings." + exit 1 + else + bashio::log.info "PostgreSQL is running." + fi + + bashio::log.info "Verifying availability of the 'vectors' extension..." + local ext_check + ext_check=$(psql "postgres://$DB_USERNAME:$DB_PASSWORD@$DB_HOSTNAME:$DB_PORT" \ + -tAc "SELECT count(*) FROM pg_available_extensions WHERE name = 'vectors';") + if [[ "$ext_check" -eq 0 ]]; then + bashio::log.error "'vectors' extension is not available. Ensure that the pgvector.rs extension is installed." + bashio::log.error "Try running: ALTER SYSTEM SET shared_preload_libraries = 'vectors'; then restart PostgreSQL." + exit 1 + else + bashio::log.info "'vectors' extension is available." + fi +} + +################################### +# Main Extension Handling # +################################### + +# If the extension isn’t enabled, create it. +if ! check_vector_extension; then + enable_vector_extension +fi + +# Store the initial pgvector.rs version +store_vector_version + +# If a desired version is provided, attempt to upgrade. +upgrade_vector_extension + +# Verify that the extension is enabled (and upgraded, if needed). +check_vector_extension || troubleshoot_vector_extension