Appearance
Storage
Where your node keeps attachments, clips, sounds, avatars and banners.
By default: on the node's own disk, in the dissent-storage Docker volume. That works, and for a small community it is the right answer. It stops being the right answer when either the disk or the egress bill becomes the constraint.
Attaching an S3-compatible bucket
Open Node Admin → Storage and switch the backend from Local Disk to S3-Compatible. Six fields:
| Field | What goes in it |
|---|---|
| Endpoint | The provider's S3 API endpoint, e.g. https://<account-id>.r2.cloudflarestorage.com |
| Bucket | Bucket name |
| Key ID | Access key id |
| App Key | Secret key. Write-only — leave blank on later edits to keep the current one |
| Region | auto is right for R2 and most S3-compatible providers. Leave the placeholder if unsure |
| Public URL | Optional CDN or custom domain in front of the bucket. Blank auto-generates |
Then click Test Connection before saving. It reports reachable and writable separately, because credentials that can list and cannot write are a real and confusing failure. Once configured, Bucket Usage shows live size and object count.
The secret key is encrypted at rest with PLUGIN_CONFIG_KEY before it is stored — which is one more reason that key belongs in your backups.
Which provider
Any S3-compatible service works. The one that changes the arithmetic is Cloudflare R2, because of what it does not charge for.
| Storage | Egress | |
|---|---|---|
| Cloudflare R2 | ~$0.015/GB/mo | $0 |
| Backblaze B2 | ~$0.006/GB/mo | free up to 3× stored, then metered |
| Amazon S3 | ~$0.023/GB/mo | ~$0.09/GB |
| Wasabi | ~$0.0069/GB/mo | free under a fair-use policy |
Indicative list prices — check the provider before budgeting on them.
Egress is the line item that surprises people running a chat node. Storage grows predictably with what your community uploads; egress grows with how often they look at it, which you do not control and cannot forecast. One popular clip rewatched a few thousand times costs nothing to store and something real to serve.
R2 removes that variable: no egress charge at all, and an S3 API that drops straight into the fields above with region: auto. It does still bill per operation, so it is cheaper rather than free — but the unpredictable half of the bill is gone.
Put a domain in front of it
R2 buckets can be exposed through a Cloudflare custom domain. Set that as Public URL and attachments are served from your own hostname rather than a provider URL.
What stays on the node regardless
Avatars, banners and profile media are always served by the node, whatever backend you configure. They are tiny, and the node needs them to render its own UI — gating them behind a bucket that may not be attached would break every avatar on the node.
The Store User Content On This Node toggle on the same screen governs only the large stuff: attachments, clips and sounds. Turn it off and uploads must go to a bucket that the server or the user has attached; an upload with nowhere to go is refused with a message saying so, rather than silently landing on your disk.
Quotas
Two numbers on the same screen, and they apply at different times:
| Setting | When it applies |
|---|---|
| Default Server Quota | Seeds a server's allocation when that server is created. Editing it does not resize servers that already exist |
| Default space per user | Read by the upload gate on every upload, so a change takes effect immediately and retroactively |
Both take 0 to mean unlimited.
The node also checks the relationship between what you have promised and what the volume actually holds, and warns at startup only when fewer than three users could fill the disk. Ordinary oversubscription is normal and expected — warning on it would just train you to ignore the warning.
Backups
An S3 bucket is your provider's durability problem; local storage is yours. Either way it is not in the node's backup archive — see Backups & Restore. The database records what the files are; it does not contain them.