Files
2026-10-06 16:33:29 +01:00

164 lines
6.4 KiB
Markdown

---
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["<b>Seagate BarraCuda</b><br/>sda1 / 2 TB"]
B["<b>Seagate BarraCuda</b><br/>sdb1 / 2 TB"]
RAID["<b>Linux MD RAID 0</b><br/>md0 / no redundancy"]
DATA[("<b>/data</b><br/>ext4")]
A --> RAID
B --> RAID
RAID --> DATA
end
subgraph System["SSD / SYSTEM"]
direction TB
SSD["<b>Samsung 860 EVO</b><br/>sdc / 1 TB"]
EFI["<b>/boot/efi</b><br/>sdc1 / FAT32"]
SWAP["<b>Swap</b><br/>sdc2"]
ROOT["<b>/</b><br/>sdc3 / ext4"]
DOCKER["<b>/var/lib/docker</b><br/>Named volumes"]
CACHE["<b>/home/jay/data</b><br/>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/<service>` | 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/<name>/_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.