--- schema_version: 1 id: home-server.storage type: reference scope: [jupiter, disks, raid, filesystems, docker-volumes] sensitivity: private-infrastructure last_reviewed: "2026-10-06" sources: - kind: owner-report reference: "lsblk filesystem output, RAID level, mount placement and Docker data root, 2026-10-06" - kind: owner-report reference: "Seedbox rclone mount and systemd unit, 2026-10-06" - kind: owner-report reference: "Deployed Portainer uses /data/portainer bind mount, not portainer_data, 2026-10-06" - kind: owner-report reference: "mdstat, mdadm scans/detail, fstab, findmnt and Docker volume/container inspection, 2026-10-06" - kind: repository repository: jupiter-stacks revision: 610e325ef6a98850511ce7a089b0b9a77bfecf15 paths: - stacks/backrest/docker-compose.yml - stacks/jellyfin/docker-compose.yml - stacks/authelia/docker-compose.yml - stacks/traefik/docker-compose.yml related: [home-server.reference, home-server.host, home-server.seedbox, home-server.portainer, home-server.backups, home-server.operations] update_triggers: [disk-change, raid-change, mount-change, volume-change, backup-coverage-change] unknowns: [persistent-mdadm-config-and-initramfs-content, disk-health] --- # Storage ```mermaid --- config: themeCSS: | .node rect { rx: 8px; ry: 8px; stroke-width: 1.5px; } .cluster rect { fill: var(--infra-zone) !important; stroke: var(--infra-border) !important; stroke-dasharray: 5 5; rx: 12px; ry: 12px; } .label, .nodeLabel, .cluster-label { color: var(--infra-text) !important; } .flowchart-link { stroke: var(--infra-line) !important; } marker path { fill: var(--infra-line) !important; stroke: var(--infra-line) !important; } .infraStorage rect, .infraStorage path { fill: var(--infra-storage-fill) !important; stroke: var(--infra-storage-stroke) !important; } .infraCloud rect { fill: var(--infra-cloud-fill) !important; stroke: var(--infra-cloud-stroke) !important; } .infraClient rect { fill: var(--infra-client-fill) !important; stroke: var(--infra-client-stroke) !important; } .infraService rect { fill: var(--infra-service-fill) !important; stroke: var(--infra-service-stroke) !important; } flowchart: curve: basis nodeSpacing: 30 rankSpacing: 45 --- flowchart LR subgraph Array["HDD ARRAY / APPLICATION DATA"] direction TB A["Seagate BarraCuda
sda1 / 2 TB"] B["Seagate BarraCuda
sdb1 / 2 TB"] RAID["Linux MD RAID 0
md0 / no redundancy"] DATA[("/data
ext4")] A --> RAID B --> RAID RAID --> DATA end subgraph System["SSD / SYSTEM"] direction TB SSD["Samsung 860 EVO
sdc / 1 TB"] EFI["/boot/efi
sdc1 / FAT32"] SWAP["Swap
sdc2"] ROOT["/
sdc3 / ext4"] DOCKER["/var/lib/docker
Named volumes"] CACHE["/home/jay/data
Backrest / Jellyfin caches"] SSD --> EFI SSD --> SWAP SSD --> ROOT ROOT --> DOCKER ROOT --> CACHE end class A,B,SSD,DATA,ROOT infraStorage class RAID infraCloud class EFI,SWAP infraClient class DOCKER,CACHE infraService ``` RAID 0: striping; no redundancy; either HDD failure loses the array. ## Filesystems Device names reflect the supplied snapshot; UUIDs identify filesystems. | Mount | Device | Filesystem | UUID | | --- | --- | --- | --- | | `/data` | `/dev/md0` | ext4 | `d60390a1-7db3-44cc-bbde-693c23e42001` | | `/` | `/dev/sdc3` | ext4 | `7a5e0ee6-4a65-4f68-9128-b3b4f3406447` | | `/boot/efi` | `/dev/sdc1` | FAT32 | `1DDE-CDF9` | | swap | `/dev/sdc2` | swap | `4781ea5d-fba5-438d-8d97-6a0801669ca1` | MD members: `/dev/sda1`, `/dev/sdb1`; metadata `1.2`; array label `jupiter:0`; MD UUID `c67fccaa-e541-bf2d-2bf6-83221086e0e9`. ## RAID assembly / geometry Linux MD, inspected with mdadm; ext4 directly on the array, no intervening LVM. | Setting | Observed value | | --- | --- | | Device / scan name | `/dev/md0` / `/dev/md/0` | | mdadm UUID | `c67fccaa:e541bf2d:2bf68322:1086e0e9` | | Capacity | 3.64 TiB / 4.00 TB | | Layout / chunk | `original` / 512 KiB | | Member order | Slot 0: `/dev/sdb1`; slot 1: `/dev/sda1` | | State at review | `clean`; 2 active members; no failed/spare devices | Scan output identifies the array; persisted mdadm configuration/initramfs were not supplied. Assembly is not array creation; do not substitute `mdadm --create`. ## Mount configuration Supplied `/etc/fstab`: ```fstab UUID=7a5e0ee6-4a65-4f68-9128-b3b4f3406447 / ext4 errors=remount-ro 0 1 UUID=1DDE-CDF9 /boot/efi vfat utf8 0 0 UUID=d60390a1-7db3-44cc-bbde-693c23e42001 /data ext4 defaults 0 2 UUID=4781ea5d-fba5-438d-8d97-6a0801669ca1 none swap sw 0 0 ``` Observed `/data`: `rw,relatime,stripe=256`; `/tmp`: tmpfs. Seedbox FUSE mount is service-managed, not listed in fstab. ## Placement | Host path | Backing / purpose | | --- | --- | | `/data/` | HDD array; service bind mounts | | `/mnt/seedbox` | Remote SFTP/FUSE mount; [seedbox](seedbox.md); not a local replica | | `/home/jay/data/backrest/cache` | SSD; Backrest cache | | `/home/jay/data/jellyfin/cache` | SSD; Jellyfin cache | | `/var/lib/docker` | SSD; Docker state and default local named volumes | | `/var/lib/containerd` | SSD; observed containerd overlayfs snapshot storage | | `/data/portainer` | HDD array; deployed [Portainer](portainer.md) state; backed up | | `/data/authelia` | Configuration, users, SQLite, notifications | | `/data/traefik/{acme,dynamic,certs}` | ACME state, dynamic configuration, certificates | Cache placement is per mount, not globally SSD-backed. `/data` backups do not implicitly include SSD-backed Docker volumes. ## Named-volume snapshot Inspected volumes below use driver `local`, no driver options, and `/var/lib/docker/volumes//_data` on SSD. | Volume | Running consumer / container path | | --- | --- | | `audiobookshelf_config` | Audiobookshelf `/config` | | `jellyfin_config` | Jellyfin `/config` | | `notes_static` | Notes web `/usr/share/nginx/html`; builder `/site-output` | | `dozzle_dozzle_data` | Dozzle `/data` | | `ctq_ctq_postgres_data` | CTQ PostgreSQL `/var/lib/postgresql/data` | | `havox_src` | Havox web/sync `/git` | Other volumes are present without a running consumer shown, including `jellyfin_cache`, `notes_notes_static`, and monitoring volumes. Presence does not prove use or justify deletion. Named volumes are outside the supplied four-directory backup plan.