Files
felhom.eu/documentation/audits/update-night-2026-09-21/apps/nextcloud-engine-mariadb/log.txt
T
admin 9c69b3ff07
gates / gates (push) Successful in 27s
Update night: Phases 2-4 evidence — both engines, the unattended HOLD, and five new findings
Evidence off the machine at the end of the phases that produced it (R-320). Teardown follows.

PHASE 2 — the two database engines, through the REAL Update button:
- MariaDB 11.6 -> 12.3 on nextcloud: PROVEN, and pressed through the button for the first time.
  All four SPIKE-r459 observables: the datadir's own record moved 11.6.2 -> 12.3.3; the engine
  itself says "already upgraded ... no need to run mariadb-upgrade again"; the entrypoint says
  "Major version upgrade detected ... Check required!" and then STARTED and FINISHED it (not the
  `skipped due to $MARIADB_AUTO_UPGRADE` line R-459 feared); and the engine took its own
  pre-upgrade backup, 631 905 B. The seeded Nextcloud account read back.
- PostgreSQL 16 -> 17 on docmost: FAILED exactly as R-463 predicted and nobody had measured.
  5.1 s to held; the pin named 17 while nothing ran; the restore brought it back in 29.1 s.
  The engine's REFUSAL LINE was destroyed by failAndHold before any probe could read it, so it
  was REPRODUCED INDEPENDENTLY with a control on every step (R-320).

PHASE 3 — the bad days. B1 produced THE UNATTENDED HOLD, which this project has never had: the
caller pressed once with nobody watching, the app held after 312.9 s, and passes 2 and 3 pressed
nothing. B2 put the pin back on a pull failure in 1.0 s. B3 refused `busy` six times. B4 showed
there is NO single-flight — 5 of 5 updates ran at once and all ended honest. B5 cut the power in
`backing-up` and the box recovered itself and said so. B7 refused under the 2 GB floor. B9 found
R-458's risk narrower than the row states.

PHASE 4 — every badge on the box is TRUE, and the held app answers all four of Q4's questions.

FINDINGS, five new and three corrections to existing rows. The one that matters: R-618 is P1 —
two templates name a health probe the app does not answer, and because the guarded update waits
on that same probe, a SUCCESSFUL update ends by STOPPING a working app. Measured: tandoor served
HTTP 200 on the new version at four samples across five minutes and was then stopped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-09-21 22:13:57 +02:00

