immich-app/immich · critical · Error
The ${name} extension is not available in this Postgres inst
Error message
The ${name} extension is not available in this Postgres instance.
If using a container image, ensure the image has the extension installed. What it means
Immich requires a vector similarity search extension (pgvector 'vector' or pgvecto.rs 'vectors', a.k.a. Chord) to be present in the Postgres instance before it can start. On bootstrap the DatabaseService queries pg_extension/pg_available_extensions for VECTOR_EXTENSIONS; if the configured extension has no availableVersion, startup aborts with this message. It is a hard precondition for running the server because vector indexes back CLIP and face recognition search.
Source
Thrown at server/src/services/database.service.ts:75
async onBootstrap() {
const version = await this.databaseRepository.getPostgresVersion();
const current = semver.coerce(version);
const postgresRange = this.databaseRepository.getPostgresVersionRange();
if (!current || !semver.satisfies(current, postgresRange)) {
throw new Error(
`Invalid PostgreSQL version. Found ${version}, but needed ${postgresRange}. Please use a supported version.`,
);
}
await this.databaseRepository.withLock(DatabaseLock.Migrations, async () => {
const extension = await this.databaseRepository.getVectorExtension();
const name = EXTENSION_NAMES[extension];
const extensionRange = this.databaseRepository.getExtensionVersionRange(extension);
const extensionVersions = await this.databaseRepository.getExtensionVersions(VECTOR_EXTENSIONS);
const { installedVersion, availableVersion } = extensionVersions.find((v) => v.name === extension) ?? {};
if (!availableVersion) {
throw new Error(messages.notInstalled(name));
}
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 }));View on GitHub (pinned to 199723261c)
Solutions
- Switch to the Immich-bundled or pgvector/pgvecto.rs Postgres image (tensorchord/pgvecto.rs or pgvector/pgvector) matching the version in docker/docker-compose.yml.
- Inside the running Postgres container run 'SELECT name, default_version FROM pg_available_extensions WHERE name IN ('vector','vectors');' to confirm the extension package exists; if absent, install the package for that PG major version.
- Verify the IMMICH/DB vector extension env var matches an extension that is actually packaged (default is 'vectors' for the bundled image); change it to 'vector' only if you installed pgvector.
- Restart the Immich server after the Postgres image/extension is fixed so the bootstrap check re-runs.
Example fix
# before: plain postgres image # image: postgres:16 # after: image with the vector extension image: tensorchord/pgvectors:pg16 # then in psql confirm: -- SELECT * FROM pg_available_extensions WHERE name = 'vectors';
Defensive patterns
Strategy: validation
Validate before calling
// before starting Immich, verify the extension package is present in Postgres
import pg from 'pg';
const client = new pg.Client({ connectionString: process.env.DB_URL });
await client.connect();
const res = await client.query(
"SELECT name FROM pg_available_extensions WHERE name IN ('vector','vectors');"
);
if (res.rowCount === 0) {
throw new Error('No vector extension available in Postgres - install pgvector/pgvecto.rs first');
} Type guard
const hasVectorExtension = (rows: { name: string }[]) =>
rows.some((r) => r.name === 'vector' || r.name === 'vectors'); Try / catch
try {
await app.start(); // triggers DatabaseService.onBootstrap
} catch (e) {
if (/extension is not available/.test(String(e?.message))) {
logger.fatal('Vector extension missing - fix the Postgres image before retrying');
process.exit(1);
}
throw e;
} Prevention
- Use the Immich-provided docker-compose Postgres image or a known pgvector/pgvecto.rs image.
- Add a startup healthcheck that queries pg_available_extensions for the vector extension.
- Pin extension image tags - do not rely on 'latest'.
- Document the required vector extension in deployment runbooks.
When it happens
Trigger: AppBootstrap event fires, DatabaseService.onBootstrap runs, getVectorExtension returns the configured extension (e.g. 'vectors'), getExtensionVersions returns no row with a non-null availableVersion for it. Triggered: fresh DB without the extension, a custom/minimal Postgres image, or VECTOR_EXTENSIONS env var pointing at an extension the image lacks.
Common situations: Using a plain postgres Docker image instead of the pgvector/pgvecto.rs image; mis-setting the vector extension env var; Postgres upgrade that dropped the extension; RDS/Cloud SQL without the vector extension package installed.
Related errors
- The ${name} extension version is ${version}, which mean
- The ${name} extension version is ${version}, but Immich only
- The database currently has ${name} ${installedVersion} activ
- No vector extension found. Available extensions: ${VECTOR_EX
- Invalid PostgreSQL version. Found ${version}, but needed ${p
AI-assisted analysis of immich-app/immich@199723261c (2026-08-12).
Data as JSON: /api/errors/9ab56d0829ae995c.
Report an issue: GitHub.