From baccb34207399b779d3162d5ef32036d999a62a1 Mon Sep 17 00:00:00 2001 From: Garrett Allen <98648590+Gerrrt@users.noreply.github.com> Date: Thu, 15 Oct 2026 23:52:36 +0000 Subject: [PATCH 1/6] docs(rack): buy four-post support rails for the keyboard drawer and the Tiny tray Both trays were mounted on 2026-10-15 and wobble with all six ear screws tight: the keyboard drawer is a 10.8" slide with no rear support and the Tiny tray a 6.6" hinged shelf, and on a 29" four-post frame their rears rest on nothing. Two pairs of adjustable 1U four-post support rails join Everything still to buy, ten rows to eleven, with README's count following. hardware.md's two rows say why and footnote the parts; the move runbook lists the rails, fits them before each tray and fastens the tray's rear to them before anything is loaded above. Refs #919. Co-Authored-By: Claude Fable 5.1 --- README.md | 2 +- docs/changelog.md | 13 +++++++++++++ docs/hardware.md | 6 ++++-- docs/roadmap.md | 1 + docs/runbooks/move-into-the-32u-rack.md | 12 ++++++++++-- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7266d349..686c1eb1 100644 --- a/README.md +++ b/README.md @@ -399,7 +399,7 @@ is [`docs/changelog.md`](docs/changelog.md), dated and never rewritten. **Every purchase still outstanding is in one place**, the roadmap's [*Everything still to buy*](docs/roadmap.md#everything-still-to-buy): -10 items now, 0 later, and a rule that nothing joins them without a +11 items now, 0 later, and a rule that nothing joins them without a decision. This sentence used to carry the list itself, name three purchases coupled to the UPS work and omit the tier's host entirely, which is how one ProDesk came to be bought for two jobs. It names no current item for the diff --git a/docs/changelog.md b/docs/changelog.md index c005cc57..588ed031 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -19,6 +19,19 @@ docstring gives: it is a record, not a claim about now. ## 2026-10-15 +- **Both front-mounted trays wobble, so they get four-post support rails** + ([#919](https://github.com/Gerrrt/HomeLab/issues/919)). The keyboard + drawer at U24 and `ifrit`'s Tiny tray at U18 are mounted and move under + hand pressure with every ear screw tight. Both are front-only mounts: a + 10.8" sliding tray with no rear support, whose reviewers tied its slider + rears to their cabinet, and a 6.6" hinged tray. Neither is a bad part; a + 29" four-post frame gives their rears nothing to rest on. The operator + chose rails for both over a fourth vented shelf for the Tiny. Two pairs + of adjustable 1U four-post support rails join *Everything still to buy*, + ten rows to eleven, and the move runbook fits them before each tray and + fastens the tray's rear to them. Both parts are now footnoted in + [`hardware.md`](hardware.md#planned-a-32u-rack). + - **The KVM goes on a shelf, and the console and power maps are decided** ([#919](https://github.com/Gerrrt/HomeLab/issues/919)). The screen, the CRS326, `ifrit`'s Tiny mount, `trinity`'s tray and the keyboard drawer are diff --git a/docs/hardware.md b/docs/hardware.md index 95e91a75..20b3504c 100644 --- a/docs/hardware.md +++ b/docs/hardware.md @@ -108,13 +108,13 @@ CRS326 with them. | U | Device | Why here | | --- | --- | --- | | U25–U32 | ViewSonic N1700W on an 8U VESA rack mount | The very top. The console's height frees the middle of the rack for air between machines. Light, so high is fine | -| U24 | 1U sliding keyboard and mouse shelf | Directly under the screen, about 112 cm up. Mounted 2026-10-15 | +| U24 | 1U sliding keyboard and mouse shelf[^Drawer] | Directly under the screen, about 112 cm up. Mounted 2026-10-15. Front-mounted only, 10.8" deep, and it wobbles with all six ear screws tight, as its reviewers found. A pair of adjustable four-post support rails under its rear is to buy, decided 2026-10-15 | | U23 | MT-VIKI 8-port KVM, on a 1U vented shelf | Beside the console, so its console cables are short. It was at U6. Its lead sets reach the DL360 20 units down, checked 2026-10-12. The shelf is because the KVM is sold as a half-U device: its ears take two of a unit's three holes, and the holes are not evenly spaced, so it sits about 8 mm off centre whichever pair is used. The shelf takes all three. Decided 2026-10-15 | | U22 | Vented blank, or left open | Air over the CRS326. It is passive, and two S+RJ10s side by side need "additional cooling" ([MikroTik's guidance](https://help.mikrotik.com/docs/spaces/ROS/pages/240156916/S+RJ10+general+guidance)) if the 2.5G WAN work goes ahead | | U21 | MikroTik CRS326-24G-2S+RM (`neo`) | Replaces the MokerLink (#444). SFP+ 1–2 are the 2.5G path, if built. Racked 2026-10-12 | | U20 | 1U horizontal cable manager | Strain relief between switch and panel. A tugged hand-crimped WAN plug was the slow internet #914 traced (#923) | | U19 | Jadol 24-port patch panel | Next to the switch, so its patch cords stay short | -| U18 | 1U mount for a Lenovo ThinkCentre Tiny: `ifrit` | The offensive range (ADR-0007, ADR-0017), beside the other two 1-litre boxes. A Tiny is not a ProDesk Mini, so its mount is one made for the Tiny, not `morpheus`'s tray design. Mounted 2026-10-15 | +| U18 | 1U mount for a Lenovo ThinkCentre Tiny[^Tinymount]: `ifrit` | The offensive range (ADR-0007, ADR-0017), beside the other two 1-litre boxes. A Tiny is not a ProDesk Mini, so its mount is one made for the Tiny, not `morpheus`'s tray design. Mounted 2026-10-15. Hinged and front-mounted, 6.6" deep, and it wobbles with all six ear screws tight, so it gets a pair of four-post support rails under its rear too, decided 2026-10-15 | | U17 | *gap* | Keeps the range off the sensitive tier's box | | U16 | ProDesk Mini tray: `trinity` | Off the shelf. Same tray as `morpheus`. Its 2 TB USB photo disk sits on the same tray | | U15 | ProDesk Mini tray: `morpheus` | | @@ -1164,6 +1164,8 @@ revisions of this repository treated `shiva` as the hypervisor itself. [^KVM]: [MT-VIKI 8-port rackmount KVM](https://a.co/d/2yQl4KH) [^Panel]: [Jadol 24-port patch panel](https://a.co/d/izggRoK) [^PDU]: [10-outlet 1U PDU](https://a.co/d/ibEygxZ) +[^Drawer]: [Electriduct 1U sliding keyboard tray, 10.8" deep](https://www.amazon.com/dp/B07RCYP32J) +[^Tinymount]: [Freejia 1U hinged rack mount for a ThinkCentre Tiny](https://www.amazon.com/dp/B0G4CZGRT7) [^tp-linkswitch]: [TP-Link 8-port gigabit switch](https://www.tp-link.com/us/business-networking/unmanaged-switch/) [^MokerLink]: [MokerLink 26-port managed switch](https://a.co/d/gaJvCKV) [^CRS326]: [MikroTik CRS326-24G-2S+RM](https://www.ebay.com/itm/257688846446) diff --git a/docs/roadmap.md b/docs/roadmap.md index 6706da76..820ac6fe 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -356,6 +356,7 @@ the VESA mount, `trinity`'s ProDesk tray and the velcro, and since | 3 × 1U four-post vented shelf, adjustable to 29" | `prometheus` U10, `oracle` U12, and the KVM at U23 | [`hardware.md`](hardware.md#planned-a-32u-rack); the third on 2026-10-15 | Before the #919 window | | 1U horizontal cable manager | U20, between switch and panel | [`hardware.md`](hardware.md#planned-a-32u-rack) | Before the #919 window | | 1U vented blank | U22, the air gap over the CRS326 | [`hardware.md`](hardware.md#planned-a-32u-rack) | Before the #919 window | +| 2 × pair of adjustable 1U four-post support rails, spanning 29" post to post | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | The operator, 2026-10-15 | Before the #919 window | | One factory-made Cat6 patch cable, long enough for the run | The XB7's striped 2.5G port to `morpheus`'s `em0`, replacing the hand-crimped patch | [#923](https://github.com/Gerrrt/HomeLab/issues/923) | Now: it should not wait for the move | | Short factory-made Cat6 patch cables, a pack, in the ADR-0009 VLAN colours | Switch to patch panel in the new rack | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §6.1 | Before the #919 window | | Spare M6 cage nuts and screws, a pack | The frame | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §0.1 | Before the #919 window | diff --git a/docs/runbooks/move-into-the-32u-rack.md b/docs/runbooks/move-into-the-32u-rack.md index 8558ec45..5b1cdda4 100644 --- a/docs/runbooks/move-into-the-32u-rack.md +++ b/docs/runbooks/move-into-the-32u-rack.md @@ -84,6 +84,7 @@ ones not yet on hand are also in the roadmap's | Four-post shelf, adjustable to 29", at least 17" deep, rated for 50 lb or more | 1 | `smaug` on its side, U5–U9 (about 20 lb) | | 1U horizontal cable manager | 1 | U20 | | 1U vented blank | 1 | U22, the air gap over the CRS326 | +| Adjustable 1U four-post support rails, a pair, spanning 29" | 2 | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | | 2 × 16 GB DDR4 SO-DIMM (DDR4-2933 or faster) | 1 kit | `ifrit` | | 1 TB NVMe, M.2 2280 | 1 | `ifrit`, replacing its 256 GB drive | | Factory-made Cat6 patch cables, short | a pack | Every switch-to-panel run. The XB7-to-`morpheus` cable is [#923](https://github.com/Gerrrt/HomeLab/issues/923)'s, fitted before the window rather than in it | @@ -359,13 +360,13 @@ units (§1.2), then the next one up. | 7 | U14 | The TP-Link on its shelf | It feeds the two laptops below it. U13 stays empty | | 8 | U15 | `morpheus` on its tray | | | 9 | U16 | `trinity` on the new ProDesk tray | Its USB photo disk too: see §6.1 | -| 10 | U18 | `ifrit` on its Tiny mount, with its brick | U17 stays empty | +| 10 | U18 | `ifrit` on its Tiny mount, with its brick | U17 stays empty. **Rails first:** a pair of four-post support rails in U18, then the tray's rear fastened to them (§6.1) | | 11 | U19 | Patch panel | | | 12 | U20 | Cable manager | | | 13 | U21 | CRS326 | Already racked on 2026-10-12. [`swap-the-switch.md`](swap-the-switch.md) Phase 2, step 2 is done; carry on from step 3 | | 14 | U22 | Vented blank | The air gap over the passive switch | | 15 | U23 | KVM, on its vented shelf | Its half-height ears take two of a unit's three holes; the shelf takes all three | -| 16 | U24 | Keyboard drawer | Front rails only | +| 16 | U24 | Keyboard drawer | Front rails only, plus a pair of four-post support rails in U24 under it; the drawer's slider rears are fastened to them before the screen goes on above (§6.1) | | 17 | U25–U32 | N1700W on its VESA mount | The bracket bolts to 4U. The screen in front of it covers 8U | ### 6.1 Cable it @@ -402,6 +403,13 @@ units (§1.2), then the next one up. supplies on 1 and 2, then up the rack, the external bricks together on 6–9 and the KVM on 10. Both laptops' chargers go on the UPS's own outlets beside the TP-Link, not on the PDU (§1.7). +- **The two cantilevered trays get their rails before anything is loaded + above them.** The keyboard drawer and the Tiny tray are front-mounted and + wobble with all six ear screws tight; a pair of adjustable four-post + support rails in each unit gives their rears a ledge. Fasten each tray's + rear to its rails: a screw through the slider or the tray's lip into the + rail where there is a hole, a velcro strap round rail and tray where there + is not. Then push each tray: the frame should not move with it. - **Read which UPS outlet group the PDU's cord is on**, and which the TP-Link and the chargers are on. The Smart-UPS X's outlets are in groups the card can switch and sequence separately, and no document records From db60ed079dc129284e2138bf817dbfdbd01ed1ef Mon Sep 17 00:00:00 2001 From: Garrett Allen <98648590+Gerrrt@users.noreply.github.com> Date: Fri, 16 Oct 2026 01:00:01 +0000 Subject: [PATCH 2/6] docs(rack): name the Rack Solutions 1UKIT-109 as the support rail kit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chosen 2026-10-16 for a stated 10–31.5" mounting range, a 45 lb rating and a cabling crossbar the keyboard drawer's slider rears can tie to. The roadmap row names it the way the smaug shelf row names StarTech, the runbook's parts table and §6.1 say the same, and the changelog entry records the choice. Refs #919. Co-Authored-By: Claude Fable 5.1 --- docs/changelog.md | 6 ++++-- docs/roadmap.md | 2 +- docs/runbooks/move-into-the-32u-rack.md | 12 +++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 588ed031..f06efdfc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -29,8 +29,10 @@ docstring gives: it is a record, not a claim about now. chose rails for both over a fourth vented shelf for the Tiny. Two pairs of adjustable 1U four-post support rails join *Everything still to buy*, ten rows to eleven, and the move runbook fits them before each tray and - fastens the tray's rear to them. Both parts are now footnoted in - [`hardware.md`](hardware.md#planned-a-32u-rack). + fastens the tray's rear to them. The kit was chosen on 2026-10-16: Rack + Solutions 1UKIT-109, for a stated 10–31.5" range, a 45 lb rating and a + cabling crossbar the drawer's slider rears can tie to. Both parts are now + footnoted in [`hardware.md`](hardware.md#planned-a-32u-rack). - **The KVM goes on a shelf, and the console and power maps are decided** ([#919](https://github.com/Gerrrt/HomeLab/issues/919)). The screen, the diff --git a/docs/roadmap.md b/docs/roadmap.md index 820ac6fe..962a5cfe 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -356,7 +356,7 @@ the VESA mount, `trinity`'s ProDesk tray and the velcro, and since | 3 × 1U four-post vented shelf, adjustable to 29" | `prometheus` U10, `oracle` U12, and the KVM at U23 | [`hardware.md`](hardware.md#planned-a-32u-rack); the third on 2026-10-15 | Before the #919 window | | 1U horizontal cable manager | U20, between switch and panel | [`hardware.md`](hardware.md#planned-a-32u-rack) | Before the #919 window | | 1U vented blank | U22, the air gap over the CRS326 | [`hardware.md`](hardware.md#planned-a-32u-rack) | Before the #919 window | -| 2 × pair of adjustable 1U four-post support rails, spanning 29" post to post | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | The operator, 2026-10-15 | Before the #919 window | +| 2 × pair of adjustable 1U four-post support rails, spanning 29" post to post. Rack Solutions 1UKIT-109 fits: 10–31.5", 45 lb, with a cabling crossbar | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | The operator, 2026-10-15; the kit chosen 2026-10-16 | Before the #919 window | | One factory-made Cat6 patch cable, long enough for the run | The XB7's striped 2.5G port to `morpheus`'s `em0`, replacing the hand-crimped patch | [#923](https://github.com/Gerrrt/HomeLab/issues/923) | Now: it should not wait for the move | | Short factory-made Cat6 patch cables, a pack, in the ADR-0009 VLAN colours | Switch to patch panel in the new rack | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §6.1 | Before the #919 window | | Spare M6 cage nuts and screws, a pack | The frame | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §0.1 | Before the #919 window | diff --git a/docs/runbooks/move-into-the-32u-rack.md b/docs/runbooks/move-into-the-32u-rack.md index 5b1cdda4..77237a18 100644 --- a/docs/runbooks/move-into-the-32u-rack.md +++ b/docs/runbooks/move-into-the-32u-rack.md @@ -84,7 +84,7 @@ ones not yet on hand are also in the roadmap's | Four-post shelf, adjustable to 29", at least 17" deep, rated for 50 lb or more | 1 | `smaug` on its side, U5–U9 (about 20 lb) | | 1U horizontal cable manager | 1 | U20 | | 1U vented blank | 1 | U22, the air gap over the CRS326 | -| Adjustable 1U four-post support rails, a pair, spanning 29" | 2 | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | +| Adjustable 1U four-post support rails, a pair, spanning 29": Rack Solutions 1UKIT-109 | 2 | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | | 2 × 16 GB DDR4 SO-DIMM (DDR4-2933 or faster) | 1 kit | `ifrit` | | 1 TB NVMe, M.2 2280 | 1 | `ifrit`, replacing its 256 GB drive | | Factory-made Cat6 patch cables, short | a pack | Every switch-to-panel run. The XB7-to-`morpheus` cable is [#923](https://github.com/Gerrrt/HomeLab/issues/923)'s, fitted before the window rather than in it | @@ -406,10 +406,12 @@ units (§1.2), then the next one up. - **The two cantilevered trays get their rails before anything is loaded above them.** The keyboard drawer and the Tiny tray are front-mounted and wobble with all six ear screws tight; a pair of adjustable four-post - support rails in each unit gives their rears a ledge. Fasten each tray's - rear to its rails: a screw through the slider or the tray's lip into the - rail where there is a hole, a velcro strap round rail and tray where there - is not. Then push each tray: the frame should not move with it. + support rails in each unit gives their rears a ledge. The 1UKIT-109 ships + with a cabling crossbar: fit it at the rear, and it is the tie point for + the keyboard drawer's slider rears. Fasten each tray's rear to its rails + or crossbar: a screw through the slider or the tray's lip where there is a + hole, a velcro strap round rail and tray where there is not. Then push + each tray: the frame should not move with it. - **Read which UPS outlet group the PDU's cord is on**, and which the TP-Link and the chargers are on. The Smart-UPS X's outlets are in groups the card can switch and sequence separately, and no document records From 0d6253c0757fa3f9952662859bdae9eee458b469 Mon Sep 17 00:00:00 2001 From: Garrett Allen <98648590+Gerrrt@users.noreply.github.com> Date: Fri, 16 Oct 2026 02:06:08 +0000 Subject: [PATCH 3/6] docs(adr): ADR-0096, fit ifrit's range disk as a SATA SSD in the Tiny's bay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The move runbook had the 1 TB drive replace the 256 GB M.2 because "there is nowhere to fit both". Lenovo's PSREF sheet for the first-generation M80q says it takes one 2.5" SATA drive as well as one M.2. The operator chose SATA on 2026-10-16: the 256 GB M.2 stays as the boot disk and the 1 TB SATA SSD carries the guests. ADR-0017's Disk row is superseded and carries the note; flash over spindles still stands. The roadmap row becomes a 2.5" SATA SSD and gains a conditional row for Lenovo's tray kit, eleven rows to twelve, with README's counts following (96 ADRs, 12 items). hardware.md, the playground runbook and the move runbook's §1.3 say the same. Refs #421. Refs #919. Co-Authored-By: Claude Fable 5.1 --- README.md | 6 +- ...-for-iops-and-keep-the-range-disposable.md | 9 +++ ...nge-disk-as-a-sata-ssd-in-the-tinys-bay.md | 81 +++++++++++++++++++ docs/changelog.md | 15 ++++ docs/hardware.md | 10 ++- docs/roadmap.md | 7 +- docs/runbooks/build-the-playground.md | 6 +- docs/runbooks/move-into-the-32u-rack.md | 21 +++-- 8 files changed, 137 insertions(+), 18 deletions(-) create mode 100644 docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md diff --git a/README.md b/README.md index 686c1eb1..df37923a 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ documents for different readers. at all. Every pinned digest is also scanned weekly for fixable HIGH and CRITICAL CVEs, and each image with findings has an open issue until a scan finds it clean. -- **Documented decisions and runbooks.** 95 ADRs covering what was chosen +- **Documented decisions and runbooks.** 96 ADRs covering what was chosen and what was rejected — including the costs accepted knowingly; 49 runbooks for the operations that are easy to get wrong at 1am, one of which is the handover page a successor reads first. Every critical alert links to @@ -224,7 +224,7 @@ inbound passes may still reach it. Data flow and the maintained Mermaid topology │ ├── architecture.md network.md hardware.md │ ├── observability.md security.md roadmap.md changelog.md │ ├── diagrams/ # the network diagram (SVG) and its predecessors -│ ├── adr/ # 95 ADRs — architecture decision records +│ ├── adr/ # 96 ADRs — architecture decision records │ ├── exercises/ # purple-team exercise records — see its README │ └── runbooks/ # 49 runbooks; successor-handover.md is the front door └── Makefile # make help @@ -399,7 +399,7 @@ is [`docs/changelog.md`](docs/changelog.md), dated and never rewritten. **Every purchase still outstanding is in one place**, the roadmap's [*Everything still to buy*](docs/roadmap.md#everything-still-to-buy): -11 items now, 0 later, and a rule that nothing joins them without a +12 items now, 0 later, and a rule that nothing joins them without a decision. This sentence used to carry the list itself, name three purchases coupled to the UPS work and omit the tier's host entirely, which is how one ProDesk came to be bought for two jobs. It names no current item for the diff --git a/docs/adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md b/docs/adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md index a9601d65..00bbef87 100644 --- a/docs/adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md +++ b/docs/adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md @@ -2,6 +2,15 @@ **Status:** Accepted · 2026-09 +> [!NOTE] +> **The *Disk* row of the decision table is superseded. The text below is +> left as written, per ADR-0001.** +> [ADR-0096](0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md) +> puts the range disk in the M80q's 2.5" bay as a SATA SSD, decided +> 2026-10-16, and keeps the 256 GB M.2 as the boot disk. The row's premise, +> flash rather than spindles for snapshot revert, stands; what changed is +> that the box has a bay as well as the slot. +> > [!NOTE] > The ADR-0007 sentence this ADR quotes under "The fleet's measured > bottleneck is spindles, not RAM" was measured on 2026-09-20 diff --git a/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md b/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md new file mode 100644 index 00000000..0b968713 --- /dev/null +++ b/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md @@ -0,0 +1,81 @@ +# ADR-0096: Fit ifrit's range disk as a SATA SSD in the Tiny's bay + +**Status:** Accepted · 2026-10 · supersedes the *Disk* row of +[ADR-0017](0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md) + +## Context + +[ADR-0017](0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md) decided +`ifrit`'s disk as "**NVMe.** Not a spindle, and not a mirror", on the ground +that the range's core operation is snapshot revert and "a chassis without an +M.2 slot cannot be given one". The box that was bought on 2026-10-05, a +first-generation ThinkCentre M80q, has that slot, and it is occupied by the +256 GB M.2 the refurbisher fitted ([`hardware.md`](../hardware.md)). The +roadmap's purchase row therefore read "1 TB NVMe SSD", and the move runbook's +§1.3 had it *replace* the 256 GB drive, "there is nowhere to fit both". + +That last sentence was wrong. Lenovo's PSREF sheet for the first-generation +M80q gives its storage as "up to two drives, 1x 2.5" HDD + 1x M.2 SSD", the +2.5" bay on SATA 6 Gb/s. The bay takes a 2.5" SSD as readily as a disk, and +it is empty on a Tiny sold with an M.2 only. Whether the tray and its flat +SATA cable are in the chassis is not known until it is opened: Lenovo sells +them as the Tiny tray kit `5M10U50268` with the `00XL211` cable, and a +refurbished box may ship without them. + +The operator chose on 2026-10-16 to put the range disk in that bay as a SATA +SSD rather than swap the M.2. + +What ADR-0017 was actually guarding against is worth restating, because the +choice turns on it. Its argument was flash against spindles: the range reverts +snapshots all day, and the fleet's measured bottleneck was a 7.2K mirror doing +741 random write IOPS at queue depth 1 against 7,952 from a SATA SSD pair, as +its own note records. A SATA SSD is on the right side of that line by an order +of magnitude. What SATA gives up against NVMe is the next order: sequential +throughput capped near 550 MB/s against several GB/s, and random IOPS in the +tens of thousands rather than the hundreds. For four or five guests on one +host, reverting one at a time, that is not the bottleneck; the range's +activity is attack tooling, not storage benchmarking. + +## Decision + +**`ifrit`'s range disk is a 1 TB 2.5" SATA SSD in the Tiny's drive bay. The +256 GB M.2 stays, as the hypervisor's boot disk.** + +- **The bay, not the slot.** The SATA SSD mounts in the Tiny's 2.5" tray and + connects by the flat SATA cable to the board, as the M80q hardware + maintenance manual shows. If the chassis has no tray and cable, the Lenovo + kit `5M10U50268` with `00XL211` is bought with the drive; the roadmap + carries it as its own row, conditional on opening the case first. +- **Two drives, two jobs.** The 256 GB M.2 is the Proxmox boot and root disk; + the 1 TB SATA SSD is the guest storage, where templates, the attack VM and + the targets' disks live and are reverted. The boot disk is never part of + the range's churn, which is a cleaner layout than ADR-0017's single drive + and is the one real gain of this change. +- **Nothing else in ADR-0017 moves.** Socketed RAM to 32 GB, the quiet + form, one NIC, and the range being maintained by nobody all stand. + +## Consequences + +- `docs/roadmap.md`'s row becomes a 2.5" SATA SSD, with a second row for the + bay kit; [`hardware.md`](../hardware.md) and the two runbooks that fit and + then use the drive say the same. The move runbook's §1.3 no longer swaps + the M.2 and no longer keeps a 256 GB drive "with the spare parts". +- The range's storage ceiling is SATA's. If a future exercise is ever + storage-bound, the M.2 slot is still there, and the fix is a larger NVMe + in it with the roles swapped, not a new chassis. That is the condition that + would reopen this decision. +- The 2.5" bay's cable is a flat flexible one that routes under the board on + a Tiny; fitting it is a case-open job done once, in the move runbook's + §1.3, before the box is racked. + +## Alternatives considered + +- **A 1 TB NVMe replacing the 256 GB M.2**, as the runbook had it. One drive + for boot and guests, the 256 GB left on a shelf, and the fastest option. + Rejected by the operator on 2026-10-16 in favour of SATA; the layout above + is also better separated. +- **A 1 TB NVMe plus the 256 GB M.2 moved to the bay** via an M.2 SATA + drive. Not possible: the 256 GB drive is NVMe, and the bay is SATA. +- **Leaving the 256 GB M.2 as the only disk.** ADR-0017 sized the range at + four or five guests with templates; 256 GB is below that before the first + snapshot. diff --git a/docs/changelog.md b/docs/changelog.md index f06efdfc..c019c150 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -17,6 +17,21 @@ roadmap as it read that day, and the *Done* entries keep the shape they had there. `check_docs.py` does not check this file, for the reason its module docstring gives: it is a record, not a claim about now. +## 2026-10-16 + +- **`ifrit`'s range disk is a SATA SSD in the Tiny's bay, not an NVMe swap** + ([ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md), + [#421](https://github.com/Gerrrt/HomeLab/issues/421)). The move runbook had + the 1 TB drive replace the 256 GB M.2 because "there is nowhere to fit + both". Lenovo's PSREF sheet says otherwise: the first-generation M80q takes + a 2.5" SATA drive as well as one M.2. The operator chose SATA, so the + 256 GB M.2 stays as the boot disk and the 1 TB SSD carries the guests. + ADR-0017's *Disk* row is superseded and carries the note; its premise, + flash over spindles, stands. The roadmap row becomes a 2.5" SATA SSD and + gains a conditional row for the Tiny's tray kit, eleven rows to twelve, + since a refurbished box may ship without the tray and cable. The runbook's + §1.3 fits the drive in the bay instead of swapping the M.2. + ## 2026-10-15 - **Both front-mounted trays wobble, so they get four-post support rails** diff --git a/docs/hardware.md b/docs/hardware.md index 20b3504c..969f7db1 100644 --- a/docs/hardware.md +++ b/docs/hardware.md @@ -206,10 +206,16 @@ down so it cannot slide off or hang by its cable. **`ifrit` was bought on 2026-10-05:** eBay item 800466163205, "Lenovo ThinkCentre M80q Micro i7-10700T 2GHz 8GB 256GB SSD", refurbished. It is a 1-litre Tiny chassis, so 1U. It is not usable as the range yet. ADR-0017 -asks for 32 GB of socketed RAM and NVMe, and two parts are still to buy: +asks for 32 GB of socketed RAM and flash storage, and +[ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md) +puts the range disk in the chassis's 2.5" bay as a SATA SSD, decided +2026-10-16, with the 256 GB M.2 it shipped with kept as the boot disk. Still +to buy: - 2 × 16 GB DDR4 SO-DIMM, replacing the 8 GB it ships with; -- a 1 TB NVMe SSD, for the range's snapshot reverts. +- a 1 TB 2.5" SATA SSD, for the range's guests and their snapshot reverts; +- the Tiny's 2.5" tray kit, Lenovo `5M10U50268` with the `00XL211` cable, + only if the chassis turns out to have none. Open it and look first. **A VGA card for optional port 1 was ordered on 2026-10-14** from Amazon: Lenovo FRU `01AJ935` (also sold as `5C50W00901`). It replaces the diff --git a/docs/roadmap.md b/docs/roadmap.md index 962a5cfe..52c76dc9 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -274,7 +274,7 @@ Gated on the domain, on a household observation, or on something to publish. - **[#421](https://github.com/Gerrrt/HomeLab/issues/421) Buy `ifrit` and build the range.** Gated on #414 and the SOC: an attack VM pointed at an uninstrumented estate teaches nothing. Both are met. What gates the build - now is its RAM kit and NVMe drive, in + now is its RAM kit and SATA SSD, in [*Everything still to buy*](#everything-still-to-buy), and its place in the #919 rack move. → [runbook](runbooks/build-the-playground.md) @@ -362,10 +362,11 @@ the VESA mount, `trinity`'s ProDesk tray and the velcro, and since | Spare M6 cage nuts and screws, a pack | The frame | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §0.1 | Before the #919 window | | 8 × 16 GB DDR4 RDIMM, dual-rank, matched to a fitted stick's label (2Rx4 or 2Rx8, PC4-2400) | `Saruman`, 128 GB to 256 GB, one more per channel on both CPUs | The operator, 2026-10-13: headroom | In the #919 window, while the DL360 is out of the rack | | 2 × 16 GB DDR4 SO-DIMM kit | `ifrit`, replacing the 8 GB it shipped with | [ADR-0017](adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md): 32 GB socketed | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | -| 1 TB NVMe SSD | `ifrit`'s range and its snapshot reverts | [ADR-0017](adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md): NVMe | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | +| 1 TB 2.5" SATA SSD | `ifrit`'s range and its snapshot reverts, in the Tiny's 2.5" bay; the 256 GB M.2 stays as the boot disk | [ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md), 2026-10-16 | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | +| Tiny 2.5" bay kit: Lenovo tray `5M10U50268` with the `00XL211` SATA cable | `ifrit`'s bay, only if the chassis has none: open the case and look before buying | [ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md) | With the SSD above | **The last one, bought 2026-10-05:** `ifrit`, the range host — a quiet -SFF box, NVMe, two socketed DIMM slots with 32 GB fitted, one NIC +SFF box with flash storage, two socketed DIMM slots with 32 GB fitted, one NIC ([ADR-0017](adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md), [#421](https://github.com/Gerrrt/HomeLab/issues/421)). The box is a refurbished ThinkCentre M80q, and it arrived on 2026-10-14. It shipped with diff --git a/docs/runbooks/build-the-playground.md b/docs/runbooks/build-the-playground.md index 8e7cf493..b510673d 100644 --- a/docs/runbooks/build-the-playground.md +++ b/docs/runbooks/build-the-playground.md @@ -43,8 +43,10 @@ decision and on this runbook. So what remains ahead of §1 is the machine. `ifrit` was bought on 2026-10-05, a refurbished ThinkCentre M80q, and arrived on 2026-10-14. It is not ready -yet: ADR-0017 asks for 32 GB of socketed RAM and an NVMe disk, and the parts -chosen for that are still to fit. [`hardware.md`](../hardware.md) lists what +yet: ADR-0017 asks for 32 GB of socketed RAM and a flash disk, which +[ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md) +makes a SATA SSD in the Tiny's bay, and the parts chosen for that are still +to fit. [`hardware.md`](../hardware.md) lists what is still to buy and fit, and #421 tracks the build. Nothing below this section can be started until they are in. diff --git a/docs/runbooks/move-into-the-32u-rack.md b/docs/runbooks/move-into-the-32u-rack.md index 77237a18..c5bf89ea 100644 --- a/docs/runbooks/move-into-the-32u-rack.md +++ b/docs/runbooks/move-into-the-32u-rack.md @@ -86,7 +86,7 @@ ones not yet on hand are also in the roadmap's | 1U vented blank | 1 | U22, the air gap over the CRS326 | | Adjustable 1U four-post support rails, a pair, spanning 29": Rack Solutions 1UKIT-109 | 2 | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | | 2 × 16 GB DDR4 SO-DIMM (DDR4-2933 or faster) | 1 kit | `ifrit` | -| 1 TB NVMe, M.2 2280 | 1 | `ifrit`, replacing its 256 GB drive | +| 1 TB 2.5" SATA SSD, plus the Tiny's tray kit (`5M10U50268` with `00XL211`) if the chassis has none | 1 | `ifrit`, in the 2.5" bay beside its 256 GB M.2 ([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)) | | Factory-made Cat6 patch cables, short | a pack | Every switch-to-panel run. The XB7-to-`morpheus` cable is [#923](https://github.com/Gerrrt/HomeLab/issues/923)'s, fitted before the window rather than in it | | Spare M6 cage nuts and screws | 1 pack | Frames never ship with enough | | 16 GB DDR4 RDIMM, dual-rank, matched to a fitted stick's label | 8 | `Saruman`, to 256 GB: fitted in §6 while it is out of the rack ([`hardware.md`](../hardware.md#compute)) | @@ -155,9 +155,12 @@ thumb. ### 1.3 Fit `ifrit`'s RAM and SSD The M80q (first generation) takes **DDR4-2666/2933 SO-DIMMs, two slots, -64 GB maximum**, and has **one M.2 2280 SSD slot** (PCIe 3.0 x4). The other -M.2 slot is for Wi-Fi. This is from Lenovo's PSREF spec sheet. So the 1 TB -drive **replaces** the 256 GB one; there is nowhere to fit both. +64 GB maximum**, and has **one M.2 2280 SSD slot** (PCIe 3.0 x4) **and one +2.5" SATA bay** (6 Gb/s). The other M.2 slot is for Wi-Fi. This is from +Lenovo's PSREF spec sheet. The 1 TB SATA SSD goes in the bay and the 256 GB +M.2 stays as the boot disk ([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)). +The bay needs Lenovo's tray and flat SATA cable; if the chassis has none, +the kit in §0.1 is fitted here. 1. Unplug the power brick, then hold the power button for five seconds to drain it. @@ -169,12 +172,14 @@ drive **replaces** the 256 GB one; there is nowhere to fit both. 4. Take out both 8 GB SO-DIMMs and fit the two 16 GB ones. Each goes in at an angle until its gold edge is fully seated, then presses down until both clips click. -5. Take out the 256 GB SSD, fit the 1 TB one, and fasten it with the same - screw. **Keep the 256 GB drive with the machine's spare parts.** It holds - whatever the refurbisher installed. +5. Fit the 1 TB SATA SSD in the 2.5" tray, the tray in the bay, and its + flat cable to the board's SATA header, routed as the manual shows. Leave + the 256 GB M.2 where it is: it holds whatever the refurbisher installed + and becomes the boot disk when Proxmox is installed over it. 6. Close the case, power on, and enter the BIOS (F1 on ThinkCentres). -**You should see** 32768 MB (or 32 GB) of memory and the 1 TB NVMe drive. +**You should see** 32768 MB (or 32 GB) of memory and both drives, the +256 GB M.2 and the 1 TB SATA. **If you see 16 GB:** one module is not seated. Power off, unplug, and reseat it. **If you see no drive:** the SSD is not fully seated in its slot, or its From 34f910a7bc728333867ed1000ffe22fb3594d476 Mon Sep 17 00:00:00 2001 From: Garrett Allen <98648590+Gerrrt@users.noreply.github.com> Date: Fri, 16 Oct 2026 02:52:14 +0000 Subject: [PATCH 4/6] docs(runbook): install onto the M.2 and make the SATA SSD the range's ZFS pool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review on #1200: §1 still said "there is one disk" and took the installer defaults, which could leave the 1 TB SSD unused and guests on the boot disk. §1 now picks the M.2 as the install target, creates a single-disk ZFS pool named range on the SATA SSD and registers it as guest storage; §5 and §6 put every guest disk on it. Refs #421. Co-Authored-By: Claude Fable 5.1 --- docs/runbooks/build-the-playground.md | 34 ++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/docs/runbooks/build-the-playground.md b/docs/runbooks/build-the-playground.md index b510673d..a20f5f52 100644 --- a/docs/runbooks/build-the-playground.md +++ b/docs/runbooks/build-the-playground.md @@ -72,10 +72,30 @@ untagged VLAN 30. **No trunk, no tagged port** — ADR-0014 applies ADR-0007's constraint on `Saruman` to `ifrit` by name, and a VLAN-aware bridge here is listed as a reason to reopen that ADR. -Install Proxmox VE. Take the defaults; the only thing worth deciding at install -time is the filesystem, and there is one disk, so it is ext4 or a single-disk -ZFS root. ZFS is worth it here for one reason: the range's whole operating model -is snapshot and revert. +Install Proxmox VE **onto the 256 GB M.2, not the SATA SSD** +([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)). +At the installer's target-disk step pick the M.2 by name, which it shows as +the `nvme` device, and leave the SATA drive unselected. ext4 is enough for a +root disk that holds nothing the range churns; the snapshots happen on the +other drive. Take the defaults otherwise. + +Then make the SATA SSD the guest storage, because the installer does not. +From the node's shell, with the SSD's `by-id` name substituted: + +```bash +ls -l /dev/disk/by-id/ | grep -i ata- +zpool create -o ashift=12 range /dev/disk/by-id/ata- +pvesm add zfspool range --pool range --content images,rootdir --sparse 1 +pvesm status +``` + +**You should see** `range` active beside `local` and the M.2's own +`local-lvm`. A single-disk pool with no redundancy is the point: ADR-0017 +said "not a mirror", and the range is maintained by nobody. From here on, +**every template, the attack VM and every target gets its disk on `range`**: +pick it in the *Storage* field when creating each VM, and §6's `clean` +snapshot is then a ZFS snapshot on that pool. Nothing of the range goes on +the M.2. Record what you actually bought in [`hardware.md`](../hardware.md) — the CPU, the memory kit and the disk capacity are chosen at the till and written down @@ -372,6 +392,7 @@ has never fired is a rule nobody knows can. One VM, and it is the only guest with a leg on both bridges. +- **Its disk on `range`**, the SATA SSD's pool from §1, like every guest here. - **`net0` on `vmbr0`** — ImaginationLAN, DHCP from the pool. Nothing points at this address, so it does not get a reservation. - **`net1` on `vmbr1`** — `172.30.30.10/24`, **no gateway**. @@ -406,8 +427,9 @@ into the estate already need on `Saruman`. ## 6. The targets -Each target attaches to **`vmbr1` and nothing else**, takes a static address -from `172.30.30.100` upward, and has **no default route**. Every image insisting +Each target attaches to **`vmbr1` and nothing else**, keeps its disk on +**`range`** (§1), takes a static address from `172.30.30.100` upward, and has +**no default route**. Every image insisting on DHCP gets a static override before its first boot on the bridge — ADR-0017 declines to run a DHCP server here, because the obvious place to run one is the dual-homed VM, and a DHCP server that binds the wrong interface there is rogue From b6252c0407d1463e1878fe0b1b87e5350d4a1a67 Mon Sep 17 00:00:00 2001 From: Garrett Allen <98648590+Gerrrt@users.noreply.github.com> Date: Fri, 16 Oct 2026 03:01:34 +0000 Subject: [PATCH 5/6] docs(rack): the Tiny's bay tray and cable are in the chassis, so no kit row Checked 2026-10-16: ifrit's M80q has the 2.5" tray and its flat SATA cable fitted. The conditional roadmap row leaves, twelve rows to eleven with README following, and ADR-0096, hardware.md, the move runbook and the changelog entry say the parts are present rather than to be checked. Refs #421. Co-Authored-By: Claude Fable 5.1 --- README.md | 2 +- ...-range-disk-as-a-sata-ssd-in-the-tinys-bay.md | 16 +++++++--------- docs/changelog.md | 8 ++++---- docs/hardware.md | 7 ++++--- docs/roadmap.md | 1 - docs/runbooks/move-into-the-32u-rack.md | 6 +++--- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index df37923a..dfd7475f 100644 --- a/README.md +++ b/README.md @@ -399,7 +399,7 @@ is [`docs/changelog.md`](docs/changelog.md), dated and never rewritten. **Every purchase still outstanding is in one place**, the roadmap's [*Everything still to buy*](docs/roadmap.md#everything-still-to-buy): -12 items now, 0 later, and a rule that nothing joins them without a +11 items now, 0 later, and a rule that nothing joins them without a decision. This sentence used to carry the list itself, name three purchases coupled to the UPS work and omit the tier's host entirely, which is how one ProDesk came to be bought for two jobs. It names no current item for the diff --git a/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md b/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md index 0b968713..ff53b0ba 100644 --- a/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md +++ b/docs/adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md @@ -17,10 +17,10 @@ roadmap's purchase row therefore read "1 TB NVMe SSD", and the move runbook's That last sentence was wrong. Lenovo's PSREF sheet for the first-generation M80q gives its storage as "up to two drives, 1x 2.5" HDD + 1x M.2 SSD", the 2.5" bay on SATA 6 Gb/s. The bay takes a 2.5" SSD as readily as a disk, and -it is empty on a Tiny sold with an M.2 only. Whether the tray and its flat -SATA cable are in the chassis is not known until it is opened: Lenovo sells -them as the Tiny tray kit `5M10U50268` with the `00XL211` cable, and a -refurbished box may ship without them. +it is empty on a Tiny sold with an M.2 only. The tray and its flat SATA +cable are in this chassis, checked on 2026-10-16; a refurbished box can ship +without them, in which case Lenovo sells them as the Tiny tray kit +`5M10U50268` with the `00XL211` cable. The operator chose on 2026-10-16 to put the range disk in that bay as a SATA SSD rather than swap the M.2. @@ -43,9 +43,7 @@ activity is attack tooling, not storage benchmarking. - **The bay, not the slot.** The SATA SSD mounts in the Tiny's 2.5" tray and connects by the flat SATA cable to the board, as the M80q hardware - maintenance manual shows. If the chassis has no tray and cable, the Lenovo - kit `5M10U50268` with `00XL211` is bought with the drive; the roadmap - carries it as its own row, conditional on opening the case first. + maintenance manual shows. Both are in the chassis, so no kit is bought. - **Two drives, two jobs.** The 256 GB M.2 is the Proxmox boot and root disk; the 1 TB SATA SSD is the guest storage, where templates, the attack VM and the targets' disks live and are reverted. The boot disk is never part of @@ -56,8 +54,8 @@ activity is attack tooling, not storage benchmarking. ## Consequences -- `docs/roadmap.md`'s row becomes a 2.5" SATA SSD, with a second row for the - bay kit; [`hardware.md`](../hardware.md) and the two runbooks that fit and +- `docs/roadmap.md`'s row becomes a 2.5" SATA SSD; + [`hardware.md`](../hardware.md) and the two runbooks that fit and then use the drive say the same. The move runbook's §1.3 no longer swaps the M.2 and no longer keeps a 256 GB drive "with the spare parts". - The range's storage ceiling is SATA's. If a future exercise is ever diff --git a/docs/changelog.md b/docs/changelog.md index c019c150..b73cdcb0 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -27,10 +27,10 @@ docstring gives: it is a record, not a claim about now. a 2.5" SATA drive as well as one M.2. The operator chose SATA, so the 256 GB M.2 stays as the boot disk and the 1 TB SSD carries the guests. ADR-0017's *Disk* row is superseded and carries the note; its premise, - flash over spindles, stands. The roadmap row becomes a 2.5" SATA SSD and - gains a conditional row for the Tiny's tray kit, eleven rows to twelve, - since a refurbished box may ship without the tray and cable. The runbook's - §1.3 fits the drive in the bay instead of swapping the M.2. + flash over spindles, stands. The roadmap row becomes a 2.5" SATA SSD; the + bay's tray and cable are already in the chassis, checked the same day, so + no kit joins the table. The runbook's §1.3 fits the drive in the bay + instead of swapping the M.2. ## 2026-10-15 diff --git a/docs/hardware.md b/docs/hardware.md index 969f7db1..7df2f6d1 100644 --- a/docs/hardware.md +++ b/docs/hardware.md @@ -213,9 +213,10 @@ puts the range disk in the chassis's 2.5" bay as a SATA SSD, decided to buy: - 2 × 16 GB DDR4 SO-DIMM, replacing the 8 GB it ships with; -- a 1 TB 2.5" SATA SSD, for the range's guests and their snapshot reverts; -- the Tiny's 2.5" tray kit, Lenovo `5M10U50268` with the `00XL211` cable, - only if the chassis turns out to have none. Open it and look first. +- a 1 TB 2.5" SATA SSD, for the range's guests and their snapshot reverts. + +The bay's tray and its flat SATA cable are in the chassis, checked +2026-10-16, so no kit is needed. **A VGA card for optional port 1 was ordered on 2026-10-14** from Amazon: Lenovo FRU `01AJ935` (also sold as `5C50W00901`). It replaces the diff --git a/docs/roadmap.md b/docs/roadmap.md index 52c76dc9..d26109a4 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -363,7 +363,6 @@ the VESA mount, `trinity`'s ProDesk tray and the velcro, and since | 8 × 16 GB DDR4 RDIMM, dual-rank, matched to a fitted stick's label (2Rx4 or 2Rx8, PC4-2400) | `Saruman`, 128 GB to 256 GB, one more per channel on both CPUs | The operator, 2026-10-13: headroom | In the #919 window, while the DL360 is out of the rack | | 2 × 16 GB DDR4 SO-DIMM kit | `ifrit`, replacing the 8 GB it shipped with | [ADR-0017](adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md): 32 GB socketed | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | | 1 TB 2.5" SATA SSD | `ifrit`'s range and its snapshot reverts, in the Tiny's 2.5" bay; the 256 GB M.2 stays as the boot disk | [ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md), 2026-10-16 | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | -| Tiny 2.5" bay kit: Lenovo tray `5M10U50268` with the `00XL211` SATA cable | `ifrit`'s bay, only if the chassis has none: open the case and look before buying | [ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md) | With the SSD above | **The last one, bought 2026-10-05:** `ifrit`, the range host — a quiet SFF box with flash storage, two socketed DIMM slots with 32 GB fitted, one NIC diff --git a/docs/runbooks/move-into-the-32u-rack.md b/docs/runbooks/move-into-the-32u-rack.md index c5bf89ea..a93af6d5 100644 --- a/docs/runbooks/move-into-the-32u-rack.md +++ b/docs/runbooks/move-into-the-32u-rack.md @@ -86,7 +86,7 @@ ones not yet on hand are also in the roadmap's | 1U vented blank | 1 | U22, the air gap over the CRS326 | | Adjustable 1U four-post support rails, a pair, spanning 29": Rack Solutions 1UKIT-109 | 2 | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | | 2 × 16 GB DDR4 SO-DIMM (DDR4-2933 or faster) | 1 kit | `ifrit` | -| 1 TB 2.5" SATA SSD, plus the Tiny's tray kit (`5M10U50268` with `00XL211`) if the chassis has none | 1 | `ifrit`, in the 2.5" bay beside its 256 GB M.2 ([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)) | +| 1 TB 2.5" SATA SSD | 1 | `ifrit`, in the 2.5" bay beside its 256 GB M.2 ([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)) | | Factory-made Cat6 patch cables, short | a pack | Every switch-to-panel run. The XB7-to-`morpheus` cable is [#923](https://github.com/Gerrrt/HomeLab/issues/923)'s, fitted before the window rather than in it | | Spare M6 cage nuts and screws | 1 pack | Frames never ship with enough | | 16 GB DDR4 RDIMM, dual-rank, matched to a fitted stick's label | 8 | `Saruman`, to 256 GB: fitted in §6 while it is out of the rack ([`hardware.md`](../hardware.md#compute)) | @@ -159,8 +159,8 @@ The M80q (first generation) takes **DDR4-2666/2933 SO-DIMMs, two slots, 2.5" SATA bay** (6 Gb/s). The other M.2 slot is for Wi-Fi. This is from Lenovo's PSREF spec sheet. The 1 TB SATA SSD goes in the bay and the 256 GB M.2 stays as the boot disk ([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)). -The bay needs Lenovo's tray and flat SATA cable; if the chassis has none, -the kit in §0.1 is fitted here. +The bay's tray and flat SATA cable are already in the chassis, checked +2026-10-16. 1. Unplug the power brick, then hold the power button for five seconds to drain it. From c4da530e1e4f78d8acd926365c11b565bc94ab30 Mon Sep 17 00:00:00 2001 From: Garrett Allen <98648590+Gerrrt@users.noreply.github.com> Date: Thu, 15 Oct 2026 21:10:42 -0700 Subject: [PATCH 6/6] docs(rack): buy 2U four-post rails for mjolnir, and retire two rows already on hand (#1201) --- README.md | 2 +- docs/changelog.md | 10 ++++++++++ docs/hardware.md | 6 ++++-- docs/roadmap.md | 9 +++++---- docs/runbooks/move-into-the-32u-rack.md | 11 ++++++----- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index dfd7475f..3c6ada2c 100644 --- a/README.md +++ b/README.md @@ -399,7 +399,7 @@ is [`docs/changelog.md`](docs/changelog.md), dated and never rewritten. **Every purchase still outstanding is in one place**, the roadmap's [*Everything still to buy*](docs/roadmap.md#everything-still-to-buy): -11 items now, 0 later, and a rule that nothing joins them without a +10 items now, 0 later, and a rule that nothing joins them without a decision. This sentence used to carry the list itself, name three purchases coupled to the UPS work and omit the tier's host entirely, which is how one ProDesk came to be bought for two jobs. It names no current item for the diff --git a/docs/changelog.md b/docs/changelog.md index b73cdcb0..cb232fdd 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -19,6 +19,16 @@ docstring gives: it is a record, not a claim about now. ## 2026-10-16 +- **`mjolnir` gets 2U four-post rails, and two bought rows leave the table** + ([#919](https://github.com/Gerrrt/HomeLab/issues/919)). The rails the UPS + sits on now sag under it; `hardware.md` had already said it needs rear + support. A 2U four-post pair rated above its weight joins *Everything + still to buy*, Rack Solutions 2UKIT-109 named for its 10–31.75" range, + 75 lb rating and 18-gauge steel, and the move runbook racks the UPS on + them and leaves the old rails out. The short patch leads in the VLAN + colours and the spare M6 cage nuts leave the table: the operator already + has both. Eleven rows become ten. + - **`ifrit`'s range disk is a SATA SSD in the Tiny's bay, not an NVMe swap** ([ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md), [#421](https://github.com/Gerrrt/HomeLab/issues/421)). The move runbook had diff --git a/docs/hardware.md b/docs/hardware.md index 7df2f6d1..e00b49a5 100644 --- a/docs/hardware.md +++ b/docs/hardware.md @@ -81,7 +81,9 @@ the table below. **It is set to 29" post to post**, the old 9U frame's depth, measured 2026-10-12. The DL360's rails and the TP-Link's shelf already fit that spacing. The DL360 Gen9 is about 70 cm (27.5") deep, the deepest thing here, -and its rails need four posts. The UPS needs rear support. Open frame suits a +and its rails need four posts. The UPS needs rear support, and the rails it +sits on now sag under it, so a 2U four-post pair rated above its weight is +to buy, decided 2026-10-16. Open frame suits a fanless switch. Any four-post shelf bought new must fit a 29"-deep rack, which its listing states, and bolt to both posts without forcing. @@ -126,7 +128,7 @@ CRS326 with them. | U5–U9 | `smaug`, the TS150, on its side on a four-post shelf | Heavy, so low. Off its long cord: on the PDU directly | | U4 | 10-outlet PDU | Fed by the UPS, close to it, so the cords are short | | U3 | HPE ProLiant DL360 Gen9 (`shiva`/`Saruman`) | Heavy and deep, so low | -| U1–U2 | APC Smart-UPS X 1500 (`mjolnir`) | Heaviest, at the bottom | +| U1–U2 | APC Smart-UPS X 1500 (`mjolnir`) | Heaviest, at the bottom, on new 2U four-post rails: the ones it has sag, decided 2026-10-16 | Twenty-nine units are used and three are left as gaps (U11, U13, U17), so there is no headroom for another server. If the rack runs out, the 1U diff --git a/docs/roadmap.md b/docs/roadmap.md index d26109a4..5613bbb8 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -347,8 +347,10 @@ ADR set; its last two rows are what it still needs. On 2026-10-13 the move into the 32U rack ([#919](https://github.com/Gerrrt/HomeLab/issues/919)) put its parts here, which had been listed only in its runbook's §0.1, and `Saruman`'s memory joined them. Already on hand, so not listed: the frame, -the VESA mount, `trinity`'s ProDesk tray and the velcro, and since -2026-10-15 the keyboard drawer and `ifrit`'s Tiny mount, both mounted. +the VESA mount, `trinity`'s ProDesk tray and the velcro; since 2026-10-15 +the keyboard drawer and `ifrit`'s Tiny mount, both mounted; and since +2026-10-16 the short patch leads in the VLAN colours and the spare M6 cage +nuts, which the operator already had. | Item | For | Decided by | When it is needed | | --- | --- | --- | --- | @@ -357,9 +359,8 @@ the VESA mount, `trinity`'s ProDesk tray and the velcro, and since | 1U horizontal cable manager | U20, between switch and panel | [`hardware.md`](hardware.md#planned-a-32u-rack) | Before the #919 window | | 1U vented blank | U22, the air gap over the CRS326 | [`hardware.md`](hardware.md#planned-a-32u-rack) | Before the #919 window | | 2 × pair of adjustable 1U four-post support rails, spanning 29" post to post. Rack Solutions 1UKIT-109 fits: 10–31.5", 45 lb, with a cabling crossbar | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | The operator, 2026-10-15; the kit chosen 2026-10-16 | Before the #919 window | +| 2U four-post rail pair rated above the UPS's weight. Rack Solutions 2UKIT-109 fits: 10–31.75", 75 lb, 18-gauge, with a cabling crossbar | `mjolnir` at U1–U2: the rails it sits on now sag under it | The operator, 2026-10-16 | Before the #919 window | | One factory-made Cat6 patch cable, long enough for the run | The XB7's striped 2.5G port to `morpheus`'s `em0`, replacing the hand-crimped patch | [#923](https://github.com/Gerrrt/HomeLab/issues/923) | Now: it should not wait for the move | -| Short factory-made Cat6 patch cables, a pack, in the ADR-0009 VLAN colours | Switch to patch panel in the new rack | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §6.1 | Before the #919 window | -| Spare M6 cage nuts and screws, a pack | The frame | [`move-into-the-32u-rack.md`](runbooks/move-into-the-32u-rack.md) §0.1 | Before the #919 window | | 8 × 16 GB DDR4 RDIMM, dual-rank, matched to a fitted stick's label (2Rx4 or 2Rx8, PC4-2400) | `Saruman`, 128 GB to 256 GB, one more per channel on both CPUs | The operator, 2026-10-13: headroom | In the #919 window, while the DL360 is out of the rack | | 2 × 16 GB DDR4 SO-DIMM kit | `ifrit`, replacing the 8 GB it shipped with | [ADR-0017](adr/0017-buy-ifrit-for-iops-and-keep-the-range-disposable.md): 32 GB socketed | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | | 1 TB 2.5" SATA SSD | `ifrit`'s range and its snapshot reverts, in the Tiny's 2.5" bay; the 256 GB M.2 stays as the boot disk | [ADR-0096](adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md), 2026-10-16 | Before [`build-the-playground.md`](runbooks/build-the-playground.md) §1 | diff --git a/docs/runbooks/move-into-the-32u-rack.md b/docs/runbooks/move-into-the-32u-rack.md index a93af6d5..7e295ad7 100644 --- a/docs/runbooks/move-into-the-32u-rack.md +++ b/docs/runbooks/move-into-the-32u-rack.md @@ -85,15 +85,16 @@ ones not yet on hand are also in the roadmap's | 1U horizontal cable manager | 1 | U20 | | 1U vented blank | 1 | U22, the air gap over the CRS326 | | Adjustable 1U four-post support rails, a pair, spanning 29": Rack Solutions 1UKIT-109 | 2 | The keyboard drawer at U24 and `ifrit`'s Tiny tray at U18: both front-mounted, both wobble with every ear screw tight | +| 2U four-post rail pair, rated above the UPS's weight: Rack Solutions 2UKIT-109 | 1 | `mjolnir`, U1–U2. The rails it sits on now sag and stay behind | | 2 × 16 GB DDR4 SO-DIMM (DDR4-2933 or faster) | 1 kit | `ifrit` | | 1 TB 2.5" SATA SSD | 1 | `ifrit`, in the 2.5" bay beside its 256 GB M.2 ([ADR-0096](../adr/0096-fit-ifrits-range-disk-as-a-sata-ssd-in-the-tinys-bay.md)) | -| Factory-made Cat6 patch cables, short | a pack | Every switch-to-panel run. The XB7-to-`morpheus` cable is [#923](https://github.com/Gerrrt/HomeLab/issues/923)'s, fitted before the window rather than in it | -| Spare M6 cage nuts and screws | 1 pack | Frames never ship with enough | | 16 GB DDR4 RDIMM, dual-rank, matched to a fitted stick's label | 8 | `Saruman`, to 256 GB: fitted in §6 while it is out of the rack ([`hardware.md`](../hardware.md#compute)) | The current shelf for the TP-Link, `morpheus`'s tray, the KVM, the PDU, the -patch panel, the UPS's rack mount, the DL360's rails and the CRS326 all move -over. +patch panel, the DL360's rails and the CRS326 all move over. The UPS's +present rails do not: they sag under it, and the 2U pair above replaces +them. The short patch leads in the VLAN colours and the spare cage nuts are +already on hand. ### 0.2 Checklist @@ -356,7 +357,7 @@ units (§1.2), then the next one up. | Order | U | Device | Notes | | --- | --- | --- | --- | -| 1 | U1–U2 | UPS, on its rack mount | Battery pack back in once it is seated. Do not plug it into the wall yet | +| 1 | U1–U2 | UPS, on its new 2U four-post rails, both posts | The rails it sat on before stay out: they sag. Battery pack back in once it is seated. Do not plug it into the wall yet | | 2 | U3 | DL360 | **First, on the floor, its eight new RDIMMs**: lid off, wrist strap on, one more per channel in the slots the lid's diagram marks for each CPU's second DIMM per channel. Then rails, at U3 on all four posts, and slide the server in until it clicks | | 3 | U4 | PDU | Its plug goes to the UPS | | 4 | U5–U9 | `smaug` on its side, on its four-post shelf | The shelf at U5, then the tower on it, on a side with no vents. About 1.5" stays clear above it |