33 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
21:37:10 ==== ENGINE EDGE nextcloud: mariadb:11.6 -> mariadb:12.3 (app image does NOT move)
21:37:12 [1] made the drive paths this app requires: ['/mnt/felhom-drives/scratch_hdd/userdata/nextcloud']
21:37:12 [1] required fields filled beyond DOMAIN/SUBDOMAIN: ['NEXTCLOUD_ADMIN_PASSWORD', 'HDD_PATH']
21:37:12 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
21:38:07 [1] deployed, controller state=running, pinned={'nextcloud': 'nextcloud:34.0.1-apache', 'nextcloud-db': 'mariadb:11.6', 'nextcloud-redis': 'redis:7-alpine'}
21:38:07 [2] seeding through the app's own route
21:38:11 nextcloud: occ user:add :: The account "drillb9a9d0" was created successfully Display name set to "drillb9a9d0"
21:38:14 nextcloud: seeded user drillb9a9d0
21:38:14 [3] control C1 — reading the seed back BEFORE the engine moves
21:38:19 nextcloud: readback of the seeded user found=True
21:38:22 [3b] engine observables BEFORE written to engine-before.txt
21:38:22 [4] „Mentés most" -> 200 {'ok': True, 'message': 'Mentés elindítva'}
21:39:47 [4] backup idle; last=None
21:39:48 [5] drill commit 29e99da5478c: nextcloud mariadb:11.6 -> mariadb:12.3 (push rc=0)
21:40:17 [sync] the badge needed 29.0s and 5 sync+rescan rounds to catch up to mariadb:12.3 — R-607's window, measured
21:40:17 [5] badge HU: [{'title': 'Újabb változat érhető el ehhez az alkalmazáshoz. A frissítés indításához nyomd meg a Frissítés gombot.', 'text': 'Frissítés elérhető — ma'}]
21:40:17 [5] badge EN: [{'title': 'A newer version of this app is available. Select the Update button to start it.', 'text': 'Update available — today'}]
21:40:17 [6] Update -> 202 {'ok': True, 'data': {'accepted': True, 'completed': False}, 'message': 'Frissítés elindult – az állapot a kártyán követhető'}
21:40:17 + 0.0s phase=safety-dump label=Adatbázis pillanatkép… err=None hold=None
21:40:18 + 1.0s phase=pulling label=Új verzió letöltése… err=None hold=None
21:40:20 + 3.1s phase=starting label=Indítás az új verzióval… err=None hold=None
21:40:36 + 18.5s phase=verifying label=Működés ellenőrzése… err=None hold=None
21:40:37 + 19.5s phase=done label=Frissítve err=None hold=None
21:40:39 [6b] engine observables AFTER written to engine-after.txt
21:40:40 [6c] hold sentences HU: ['Nextcloud — Felhom.eu document.documentElement.className=document.documentElement.className.replace(\'no-js\',\'js\'); function csrfHeaders(){var el=document.querySelector(\'meta[name="csrf-token"]\');return el?{\'X-CSRF-Token\':el.content}:{};} function felhomConfirm(el,question,onYes){ if(!el||el.dataset.fcOpen)return; el.dataset.fcOpen=\'1\'; var wrap=document.createElement(\'span\');wrap.className=\'inline-confirm\'; var q=document.createElement(\'span\');q.className=\'inline-confirm-q\';q.textContent=question; var yes=document.createElement(\'button\');yes.type=\'button\';yes.className=\'btn btn-xs btn-danger\';yes.textContent=\'Igen\'; var no=document.createElement(\'button\');no.type=\'button\';no.className=\'btn btn-xs btn-outline\';no.textContent=\'Mégse\'; wrap.appendChild(q);wrap.appendChild(yes);wrap.appendChild(no); el.style.display=\'none\';el.parentNode.insertBefore(wrap,el.nextSibling); function close(){wrap.remove();el.style.display=\'\';delete el.dataset.fcOpen;} no.addEventListener(\'click\',close); yes.addEventListener(\'click\',function(){close();onYes();}); } document.addEventListener(\'click\',function(e){ var btn=e.target.closest?e.target.closest(\'[data-confirm]\'):null; if(!btn)return; e.preventDefault(); felhomConfirm(btn,btn.getAttribute(\'data-confirm\'),function(){ var form=btn.closest(\'form\'); if(form){if(form.requestSubmit)form.requestSubmit(btn);else form.submit();} }); }); document.addEventListener(\'click\',function(e){ var btn=e.target.closest?e.target.closest(\'.nav-group-toggle\'):null; if(!btn)return; var group=btn.closest(\'.nav-group\'); if(!group)return; var willOpen=!group.classList.contains(\'is-open\'); document.querySelectorAll(\'.nav-group.is-open\').forEach(function(g){ g.classList.remove(\'is-open\'); var t=g.querySelector(\'.nav-group-toggle\'); if(t)t.setAttribute(\'aria-expanded\',\'false\'); }); if(willOpen){group.classList.add(\'is-open\');btn.setAttribute(\'aria-expanded\',\'true\');} }); function showAlert(msg){var o=document.createElement(\'div\');o.className=\'modal-overlay\';o.id=\'alert-modal\';o.addEventListener(\'click\',function(e){if(e.target===o)o.remove();});var c=document.createElement(\'div\');c.className=\'modal-card\';c.innerHTML=\' Üzenet \'+msg.replace(/&/g,\'&amp;\').replace(/ /g,\'&gt;\')+\' OK \';o.appendChild(c);document.body.appendChild(o);} Indítópult Vezérlőpult Alkalmazások Tárhely Meghajtók Hálózati tárhely Biztonsági mentés Áttekintés Távoli mentés Alkalmazások Visszaállítás Megosztás Hálózati megosztás Rendszermonitor Debug Beállítások Rendszer Értesítések Biztonság és hozzáférés 0.261.0 Magyar English Kijelentkezés ↗ Hub kapcsolat kikapcsolva — a központi monitoring nem aktív Rendszermonitor → ← Alkalmazások Nextcloud Fut Naprakész Megnyitás ↗ Napló Exportálás Beállítások Hiányzó tárhely: nextcloud Ennek az alkalmazásnak az adattárolója jelenleg nem elérhető, ezért le van állítva.', "Válassz céltárhelyet… SCRATCH HDD (/mnt/felhom-drives/scratch_hdd) Áthelyezés function appMigFmtGB(b){ return (Number(b||0)/1e9).toFixed(1)+' GB'; } function appMigRender(job){ var names={stop:'Leállítás',copy:'Adatok másolása',verify:'Ellenőrzés',flip:'Újratelepítés',redeploy:'Újratelepítés',cleanup:'Régi adatok törlése'}; var s=names[job.phase]||job.phase; if(job.phase==='copy'&&job.bytes_total>0){ s+=' ('+Math.floor(100*job.bytes_done/job.bytes_total)+'% — '+appMigFmtGB(job.bytes_done)+'/'+appMigFmtGB(job.bytes_total)+')'; } return s+'…'; } function appMigWatch(){ var panel=document.getElementById('app-migrate-progress'); if(panel) panel.style.display='block'; function tick(){ fetch('/api/storage/migrate/status').then(function(r){return r.json();}).then(function(d){ var job=d.data&&d.data.job; if(!job){ if(panel) panel.textContent='Nincs folyamatban áthelyezés.'; return; } if(panel) panel.innerHTML=appMigRender(job); if(job.phase==='done'){ if(panel) panel.innerHTML+=' Kész '; setTimeout(function(){location.reload();},1500); return; } if(job.phase==='aborted'){ if(panel) panel.innerHTML+=' Megszakadt: '+(job.error||'')+' A régi adatok érintetlenek.'; return; } setTimeout(tick,1500); }).catch(function(){ setTimeout(tick,2000); }); } tick(); } function appMigrate(btn,app,label){ var sel=document.getElementById('app-migrate-target'); var target=sel?sel.value:''; if(!target){ showAlert('Válassz céltárhelyet.'); return; } felhomConfirm(btn,'Áthelyezed a(z) '+label+' adatait ide: '+target+'?", "A régi adatok csak sikeres áthelyezés után törlődnek.',function(){ fetch('/api/storage/migrate-app',{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({app:app,target:target})}) .then(function(r){return r.json();}).then(function(d){ if(d.ok){ appMigWatch(); } else { showAlert('Hiba: '+(d.error||'ismeretlen')); } }) .catch(function(e){ showAlert('Hiba: '+e); }); }); } (function(){ fetch('/api/storage/migrate/status').then(function(r){return r.json();}).then(function(d){ if(d.data&&d.data.job){ appMigWatch(); } }).catch(function(){}); })(); Mire használható?"]
21:40:40 [6c] hold sentences EN: ['Nextcloud — Felhom.eu document.documentElement.className=document.documentElement.className.replace(\'no-js\',\'js\'); function csrfHeaders(){var el=document.querySelector(\'meta[name="csrf-token"]\');return el?{\'X-CSRF-Token\':el.content}:{};} function felhomConfirm(el,question,onYes){ if(!el||el.dataset.fcOpen)return; el.dataset.fcOpen=\'1\'; var wrap=document.createElement(\'span\');wrap.className=\'inline-confirm\'; var q=document.createElement(\'span\');q.className=\'inline-confirm-q\';q.textContent=question; var yes=document.createElement(\'button\');yes.type=\'button\';yes.className=\'btn btn-xs btn-danger\';yes.textContent=\'Yes\'; var no=document.createElement(\'button\');no.type=\'button\';no.className=\'btn btn-xs btn-outline\';no.textContent=\'Cancel\'; wrap.appendChild(q);wrap.appendChild(yes);wrap.appendChild(no); el.style.display=\'none\';el.parentNode.insertBefore(wrap,el.nextSibling); function close(){wrap.remove();el.style.display=\'\';delete el.dataset.fcOpen;} no.addEventListener(\'click\',close); yes.addEventListener(\'click\',function(){close();onYes();}); } document.addEventListener(\'click\',function(e){ var btn=e.target.closest?e.target.closest(\'[data-confirm]\'):null; if(!btn)return; e.preventDefault(); felhomConfirm(btn,btn.getAttribute(\'data-confirm\'),function(){ var form=btn.closest(\'form\'); if(form){if(form.requestSubmit)form.requestSubmit(btn);else form.submit();} }); }); document.addEventListener(\'click\',function(e){ var btn=e.target.closest?e.target.closest(\'.nav-group-toggle\'):null; if(!btn)return; var group=btn.closest(\'.nav-group\'); if(!group)return; var willOpen=!group.classList.contains(\'is-open\'); document.querySelectorAll(\'.nav-group.is-open\').forEach(function(g){ g.classList.remove(\'is-open\'); var t=g.querySelector(\'.nav-group-toggle\'); if(t)t.setAttribute(\'aria-expanded\',\'false\'); }); if(willOpen){group.classList.add(\'is-open\');btn.setAttribute(\'aria-expanded\',\'true\');} }); function showAlert(msg){var o=document.createElement(\'div\');o.className=\'modal-overlay\';o.id=\'alert-modal\';o.addEventListener(\'click\',function(e){if(e.target===o)o.remove();});var c=document.createElement(\'div\');c.className=\'modal-card\';c.innerHTML=\' Message \'+msg.replace(/&/g,\'&amp;\').replace(/ /g,\'&gt;\')+\' OK \';o.appendChild(c);document.body.appendChild(o);} Launcher Dashboard Apps Storage Drives Network storage Backup Overview Remote backup Apps Restore Sharing Network sharing System monitor Debug Settings System Notifications Security and access 0.261.0 Magyar English Sign out ↗ The hub connection is off — central monitoring is not running System monitor → ← Apps Nextcloud Running Up to date Open ↗ Log Export Settings Missing storage: nextcloud This app’s data storage is not available right now, so the app is stopped.', "Choose a target storage… SCRATCH HDD (/mnt/felhom-drives/scratch_hdd) Move function appMigFmtGB(b){ return (Number(b||0)/1e9).toFixed(1)+' GB'; } function appMigRender(job){ var names={stop:'Stopping',copy:'Copying data',verify:'Checking',flip:'Reinstalling',redeploy:'Reinstalling',cleanup:'Deleting old data'}; var s=names[job.phase]||job.phase; if(job.phase==='copy'&&job.bytes_total>0){ s+=' ('+Math.floor(100*job.bytes_done/job.bytes_total)+'% — '+appMigFmtGB(job.bytes_done)+'/'+appMigFmtGB(job.bytes_total)+')'; } return s+'…'; } function appMigWatch(){ var panel=document.getElementById('app-migrate-progress'); if(panel) panel.style.display='block'; function tick(){ fetch('/api/storage/migrate/status').then(function(r){return r.json();}).then(function(d){ var job=d.data&&d.data.job; if(!job){ if(panel) panel.textContent='No move in progress.'; return; } if(panel) panel.innerHTML=appMigRender(job); if(job.phase==='done'){ if(panel) panel.innerHTML+=' Done '; setTimeout(function(){location.reload();},1500); return; } if(job.phase==='aborted'){ if(panel) panel.innerHTML+=' Stopped: '+(job.error||'')+' The old data is untouched.'; return; } setTimeout(tick,1500); }).catch(function(){ setTimeout(tick,2000); }); } tick(); } function appMigrate(btn,app,label){ var sel=document.getElementById('app-migrate-target'); var target=sel?sel.value:''; if(!target){ showAlert('Choose a target storage.'); return; } felhomConfirm(btn,'Move the '+label+' data to: '+target+'?", "The old data is deleted only after a successful move.',function(){ fetch('/api/storage/migrate-app',{method:'POST',headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({app:app,target:target})}) .then(function(r){return r.json();}).then(function(d){ if(d.ok){ appMigWatch(); } else { showAlert('Error: '+(d.error||'unknown')); } }) .catch(function(e){ showAlert('Error: '+e); }); }); } (function(){ fetch('/api/storage/migrate/status').then(function(r){return r.json();}).then(function(d){ if(d.data&&d.data.job){ appMigWatch(); } }).catch(function(){}); })(); What is it for?"]
21:40:40 [7] reading the seed back AFTER the engine moved
21:40:45 nextcloud: readback of the seeded user found=True
21:40:47 [8] pinned = {'nextcloud': 'nextcloud:34.0.1-apache', 'nextcloud-db': 'mariadb:12.3', 'nextcloud-redis': 'redis:7-alpine'}
21:40:47 [8] installed = {'nextcloud': 'nextcloud:34.0.1-apache', 'nextcloud-db': 'mariadb:12.3', 'nextcloud-redis': 'redis:7-alpine'}
21:40:47 [8] compose = ['image: nextcloud:34.0.1-apache', 'image: mariadb:12.3', 'image: redis:7-alpine']
21:40:47 [8] inspect = ['nextcloud-db mariadb:12.3 running=true restarts=0', 'nextcloud nextcloud:34.0.1-apache running=true restarts=0', 'nextcloud-redis redis:7-alpine running=true restarts=0']