Files
root f5175f1ce0 Sync docs, audit artifacts, project notes, and VerdictTank proposal docs
- audit/phase-one + phase-two: security audit briefs, findings, credential-rotation plan, Docker-USER hardening scripts, rollback refs
- disaster-recovery/restore-test-log.md + backup-dr-audit-2026-08-10.md
- clients/ (modelortho SEO audit, ai-biz-dev competitive landscape), notes/ (tiktok strategy)
- projects/: front-desk-voice-agent, seo-visibility-checker product plan, hotnow-savannah HTML, resend-transactional-email, backup-dashboard-enhancements, code-review-graph, seo-ci-architecture
- proposals/verdicttank/: architecture v4.0, methodology, judge-pool review, consolidation reasoning, cross-check review
- docs/super-search/firecrawl-provider-strategy.md
- updates: CHANGELOG, model-chain, projects-master-readme, intelsight.io
- .gitignore: exclude nested standalone repos (seo-tool, venturebuilt)
2026-08-26 02:27:28 -04:00

5.3 KiB

Restore Test — 2026-08-10

Tester: Hermes (automated)
Purpose: First-ever ITPP restore test. Prove backups are restorable.
Environment: Core (152.53.192.33), restoring to /tmp/ only — zero production impact.


Test 1: Gitea (app2)

  • Backup source: s3://hermes-vps-backups/gitea/daily/20260810-120021/
  • Backup contents: SQLite DB (gitea.db) + app.ini + 30 bare git repos
  • Backup DB size: 2.6 MB (2,723,840 bytes)
  • Download duration: ~3s (DB + config), ~16s (3 sample repos)
  • Restored to: /tmp/restore-test-gitea/

Verification — Database

Metric Value
Total tables 117
Users 1 (ippadmin, info@itpropartner.com, admin)
Repositories 52
Issues 0
Pull requests 0
Actions 461
Webhooks 0
Releases 0

Sample repository rows:

id=52  lower_name=itpp-docs        updated=1786333787  is_empty=0
id=8   lower_name=osint-tool       updated=1786333633  is_empty=0
id=27  lower_name=launchcheck      updated=1786333633  is_empty=0

Verification — Git Repos (3 of 30 sampled)

Repository Commits Latest commit
itpp-infrastructure.git 29 5f48e02 docs: promote claude-sonnet-5 to primary
hermes-skills.git 3 2f9b99b chore: sync skill updates and references
disaster-recovery.git 5 3bc6d08 Fix: app1-bu CPX11 → CPX21 spec

All three repos validated with git log --oneline and git rev-list --count HEAD.

Issue Found & Workaround

Issue: Gitea bare repos stored in S3 are missing the refs/ directory (all refs are in packed-refs). Git refuses to recognize the repository without refs/ existing.

Workaround: mkdir -p refs/heads refs/tags in each repo directory before git operations. This is a restore procedure note — any real disaster recovery of Gitea repos from S3 must include this step.

Verdict

PASS — Database integrity confirmed, all 117 tables present, 52 repos accounted for, 3/3 sampled repos verified with valid git history. One procedural note about refs/ directory documented.

  • Total duration: ~30s
  • Backup age at test time: ~9 hours (backup at 12:00 UTC, test at ~21:15 ET)

Test 2: Vaultwarden (app1)

  • Backup source: s3://hermes-vps-backups/app1/vaultwarden/vaultwarden-backup-2026-08-10_0230.tar.gz
  • Backup contents: Compressed tar.gz containing SQLite DB + WAL + RSA key + icon cache + docker-compose.yml
  • Backup size: 730.4 KB compressed
  • Download duration: ~1s
  • Restored to: /tmp/restore-test-vaultwarden/

Verification — Database

Metric Main DB Backup DB Match?
Total tables 29 29
Users 1 (g@germainebrown.com, enabled) 1
Ciphers (passwords) 123 123
Organizations 0 0
Collections 0 0
Folders 4
Devices 9
Attachments 0
Sends 0

Cipher type distribution: 121 logins (type 1), 2 secure notes (type 2)

RSA key: Present and valid (1,675 bytes, -----BEGIN RSA PRIVATE KEY-----)

Verification — Files

File Size Status
data/db.sqlite3 388 KB Valid SQLite
data/db-backup.sqlite3 400 KB Valid SQLite
data/db.sqlite3-wal 3.9 MB WAL present
data/db.sqlite3-shm 32 KB SHM present
data/rsa_key.pem 1,675 B Valid PEM key
docker-compose.yml Present

Issue Found

WAL file present: The backup includes active WAL (Write-Ahead Log) files, confirming the backup was taken while Vaultwarden was running. Since all three files (db.sqlite3, -wal, -shm) are present and consistent, SQLite's WAL recovery is automatic and the database opens cleanly. This is expected and correct for a live backup — no action needed.

Verdict

PASS — Main and backup databases are identical and consistent. All 29 tables present, 123 ciphers intact, 1 user verified, RSA key valid, and WAL recovery clean. The backup is fully restorable.

  • Total duration: ~2s (download + extract + verify)
  • Backup age at test time: ~19 hours (backup at 02:30 UTC, test at ~21:15 ET)

Summary

Test Service Verdict Notes
1 Gitea (app2) PASS DB + repos verified; refs/ workaround documented
2 Vaultwarden (app1) PASS DB consistent across main+backup; RSA key valid; WAL clean

Overall Assessment

Both backups are restorable. This is the first successful restore test in ITPP history.

Recommendations

  1. Automate restore testing — Run a scripted restore test weekly (e.g., every Monday morning). Rotate through different services.
  2. Expand coverage — Test remaining backup targets in subsequent runs: LiteLLM, OpenWebUI, Hudu, Traccar, etc.
  3. Document Gitea refs/ workaround — Add the mkdir -p refs/heads refs/tags step to the Gitea disaster recovery procedure.
  4. Investigate core/vaultwarden — Backups under core/vaultwarden/ stopped on 2026-07-28 and are only 33 KB — likely stale/misconfigured. The active Vaultwarden instance is on app1.
  5. Full-scale DR drill — After individual restore tests pass for all services, schedule a coordinated full-stack restore to the standby server.