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
- Restore the Postgres image/package to a version that offers installedVersion or newer (undo the downgrade).
- 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.
- Run 'SELECT extname, extversion FROM pg_extension;' and 'SELECT name, default_version FROM pg_available_extensions;' and reconcile the two.
- 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
- Never downgrade the vector extension image below the DB's installed version.
- When switching extension type (vector <-> vectors), DROP first.
- Keep image tags in version control to detect accidental downgrades.
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
- The ${name} extension version is ${version}, which mean
- The ${name} extension version is ${version}, but Immich only
- The ${name} extension is not available in this Postgres inst
- Invalid PostgreSQL version. Found ${version}, but needed ${p
- No vector extension found. Available extensions: ${VECTOR_EX
AI-assisted analysis of immich-app/immich@199723261c (2026-08-12).
Data as JSON: /api/errors/066035944a16f0be.
Report an issue: GitHub.