Prepare glob-scoped callers and prove offsite ledger recovery
Some checks failed
Transactional mail acceptance / mail (push) Failing after 32s
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Container Image / build-and-push (push) Successful in 57s

Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a11fd9-caf6-7a63-b578-9daaaa134ff2
This commit is contained in:
tegwick 2026-10-09 11:43:11 +02:00
parent 6fb206b359
commit 93b6ba2aae
21 changed files with 1080 additions and 19 deletions

View file

@ -0,0 +1,18 @@
[Unit]
Description=Notify platform-root of email-connect ledger failure in %i
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
UMask=0077
StateDirectory=email-connect-backup
StateDirectoryMode=0700
ExecStart=/usr/bin/python3 /opt/email-connect-backup/notify-ledger-failure.py --unit %i
TimeoutStartSec=2min
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/lib/email-connect-backup
ProtectHome=true

View file

@ -2,6 +2,7 @@
Description=Coherent encrypted email-connect transactional ledger backup
After=network-online.target k3s.service
Wants=network-online.target
OnFailure=email-connect-ledger-alert@%n.service
[Service]
Type=oneshot

View file

@ -1,10 +1,16 @@
[Unit]
Description=Check email-connect ledger archive age and local ciphertext hash
OnFailure=email-connect-ledger-alert@%n.service
[Service]
Type=oneshot
User=root
ExecStart=/usr/bin/python3 /opt/email-connect-backup/backup-ledger.py freshness
ExecStartPost=-/usr/bin/python3 /opt/email-connect-backup/notify-ledger-failure.py
StateDirectory=email-connect-backup
StateDirectoryMode=0700
UMask=0077
ReadWritePaths=/var/lib/email-connect-backup
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true

View file

@ -0,0 +1,29 @@
{
"schema": "email-connect.ledger-runtime-bundle.v1",
"files": {
"email-connect-ledger-freshness.service": "a9ce8d1e92fadcda8bb125bf952c42f338514545b6a980cfd8be0dd95bc5eb06",
"backup-primary.lock": "7142d3690855a6fcfdd2dac02113e7a76b6731988d52b4b013a50d97570f2aaa",
"email-connect-ledger-backup.service": "e2f41257ac7df0aac6250822a794289946f4282e68ee61d751c2c84a1caeb1e5",
"notify-ledger-failure.py": "d5bc735963896b2e909660e678b8ed1b220ec8f1038014399c5b995a577c90b6",
"primary_application_archive.py": "a3f0a61e869a6012edb4b5288be14e3b0c4a9a1273b090320ab146d12e5aa94d",
"rehearse-ledger.py": "3ee32b035b6c6c2f7c994346d1db04622daeb9260b8ed723bc89661f3632eaba",
"backup-ledger.py": "8a89aa01c0c22e46352f1ad7a6f30b9b5db792639c1acc9a60579f50b7c8c369",
"capture-ledger.py": "df09d972be74db89a80f4899ef782f5412e655dfa12317a07cc7f35e9b1063da",
"email-connect-ledger-alert@.service": "4ee43ffab27478556c75153e89668a3bb36e6c56d6dd3b52d0db8d8603b9263c",
"email-connect-ledger-backup.timer": "ffb64bf39763c5e3d52cea5a13aa3fdffe243c3ff5a81555eb47048746527782",
"ledger_archive.py": "92d9d5e1908c7d433eb3f4ada6460f7d9b639017a4c2311cb7ffaacd262f33c3",
"email-connect-ledger-freshness.timer": "9103655972b13c25dcbb6a8d53f3076fe8b9b7eb04a91e85c1cd1a875bf3310f"
},
"receiver_image": "eb3e7b68d21209e9eb71b928a5b0bc987e8e3164f21dca4ff712f946d0c103f2",
"timers_enabled": false,
"failure_recipient": "platform-root",
"notification_delivery_verified": true,
"runtime_installed": true,
"sdk_hash_locked": true,
"hardened_preflight_verified": true,
"notification_message_id": "adcebf95-26c4-4adb-99b0-4446c8505a42",
"failure_hook_test_verified": true,
"freshness_verified": true,
"human_acknowledged": false,
"units_installed": true
}