From 8087919d31850a30a8002b5eb85d6f9af7d12c3c Mon Sep 17 00:00:00 2001 From: Maurice <61554723+mauriceboe@users.noreply.github.com> Date: Tue, 25 Aug 2026 22:40:32 +0200 Subject: [PATCH] Remove storage configuration details from README Removed detailed storage configuration and provisioning instructions from the README. --- README.md | 93 ------------------------------------------------------- 1 file changed, 93 deletions(-) diff --git a/README.md b/README.md index 81a4ea27f..ff1554f33 100644 --- a/README.md +++ b/README.md @@ -490,99 +490,6 @@ Caddy handles TLS and WebSockets automatically. -
- -

Storage

- -TREK separates *what* it stores (eight content categories — trip documents, -journey photos, cover images, profile pictures, place images, the two photo -caches, and backups) from *where* it stores it (named backends). Out of the -box everything lives on local disk (`uploads/` and `data/backups`). From -**Admin → Storage** you can: - -- **Add S3-compatible backends** (AWS S3, Cloudflare R2, Backblaze B2, Garage, - MinIO/AIStor) and assign any category to them. -- **Replicate a backend**: edit it and pick **Mirror targets** — every write is - then also copied to each target. The classic off-site backup setup is: - add an S3 backend, edit `backups-local`, tick the S3 backend as a mirror - target, save. Replica writes happen one after another during each upload, so - a slow or unreachable target slows every upload of every category on that - backend — fine for backups, worth weighing for hot categories. Existing - objects are not replicated when you add a target — press **Sync now** on - the backend to copy them (one sync at a time; progress and cancel in the - panel). -- **Watch the Health strip**: replica failures never fail the original - request; they are recorded and shown there instead. All-clear means every - replicated write landed. Failures also notify admins over the configured - notification channels (first failure immediately, then hourly summaries) — - tune it under Admin → Notifications. -- **Test** any backend from its row (for a replicated backend it probes the - primary and each target individually). Targets must be saved before Test - can probe them. -- **Usage**: per-category and per-backend object counts and sizes, scanned - nightly and on demand. - -Backend credentials are encrypted at rest. Without an explicit -`ENCRYPTION_KEY` the implicit key from the data directory is used — that -works, but the implicit key rides inside backups, so setting `ENCRYPTION_KEY` -explicitly is recommended for credentialed backends. On an existing install -that has been running without an explicit key, do not just set a new one — -that would orphan already-stored secrets; use the key-rotation procedure (see -*Rotating the Encryption Key* under Updating) to move to an explicit key. - -Notes and limits: reassigning a populated category prompts to move its -existing objects — accepting copies everything to the new backend, flips the -category, then sweeps any writes that raced the copy; source objects are kept -(not deleted) and reported as reclaimable (count + size) to reclaim manually; -declining routes only new writes to the new backend, leaving old objects in -place as before. Only one storage job (a mirror sync or a category migration) -runs at a time, cancelling before the flip is always safe, and a failed copy -never flips the category; media categories on S3 work but every served byte -proxies through the server — the proxy answers conditional GETs (ETag / -Last-Modified) and a single `Range` request, while a multi-range request is -answered with the full object; AWS buckets -with Object-Lock or checksum-requiring policies -reject the server's uploads; self-hosted endpoints (MinIO/Garage) should be -addressed by IP or `localhost` unless configured for virtual-hosted buckets. -The legacy `/uploads/photos` directory from older TREK versions is still -served and included in backups, but it is not a configurable category. -Running the storage contract suite against a live MinIO/AIStor is a -license-gated procedure — CI runs it automatically for same-repo pull -requests (fork PRs skip it, since they have no access to the license -secret); to run it yourself locally, see `docker-compose.minio-test.yml`'s -header for the manual procedure. - -### Provisioning at first boot (seed file) - -For infrastructure-as-code setups, mount a `storage-config.json` into the -data directory — it is imported **once**, on the first boot that has no -stored storage configuration, and loudly ignored afterwards: - -```jsonc -// storage-config.json — secrets may be plaintext (encrypted on import) -// or already-encrypted enc:v1: values. -{ - "backends": [ - { "name": "off-site", "type": "s3", "options": { - "endpoint": "https://s3.example.com", "bucket": "trek", - "accessKeyId": "…", "secretAccessKey": "…" } }, - { "name": "backups-mirror", "type": "mirror", "options": { - "primary": "backups-local", "replicas": ["off-site"] } } - ], - "categories": { "backups": "backups-mirror" } -} -``` - -(The panel presents this exact setup as **Mirror targets** on `backups-local`.) - -```yaml -# docker-compose: add under the trek service's volumes - - ./storage-config.json:/app/data/storage-config.json:ro -``` - -An invalid seed file aborts boot with the exact validation error — an -actively-provisioning operator sees the problem instead of a silent default. - ### Recovery and restore To reset storage configuration to the built-in defaults (or to re-import a