Pause optional ai-rem update jobs during backup snapshots
This commit is contained in:
1 parent
be48ee85ef
commit
68c21db454
4 files changed
+39
-2
No files matched your search
@@ -24,6 +24,10 @@ lokale Docker-Image vor und prüft Initialisierung, Import und Bereinigung. Nach
|
|||||||
Backup mit Remote-Dateiprüfung aktiviert es den Monatstimer.
|
Backup mit Remote-Dateiprüfung aktiviert es den Monatstimer.
|
||||||
`--enable-ai-rem` nimmt auf Gemini `/srv/ai-rem` und `/etc/ai-rem` samt
|
`--enable-ai-rem` nimmt auf Gemini `/srv/ai-rem` und `/etc/ai-rem` samt
|
||||||
Dienststopps wieder auf; siehe [Update-Anleitung](UPDATE_ANLEITUNG.md).
|
Dienststopps wieder auf; siehe [Update-Anleitung](UPDATE_ANLEITUNG.md).
|
||||||
|
Ein installierter `ai-rem-managed-update.timer` und sein Dienst werden dabei
|
||||||
|
ebenfalls vor dem Snapshot angehalten und anschließend fortgesetzt. Die
|
||||||
|
[ai-rem-Betriebsautomatisierung](https://gitea.jr-it-services.de/johannes/ai-rem-maintenance)
|
||||||
|
nutzt zusätzlich die konfigurierte Backup-Sperre, um parallele Updates zu vermeiden.
|
||||||
[Speicherbereinigung und Fehlerbehebung](SPEICHER.md) beschreibt die automatische
|
[Speicherbereinigung und Fehlerbehebung](SPEICHER.md) beschreibt die automatische
|
||||||
Entfernung erkannter Arbeitsreste und die geschützte lokale Notfallaufbewahrung.
|
Entfernung erkannter Arbeitsreste und die geschützte lokale Notfallaufbewahrung.
|
||||||
Ohne Aktivierungsoption bleibt ein bisher deaktivierter Restore-Test deaktiviert.
|
Ohne Aktivierungsoption bleibt ein bisher deaktivierter Restore-Test deaktiviert.
|
||||||
|
|||||||
@@ -73,6 +73,22 @@ Marker, begrenzte Wiederholungen, Signalabbrüche und Mount-/Recovery-Schutz.
|
|||||||
Paketinstallation, ai-rem-Einbindung und Rollback bestanden ebenfalls. Das ersetzt
|
Paketinstallation, ai-rem-Einbindung und Rollback bestanden ebenfalls. Das ersetzt
|
||||||
nicht die noch ausstehende Installation und Speicher-/Backup-Abnahme auf Gemini.
|
nicht die noch ausstehende Installation und Speicher-/Backup-Abnahme auf Gemini.
|
||||||
|
|
||||||
|
## Ergänzung vom 18.10.2026: ai-rem-Updates beim Snapshot berücksichtigen
|
||||||
|
|
||||||
|
`--enable-ai-rem` berücksichtigt jetzt auch `ai-rem-managed-update.timer` und
|
||||||
|
`ai-rem-managed-update.service`, sofern diese auf dem Host installiert sind.
|
||||||
|
Beide werden vor den bisherigen ai-rem-Diensten gestoppt und nach dem
|
||||||
|
Anwendungsstart wieder aufgenommen. Alte Hosts ohne Update-Timer bleiben
|
||||||
|
unterstützt; wiederholte Installation erzeugt keine doppelten Stopps.
|
||||||
|
|
||||||
|
Die eigene [ai-rem-Betriebsautomatisierung](https://gitea.jr-it-services.de/johannes/ai-rem-maintenance)
|
||||||
|
richtet die täglichen Updates und einen persistenten Modell-Cache ein, verwendet
|
||||||
|
die konfigurierte `LOCKFILE` und ergänzt die Update-Units in der bestehenden
|
||||||
|
Backup-Konfiguration. Die app-backup-Ergänzung ist zusätzlich für spätere
|
||||||
|
Paketinstallationen notwendig, damit `--enable-ai-rem` die Stoppreihenfolge erhält.
|
||||||
|
Die erfolgreiche Produktionsinstallation des ai-rem-Updaters ist am 18.10.2026
|
||||||
|
noch nicht bestätigt; der zuletzt geprüfte Dienst läuft auf 1.3.0 ohne Update-Timer.
|
||||||
|
|
||||||
## Update vom 16.09.2026: Upload ohne Archiv-Rücklesen, ai-rem wieder aufnehmen
|
## Update vom 16.09.2026: Upload ohne Archiv-Rücklesen, ai-rem wieder aufnehmen
|
||||||
|
|
||||||
Der tägliche Lauf lädt Archive und Manifest über Crypt hoch und prüft anschließend
|
Der tägliche Lauf lädt Archive und Manifest über Crypt hoch und prüft anschließend
|
||||||
|
|||||||
@@ -821,7 +821,13 @@ else: raise SystemExit('Unexpected Docker command')
|
|||||||
f.write(f'EXTRA_PATHS=("{old_extra}")\n')
|
f.write(f'EXTRA_PATHS=("{old_extra}")\n')
|
||||||
package=self.build_package()
|
package=self.build_package()
|
||||||
self.env['TEST_METADATA_ONLY']='true'
|
self.env['TEST_METADATA_ONLY']='true'
|
||||||
for attempt in range(2):
|
for attempt in range(3):
|
||||||
|
if attempt == 1:
|
||||||
|
optional=['ai-rem-managed-update.timer','ai-rem-managed-update.service']
|
||||||
|
state=json.loads(self.state.read_text())
|
||||||
|
for unit in optional: state['services'][unit]='active'
|
||||||
|
self.state.write_text(json.dumps(state))
|
||||||
|
units=optional+units
|
||||||
self.events.write_text('')
|
self.events.write_text('')
|
||||||
result=subprocess.run(['bash',str(package),'--foreground','--enable-ai-rem'],
|
result=subprocess.run(['bash',str(package),'--foreground','--enable-ai-rem'],
|
||||||
env=self.env,capture_output=True,text=True,timeout=120)
|
env=self.env,capture_output=True,text=True,timeout=120)
|
||||||
@@ -834,6 +840,8 @@ else: raise SystemExit('Unexpected Docker command')
|
|||||||
self.assertEqual([(a['label'],a['source']) for a in extra],
|
self.assertEqual([(a['label'],a['source']) for a in extra],
|
||||||
[('extra-0',str(old_extra)),('extra-1','/srv/ai-rem'),('extra-2','/etc/ai-rem')])
|
[('extra-0',str(old_extra)),('extra-1','/srv/ai-rem'),('extra-2','/etc/ai-rem')])
|
||||||
events=self.events.read_text()
|
events=self.events.read_text()
|
||||||
|
if attempt == 0:
|
||||||
|
self.assertNotIn('systemctl stop ai-rem-managed-update.',events)
|
||||||
for unit in units:
|
for unit in units:
|
||||||
self.assertEqual(events.count('systemctl stop '+unit+' '),1)
|
self.assertEqual(events.count('systemctl stop '+unit+' '),1)
|
||||||
self.assertLess(events.index('systemctl stop '+unit+' '),events.index('mariadb-dump'))
|
self.assertLess(events.index('systemctl stop '+unit+' '),events.index('mariadb-dump'))
|
||||||
|
|||||||
@@ -225,13 +225,22 @@ if [[ $UP_WORKER == false ]]; then
|
|||||||
remaining=()
|
remaining=()
|
||||||
for unit in "${QUIESCE_SERVICES[@]}"; do
|
for unit in "${QUIESCE_SERVICES[@]}"; do
|
||||||
case ${unit%.service} in
|
case ${unit%.service} in
|
||||||
ai-rem|ai-rem-healthcheck|ai-rem-backup|ai-rem-prune|ai-rem-healthcheck.timer|ai-rem-backup.timer|ai-rem-prune.timer) ;;
|
ai-rem|ai-rem-healthcheck|ai-rem-backup|ai-rem-prune|ai-rem-managed-update|ai-rem-healthcheck.timer|ai-rem-backup.timer|ai-rem-prune.timer|ai-rem-managed-update.timer) ;;
|
||||||
*) remaining+=("$unit") ;;
|
*) remaining+=("$unit") ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
for unit in "${ai_rem_units[@]}"; do
|
for unit in "${ai_rem_units[@]}"; do
|
||||||
[[ $(systemctl show "$unit" --property=LoadState --value) == loaded ]] || die "Missing ai-rem unit: $unit"
|
[[ $(systemctl show "$unit" --property=LoadState --value) == loaded ]] || die "Missing ai-rem unit: $unit"
|
||||||
done
|
done
|
||||||
|
# Older hosts have no managed updater yet. When installed, stop its timer
|
||||||
|
# and job before taking the database snapshot; resume them after ai-rem.
|
||||||
|
optional_ai_rem_units=()
|
||||||
|
for unit in ai-rem-managed-update.timer ai-rem-managed-update.service; do
|
||||||
|
if [[ $(systemctl show "$unit" --property=LoadState --value) == loaded ]]; then
|
||||||
|
optional_ai_rem_units+=("$unit")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
ai_rem_units=("${optional_ai_rem_units[@]}" "${ai_rem_units[@]}")
|
||||||
QUIESCE_SERVICES=("${ai_rem_units[@]}" "${remaining[@]}")
|
QUIESCE_SERVICES=("${ai_rem_units[@]}" "${remaining[@]}")
|
||||||
echo 'ai-rem included: /srv/ai-rem and /etc/ai-rem; container and maintenance jobs stopped during snapshot'
|
echo 'ai-rem included: /srv/ai-rem and /etc/ai-rem; container and maintenance jobs stopped during snapshot'
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in new issue
Block a user