echo6-docs/docs/matrix/synapse_retention_discovery.md
echo6-autocommit e5da5f023d auto: docs sync 2026-06-15T21:21:42+00:00
Files changed: .obsidian/appearance.json .obsidian/graph.json .obsidian/plugins/obsidian-livesync/data.json .obsidian/workspace.json INDEX.md archive/matrix/PHASE6_DECISION.md archive/matrix/PLAN.md archive/matrix/appservices.md archive/matrix/archive_receiver_discovery.md archive/matrix/archivist_discovery.md archive/matrix/hookshot_deployment_discovery.md archive/matrix/hookshot_e2ee_discovery.md archive/matrix/hookshot_payload_discovery.md archive/matrix/hookshot_room_targeting_discovery.md docs/matrix/archivist.md docs/matrix/matrix_host.md docs/matrix/mautrix_signal.md docs/matrix/synapse.md docs/matrix/synapse_homeserver.yaml.sanitized docs/matrix/synapse_retention_discovery.md docs/services/services.md notes/echo6-landing-page-data-export.md notes/ia-download-queue.md projects/argus.md
2026-06-15 21:21:42 +00:00

5.3 KiB
Raw Blame History

Synapse Retention Discovery

Generated: 2026-04-09 (Phase 6.0, Question 1)

Current homeserver.yaml Values

APPLIED 2026-04-12 (Archivist Phase 2)

Two settings added to homeserver.yaml:

 report_stats: false

+redaction_retention_period: null
+
 trusted_key_servers:
   - server_name: "matrix.org"
 experimental_features:
   msc3202_transaction_extensions: true
   msc2409_to_device_messages_enabled: true
+  msc2815_enabled: true
  • Backup: /opt/matrix/synapse/homeserver.yaml.bak-20260412
  • Applied: 2026-04-12 03:06 UTC
  • Synapse restarted, health verified, bridge reconnected, Element login confirmed
  • Rollback: restore backup and docker compose restart synapse

Previous state (before 2026-04-12)

Setting Previous Value Current Value Source
redaction_retention_period NOT SET (default 7d) null (disabled) synapse/config/server.py
msc2815_enabled NOT SET (default false) true synapse/config/experimental.py
forgotten_room_retention_period NOT SET NOT SET (unchanged) synapse/config/server.py
media_retention.local_media_lifetime NOT SET NOT SET (unchanged) synapse/config/repository.py
media_retention.remote_media_lifetime NOT SET NOT SET (unchanged) synapse/config/repository.py

Full experimental_features block (current):

experimental_features:
  msc3202_transaction_extensions: true
  msc2409_to_device_messages_enabled: true
  msc2815_enabled: true

What redaction_retention_period: null Changes

Source: Synapse v1.147.1 synapse/config/server.py, synapse/storage/databases/main/events.py

When set to null:

  • Synapse STOPS censoring (overwriting) redacted event content in the DB
  • The original unredacted content stays in event_json table forever
  • The 5-minute censoring job still runs but skips all events
  • Redactions still WORK from the client perspective — clients see events as redacted
  • The only difference is the server retains the pre-redaction content internally

When at default 7d:

  • After 7 days post-redaction, Synapse replaces stored event content with the redacted form
  • Original content is permanently lost from the DB
  • Any tool querying the DB after 7 days gets only the stripped event

MSC2815 Support — CONFIRMED in Synapse 1.147.1

Config key: experimental_features.msc2815_enabled (default: false) Source: synapse/config/experimental.py line 372 Feature flag advertised as: fi.mau.msc2815: true in /_matrix/client/versions

What MSC2815 does:

  • Adds include_unredacted_content=true query param to GET /rooms/{roomId}/event/{eventId}
  • Requires requester to have power level >= room's redact PL (default 50)
  • Returns original unredacted content if still in DB
  • Returns FI.MAU.MSC2815_UNREDACTED_CONTENT_DELETED if content was already censored

Critical interaction: MSC2815 + redaction_retention_period

  • With default 7d: MSC2815 only works for 7 days after redaction
  • With null: MSC2815 works forever (content never censored)

Current DB Sizes

Database Size
synapse 259 MB
mas 17 MB
mautrix_signal 14 MB

Top 5 tables in synapse:

Table Size
state_groups_state 91 MB
event_json 20 MB
events 15 MB
event_auth 14 MB
device_lists_changes_in_room 12 MB

Growth Rate Analysis

Backup sizes over 14 days (Mar 26 - Apr 9, gzipped):

  • Mar 26: 5.28 MB → Apr 9: 5.41 MB
  • Delta: ~130 KB compressed over 14 days = ~9 KB/day compressed
  • Uncompressed estimate: ~50-100 KB/day growth

Event volume:

  • Total events: 2,617 across 18 rooms
  • Last 7 days: 2,356 events (bridge just deployed, bulk of these are portal creation)
  • Steady-state will be much lower — Signal groups average 10-50 messages/day
  • Only 3 redaction events in entire history

Storage Impact Estimate (disabling redaction purge)

Current scale:

  • 2,617 events = 259 MB total DB (but most of that is state, not event content)
  • event_json table: 20 MB for 2,617 events = ~7.6 KB avg per event
  • Redactions are 3 out of 2,617 (0.1%)

Even at 10x Signal bridge traffic (100 messages/day across all groups):

  • 100 events/day × 7.6 KB = 760 KB/day event_json growth
  • Redactions typically <5% of messages = <5 events/day × 7.6 KB = 38 KB/day saved by NOT censoring
  • Over 1 year: ~14 MB retained from not censoring

Verdict: Storage impact of redaction_retention_period: null is NEGLIGIBLE. The entire Synapse DB after months of use is 259 MB. Even with aggressive Signal bridge traffic, retaining redacted content adds <15 MB/year.

MAS Interaction with Redacted Content

MAS does NOT interact with redacted content. MAS handles:

  • Authentication (login/logout/refresh)
  • Token management
  • Upstream OIDC delegation

MAS has no audit policy, no event content access, and no retention policy of its own. Redaction handling is entirely within Synapse's event store. No conflict.

Rollback Procedure

If redaction_retention_period: null and msc2815_enabled: true are added and need reverting:

  1. Remove both settings from homeserver.yaml
  2. Restart Synapse: docker compose restart synapse
  3. Synapse returns to default 7d censoring
  4. Already-retained content will be censored within 7 days + 5 minutes
  5. No DB migration needed — Synapse's censoring job handles cleanup automatically

The rollback is clean and non-destructive.