immich-app/immich · critical · Error

The database currently has ${name} ${installedVersion} activ

Error message

The database currently has ${name} ${installedVersion} activated, but the Postgres instance only has ${availableVersion} available.
    This most likely means the extension was downgraded.
    If ${name} ${installedVersion} is compatible with Immich, please ensure the Postgres instance has this available.

What it means

The extension version currently activated in pg_extension (installedVersion) is newer than the highest version Postgres can offer (availableVersion). This means the Postgres instance's extension package was downgraded while the database still references the newer version - a state Immich cannot safely operate in. The guard at line 95 catches semver.lt(availableVersion, installedVersion).

Source

Thrown at server/src/services/database.service.ts:95

      if ([availableVersion, installedVersion].some((version) => version && semver.eq(version, '0.0.0'))) {
        throw new Error(messages.nightlyVersion({ name, extension, version: '0.0.0' }));
      }

      if (!semver.satisfies(availableVersion, extensionRange)) {
        throw new Error(messages.outOfRange({ name, extension, version: availableVersion, range: extensionRange }));
      }

      if (!installedVersion) {
        await this.createExtension(extension);
      }

      if (installedVersion && semver.gt(availableVersion, installedVersion)) {
        await this.updateExtension(extension, availableVersion);
      } else if (installedVersion && !semver.satisfies(installedVersion, extensionRange)) {
        throw new Error(messages.outOfRange({ name, extension, version: installedVersion, range: extensionRange }));
      } else if (installedVersion && semver.lt(availableVersion, installedVersion)) {
        throw new Error(messages.invalidDowngrade({ name, extension, availableVersion, installedVersion }));
      }

      try {
        await this.databaseRepository.reindexVectorsIfNeeded([VectorIndex.Clip, VectorIndex.Face]);
      } catch (error) {
        this.logger.warn(
          'Could not run vector reindexing checks. If the extension was updated, please restart the Postgres instance. If you are upgrading directly from a version below 1.107.2, please upgrade to 1.107.2 first.',
        );
        throw error;
      }

      for (const { name: dbName, installedVersion } of extensionVersions) {
        const isDepended = dbName === DatabaseExtension.Vector && extension === DatabaseExtension.VectorChord;
        if (dbName !== extension && installedVersion && !isDepended) {
          await this.dropExtension(dbName);
        }
      }

View on GitHub (pinned to 199723261c)

Solutions

  1. Restore the Postgres image/package to a version that offers installedVersion or newer (undo the downgrade).
  2. If you intentionally must downgrade, first DROP the extension in the new (older) image then let Immich recreate it - but note vector indexes will need rebuilding.
  3. Run 'SELECT extname, extversion FROM pg_extension;' and 'SELECT name, default_version FROM pg_available_extensions;' and reconcile the two.
  4. Restart Immich once availableVersion >= installedVersion.

Example fix

# before: image downgraded, installed > available
image: tensorchord/pgvecto-rs:pg16-v0.2.0
# after: image restored to the version the DB already has (or newer)
image: tensorchord/pgvecto-rs:pg16-v0.3.0
Defensive patterns

Strategy: validation

Validate before calling

import pg from 'pg';
import semver from 'semver';
const client = new pg.Client({ connectionString: process.env.DB_URL });
await client.connect();
const avail = await client.query(
  "SELECT name, default_version FROM pg_available_extensions WHERE name IN ('vector','vectors');"
);
const inst = await client.query(
  "SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector','vectors');"
);
for (const i of inst.rows) {
  const a = avail.rows.find((r) => r.name === i.extname);
  if (a && semver.lt(semver.coerce(a.default_version)!, semver.coerce(i.extversion)!)) {
    throw new Error(`${i.extname} was downgraded: installed ${i.extversion} > available ${a.default_version}`);
  }
}

Type guard

import semver from 'semver';
const noDowngrade = (installed: string, available: string) =>
  !semver.lt(semver.coerce(available)!, semver.coerce(installed)!);

Try / catch

try {
  await app.start();
} catch (e) {
  if (/extension was downgraded/.test(String(e?.message))) {
    logger.fatal('Vector extension downgraded - restore the prior image version');
    process.exit(1);
  }
  throw e;
}

Prevention

When it happens

Trigger: On bootstrap, installedVersion exists and semver.lt(availableVersion, installedVersion). Example: DB was running pgvecto.rs 0.3.0, the container was switched to an image packaging only 0.2.x; pg_extension still references 0.3.0 but pg_available_extensions reports 0.2.x.

Common situations: Downgrading the vector extension Docker image; restoring a DB backup made against a newer extension into an instance with an older one; switching between pgvector and pgvecto.rs/chord without dropping the old extension first.

Related errors


AI-assisted analysis of immich-app/immich@199723261c (2026-08-12). Data as JSON: /api/errors/066035944a16f0be. Report an issue: GitHub.