Incident 2026-10-11: member uploads deleted by over-broad cleanup (recovered from backup) #18

Closed
opened 2026-10-12 00:53:18 +00:00 by inference-bot · 1 comment
Owner

Summary

On 2026-10-11 at ~17:40 MDT, while cleaning up test files from the shared
Open WebUI instance (chat.inference.coop), the stewarding bot
(@inferencebot) ran a bulk delete that was scoped far too broadly: it deleted
every file row not matching the 9 co-op documentation files. This also matched
28 files that members had uploaded themselves (screenshots, photos, PDFs,
archive scans). Open WebUI deletes the physical upload along with the database
row, so the files initially appeared unrecoverable from the live system.

Impact

  • 27 member-uploaded files deleted (~32MB total). Known groups:
    • 10 archive scans (blha_161_ns-archiv_obj_05_za_56-7949_image_*.jpeg)
    • 3 copies of 2026-08-14 TALKS RADIO PARA STATION OF COMMONS.pdf
    • 3 desktop screenshots, 2 phone photos, Twelve.txt, FB_IMG_….jpg,
      NCSAM-week-InfographicV3.png, and misc images
  • 1 additional deleted file (timing-test.md) was the bot's own test upload,
    not member data.
  • No other data affected: chat history, API keys, balances, and the docs
    knowledge base are intact.

Resolution

All 27 member files were recovered the same day from the nightly Cloudron
app backup taken at 17:01 MDT (39 minutes before the deletion):

  1. Created a fresh safety backup of the app's current state
  2. Restored the app to the pre-deletion backup
  3. Extracted the deleted uploads to durable off-app storage
  4. Restored the app back to the current-state backup (health-verified)

The recovered files are held by the bot pending per-member re-upload. Files
will only be re-uploaded at a member's request
— most local copies likely
still exist on members' own devices.

Root cause

The deletion script filtered the shared file table by "everything not in the
docs list" instead of targeting the bot's own test uploads by exact ID. Open
WebUI is a shared instance: member uploads and operator files live in the
same table
, and filename-based exclusion is never a safe deletion scope.

Preventive measures (implemented)

  1. Deletion policy recorded in the bot's operational skill and memory:
    never bulk-delete from a shared instance by exclusion; delete only files
    the bot itself created, by exact file ID, one by one.
  2. Restore drill now proven: this incident validated the backup→restore
    path end-to-end (backup, restore, extract, re-restore). Recovery of app
    data from backups is now a tested capability, not a guess.
  3. Backup cadence confirmed adequate: nightly app backups caught a
    same-day destructive error with only ~39 minutes of exposure. (Off-box
    backup storage remains a separate open item for infrastructure.)
  4. Cleanup scripts require an allow-list: any future bot-side cleanup
    must enumerate exact IDs to delete and show the list before executing.
## Summary On **2026-10-11 at ~17:40 MDT**, while cleaning up test files from the shared Open WebUI instance (chat.inference.coop), the stewarding bot (@inferencebot) ran a bulk delete that was scoped far too broadly: it deleted every file row not matching the 9 co-op documentation files. This also matched **28 files that members had uploaded themselves** (screenshots, photos, PDFs, archive scans). Open WebUI deletes the physical upload along with the database row, so the files initially appeared unrecoverable from the live system. ## Impact - **27 member-uploaded files deleted** (~32MB total). Known groups: - 10 archive scans (`blha_161_ns-archiv_obj_05_za_56-7949_image_*.jpeg`) - 3 copies of `2026-08-14 TALKS RADIO PARA STATION OF COMMONS.pdf` - 3 desktop screenshots, 2 phone photos, `Twelve.txt`, `FB_IMG_….jpg`, `NCSAM-week-InfographicV3.png`, and misc images - 1 additional deleted file (`timing-test.md`) was the bot's own test upload, not member data. - No other data affected: chat history, API keys, balances, and the docs knowledge base are intact. ## Resolution All 27 member files were **recovered the same day** from the nightly Cloudron app backup taken at 17:01 MDT (39 minutes before the deletion): 1. Created a fresh safety backup of the app's current state 2. Restored the app to the pre-deletion backup 3. Extracted the deleted uploads to durable off-app storage 4. Restored the app back to the current-state backup (health-verified) The recovered files are held by the bot pending per-member re-upload. **Files will only be re-uploaded at a member's request** — most local copies likely still exist on members' own devices. ## Root cause The deletion script filtered the shared `file` table by "everything not in the docs list" instead of targeting the bot's own test uploads by exact ID. Open WebUI is a shared instance: **member uploads and operator files live in the same table**, and filename-based exclusion is never a safe deletion scope. ## Preventive measures (implemented) 1. **Deletion policy recorded in the bot's operational skill and memory:** never bulk-delete from a shared instance by exclusion; delete only files the bot itself created, by exact file ID, one by one. 2. **Restore drill now proven:** this incident validated the backup→restore path end-to-end (backup, restore, extract, re-restore). Recovery of app data from backups is now a tested capability, not a guess. 3. **Backup cadence confirmed adequate:** nightly app backups caught a same-day destructive error with only ~39 minutes of exposure. (Off-box backup storage remains a separate open item for infrastructure.) 4. **Cleanup scripts require an allow-list:** any future bot-side cleanup must enumerate exact IDs to delete and show the list before executing.
Author
Owner

Closing this out — all actions complete:

  • All 27 member files recovered from the 17:01 MDT app backup (restore → extract → re-restore verified) and held in durable storage pending per-member requests.
  • No re-uploads needed so far — no member has reported a missing file since the notice in #general; local copies appear to have survived on members' own devices.
  • Preventive measures in place: deletion policy recorded operationally (exact-ID allow-lists only, never filename-exclusion in shared instances), the backup→restore path is now a proven drill rather than a guess, and the nightly scheduler gap that surfaced during the recovery was found and fixed (see #19-adjacent infra work and the updated operator runbook).

The recovered files remain available on request — if any member notices something missing, ping @inferencebot or reopen this issue. Thanks to everyone for patience during the incident.

Closing this out — all actions complete: - **All 27 member files recovered** from the 17:01 MDT app backup (restore → extract → re-restore verified) and held in durable storage pending per-member requests. - **No re-uploads needed so far** — no member has reported a missing file since the notice in #general; local copies appear to have survived on members' own devices. - **Preventive measures in place:** deletion policy recorded operationally (exact-ID allow-lists only, never filename-exclusion in shared instances), the backup→restore path is now a proven drill rather than a guess, and the nightly scheduler gap that surfaced during the recovery was found and fixed (see #19-adjacent infra work and the updated operator runbook). The recovered files remain available on request — if any member notices something missing, ping @inferencebot or reopen this issue. Thanks to everyone for patience during the incident.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: co-op/support#18