before: pinned={'sparkyfitness-db': 'postgres:15-alpine', 'sparkyfitness-frontend': 'codewithcj/sparkyfitness:v0.17.3', 'sparkyfitness-server': 'codewithcj/sparkyfitness_server:v0.17.3'} PG_VERSION=15
drill: 16ce915 DRILL sparkyfitness: sparkyfitness-db postgres:15-alpine -> postgres:18-alpine with the engine_conversion mark (box proof)
  phase +0.0s backing-up | err=None
  phase +25.6s safety-dump | err=None
  phase +27.7s pulling | err=None
  phase +29.7s copying | err=None
  phase +31.8s converting | err=None
  phase +42.0s starting | err=None
  phase +53.3s verifying | err=None
  phase +58.4s done | err=None
    sparkyfitness: readback of the seeded weight http=200 equal=True
2026/09/30 10:45:21 update.go:536: [INFO] [stacks] update sparkyfitness: accepted — guarded update started
2026/09/30 10:45:21 update.go:1365: [INFO] [stacks] update sparkyfitness: phase checking
2026/09/30 10:45:21 update.go:786: [INFO] [stacks] update sparkyfitness: ladder — the last step (1 of 1) — the catalog's current definition
2026/09/30 10:45:21 update.go:800: [INFO] [stacks] update sparkyfitness: this step CONVERTS sparkyfitness-db PostgreSQL 15 → 18 (the ladder entry's mark); database volume sparkyfitness_sparkyfitness_db_data
2026/09/30 10:45:21 update.go:816: [INFO] [stacks] update sparkyfitness: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T10:29:30Z) (found: none) — backing up first
2026/09/30 10:45:21 update.go:1365: [INFO] [stacks] update sparkyfitness: phase backing-up
2026/09/30 10:45:46 update.go:831: [INFO] [stacks] update sparkyfitness: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T10:45:22Z
2026/09/30 10:45:46 update.go:1365: [INFO] [stacks] update sparkyfitness: phase safety-dump
2026/09/30 10:45:47 update.go:846: [INFO] [stacks] update sparkyfitness: safety dump done (1 file(s)) [/mnt/sys_drive/felhom-data/backups/primary/sparkyfitness/db-dumps/pre-restore-20260930T104546Z-sparkyfitness-postgres.sql]
2026/09/30 10:45:48 undo.go:287: [INFO] [stacks] update sparkyfitness: the undo copy will hold 3 named volume(s), 67.7 MiB
2026/09/30 10:45:49 pgconvert.go:340: [INFO] [stacks] update sparkyfitness: conversion space — database volume sparkyfitness_sparkyfitness_db_data is 68 MB; the dump needs up to 85 MB + the 2 GB floor; 27.7 GB free beside the stack dir
2026/09/30 10:45:49 update.go:1365: [INFO] [stacks] update sparkyfitness: phase pinning
2026/09/30 10:45:49 pin.go:373: [INFO] [stacks] update sparkyfitness: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/sparkyfitness/docker-compose.yml (sparkyfitness-db=postgres:18-alpine, sparkyfitness-frontend=codewithcj/sparkyfitness:v0.17.3, sparkyfitness-server=codewithcj/sparkyfitness_server:v0.17.3)
2026/09/30 10:45:49 update.go:1365: [INFO] [stacks] update sparkyfitness: phase pulling
2026/09/30 10:45:50 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying
2026/09/30 10:45:51 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying
2026/09/30 10:45:51 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_backup → sparkyfitness_sparkyfitness_backup.pre-update-20260930T104551Z in 527ms
2026/09/30 10:45:51 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying
2026/09/30 10:45:52 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_db_data → sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z in 943ms
2026/09/30 10:45:52 update.go:1365: [INFO] [stacks] update sparkyfitness: phase copying
2026/09/30 10:45:53 undo.go:437: [INFO] [stacks] update sparkyfitness: copied sparkyfitness_sparkyfitness_uploads → sparkyfitness_sparkyfitness_uploads.pre-update-20260930T104551Z in 455ms
2026/09/30 10:45:53 update.go:1365: [INFO] [stacks] update sparkyfitness: phase converting
2026/09/30 10:45:53 pgconvert.go:423: [INFO] [stacks] update sparkyfitness: CONVERTING sparkyfitness-db PostgreSQL 15 → 18 (volume sparkyfitness_sparkyfitness_db_data, kept copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z)
2026/09/30 10:45:54 pgconvert.go:468: [INFO] [stacks] update sparkyfitness: pg_dumpall from 15 done in 661ms — 369 kB, completion line present; before: 2 database(s), 94 table(s), 261 row(s)
2026/09/30 10:45:55 update.go:1365: [INFO] [stacks] update sparkyfitness: phase converting
2026/09/30 10:45:55 pgconvert.go:484: [INFO] [stacks] update sparkyfitness: database volume sparkyfitness_sparkyfitness_db_data emptied (its copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z holds the old datadir, marker checked twice)
2026/09/30 10:46:02 pgconvert.go:513: [INFO] [stacks] update sparkyfitness: loaded into 18 in 3.406s (dropped the entrypoint's empty database(s) [sparkyfitness_db]; skipped CREATE ROLE for [sparky])
2026/09/30 10:46:02 pgconvert.go:529: [INFO] [stacks] update sparkyfitness: CONVERTED 15 → 18 in 9.793s — the check is equal (2 database(s), 94 table(s), 261 row(s)), PG_VERSION 18
2026/09/30 10:46:02 update.go:1365: [INFO] [stacks] update sparkyfitness: phase starting
2026/09/30 10:46:14 update.go:1365: [INFO] [stacks] update sparkyfitness: phase verifying
2026/09/30 10:46:19 update.go:997: [INFO] [stacks] update sparkyfitness: healthy after 5s (the app's health check passed)
2026/09/30 10:46:19 update.go:1015: [INFO] [stacks] update sparkyfitness: KEEPING the pre-conversion datadir copy sparkyfitness_sparkyfitness_db_data.pre-update-20260930T104551Z (PostgreSQL 15) until a backup of the converted app is proven
2026/09/30 10:46:19 update.go:1033: [INFO] [stacks] update sparkyfitness: DONE in 58s

RESULT final_phase=done PG_VERSION=18 seed_after=True verdict=proven
