164 lines
6.4 KiB
Markdown
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.
|