25cb3eb9c1
gates / gates (push) Successful in 29s
- R-463 CLOSED: rallly, outline, sparkyfitness -> PostgreSQL 18 (catalog 25ffd89 / aeb0cd6 / 1666572), each proven on the bench and on 9202 through the guarded Update with one undo case; zipline, adventurelog, immich stay on 16 by 09 decision 42's rule (upstream runs 16 / 16 / 14). - Part F: bookstack, kimai, audiobookshelf, n8n, navidrome, grafana, komga moved on both venues; immich not (R-732: its first start OOM-killed its database on the bench). - R-687 item 4 PROVEN LIVE on demo-hp: two deferrals while the leg stepped two apps, the whole-guest backup on the first poll after, success; config + window put back and read back. - Catalog currency audit (Part D): 25/53 behind inside a major, 19 across; night-updatable 28 -> 31 (+1). - R-446 and R-440 narrowed (measured on demo-hp); R-624 corrected (outline, rallly, zipline have routes); R-548 note (demo-hp's local tier refused for space since 09-27). - New rows: R-730 (the ISO 1.29.0 build commit cannot be proven -> no tag; installer-v* is the script's line), R-731 (tag-shape switches), R-732. Register 361 -> 364. - 09 §3: the 2026-09-30 operator notes (by day; Tester-2 pre-checks done; decision 52 not needed, not recorded); §6.4 dated currency note. STATUS, CONTEXT, REPORT-pg-last-six-2026-09-30.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
142 lines
12 KiB
Markdown
142 lines
12 KiB
Markdown
# 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/<app>/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 `<pg>-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.
|