> ## Documentation Index
> Fetch the complete documentation index at: https://docs.e6data.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Storage

> Unified uses one storage_root for its durable state. Use an S3 URL for remote workers, or an absolute local directory for a local deployment.

ReferenceApplies to: Unified engine deployments

Unified uses one `storage_root` for its durable state. Use an S3 URL for remote workers, or an absolute local directory for a local deployment.

```toml theme={"theme":{"light":"github-light","dark":"github-dark"}}
storage_root = "s3://YOUR_BUCKET/unified/"
```

For local development:

```toml theme={"theme":{"light":"github-light","dark":"github-dark"}}
storage_root = "/var/lib/laminar"
```

## Storage layout

All engine-owned durable locations are computed below the root.

| Location | Content |
| - | - |
| `metadata/<service>/` | Saved queries, notebooks, dashboards, schedules, runs, tasks, attempts, and other service records |
| `metadata/telemetry-history/` | Stored logs, metrics, and spans |
| `tables/` | Default Iceberg table data and metadata |
| `results/` | Query results, session artifacts, and Unified checkpoints |
| `secrets/master.key` | Encryption key for saved secrets |

Metadata uses SlateDB. Result payloads use object storage. These backends and their prefixes are computed from the root. Separate location settings such as `database.backend`, `result_storage.backend`, `iceberg.root_url`, and `secrets.master_key_file` are rejected.

Changing the root selects a different store. It does not move existing data. Keep the whole root, including the secret key, together when moving or restoring data. Each service database needs one active controller writer.

## S3 connection

S3 uses the process's bootstrap AWS identity. This can come from the AWS environment or the platform identity attached to the controller and worker. A saved credential cannot bootstrap access to its own metadata store.

Set `AWS_REGION` or `AWS_DEFAULT_REGION`. The default Region is `us-east-1`. For an S3-compatible endpoint, set `AWS_ENDPOINT_URL_S3` or `AWS_ENDPOINT_URL`. An `http://` endpoint enables HTTP for that connection. These are connection settings; the bucket and prefix still come only from `storage_root`.

Controller and workers must reach the same bucket and prefix. The controller needs access to all engine state. Workers need the table, result, and source access used by their tasks. The secret key object must stay private. Its contents are created once and reused after restart. A missing key for an existing secret store causes startup to fail.

## Temporary files

Spill files and Python runtime files use `<local root>/tmp/` with local storage. With S3 they use the system temporary directory under `laminar/`, normally `/tmp/laminar/`. These files are temporary. A container with a read-only root filesystem needs a writable `/tmp` mount, but no persistent local data mount for S3 state.

Hub runs sample services in Docker Compose. Its data uses separate Docker volumes.

## Sources and external tables

`file_sources` describes external input and output connections. External catalog tables can also have their own locations and credentials. These locations are not engine-owned state and do not move when `storage_root` changes.

`table_storage.options.part_bytes` and `result_storage.options.part_bytes` remain transfer-size settings. They do not set the Parquet file size. See [Iceberg write options](https://docs.e6data.com/transformation/sql/writes.md#iceberg-write-options).

This root setting applies only to Unified.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.