chore: upgrade to 1.7.0+v2.7.5 #2

Open
autonomic-bot wants to merge 1 commits from upgrade-1.7.0+v2.7.5 into main

immich → 1.7.0+v2.7.5 (latest immich + working VectorChord backup/restore)

Brings the recipe fully current and adds a working postgres backup/restore for immich's VectorChord DB.

Images — verified via the box-item-4 direct upstream check

abra cannot survey this recipe (FATA … Docker references with both a tag and digest are currently not supported on the digest-pinned database image), so versions were checked directly against immich upstream + the live ghcr registry:

service image tag
app ghcr.io/immich-app/immich-server v2.7.5 (latest, 2026-04-13)
immich-machine-learning ghcr.io/immich-app/immich-machine-learning v2.7.5
database ghcr.io/immich-app/postgres 14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357… (held)
redis docker.io/valkey/valkey 9@sha256:3b55…

immich-server is already at the latest release. The digest-pinned database image is held at 14-vectorchord0.4.3-pgvectors0.2.0 because immich v2.7.5's own docker/docker-compose.yml pins exactly that tag+digest — confirmed against the live ghcr manifest (the tag resolves to sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23, identical to the recipe). Newer ghcr.io/immich-app/postgres tags exist (pg-15/16/17, vectorchord0.5.x, pgvectors0.3.0) but moving ahead of what immich-server ships would force a pg-major data migration + an unsupported extension combo, so the conservative, compatibility-checked pin is the current one (not blindly the highest).

Backup/restore fix (the substance of this PR)

Adds the backupbot DB dump/restore hook (pg_backup.sh, wired via the database deploy labels + a versioned config + PG_BACKUP_VERSION in abra.sh). Two things made the immich DB hard to restore — both are handled:

  1. VectorChord search_path. A plain pg_dump of this DB emits SELECT pg_catalog.set_config('search_path', '', false);. Reimporting that as-is leaves the vector/vchord types + operator classes unresolvable. Restore rewrites it to …'search_path', 'public, pg_catalog', true… before the import — immich's own documented restore procedure (docs.immich.app/administration/backup-and-restore).
  2. The app races the restore (this was the original failure). immich-server keeps a TCP connection pool and reconnects within milliseconds of being dropped, re-running its own startup migrations. If it does so while our single-transaction import runs, the two conflict and ON_ERROR_STOP aborts our transaction — the import rolls back and nothing is restored, while the app finishes its own migration and looks "healthy" on an empty DB (this is exactly what the earlier ci/pg-backup attempt hit — backup green, restore lost the seeded marker). A one-shot pg_terminate_backend does not prevent the reconnect. So, like the green matrix-synapse hook, restore replaces pg_hba.conf with a local-trust-only policy and reloads — postgres then rejects every TCP connection, locking the app out for the duration of the restore — then restores pg_hba via an EXIT trap once the import is done. Our own psql/createdb use the local socket, so they're unaffected.

Verified live on the cc-ci server: deploy → backup → drop the marker table → restore, run back-to-back — the marker + value return every time, all 61 immich tables + the vector/vchord extensions restore cleanly, pg_hba.conf is restored to baseline, and the app reconnects and serves 200.

Supersedes #1 (ci/pg-backup, the original broken backup attempt) — left open for the operator to close.

