# A1 — upstream PostgreSQL notes for the last six apps (2026-09-30) Read-only research. Fetched 2026-09-30 with curl (GitHub raw / API, ghcr, Docker Hub) and WebFetch (docs sites). Nothing on any Felhom host was touched. Rule applied: Felhom decision 42. ## Catalog pins (app-catalog-felhom.eu/templates//docker-compose.yml, working tree) | app | app image | db image | data mount | |---|---|---|---| | outline | outlinewiki/outline:1.9.1 | postgres:16-alpine | /var/lib/postgresql/data | | rallly | lukevella/rallly:4.11.1 | postgres:16-alpine | /var/lib/postgresql/data | | zipline | ghcr.io/diced/zipline:4.6.1 | postgres:16-alpine | /var/lib/postgresql/data | | sparkyfitness | codewithcj/sparkyfitness(_server):v0.17.3 | postgres:15-alpine | /var/lib/postgresql/data, PGDATA=/var/lib/postgresql/data/pgdata | | adventurelog | ghcr.io/seanmorley15/adventurelog-backend/-frontend:v0.13.0 | postgis/postgis:16-3.5-alpine | /var/lib/postgresql/data | | immich | ghcr.io/immich-app/immich-server:v3.2.2 | ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvectors0.2.0 | /var/lib/postgresql/data | ## Newest upstream releases (GitHub API /releases, 2026-09-30) - outline/outline: v1.10.1 (2026-09-09) - lukevella/rallly: v4.15.3 (2026-09-29); pinned v4.11.1 published 2026-06-20 - diced/zipline: v4.8.0 (2026-09-27) - CodeWithCJ/SparkyFitness: v1.7.3 (2026-09-28); pinned v0.17.3 published 2026-07-06 - seanmorley15/AdventureLog: v0.13.0 (2026-08-12) = pinned - immich-app/immich: v3.2.4 (2026-09-28) latest stable; v3.3.0-rc.0 (2026-09-29) prerelease ## PostgreSQL EOL (https://www.postgresql.org/support/versioning/, fetched 2026-09-30) 18: 18.6, first 2025-09-25, final November 14, 2030 · 17: 17.11, final November 8, 2029 · 16: 16.15, final November 9, 2028 · 15: 15.19, final November 11, 2027 · 14: 14.24, final November 12, 2026. PG 19 is in beta (19 Beta 4), not yet in the table. ## outline - https://raw.githubusercontent.com/outline/outline/v1.9.1/docker-compose.yml and .../v1.10.1/docker-compose.yml — this is the LOCAL-DEV compose (ports on 127.0.0.1, no app service). Both tags: ` postgres:` / ` image: postgres` (unpinned = latest). - https://raw.githubusercontent.com/outline/outline/v1.9.1/.github/workflows/ci.yml line 94 and .../v1.10.1/.github/workflows/ci.yml line 115: ` image: postgres:14.2` (CI test DB). - Official self-host compose = docs page https://docs.getoutline.com/s/hosting/doc/docker-7pfeLP5a8t (unversioned, read 2026-09-30): `image: postgres:18`, volume `database-data:/var/lib/postgresql`. - Requirements https://docs.getoutline.com/s/hosting/doc/requirements-ULdYnwi4wG: "PostgreSQL (v14+)". - What the docs compose said at v1.9.1: NOT FOUND (docs are not versioned; the Wayback Machine returned 429 / "Temporarily Offline"). ## rallly - https://raw.githubusercontent.com/lukevella/rallly/v4.11.1/docker-compose.yml and .../v4.15.3/docker-compose.yml (repo-root compose, builds from source): ` image: postgres:18-alpine`, ` - db-data:/var/lib/postgresql`. Commit history of that file: `3407ebeb 2026-05-07 ⬆️ Upgrade postgres to 18-alpine` (before v4.11.1). - Official self-host repo https://raw.githubusercontent.com/lukevella/rallly-selfhosted/main/docker-compose.yml (not tagged per app version): ` image: postgres:${POSTGRES_VERSION:-14}-alpine` with comment "(… fresh installs get 18). The defaults below match the original postgres 14 deployment … They are a compatibility fallback, not a version choice"; and "postgres images ≥18 moved PGDATA and expect the volume mounted at /var/lib/postgresql instead of /var/lib/postgresql/data." History: `75c23d09 2026-07-08 Provision Postgres 18 on fresh installs, pin existing volumes to their major`, `3e8fe380 2026-07-14 Add upgrade-db command and Postgres EOL warning`. - https://raw.githubusercontent.com/lukevella/rallly-selfhosted/main/README.md: "`POSTGRES_VERSION` | Bundled Postgres major version — pinned automatically on first start (18 for fresh installs, …)"; "To move to the current version (18):" … "`./rallly.sh upgrade-db`" "dumps the database …, restores it into a fresh PostgreSQL 18 volume". - Documented lower bound: not found. ## zipline - https://raw.githubusercontent.com/diced/zipline/v4.6.1/docker-compose.yml and .../v4.8.0/docker-compose.yml: ` image: postgres:16`, ` - pgdata:/var/lib/postgresql/data`. Dev compose same (`image: postgres:16`) at both. File history has no postgres bump since `651efbc0 2024-12-28 feat: prisma migrations`. - https://zipline.diced.sh/docs/get-started/docker: "This guide uses PostgreSQL"; no version sentence. - https://raw.githubusercontent.com/diced/zipline-docs/trunk/docs/guides/migrate-pg-14-15.md: "PostgreSQL 14 is still supported until November 12th, 2026." - Documented upper bound / PG17/18 statement: NOT FOUND (GitHub issue search "postgres 17 OR postgres 18" returned nothing relevant; #1054 is a collation-version mismatch report, not a major-version one). ## sparkyfitness - https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v0.17.3/docker/docker-compose.prod.yml: ` image: postgres:18.3-alpine`, ` - ${DB_PATH:-./postgresql}:/var/lib/postgresql`. - https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v1.7.3/docker/docker-compose.prod.yml: same two lines. - Commit `57536c4a 2026-03-20 Postgres 18.3 upgrade` (touches docker-compose.prod.yml + docs/content/1.install/8.postgres-upgrade.md). - Stale doc at the pinned tag: https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v0.17.3/docs/content/1.install/1.docker-compose.md line 44 `* **Image**: \`postgres:15-alpine\`` (contradicts the compose in the same tag). At v1.7.3 docs/src/install/docker-compose.md line 51: `- **Image**: \`postgres:18.3-alpine\``. - https://raw.githubusercontent.com/CodeWithCJ/SparkyFitness/v1.7.3/docs/src/install/postgres-upgrade.md: "# PostgreSQL Upgrade (15 to 18.3)" … "upgrading your SparkyFitness PostgreSQL database from version 15-alpine to 18.3-alpine" … method `pg_dumpall -U sparky > ./full_backup.sql`, fresh dir, remount at `/var/lib/postgresql`. - .../v1.7.3/docs/src/install/external-database.md: "**No extensions required.** As of v0.17.0 release, SparkyFitness no longer depends on `uuid-ossp`, `pgcrypto`, or `pg_stat_statements`." and "UUID generation uses the built-in `gen_random_uuid()` (PostgreSQL 13+)"; "PostgreSQL 15+ only: the default public schema permissions changed in PG 15." - Version gap: pinned v0.17.3 (2026-07-06) vs newest v1.7.3 (2026-09-28) — crosses 0.x -> 1.x. ## adventurelog - https://raw.githubusercontent.com/seanmorley15/AdventureLog/v0.13.0/docker-compose.yml: ` image: postgis/postgis:16-3.5`, ` - postgres_data:/var/lib/postgresql/data/`. Same in docker/docker-compose.database.yml, .dev.yml, .advanced.yml at v0.13.0 and in main/docker-compose.yml (2026-09-30). v0.13.0 is the newest release. - https://raw.githubusercontent.com/seanmorley15/AdventureLog/v0.13.0/documentation/docs/install/docker.md line 29: "It is recommended to use the `imresamu/postgis:16-3.5-alpine` image" (ARM note). - backend/server/requirements.txt at v0.13.0: `Django==5.2.13`, `psycopg2-binary==2.9.10`. - Documented supported PG range: NOT FOUND in AdventureLog docs. - Docker Hub https://hub.docker.com/v2/repositories/postgis/postgis/tags?page_size=100&name=alpine (count 81, all read): 16-3.5-alpine (updated 2026-08-31), 16-3.4-alpine; NO 16-3.6-alpine. 17-3.5-alpine and 17-3.6-alpine (2026-08-31). 18-3.6-alpine (2026-08-31); NO 18-3.5-alpine. 19beta1-3.6-alpine. - PostGIS https://postgis.net/docs/manual-3.6/postgis_administration.html ("Upgrading spatial databases"): "By HARD UPGRADE we mean full dump/reload of postgis-enabled databases."; "If you are running PostGIS 3 or above, then you should use the PostGIS_Extensions_Upgrade function to upgrade to the latest version you have installed." (in-place/soft path); "If you installed PostGIS originally without a version specified, you can often skip the reinstallation of postgis extension before restoring since the backup just has `CREATE EXTENSION postgis` and thus picks up the newest latest version during restore." ## immich - https://raw.githubusercontent.com/immich-app/immich/v3.2.2/docker/docker-compose.yml line 59, identical at v3.2.4 and v3.3.0-rc.0: ` image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23` and ` - ${DB_DATA_LOCATION}:/var/lib/postgresql/data`. - https://raw.githubusercontent.com/immich-app/immich/v3.2.4/docs/docs/administration/postgres-standalone.md (same at v3.2.2): "Immich is known to work with Postgres versions `>= 14, < 20`." / "The current accepted range for VectorChord is `>= 0.3, < 2.0`." / "Support for pgvecto.rs has been dropped as of 3.0" / "When installing a new version of VectorChord, you will need to manually update the extension and reindex … `ALTER EXTENSION vchord UPDATE; REINDEX INDEX face_index; REINDEX INDEX clip_index;`" - .../docs/docs/install/upgrading.md: "The new DB image includes pgvector and pgvecto.rs in addition to VectorChord, so you can use this image to restore from existing backups that used either of these extensions. However, backups made after switching to VectorChord require an image containing VectorChord to restore successfully." / "you can optionally switch to an image variant that doesn’t have pgvecto.rs installed after you’ve performed the migration and started Immich: `ghcr.io/immich-app/postgres:14-vectorchord0.4.3`, changing the PostgreSQL version as appropriate." / "it’s normal for the server logs to be seemingly stuck at `Reindexing clip_index` and `Reindexing face_index`". - .../docs/docs/administration/backup-and-restore.md: manual backup = `pg_dump --clean --if-exists --dbname=…`; restore = pipe into psql with `--single-transaction --set ON_ERROR_STOP=on` on a fresh DB; "requires a completely fresh install". Whether vector indexes are carried or rebuilt by a dump/restore: NOT STATED in the docs. - Server source v3.2.4: - server/src/constants.ts: `export const POSTGRES_VERSION_RANGE = '>=14.0.0';`, `export const VECTORCHORD_VERSION_RANGE = '>=0.3 <2';` - server/src/services/database.service.ts (startup, under the migrations lock): `if (installedVersion && semver.gt(availableVersion, installedVersion)) { await this.updateExtension(extension, availableVersion); }` … `await this.databaseRepository.reindexVectorsIfNeeded([VectorIndex.Clip, VectorIndex.Face]);` … and `if (dbName !== extension && installedVersion && !isDepended) { await this.dropExtension(dbName); }` (drops any installed non-active vector extension, i.e. pgvecto.rs `vectors`, keeping pgvector `vector` because vchord depends on it). - server/src/repositories/database.repository.ts `updateVectorExtension`: drops clip_index/face_index, `ALTER EXTENSION … UPDATE TO`, then `reindexVectors` both. `reindexVectorsIfNeeded` rebuilds an index that is missing, not `using vchordrq`, or whose `lists` no longer matches the row count. - ghcr tags (anonymous token, https://ghcr.io/v2/immich-app/postgres/tags/list, 174 tags, all of form `-vectorchord…`): - 16: 16-vectorchord0.4.3, 16-vectorchord0.4.3-pgvectors0.2.0/0.2.1/0.3.0, …-pgvector0.8.1…, 16-vectorchord0.5.3, 16-vectorchord0.5.3-pgvector0.8.1, 16-vectorchord1.1.1 - 17: pgvecto.rs only as `-pgvectors0.3.0` (no 0.2.x); 17-vectorchord0.4.3, 17-vectorchord0.5.3, 17-vectorchord1.1.1 - 18: ONLY 18-vectorchord0.5.3, 18-vectorchord0.5.3-pgvector0.8.1, 18-vectorchord1.1.1 — no pgvecto.rs variant, no vchord 0.4.x - no PG19 tag.