Skip to content

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:

FieldWhat goes in it
EndpointThe provider's S3 API endpoint, e.g. https://<account-id>.r2.cloudflarestorage.com
BucketBucket name
Key IDAccess key id
App KeySecret key. Write-only — leave blank on later edits to keep the current one
Regionauto is right for R2 and most S3-compatible providers. Leave the placeholder if unsure
Public URLOptional 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.

StorageEgress
Cloudflare R2~$0.015/GB/mo$0
Backblaze B2~$0.006/GB/mofree up to 3× stored, then metered
Amazon S3~$0.023/GB/mo~$0.09/GB
Wasabi~$0.0069/GB/mofree 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:

SettingWhen it applies
Default Server QuotaSeeds a server's allocation when that server is created. Editing it does not resize servers that already exist
Default space per userRead 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.