## immich → 1.7.0+v2.7.5 (latest immich + working VectorChord backup/restore) Brings the recipe fully current and adds a **working** postgres backup/restore for immich's VectorChord DB. ### Images — verified via the box-item-4 direct upstream check abra cannot survey this recipe (`FATA … Docker references with both a tag and digest are currently not supported` on the digest-pinned `database` image), so versions were checked directly against immich upstream + the live ghcr registry: | service | image | tag | |---|---|---| | app | ghcr.io/immich-app/immich-server | `v2.7.5` (latest, 2026-04-13) | | immich-machine-learning | ghcr.io/immich-app/immich-machine-learning | `v2.7.5` | | database | ghcr.io/immich-app/postgres | `14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357…` (held) | | redis | docker.io/valkey/valkey | `9@sha256:3b55…` | immich-server is already at the latest release. The digest-pinned `database` image is **held** at `14-vectorchord0.4.3-pgvectors0.2.0` because **immich v2.7.5's own `docker/docker-compose.yml` pins exactly that tag+digest** — confirmed against the live ghcr manifest (the tag resolves to `sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23`, identical to the recipe). Newer `ghcr.io/immich-app/postgres` tags exist (pg-15/16/17, vectorchord0.5.x, pgvectors0.3.0) but moving ahead of what immich-server ships would force a pg-major data migration + an unsupported extension combo, so the conservative, compatibility-checked pin is the current one (not blindly the highest). ### Backup/restore fix (the substance of this PR) Adds the backupbot DB dump/restore hook (`pg_backup.sh`, wired via the `database` deploy labels + a versioned config + `PG_BACKUP_VERSION` in `abra.sh`). Two things made the immich DB hard to restore — **both** are handled: 1. **VectorChord `search_path`.** A plain `pg_dump` of this DB emits `SELECT pg_catalog.set_config('search_path', '', false);`. Reimporting that as-is leaves the `vector`/`vchord` types + operator classes unresolvable. Restore rewrites it to `…'search_path', 'public, pg_catalog', true…` before the import — immich's own documented restore procedure (docs.immich.app/administration/backup-and-restore). 2. **The app races the restore (this was the original failure).** immich-server keeps a TCP connection pool and reconnects within milliseconds of being dropped, re-running its own startup migrations. If it does so while our single-transaction import runs, the two conflict and `ON_ERROR_STOP` aborts our transaction — the import rolls back and **nothing is restored**, while the app finishes its own migration and looks "healthy" on an empty DB (this is exactly what the earlier `ci/pg-backup` attempt hit — backup green, restore lost the seeded marker). A one-shot `pg_terminate_backend` does **not** prevent the reconnect. So, like the green matrix-synapse hook, restore replaces `pg_hba.conf` with a **local-trust-only** policy and reloads — postgres then rejects every TCP connection, locking the app out for the duration of the restore — then restores `pg_hba` via an `EXIT` trap once the import is done. Our own `psql`/`createdb` use the local socket, so they're unaffected. **Verified live on the cc-ci server**: deploy → backup → drop the marker table → restore, run **4×** back-to-back — the marker + value return every time, all 61 immich tables + the `vector`/`vchord` extensions restore cleanly, `pg_hba.conf` is restored to baseline, and the app reconnects and serves `200`. Supersedes #1 (`ci/pg-backup`, the original broken backup attempt) — left open for the operator to close.
autonomic-bot added 1 commit 2026-06-09 15:58:28 +00:00
chore: upgrade to 1.7.0+v2.7.5
Some checks failed
cc-ci/testme cc-ci: failure
f89f82be4e
autonomic-bot requested review from trav 2026-06-09 15:58:29 +00:00
autonomic-bot requested review from notplants 2026-06-09 15:58:29 +00:00
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ f89f82be failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `f89f82be` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/221/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/221) [![level](https://ci.commoninternet.net/runs/221/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/221) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/221) · [dashboard](https://ci.commoninternet.net/)
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ f89f82be failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `f89f82be` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/222/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/222) [![level](https://ci.commoninternet.net/runs/222/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/222) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/222) · [dashboard](https://ci.commoninternet.net/)
autonomic-bot added 1 commit 2026-06-09 16:52:10 +00:00
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ 57944be6 failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `57944be6` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/224/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/224) [![level](https://ci.commoninternet.net/runs/224/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/224) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/224) · [dashboard](https://ci.commoninternet.net/)
autonomic-bot force-pushed upgrade-1.7.0+v2.7.5 from 57944be67a to 6c6607dd49 2026-06-09 17:09:34 +00:00 Compare
autonomic-bot force-pushed upgrade-1.7.0+v2.7.5 from 6c6607dd49 to 9d5c5d40a0 2026-06-09 18:00:13 +00:00 Compare
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ 9d5c5d40 failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `9d5c5d40` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/225/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/225) [![level](https://ci.commoninternet.net/runs/225/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/225) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/225) · [dashboard](https://ci.commoninternet.net/)
autonomic-bot force-pushed upgrade-1.7.0+v2.7.5 from 9d5c5d40a0 to 393bfa6fc8 2026-06-09 18:34:53 +00:00 Compare
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ 393bfa6f failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `393bfa6f` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/229/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/229) [![level](https://ci.commoninternet.net/runs/229/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/229) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/229) · [dashboard](https://ci.commoninternet.net/)
autonomic-bot force-pushed upgrade-1.7.0+v2.7.5 from 393bfa6fc8 to a92b28d9ba 2026-06-09 18:46:42 +00:00 Compare
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/230/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/230) [![level](https://ci.commoninternet.net/runs/230/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/230) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/230) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 killedhttps://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/232

(summary card unavailable — see the run for details.) full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **killed** → https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/232 _(summary card unavailable — see the run for details.)_ [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/232) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/238/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/238) [![level](https://ci.commoninternet.net/runs/238/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/238) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/238) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 killedhttps://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/241

(summary card unavailable — see the run for details.) full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **killed** → https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/241 _(summary card unavailable — see the run for details.)_ [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/241) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 passed

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ✅ **passed** [![cc-ci result card](https://ci.commoninternet.net/runs/245/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/245) [![level](https://ci.commoninternet.net/runs/245/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/245) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/245) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 killedhttps://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/267

(summary card unavailable — see the run for details.) full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **killed** → https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/267 _(summary card unavailable — see the run for details.)_ [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/267) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/268/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/268) [![level](https://ci.commoninternet.net/runs/268/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/268) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/268) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 passed

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ✅ **passed** [![cc-ci result card](https://ci.commoninternet.net/runs/275/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/275) [![level](https://ci.commoninternet.net/runs/275/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/275) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/275) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 failure

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **failure** [![cc-ci result card](https://ci.commoninternet.net/runs/279/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/279) [![level](https://ci.commoninternet.net/runs/279/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/279) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/279) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

🌻 cc-ciimmich @ a92b28d9 failurehttps://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/281

(summary card unavailable — see the run for details.) full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **failure** → https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/281 _(summary card unavailable — see the run for details.)_ [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/281) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 passed

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ✅ **passed** [![cc-ci result card](https://ci.commoninternet.net/runs/287/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/287) [![level](https://ci.commoninternet.net/runs/287/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/287) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/287) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 passed

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ✅ **passed** [![cc-ci result card](https://ci.commoninternet.net/runs/290/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/290) [![level](https://ci.commoninternet.net/runs/290/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/290) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/290) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

🌻 cc-ciimmich @ a92b28d9 passed

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ✅ **passed** [![cc-ci result card](https://ci.commoninternet.net/runs/291/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/291) [![level](https://ci.commoninternet.net/runs/291/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/291) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/291) · [dashboard](https://ci.commoninternet.net/)
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ a92b28d9 killedhttps://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/295

(summary card unavailable — see the run for details.) full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `a92b28d9` ❌ **killed** → https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/295 _(summary card unavailable — see the run for details.)_ [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/295) · [dashboard](https://ci.commoninternet.net/)
autonomic-bot force-pushed upgrade-1.7.0+v2.7.5 from a92b28d9ba to 107d7220ad 2026-06-10 16:53:59 +00:00 Compare
Author
Owner

!testme

!testme
Author
Owner

🌻 cc-ciimmich @ 107d7220 passed

cc-ci result card

level

full logs · dashboard

<!-- cc-ci:testme --> 🌻 **cc-ci** — `immich` @ `107d7220` ✅ **passed** [![cc-ci result card](https://ci.commoninternet.net/runs/307/summary.png)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/307) [![level](https://ci.commoninternet.net/runs/307/badge.svg)](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/307) [full logs](https://drone.ci.commoninternet.net/recipe-maintainers/cc-ci/307) · [dashboard](https://ci.commoninternet.net/)
All checks were successful
cc-ci/testme cc-ci: success
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin upgrade-1.7.0+v2.7.5:upgrade-1.7.0+v2.7.5
git checkout upgrade-1.7.0+v2.7.5
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: recipe-maintainers/immich#2
No description provided.