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

# Ceph (Rados Gateway)

> Mount a self-hosted Ceph Rados Gateway bucket as a virtual filesystem.

The Ceph resource is a thin wrapper over the [S3 resource](/python/resource/s3).
It maps a `CephConfig` to an `S3Config` and reuses the exact same backend,
commands, and behavior as S3, it just points at your Ceph Rados Gateway
`endpoint_url` and uses path-style addressing by default.

Ceph RGW is self-hosted, so `endpoint_url` is **required** (there is no
region-derived host). Uses aioboto3 against the gateway's S3-compatible API.

## Config

```python theme={null}
import os

from mirage import MountMode, Workspace
from mirage.resource.ceph import CephConfig, CephResource

config = CephConfig(
    bucket=os.environ["CEPH_BUCKET"],
    endpoint_url=os.environ["CEPH_ENDPOINT_URL"],
    access_key_id=os.environ["CEPH_ACCESS_KEY_ID"],
    secret_access_key=os.environ["CEPH_SECRET_ACCESS_KEY"],
    # Optional:
    # region="us-east-1",   # default
    # path_style=True,      # default
    # timeout=30,
    # proxy="http://proxy:8080",
)
resource = CephResource(config)
ws = Workspace({"/ceph": resource}, mode=MountMode.READ)
```

Both `READ` and `WRITE` modes are supported.

## Example

```python theme={null}
import asyncio
import os

from dotenv import load_dotenv

from mirage import MountMode, Workspace
from mirage.resource.ceph import CephConfig, CephResource

load_dotenv(".env.development")

config = CephConfig(
    bucket=os.environ["CEPH_BUCKET"],
    endpoint_url=os.environ["CEPH_ENDPOINT_URL"],
    access_key_id=os.environ["CEPH_ACCESS_KEY_ID"],
    secret_access_key=os.environ["CEPH_SECRET_ACCESS_KEY"],
)
resource = CephResource(config)


async def main() -> None:
    ws = Workspace({"/ceph/": resource}, mode=MountMode.READ)

    r = await ws.execute("ls /ceph/")
    print(await r.stdout_str())

    r = await ws.execute("find /ceph/ -name '*.json'")
    print(await r.stdout_str())


if __name__ == "__main__":
    asyncio.run(main())
```

## Notes

* Ceph reports `ResourceName.S3` and routes through the same `core/s3`
  implementation, so the full S3 shell-command set applies. See the
  [S3 resource](/python/resource/s3) for the complete command reference,
  range reads, streaming, and the index cache fast path.
* For credential setup, see [Ceph Setup](/home/setup/ceph).
