diff --git a/public/404.html b/public/404.html index 5bb5c96..229bc13 100644 --- a/public/404.html +++ b/public/404.html @@ -1,448 +1,6 @@ - - - - - - - - - - 404 Page not found · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- -

Page Not Found 😕

-

- Error 404 -

-
-

It seems that the page you've requested does not exist.

-
- - -
- - -
- - - +404 Page not found · N.E.E.T. Works +
Skip to main content

Page Not Found 😕

Error 404

It seems that the page you've requested does not exist.

\ No newline at end of file diff --git a/public/authors/index.html b/public/authors/index.html index a62b26c..6e19c0d 100644 --- a/public/authors/index.html +++ b/public/authors/index.html @@ -1,492 +1,6 @@ - - - - - - - - - - Authors · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - - - -
- -

Authors

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - - -
- -
- - - - - - -
- - -
- - - +Authors · N.E.E.T. Works +
Skip to main content

Authors

\ No newline at end of file diff --git a/public/authors/index.xml b/public/authors/index.xml index 6532cd9..4eee5eb 100644 --- a/public/authors/index.xml +++ b/public/authors/index.xml @@ -1,15 +1 @@ - - - - Authors on N.E.E.T. Works - https://blog.neet.works/authors/ - Recent content in Authors on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - - - - +Authors on N.E.E.T. Workshttps://blog.neet.works/authors/Recent content in Authors on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* \ No newline at end of file diff --git a/public/categories/diy/index.html b/public/categories/diy/index.html index c27198e..f8c7eea 100644 --- a/public/categories/diy/index.html +++ b/public/categories/diy/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Diy · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Diy

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Diy · N.E.E.T. Works +
Skip to main content

Diy

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/categories/diy/index.xml b/public/categories/diy/index.xml index 779d620..72fc726 100644 --- a/public/categories/diy/index.xml +++ b/public/categories/diy/index.xml @@ -1,25 +1 @@ - - - - Diy on N.E.E.T. Works - https://blog.neet.works/categories/diy/ - Recent content in Diy on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Diy on N.E.E.T. Workshttps://blog.neet.works/categories/diy/Recent content in Diy on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/categories/diy/page/1/index.html b/public/categories/diy/page/1/index.html index 82b4545..8ff66a5 100644 --- a/public/categories/diy/page/1/index.html +++ b/public/categories/diy/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/categories/diy/ - - - - - - +https://blog.neet.works/categories/diy/ + \ No newline at end of file diff --git a/public/categories/homelab/index.html b/public/categories/homelab/index.html index 7348c5f..cb8d86f 100644 --- a/public/categories/homelab/index.html +++ b/public/categories/homelab/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Homelab · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Homelab

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Homelab · N.E.E.T. Works +
Skip to main content

Homelab

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/categories/homelab/index.xml b/public/categories/homelab/index.xml index 84117c5..5880b74 100644 --- a/public/categories/homelab/index.xml +++ b/public/categories/homelab/index.xml @@ -1,25 +1 @@ - - - - Homelab on N.E.E.T. Works - https://blog.neet.works/categories/homelab/ - Recent content in Homelab on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Homelab on N.E.E.T. Workshttps://blog.neet.works/categories/homelab/Recent content in Homelab on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/categories/homelab/page/1/index.html b/public/categories/homelab/page/1/index.html index a63bfe2..5056a0d 100644 --- a/public/categories/homelab/page/1/index.html +++ b/public/categories/homelab/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/categories/homelab/ - - - - - - +https://blog.neet.works/categories/homelab/ + \ No newline at end of file diff --git a/public/categories/index.html b/public/categories/index.html index 826b6d6..661ceaf 100644 --- a/public/categories/index.html +++ b/public/categories/index.html @@ -1,556 +1,14 @@ - - - - - - - - - - Categories · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - - - -
- -

Categories

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - - -
- -
-

- Diy - - · - - 1 - - -

-
- - - - - - - -
- - - - - - -
- - -
- - - +Categories · N.E.E.T. Works +
Skip to main content

Categories

\ No newline at end of file diff --git a/public/categories/index.xml b/public/categories/index.xml index 666cd8b..049f3cb 100644 --- a/public/categories/index.xml +++ b/public/categories/index.xml @@ -1,55 +1 @@ - - - - Categories on N.E.E.T. Works - https://blog.neet.works/categories/ - Recent content in Categories on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Diy - https://blog.neet.works/categories/diy/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/categories/diy/ - - - - - - Homelab - https://blog.neet.works/categories/homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/categories/homelab/ - - - - - - Servers - https://blog.neet.works/categories/servers/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/categories/servers/ - - - - - - Watercooling - https://blog.neet.works/categories/watercooling/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/categories/watercooling/ - - - - - - +Categories on N.E.E.T. Workshttps://blog.neet.works/categories/Recent content in Categories on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Diyhttps://blog.neet.works/categories/diy/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/categories/diy/Homelabhttps://blog.neet.works/categories/homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/categories/homelab/Servershttps://blog.neet.works/categories/servers/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/categories/servers/Watercoolinghttps://blog.neet.works/categories/watercooling/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/categories/watercooling/ \ No newline at end of file diff --git a/public/categories/servers/index.html b/public/categories/servers/index.html index 2888f45..3f2320e 100644 --- a/public/categories/servers/index.html +++ b/public/categories/servers/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Servers · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Servers

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Servers · N.E.E.T. Works +
Skip to main content

Servers

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/categories/servers/index.xml b/public/categories/servers/index.xml index f7ac940..e8b091b 100644 --- a/public/categories/servers/index.xml +++ b/public/categories/servers/index.xml @@ -1,25 +1 @@ - - - - Servers on N.E.E.T. Works - https://blog.neet.works/categories/servers/ - Recent content in Servers on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Servers on N.E.E.T. Workshttps://blog.neet.works/categories/servers/Recent content in Servers on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/categories/servers/page/1/index.html b/public/categories/servers/page/1/index.html index acefb8c..8c60512 100644 --- a/public/categories/servers/page/1/index.html +++ b/public/categories/servers/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/categories/servers/ - - - - - - +https://blog.neet.works/categories/servers/ + \ No newline at end of file diff --git a/public/categories/watercooling/index.html b/public/categories/watercooling/index.html index a669a45..e0ae7a7 100644 --- a/public/categories/watercooling/index.html +++ b/public/categories/watercooling/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Watercooling · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Watercooling

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Watercooling · N.E.E.T. Works +
Skip to main content

Watercooling

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/categories/watercooling/index.xml b/public/categories/watercooling/index.xml index 431e1df..7d9ac23 100644 --- a/public/categories/watercooling/index.xml +++ b/public/categories/watercooling/index.xml @@ -1,25 +1 @@ - - - - Watercooling on N.E.E.T. Works - https://blog.neet.works/categories/watercooling/ - Recent content in Watercooling on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Watercooling on N.E.E.T. Workshttps://blog.neet.works/categories/watercooling/Recent content in Watercooling on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/categories/watercooling/page/1/index.html b/public/categories/watercooling/page/1/index.html index e3e8212..7c0b4e3 100644 --- a/public/categories/watercooling/page/1/index.html +++ b/public/categories/watercooling/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/categories/watercooling/ - - - - - - +https://blog.neet.works/categories/watercooling/ + \ No newline at end of file diff --git a/public/index.html b/public/index.html index 2f255e1..345c670 100644 --- a/public/index.html +++ b/public/index.html @@ -1,787 +1,18 @@ - - - - - - - - - - - N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - - -
-
-
-
-
-
- - - - - - - - - -
-
-
-
- -
-
- - - - - - - - - - rawhide kobayashi - - -

- rawhide kobayashi -

- -

- beep-boop maggot! -

- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
-
-
-
-
-
-
- - - - - - -

Recent

- - - - - - - - - - - - - - - - -
- - - - - -
- - -
- - - +N.E.E.T. Works +
Skip to main content
rawhide kobayashi

rawhide kobayashi

beep-boop maggot!

Recent

\ No newline at end of file diff --git a/public/index.json b/public/index.json index e1db3a1..34020ad 100644 --- a/public/index.json +++ b/public/index.json @@ -1,2 +1 @@ - [{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/alphacool/","section":"Tags","summary":"","title":"Alphacool","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/aqua-computer/","section":"Tags","summary":"","title":"Aqua Computer","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/arduino/","section":"Tags","summary":"","title":"Arduino","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/categories/diy/","section":"Categories","summary":"","title":"Diy","type":"categories"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/categories/homelab/","section":"Categories","summary":"","title":"Homelab","type":"categories"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/intel/","section":"Tags","summary":"","title":"Intel","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/","section":"N.E.E.T. Works","summary":"","title":"N.E.E.T. Works","type":"page"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/nvidia/","section":"Tags","summary":"","title":"Nvidia","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/categories/servers/","section":"Categories","summary":"","title":"Servers","type":"categories"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/supermicro/","section":"Tags","summary":"","title":"Supermicro","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"January 16 2025","externalUrl":null,"permalink":"/categories/watercooling/","section":"Categories","summary":"","title":"Watercooling","type":"categories"},{"content":" Overview # I\u0026rsquo;ve been watercooling my desktop since 2020, and case modding custom cooling solutions since my first modern dGPU in 2012. I enjoy it for the aesthetic, as well as the ability to run my hardware to the redline, despite the lower gains that modern hardware has\u0026hellip; It\u0026rsquo;s still fun to try and see how high you can get on benchmark scoreboards. It was a big initial investment, but with most parts being reusable, the ongoing cost for component upgrades are minimal. Early in 2024, I bought some GPUs to use for dedicated ML tasks in my server rack, and immediately had watercooling on the mind. There weren\u0026rsquo;t particularly strong reasons to do so, but it would lower the power usage a bit, give me some more VRAM overclocking headroom, and give me a bit more core clock stability, as well as the ability to use a cheap two-slot NVLINK connector without suffocating a GPU.\nMy initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40. I\u0026rsquo;ve never had a leak on my desktop, but with wider temperature swings in my garage, and collectively, a whole lot more expensive hardware that might get damaged than compared to my desktop setup, I was hesitant. The benefits seemed minimal, and I considered it a fun what-if scenario until I upgraded my main server and discovered that the forced-air passive chassis cooling was insufficient for my new CPUs. At that point, I had to make a decision: Get better heatsinks, which would be single-purpose and cost in excess of $100 each, or whole rack watercooling. I chose whole rack watercooling.\nWith enough reason for me to go ahead with the project, and the only thing holding me back being a fear of leaks, I had to figure out how to actively monitor for, and preferably prevent such an eventuality. I happened upon a product called LEAKSHIELD, from Aqua Computer, that advertised itself as doing exactly that.\nHow does it work? You pull a vacuum inside the fluid loop and monitor the loss rate. Water can\u0026rsquo;t get out if air is trying to get in, and if air gets in, the vacuum is reduced. It\u0026rsquo;s so simple, I don\u0026rsquo;t know why it took this long for such a product to enter the PC watercooling space. I could have just bought a LEAKSHIELD and called it a day, but Aqua Computer\u0026rsquo;s software doesn\u0026rsquo;t support Linux, and the specs for the vacuum pump seemed a bit weak for a loop of my scale. But, its functionality was something I was confident I could emulate with more robust off-the-shelf parts. Thus, sufficiently armed with esoteric plumbing knowledge, I took the plunge and started loading up on parts.\nThe Hardware # Most of the build uses pretty standard off-the-shelf parts for PC watercooling, but there are a few bits and pieces that most builders won\u0026rsquo;t have seen before, and a custom control system that offers a more relevant experience for a server rack. The control system is based on an Arduino Uno that feeds vital statistics over serial, and features pressure control and monitoring similar to the LEAKSHIELD, with fan control based on a PID algorithm keeping the water temperature at a fixed setpoint above ambient.\nOff-the-shelf # General Details # The centerpiece of the build, which the control unit and pump mount to, is the \u0026ldquo;MOther of all RAdiators\u0026rdquo;, version 3, from Watercool. This is the 360mm version with support for up to 18x 120mm fans, or 8x 180mm fans. It\u0026rsquo;s constructed more in the spirit of a vehicle radiator than a traditional PC radiator, with a less restrictive fin stack and large, round tubes rather than thin rectangular ones. It provides several mounting points for accessories which I was able to utilize to secure it to my server rack in a satisfactorily sturdy fashion. An in-depth teardown on the construction method and material quality of the MO-RA can be found on igor\u0026rsquo;sLAB. For fans, I have a collection of old DC-control Corsair Air Series SP120s. They\u0026rsquo;ve all been retired from regular use, because of noise-related aging issues. In fact, one of them failed to turn at all once I had everything wired up, and another had its bearing disintegrate about 8 weeks after putting the thing into service. That being said, they did survive (and continue to survive, in the remaining 16 cases) 24/7 use for anywhere from 4-10 years, at bottom of the barrel pricing, so that\u0026rsquo;s not too bad. I\u0026rsquo;m not exactly pushing the limits of this radiator here, so a few fans breaking down over time isn\u0026rsquo;t the end of the world.\nA MO-RA V3 360 PRO PC Watercooling Radiator from Watercool I got a secondhand Corsair XD5 pump/res combo from eBay for about sixty bucks, which is pretty good for a genuine D5-based pump/res combo. It has PWM support which I did wire up, but the flow ended up being rather anemic even at 100%, so I just run it full speed all the time. The flow rate is measured through an Aqua Computer flow sensor, which is simply a hall-effect tachometer translated to l/h through software. I did not attempt to verify the accuracy of the sensor in my setup. The absolute accuracy is less relevant than simply getting an overall idea of whether or not the measurement is consistent with flow behavior, which it is.\nSimple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans. CPUs # My thermally problematic server upgrade was to dual Xeon Gold 6154s, which are Skylake-SP architecture. This specific SKU is pretty beefy, with 18 cores at sustained all-core speeds of 3.7GHz SSE / 3.3GHz AVX2 / 2.7GHz AVX512, and a TDP of 200 watts. The rated tjmax was 105C, and with the chassis cooling, they readily met that and started throttling under all-core loads, with idle as high as 60-70*C. I previously had Xeon E5-2697 v2s, which had TDPs of 130w. They got toasty, but never throttled. I\u0026rsquo;m not sure if the chassis had any easy fan upgrades available that might have made a difference, and I certainly could have moved to 4u-compatible tower coolers rather than forced air, but since I wanted to watercool the GPUs anyway, adding the CPUs as well would be minimal cost/effort, with more future compatibility for the waterblocks compared to a specialized LGA3647 tower cooler.\nAlphacool Eisblock XPX Pro coldplate Image credit \u0026amp; copyright - igor\u0026rsquo;sLAB The CPU waterblocks are Alphacool Eisblock XPX Pro Aurora Light models, which are significantly cheaper than the XPX Aurora Pro not-light version. They appear to be entirely identical, functionally\u0026hellip; I\u0026rsquo;m not sure if there any actual performance benefits offered by the not-light version. It\u0026rsquo;s a relatively obscure block family without many thorough reviews, which makes sense, given this block is designed for full coverage on Xeons/Threadrippers. The coldplate appears to be skived, which is uncommon in this price bracket for a discrete block, and the fins are incredibly short and dense. In smaller desktop loops, I\u0026rsquo;ve seen this block criticized for having overly restrictive flow, but when you have four blocks + quick disconnects, \u0026ldquo;good\u0026rdquo; flow is relative. At the power limit of 200w, the maximum core temperature delta relative to the water temperature is 25*C, with a ~1-2*C average delta between the two serially-connected sockets at a flow rate of ~130L/h, and that\u0026rsquo;s more than sufficient.\nInterior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components. GPUs # The GPU blocks are Phanteks 2080 Ti Founder\u0026rsquo;s Edition blocks. Nothing special, they\u0026rsquo;re just the cheapest matching ones I could find in 2024 that looked like they\u0026rsquo;d fit these almost-reference-but-not-quite OEM cards. They\u0026rsquo;re generic OEM models that would have gone in prebuilts. The most interesting thing about these cards, is that they\u0026rsquo;ve been modded to have 22GB of VRAM. There\u0026rsquo;s a dedicated supplier still offering them, and it\u0026rsquo;s by far the best $/GB value for VRAM in modern NVIDIA GPUs.1 Whether or not this is a better value overall than, say, a 3090 (Ti) depends on your usecase. Performance improvements in ML tasks between the 2080 Ti and 3090 (Ti) range from as little as ~20% to as much as ~100% depending on how memory bandwidth constrained your workload is. With secondhand 3090 (Ti)s still going for minimum $700 on the used market in the US, I found the alternative 2080 Ti option to be more alluring for my usecase, which is primarily single image super-resolution. More VRAM is desirable to increase the size of tiles for inference, and to increase the batch size during training. Training speed scales almost linearly, and inference speed scales linearly, per GPU. So, for my usecase, where I\u0026rsquo;m not really limited by the performance of a single GPU, the 2080 Ti mod route offers better overall value both for VRAM and combined core performance compared to 3090 (Ti)s. The idea of having a modded GPU in itself was also appealing and definitely part of why I made that decision. Pulling up a hardware monitor and seeing a 2080 Ti with 22GB of VRAM feels a little bit naughty, and I like that.\nThe blocks installed in an ASUS prebuilt gaming tower. I did initially buy three of them, as pictured at the beginning of this post, but one of them failed just after the 30 day warranty period listed on their website. Despite that, they were kind enough to offer a full refund if I covered return shipping, and were very communicative and responded in \u0026lt;24 hours every time I sent them any kind of message/inquiry.\nThe biggest benefit that watercooling theoretically brings to modern video cards is a prolonged lifespan. Not due to lower core temperatures,2 in an absolute sense, but due to the reduced stress from thermal cycles. Mismatches in the rate of thermal expansion between the die and the substrate will eventually cause their bond to break, and this happens faster the larger your die is, and the more extreme the temperature differences are. Today\u0026rsquo;s GPU dies are huge, and it\u0026rsquo;s hard to say how many failures are attributable to this factor alone, but it is certain to be more of a risk than it has been in the past. I\u0026rsquo;d rather buy a used mining GPU than a used gaming GPU any day, because it has likely been kept at roughly the same temperature for most of its life, as opposed to experiencing wide periodic swings.\nThe GPU blocks required a moderate amount of light massaging to properly fit on these OEM model cards. The power plugs are in a different position and a singular capacitor on these models is slightly taller than on the actual Founder\u0026rsquo;s Edition reference card, but they\u0026rsquo;re otherwise close enough to identical. That\u0026rsquo;s not to say that there are no benefits from lowering the operating temperature. As an absolute value, within manufacturer limits, it affects boost clocks, and leakage current. A cooler chip will use less power to run at the same clock speed compared to a hotter chip due to reduced leakage current, making them measurably more energy efficient per clock cycle the colder they run. In my case, with the fan on max, while not thermal throttling, these GPUs would bounce off the power limit of 280w while attempting to hit a core clock of 1800MHz. Under water, at a reported core temperature of ~30*C, the reported board power draw is only ~220w at 1800MHz3 core clock for the same workload. The type of fan typically found in these coolers is rated anywhere from 15-30w on its own, so a reduction of at least 30w can likely be attributed to a lower leakage current.\nDIY Time # In no particular order, here is a list of the major components involved in the control system.\nGeneric metal box, formerly from a PBX system. Arduino Uno clone, unknown brand 60mm Corsair fan RS232 TTL shifter Aesthetic retro power switch 12v DC vacuum pump U.S. Solid 12V NC Solenoid 12v relay modules HX711 ADC MD-PS002 Absolute Pressure Sensors L298-like PWM motor driver Apple White iMac PSU Adafruit Arduino Uno Proto Shield DS18B20 temperature probes Fit check for all the major components. I didn\u0026rsquo;t take excruciatingly detailed pictures of every single step of the assembly/prototyping process. For the most part, I was just plugging pre-made components together. The most interesting production notes include the pressure sensor and the power supply.\nPutting New Life into an iMac PSU # The power supply I used is from a first-gen Intel White iMac, which is visually very similar to the G5. It was one of the earliest things that I installed Linux on, and I used it as a seedbox for a bit, but eventually took it apart and saved some of the more interesting stuff.\nAll the credit goes to the user ersterhernd, from this thread on the tonymacx86.com forum for figuring out the pinout of this PSU, which is almost entirely identical to the one that was in my unit, apart from the power rating on mine being 200w. There are two banks of pins, half of which are always on, half of which are toggleable. Each bank has 12v, 5v, and 3.3v. I didn\u0026rsquo;t end up using 3.3v for anything other than the power switch. I have no idea what the energy efficiency of this unit is, obviously it doesn\u0026rsquo;t have an 80+ certification\u0026hellip; But I\u0026rsquo;m assuming that Apple would make it at least halfway decent. Hopefully more efficient than a random 12v power brick with additional converters, I\u0026rsquo;d hope.\nMy schematic for the control unit. It was the first time I\u0026rsquo;ve ever used KiCad, and the first time I\u0026rsquo;ve ever made a schematic like this at all. I hope it\u0026rsquo;s relatively legible. As you can see in the schematic above, the always-on 3.3v pin is connected to SYS_POWERUP through a relay board. The relay input is pulled low by a single pole switch, which turns the relay on, which connects ground to SYS_POWERUP, engaging the other rail of the power supply. This is kind of a convoluted solution to not having a double-pole switch\u0026hellip; But I didn\u0026rsquo;t have a double-pole switch, so that\u0026rsquo;s what I did.\nMeasuring vacuum # The leak-resisting aspect all hinges on monitoring the pressure of the loop\u0026hellip; Or potentially running a vacuum pump constantly, but that\u0026rsquo;s stupid. For some reason, I had a really hard time finding a vacuum pressur sensor. There are plenty of physical, analogue vacuum gauges available, but as far as an electronic sensor\u0026hellip; I just couldn\u0026rsquo;t find any located in the US, at a reasonable price. There were a few hobbyist grade differential sensors, but I wanted to be able to measure down to an almost complete vacuum, and they didn\u0026rsquo;t have the range. Maybe I had the wrong search terms, but I just wasn\u0026rsquo;t finding anything. Eventually I found an unpackaged sensor with obscure, not entirely legible datasheets that claimed to have an acceptable pressure range for my application. The MD-PS002 is what I settled on, available on Amazon in the US in a 2-pack for $8. It\u0026rsquo;s a tiny little thing, and it took two attempts to successfully create a sensor package that didn\u0026rsquo;t leak.\nSensor package details, installed and all gooped up. I drilled a hole in a G1/4\u0026quot; plug, just slightly bigger than the metal ring on the sensor, coated that ring with J-B Weld, and inserted it, letting it cure before grinding away the exterior of the top of the plug and building up more J-B weld to add some strain relief for the wires as well as edge-to-edge sealing. The current vacuum loss rate, after running the system for a few months, allowing the loop to very thoroughly de-gas, is now less than 50mbar per day at -500 to -600mbar. I was slightly worried about the lifetime of the pump, given it\u0026rsquo;s a cheap thing from Amazon, but given it only has to run for about a second every 2-3 days, I imagine that won\u0026rsquo;t be an issue.\nHere\u0026rsquo;s a quick video showing the system not leaking!\nThis pressure sensor is a wheatstone bridge, which works the same way as load cells for digital scales. The resistance changes are very, very low, thus the signal must be amplified before being fed into an ADC. You could use an op-amp, and feed that signal into an analog input on the Arduino, but I felt more comfortable using the HX711, a two-channel ADC with integrated amplifier designed to be used with wheatstone bridge load cells. Here\u0026rsquo;s a code snippet showing how I converted the raw analog measurement to mbar.\nfloat pressure_raw_to_mbar(int32_t pressure_raw) { return (pressure_raw - 390000) * (1700.0 / (5600000 - 390000)) - 700; } I calibrated it manually, comparing it to an analogue gauge. It\u0026rsquo;s calibrated to a zero point at atmospheric pressure in my locale, and from -700mbar to +1000mbar. I figured out that, when setting the HX711 to a gain of 64 with the Adafruit HX711 library, a change of 100mbar is a change in the ADC measurement by 30k, highly consistent across the entire pressure range that I tested. I can\u0026rsquo;t be 100% sure how accurate the analogue gauge is, but 100% accuracy doesn\u0026rsquo;t really matter for this application. All I really need to know is the fact that an adequate vacuum is present, and a general idea of the leak rate, which is a requirement that this setup meets.\nOther stuff # I got a beefy PWM motor driver with L298 logic, claiming a continuous current of 7 amps per channel, which nicely fit my requirements. 120mm PC fans are typically 0.2-0.3 amps, and mine in particular are 0.25. For 18 fans, it should be approximately 4.5 amps at 100% speed. It\u0026rsquo;s a bit oversized, and I\u0026rsquo;m only using one channel, but it leaves me the option in the future to use larger, generic radiator fans that have more demanding power requirements. I\u0026rsquo;m already down two from eighteen, eventually enough of them are going to fail that I\u0026rsquo;ll have to find another solution.\nRequired additions to the solenoid, pump motor, and the complete assembly without cover. In my initial tests, I found that operating the pump and solenoid would cause the Arduino to reset, seemingly at random, or cause other undefined behavior. Since they were not electrically isolated on a second power supply, that makes sense. They were backfeeding energy and causing a notable amount of general interference during operation, to the point that the LEDs on the inactive relay modules would dimly illuminate when the motor was in operation, and very visibly illuminate whenever the motor or the solenoid deactivated. I had to add flyback diodes, and, for peace of mind, I added ceramic filtering capacitors to the pump as well. Those additions completely eliminated the issue. Below is a video demonstrating the bad behavior.\nI did a similar plug-drilling setup for the water temperature sensor with a generic Dallas temperature probe. The air probe was taped to the exterior of the box, in the path of the incoming air. All that remained was to solder up a sort of bus bar for the radiator fan connectors, get the temperature probes and pull-up resistors wired into the proto board, and hook everything up to the Arduino, then write the software to tie it all together.\nThe Software # rawhide_k/server-watercooling-controller C\u0026#43;\u0026#43; 0 0 The Arduino operates independently, without a server. The fan speed and loop pressure are managed autonomously. The serial connection is only used to report vital stats, for later integration into more connected monitoring systems. Ultimately, there are only two actions it can take: Change the fan speed, and turn on the vacuum pump. Neither of these require any external knowledge. It doesn\u0026rsquo;t need any information about the connected hardware to function correctly. All it\u0026rsquo;s concerned with is keeping the water temperature at a certain delta above ambient temperature, and keeping the loop pressure within a certain range. Ultimately, very simple.\nOnce per second, the temperature sensors are sampled, the PID loop for the fans runs with the new temperature data points, and the fan speed, temperature data, vacuum pressure, and pump/flow measurements are sent over serial with the help of the ArduinoJSON library. I settled on a target water delta of 4*C relative to ambient, with a chosen min/max temperature range where the fans turn off or pin themselves to 100% completely. The 4*C delta is rather arbitrary. It\u0026rsquo;s approximately the delta that exists when the systems are on, but idle, and the fans are at their minimum speed. That delta can be maintained during 100% CPU load, and during medium-heavy GPU loads, but not both combined. It still stays well under a 10*C delta in that case, though, so I can\u0026rsquo;t complain.\nThere are also hard stops to turn the fans off if the water temperature hits 5*C, and pin them to max if it hits 40*C. I\u0026rsquo;m not sure how realistic either of those figures are, but it\u0026rsquo;s better to be safe than frozen up and/or exploded.\nint fan_PID(float* air_temp, float* water_temp, uint32_t* cur_loop_timestamp) { static const float kp = 120.0; static const float ki = 0.16; static const float kd = 4.0; static float integral = 0; static float derivative = 0; static float last_error = 0; static float error; static float delta; static float last_time = *cur_loop_timestamp; static const float min_water_temp = 5.0; static const float max_water_temp = 40.0; static const uint8_t min_fan_speed = 90; static const uint8_t max_fan_speed = 255; static const uint8_t temp_target_offset = 4; static const uint8_t fan_offset = 10; static int16_t fan_speed; if (*water_temp \u0026gt;= max_water_temp) { return max_fan_speed; } else if (*water_temp \u0026lt;= min_water_temp) { return 0; } else { error = *water_temp - min(*air_temp + temp_target_offset, max_water_temp); delta = *cur_loop_timestamp - last_time; //mitigate unlimited integral windup if (fan_speed == max_fan_speed) { integral += error * delta; } if (*air_temp + temp_target_offset \u0026gt; *water_temp - 1) { integral = 0; } derivative = (error - last_error) / delta; fan_speed = round(constrain(min_fan_speed + fan_offset + (kp * error + ki * integral + kd * derivative), min_fan_speed, max_fan_speed)); last_error = error; return fan_speed; } } Occasionally, the temperature probes as well as the HX711 return spurious readings that cause poor behavior, such as crashing the Arduino. In particular, the temperature probes will sometimes return -127, which caused my PID algorithm to crash the Arduino for reasons I could not divine.\nFor the temperature probes, I simply ignore the one problematic result that I\u0026rsquo;ve observed.\nnew_water_temp = sensors.getTempC(water_therm); new_air_temp = sensors.getTempC(air_therm); if (new_water_temp != -127) { water_temp = new_water_temp; } if (new_air_temp != -127) { air_temp = new_air_temp; } sensors.requestTemperatures(); In case of any other freezing/crashing issues, I also enabled the watchdog timer for 2 seconds. So, if, for some reason, it does freeze/crash, it should self reset after 2 seconds. It seems to be working, although I guess time will tell in the long-term. I haven\u0026rsquo;t experienced any operation issues since I added it over a month ago. The other concern is undefined behavior when the timer overflows. The Uno only has a 32-bit timer, so it will overflow around 50 days of uptime. This function pre-emptively resets it.\n//we will use this function to periodically self-reset to avoid timer overflows void(* resetFunc) (void) = 0; ... //reset the system when approaching timer overflow if (cur_loop_timestamp \u0026gt;= 4000000000) { resetFunc(); } In addition to the temperature probe problem, the HX711 occasionally returns wildly wrong results that need to be filtered out. To compensate for that, if the pressure dips below the threshold, I wait one second, and if the pressure is still below the threshold, I then begin pumping. This check happens approximately ten times per second, as the default behavior of the HX711 board that I have is to run in 10hz mode. I\u0026rsquo;m not sure if the issue springs from some kind of interference with the tachometer interrupts messing up the signaling timing, or if I\u0026rsquo;m misunderstanding the correct way to sample the HX711 over time.\nif (cur_loop_timestamp - last_pressure_check \u0026gt;= 100) { loop_pressure = pressure_raw_to_mbar(hx711.readChannelRaw(CHAN_A_GAIN_64)); if (sucking == false) { if (loop_pressure \u0026gt; low_pressure_threshold) { if (checking_low_pressure == false) { checking_low_pressure = true; low_pressure_confirmation_timestamp = cur_loop_timestamp; } if (cur_loop_timestamp - low_pressure_confirmation_timestamp \u0026gt;= 1000) { digitalWrite(pump_relay, HIGH); digitalWrite(solenoid_relay, HIGH); sucking = true; checking_low_pressure = false; } } else if (cur_loop_timestamp - low_pressure_confirmation_timestamp \u0026gt;= 1000) { checking_low_pressure = false; } } else { if (loop_pressure \u0026lt; high_pressure_threshold) { digitalWrite(pump_relay, LOW); digitalWrite(solenoid_relay, LOW); sucking = false; } } last_pressure_check = cur_loop_timestamp; } Currently, my server-side software is incomplete. It\u0026rsquo;s just a brute-force JSON-over-serial reader written in Python, that I glance at from time to time. I plan write a Zabbix bridge, and have that manage the monitoring, alerts, and reactions to catostraphic events, once I have Zabbix properly setup for my systems\u0026hellip; But that hasn\u0026rsquo;t happened just yet. I don\u0026rsquo;t expect it to be a particularly interesting event, but if anything comes up I might write a post about it.\nOther Thoughts? # The Arduino\u0026rsquo;s software hadn\u0026rsquo;t been 100% finalized when I took the below pictures. The control box does have a lid now, and all the cable management is a lot cleaner\u0026hellip; Promise!\nEverything installed and working! When I was testing it, I had an incident where the Arduino crashed, which means the fans stopped\u0026hellip; That\u0026rsquo;s a big drawback with the motor controller that I have, it fails off instead of on. But, I haven\u0026rsquo;t experienced any more issues after adding those software fixes. At that time, I was running a full GPU workload\u0026hellip; The water temperature exceeded 70*C. It happened at night, and I have no idea how long it ran like that\u0026hellip; Hours. Pretty scary stuff, but it all came out alright.\nThis project had a lot of firsts for me. It was the first time I\u0026rsquo;ve done any kind of embedded-adjacent development beyond \u0026ldquo;ooooo look at the blinky light, oooooooo it turns off when you press the button, wwaaaow\u0026rdquo;, and the first time I\u0026rsquo;d designed something with so many individual parts. I\u0026rsquo;ve never worked with air pumps, solenoids, or pressure sensing before, nor had to debug issues like the lack of flyback diodes.\nThe biggest mistake I made was using that stupid battery box. It\u0026rsquo;s steel, and I don\u0026rsquo;t have the tools or experience to work with steel in the way that I intended to. I thought it would look cool, and it does, but if I did it again, I\u0026rsquo;d use a generic aluminum or plastic project box instead, because it took two entire days plus waiting for new drill bits that can actually cut through it.\nIf I were to ever take it apart again, I\u0026rsquo;d add a passthrough for the SPI header, and/or an external reset button. I should have gotten a physical display of some type that could show the sensors and debug info on the device itself without being connected to another device to readout the data.\nI\u0026rsquo;d like to get a second pump, for redundancy\u0026rsquo;s sake and to increase the flow rate. But it\u0026rsquo;s going to be such a pain to install that I feel like I\u0026rsquo;m never going to bother to do it, unless the current pump fails, or I add more components to be cooled and the flow is adversely affected. I was slightly concerned about the evaporation rate of the liquid via the vacuum tank, and that I\u0026rsquo;d need to add some kind of fluid level detection system, but there\u0026rsquo;s been no noticeable loss thus far. Now that I know the pump turns on so infrequently, I can\u0026rsquo;t imagine that it\u0026rsquo;s going to need to be topped up anytime soon.\nIn terms of value\u0026hellip; This was unbelievably bad. Buying tower coolers would have allowed the CPUs to run without throttling, and buying another GPU would have overpowered any benefits gained by NVLINK. I haven\u0026rsquo;t tallied up exactly how much I spent on it, but it was at least $1000, including buying new tools and excess materials that I haven\u0026rsquo;t fully used, and excluding the original cost of re-using some parts I already had. I\u0026rsquo;ve added risk, maintenance overhead, and pain whenever I swap out hardware in the future. Custom watercooling4 is an ongoing abusive relationship between your fingertips and your ego, or your fascination for slightly more optimized numbers on a screen\u0026hellip; But I\u0026rsquo;d do it again in a heartbeat, because it was fun.\nIn modern, post-Turing cards, that is. Please stop buying mesozoic-era Kepler/Maxwell Quadros and Teslas just because they have VRAM. There\u0026rsquo;s a reason they\u0026rsquo;re going for like, $20, and if you paid more for anything from that era, I\u0026rsquo;m sorry. Electrical costs are a thing, and your life is worth more than waiting for any meaningful, current-year work to happen on those decrepit e-waste cards. I feel even worse for you if you got tricked into buying one of those \u0026ldquo;24GB\u0026rdquo; or \u0026ldquo;16GB\u0026rdquo; cards that are actually 2x12GB and 2x8GB. You can make an argument for Volta, but only if you\u0026rsquo;re doing some deranged pure FP64 stuff. Consumer Turing and newer are faster at everything else! And if you\u0026rsquo;re buying them for HW-accel encode\u0026hellip; The quality is awful compared to any Intel ARC card. Buy one of those instead.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nI don\u0026rsquo;t understand why people don\u0026rsquo;t trust the manufacturer specifications when it comes to silicon temperature limits, beyond unfounded conspiracy nonsense around planned destruction/obselence. In terms of Intel server SKUs, you find that the throttling temp is higher than on consumer SKUs, despite the higher reliability demanded by the enterprise market\u0026hellip; I\u0026rsquo;m assuming that this is due to reduced hotspot variance thanks to generally lower voltage spread from lower boosting clock speeds. On enterprise SKUs which are focused on single threaded performance, the throttling temp is typically lower than those without the ability to boost as high. If you have evidence to the contrary, let me know.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nNVIDIA overclocking on Linux is awful. There\u0026rsquo;s no way to edit the voltage-frequency curve through the Linux drivers. You can only set the offset. So you can\u0026rsquo;t really make use of dynamic boosting if you want to undervolt. I have the max clock speed clamped at 1800MHz with a core offset to emulate undervolting as you would do on Windows, but it\u0026rsquo;s hard to say if I\u0026rsquo;m getting the peak performance that I could be getting at whatever the core voltage is under these circumstances - because NVIDIA\u0026rsquo;s Linux drivers ALSO don\u0026rsquo;t report that. VRAM temperature? Nope. VRM? Nope. Hotspot? Nope. You better hope your card works with NVML, too, because otherwise you\u0026rsquo;re going to have to mess around with X to use nvidia-settings.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nStop calling them open loops. Open loop systems exchange fluid with the environment. Unless you\u0026rsquo;re getting your water out of the sink and flushing it right down the drain, your system is not open loop. It\u0026rsquo;s closed. I don\u0026rsquo;t understand why people call custom loops \u0026ldquo;open\u0026rdquo; and AIOs \u0026ldquo;closed\u0026rdquo; when their modes of operation are identical. It\u0026rsquo;s just plain wrong.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"January 16 2025","externalUrl":null,"permalink":"/posts/watercooling-homelab/","section":"Posts","summary":"","title":"Watercooling My Homelab","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml index 194bda6..75e4695 100644 --- a/public/index.xml +++ b/public/index.xml @@ -1,25 +1 @@ - - - - N.E.E.T. Works - https://blog.neet.works/ - Recent content on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +N.E.E.T. Workshttps://blog.neet.works/Recent content on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/js/panzoom-util.0b774e030782a9868719da996178ac3b16e1b62d1e91bc2d30acff9d859a5621b373e1ae37cef8bbb467283f80648346c36d54b799a38d6da96aeac3bf4ff8e1.js b/public/js/panzoom-util.687cf1af7ca1d075a5ce49ea7cef103a94c400423cc5b30927bf4db06c6a8ae0b8ee6f2b2bf501be099039b2f4ac5f4b348ed4af0429559ebb0743c54f051d5a.js similarity index 100% rename from public/js/panzoom-util.0b774e030782a9868719da996178ac3b16e1b62d1e91bc2d30acff9d859a5621b373e1ae37cef8bbb467283f80648346c36d54b799a38d6da96aeac3bf4ff8e1.js rename to public/js/panzoom-util.687cf1af7ca1d075a5ce49ea7cef103a94c400423cc5b30927bf4db06c6a8ae0b8ee6f2b2bf501be099039b2f4ac5f4b348ed4af0429559ebb0743c54f051d5a.js diff --git a/public/page/1/index.html b/public/page/1/index.html index 01760dc..009ab01 100644 --- a/public/page/1/index.html +++ b/public/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/ - - - - - - +https://blog.neet.works/ + \ No newline at end of file diff --git a/public/posts/index.html b/public/posts/index.html index 295fa51..05a0900 100644 --- a/public/posts/index.html +++ b/public/posts/index.html @@ -1,724 +1,15 @@ - - - - - - - - - - Posts · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Posts

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
- - -
-
- -
- -
- - - - -
- - - - - - - - - - -
- - - -

- 2025 -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - - -
- - - - - - - - - -
- - -
- - - +Posts · N.E.E.T. Works +
Skip to main content

Posts

2025

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/posts/index.xml b/public/posts/index.xml index 97ed75b..aed49a9 100644 --- a/public/posts/index.xml +++ b/public/posts/index.xml @@ -1,25 +1 @@ - - - - Posts on N.E.E.T. Works - https://blog.neet.works/posts/ - Recent content in Posts on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Posts on N.E.E.T. Workshttps://blog.neet.works/posts/Recent content in Posts on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html index 1b3b56e..31c75d5 100644 --- a/public/posts/page/1/index.html +++ b/public/posts/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/posts/ - - - - - - +https://blog.neet.works/posts/ + \ No newline at end of file diff --git a/public/posts/watercooling-homelab/index.html b/public/posts/watercooling-homelab/index.html index ea62c6f..dd76bc9 100644 --- a/public/posts/watercooling-homelab/index.html +++ b/public/posts/watercooling-homelab/index.html @@ -1,1836 +1,177 @@ - - - - - - - - - - Watercooling My Homelab · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- - - - - - - - - - - -
- - - -
-
-
-
-
- - - - -
- -
-
- - -
- - Table of Contents - - -
- - -
-
- - -
- -
- -

- Watercooling My Homelab -

- - - - - - - - - - - - -
- - - - - - - - - - - - - rawhide kobayashi - - -
- -
- Author -
-
- rawhide kobayashi -
- - -
ᗜ⩊ᗜ
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
-
- -
- - - - -
- - - - -
- - -

Overview -
- - - # - - -

-

I’ve been watercooling my desktop since 2020, and case modding custom cooling solutions since my first modern dGPU in 2012. I enjoy it for the aesthetic, as well as the ability to run my hardware to the redline, despite the lower gains that modern hardware has… It’s still fun to try and see how high you can get on benchmark scoreboards. It was a big initial investment, but with most parts being reusable, the ongoing cost for component upgrades are minimal. Early in 2024, I bought some GPUs to use for dedicated ML tasks in my server rack, and immediately had watercooling on the mind. There weren’t particularly strong reasons to do so, but it would lower the power usage a bit, give me some more VRAM overclocking headroom, and give me a bit more core clock stability, as well as the ability to use a cheap two-slot NVLINK connector without suffocating a GPU.

- - -
- -
- - - - My initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40. - -
-
My initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40.
-
-

I’ve never had a leak on my desktop, but with wider temperature swings in my garage, and collectively, a whole lot more expensive hardware that might get damaged than compared to my desktop setup, I was hesitant. The benefits seemed minimal, and I considered it a fun what-if scenario until I upgraded my main server and discovered that the forced-air passive chassis cooling was insufficient for my new CPUs. At that point, I had to make a decision: Get better heatsinks, which would be single-purpose and cost in excess of $100 each, or whole rack watercooling. I chose whole rack watercooling.

-

With enough reason for me to go ahead with the project, and the only thing holding me back being a fear of leaks, I had to figure out how to actively monitor for, and preferably prevent such an eventuality. I happened upon a product called LEAKSHIELD, from Aqua Computer, that advertised itself as doing exactly that.

- - -

How does it work? You pull a vacuum inside the fluid loop and monitor the loss rate. Water can’t get out if air is trying to get in, and if air gets in, the vacuum is reduced. It’s so simple, I don’t know why it took this long for such a product to enter the PC watercooling space. I could have just bought a LEAKSHIELD and called it a day, but Aqua Computer’s software doesn’t support Linux, and the specs for the vacuum pump seemed a bit weak for a loop of my scale. But, its functionality was something I was confident I could emulate with more robust off-the-shelf parts. Thus, sufficiently armed with esoteric plumbing knowledge, I took the plunge and started loading up on parts.

- - -

The Hardware -
- - - # - - -

-

Most of the build uses pretty standard off-the-shelf parts for PC watercooling, but there are a few bits and pieces that most builders won’t have seen before, and a custom control system that offers a more relevant experience for a server rack. The control system is based on an Arduino Uno that feeds vital statistics over serial, and features pressure control and monitoring similar to the LEAKSHIELD, with fan control based on a PID algorithm keeping the water temperature at a fixed setpoint above ambient.

- - -

Off-the-shelf -
- - - # - - -

- - -

General Details -
- - - # - - -

-

The centerpiece of the build, which the control unit and pump mount to, is the “MOther of all RAdiators”, version 3, from Watercool. This is the 360mm version with support for up to 18x 120mm fans, or 8x 180mm fans. It’s constructed more in the spirit of a vehicle radiator than a traditional PC radiator, with a less restrictive fin stack and large, round tubes rather than thin rectangular ones. It provides several mounting points for accessories which I was able to utilize to secure it to my server rack in a satisfactorily sturdy fashion. An in-depth teardown on the construction method and material quality of the MO-RA can be found on igor’sLAB. For fans, I have a collection of old DC-control Corsair Air Series SP120s. They’ve all been retired from regular use, because of noise-related aging issues. In fact, one of them failed to turn at all once I had everything wired up, and another had its bearing disintegrate about 8 weeks after putting the thing into service. That being said, they did survive (and continue to survive, in the remaining 16 cases) 24/7 use for anywhere from 4-10 years, at bottom of the barrel pricing, so that’s not too bad. I’m not exactly pushing the limits of this radiator here, so a few fans breaking down over time isn’t the end of the world.

- - -
- -
- - - - A MO-RA V3 360 PRO PC Watercooling Radiator from [Watercool](https://watercool.de) - -
-
A MO-RA V3 360 PRO PC Watercooling Radiator from Watercool
-
-

I got a secondhand Corsair XD5 pump/res combo from eBay for about sixty bucks, which is pretty good for a genuine D5-based pump/res combo. It has PWM support which I did wire up, but the flow ended up being rather anemic even at 100%, so I just run it full speed all the time. The flow rate is measured through an Aqua Computer flow sensor, which is simply a hall-effect tachometer translated to l/h through software. I did not attempt to verify the accuracy of the sensor in my setup. The absolute accuracy is less relevant than simply getting an overall idea of whether or not the measurement is consistent with flow behavior, which it is.

- - -
- -
- - - - Simple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans. - -
-
Simple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans.
-
- - -

CPUs -
- - - # - - -

-

My thermally problematic server upgrade was to dual Xeon Gold 6154s, which are Skylake-SP architecture. This specific SKU is pretty beefy, with 18 cores at sustained all-core speeds of 3.7GHz SSE / 3.3GHz AVX2 / 2.7GHz AVX512, and a TDP of 200 watts. The rated tjmax was 105C, and with the chassis cooling, they readily met that and started throttling under all-core loads, with idle as high as 60-70*C. I previously had Xeon E5-2697 v2s, which had TDPs of 130w. They got toasty, but never throttled. I’m not sure if the chassis had any easy fan upgrades available that might have made a difference, and I certainly could have moved to 4u-compatible tower coolers rather than forced air, but since I wanted to watercool the GPUs anyway, adding the CPUs as well would be minimal cost/effort, with more future compatibility for the waterblocks compared to a specialized LGA3647 tower cooler.

- - -
- -
- - - - Alphacool Eisblock XPX Pro coldplate. Image credit & copyright - [igor'sLAB](https://www.igorslab.de/en/ryzen-threadripper-2990-wx-with-500-w-alphacool-iceblock-xpx-aurora-pro-plexi-digital-rgb-in-test/) - -
-
Alphacool Eisblock XPX Pro coldplate Image credit & copyright - igor’sLAB
-
-

The CPU waterblocks are Alphacool Eisblock XPX Pro Aurora Light models, which are significantly cheaper than the XPX Aurora Pro not-light version. They appear to be entirely identical, functionally… I’m not sure if there any actual performance benefits offered by the not-light version. It’s a relatively obscure block family without many thorough reviews, which makes sense, given this block is designed for full coverage on Xeons/Threadrippers. The coldplate appears to be skived, which is uncommon in this price bracket for a discrete block, and the fins are incredibly short and dense. In smaller desktop loops, I’ve seen this block criticized for having overly restrictive flow, but when you have four blocks + quick disconnects, “good” flow is relative. At the power limit of 200w, the maximum core temperature delta relative to the water temperature is 25*C, with a ~1-2*C average delta between the two serially-connected sockets at a flow rate of ~130L/h, and that’s more than sufficient.

- - -
- -
- - - - Interior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components. - -
-
Interior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components.
-
- - -

GPUs -
- - - # - - -

-

The GPU blocks are Phanteks 2080 Ti Founder’s Edition blocks. Nothing special, they’re just the cheapest matching ones I could find in 2024 that looked like they’d fit these almost-reference-but-not-quite OEM cards. They’re generic OEM models that would have gone in prebuilts. The most interesting thing about these cards, is that they’ve been modded to have 22GB of VRAM. There’s a dedicated supplier still offering them, and it’s by far the best $/GB value for VRAM in modern NVIDIA GPUs.1 Whether or not this is a better value overall than, say, a 3090 (Ti) depends on your usecase. Performance improvements in ML tasks between the 2080 Ti and 3090 (Ti) range from as little as ~20% to as much as ~100% depending on how memory bandwidth constrained your workload is. With secondhand 3090 (Ti)s still going for minimum $700 on the used market in the US, I found the alternative 2080 Ti option to be more alluring for my usecase, which is primarily single image super-resolution. More VRAM is desirable to increase the size of tiles for inference, and to increase the batch size during training. Training speed scales almost linearly, and inference speed scales linearly, per GPU. So, for my usecase, where I’m not really limited by the performance of a single GPU, the 2080 Ti mod route offers better overall value both for VRAM and combined core performance compared to 3090 (Ti)s. The idea of having a modded GPU in itself was also appealing and definitely part of why I made that decision. Pulling up a hardware monitor and seeing a 2080 Ti with 22GB of VRAM feels a little bit naughty, and I like that.

- - -
- -
- - - - The blocks installed in an ASUS prebuilt gaming tower. - -
-
The blocks installed in an ASUS prebuilt gaming tower.
-
-

I did initially buy three of them, as pictured at the beginning of this post, but one of them failed just after the 30 day warranty period listed on their website. Despite that, they were kind enough to offer a full refund if I covered return shipping, and were very communicative and responded in <24 hours every time I sent them any kind of message/inquiry.

-

The biggest benefit that watercooling theoretically brings to modern video cards is a prolonged lifespan. Not due to lower core temperatures,2 in an absolute sense, but due to the reduced stress from thermal cycles. Mismatches in the rate of thermal expansion between the die and the substrate will eventually cause their bond to break, and this happens faster the larger your die is, and the more extreme the temperature differences are. Today’s GPU dies are huge, and it’s hard to say how many failures are attributable to this factor alone, but it is certain to be more of a risk than it has been in the past. I’d rather buy a used mining GPU than a used gaming GPU any day, because it has likely been kept at roughly the same temperature for most of its life, as opposed to experiencing wide periodic swings.

- - -
- -
The GPU blocks required a moderate amount of light massaging to properly fit on these OEM model cards. The power plugs are in a different position and a singular capacitor on these models is slightly taller than on the actual Founder’s Edition reference card, but they’re otherwise close enough to identical.
-
-

That’s not to say that there are no benefits from lowering the operating temperature. As an absolute value, within manufacturer limits, it affects boost clocks, and leakage current. A cooler chip will use less power to run at the same clock speed compared to a hotter chip due to reduced leakage current, making them measurably more energy efficient per clock cycle the colder they run. In my case, with the fan on max, while not thermal throttling, these GPUs would bounce off the power limit of 280w while attempting to hit a core clock of 1800MHz. Under water, at a reported core temperature of ~30*C, the reported board power draw is only ~220w at 1800MHz3 core clock for the same workload. The type of fan typically found in these coolers is rated anywhere from 15-30w on its own, so a reduction of at least 30w can likely be attributed to a lower leakage current.

- - -

DIY Time -
- - - # - - -

-

In no particular order, here is a list of the major components involved in the control system.

-
    -
  • Generic metal box, formerly from a PBX system.
  • -
  • Arduino Uno clone, unknown brand
  • -
  • 60mm Corsair fan
  • -
  • RS232 TTL shifter
  • -
  • Aesthetic retro power switch
  • -
  • 12v DC vacuum pump
  • -
  • U.S. Solid 12V NC Solenoid
  • -
  • 12v relay modules
  • -
  • HX711 ADC
  • -
  • MD-PS002 Absolute Pressure Sensors
  • -
  • L298-like PWM motor driver
  • -
  • Apple White iMac PSU
  • -
  • Adafruit Arduino Uno Proto Shield
  • -
  • DS18B20 temperature probes
  • -
- - -
- -
- - - - Fit check for all the major components. - -
-
Fit check for all the major components.
-
-

I didn’t take excruciatingly detailed pictures of every single step of the assembly/prototyping process. For the most part, I was just plugging pre-made components together. The most interesting production notes include the pressure sensor and the power supply.

- - -

Putting New Life into an iMac PSU -
- - - # - - -

-

The power supply I used is from a first-gen Intel White iMac, which is visually very similar to the G5. It was one of the earliest things that I installed Linux on, and I used it as a seedbox for a bit, but eventually took it apart and saved some of the more interesting stuff.

-

All the credit goes to the user ersterhernd, from this thread on the tonymacx86.com forum for figuring out the pinout of this PSU, which is almost entirely identical to the one that was in my unit, apart from the power rating on mine being 200w. There are two banks of pins, half of which are always on, half of which are toggleable. Each bank has 12v, 5v, and 3.3v. I didn’t end up using 3.3v for anything other than the power switch. I have no idea what the energy efficiency of this unit is, obviously it doesn’t have an 80+ certification… But I’m assuming that Apple would make it at least halfway decent. Hopefully more efficient than a random 12v power brick with additional converters, I’d hope.

- - -
- -
- - My schematic for the control unit. It was the first time I've ever used KiCad, and the first time I've ever made a schematic like this at all. I hope it's relatively legible. - -
-
My schematic for the control unit. It was the first time I’ve ever used KiCad, and the first time I’ve ever made a schematic like this at all. I hope it’s relatively legible.
-
-

As you can see in the schematic above, the always-on 3.3v pin is connected to SYS_POWERUP through a relay board. The relay input is pulled low by a single pole switch, which turns the relay on, which connects ground to SYS_POWERUP, engaging the other rail of the power supply. This is kind of a convoluted solution to not having a double-pole switch… But I didn’t have a double-pole switch, so that’s what I did.

- - -

Measuring vacuum -
- - - # - - -

-

The leak-resisting aspect all hinges on monitoring the pressure of the loop… Or potentially running a vacuum pump constantly, but that’s stupid. For some reason, I had a really hard time finding a vacuum pressur sensor. There are plenty of physical, analogue vacuum gauges available, but as far as an electronic sensor… I just couldn’t find any located in the US, at a reasonable price. There were a few hobbyist grade differential sensors, but I wanted to be able to measure down to an almost complete vacuum, and they didn’t have the range. Maybe I had the wrong search terms, but I just wasn’t finding anything. Eventually I found an unpackaged sensor with obscure, not entirely legible datasheets that claimed to have an acceptable pressure range for my application. The MD-PS002 is what I settled on, available on Amazon in the US in a 2-pack for $8. It’s a tiny little thing, and it took two attempts to successfully create a sensor package that didn’t leak.

- - -
- -
Sensor package details, installed and all gooped up.
-
-

I drilled a hole in a G1/4" plug, just slightly bigger than the metal ring on the sensor, coated that ring with J-B Weld, and inserted it, letting it cure before grinding away the exterior of the top of the plug and building up more J-B weld to add some strain relief for the wires as well as edge-to-edge sealing. The current vacuum loss rate, after running the system for a few months, allowing the loop to very thoroughly de-gas, is now less than 50mbar per day at -500 to -600mbar. I was slightly worried about the lifetime of the pump, given it’s a cheap thing from Amazon, but given it only has to run for about a second every 2-3 days, I imagine that won’t be an issue.

-

Here’s a quick video showing the system not leaking!

- - -

This pressure sensor is a wheatstone bridge, which works the same way as load cells for digital scales. The resistance changes are very, very low, thus the signal must be amplified before being fed into an ADC. You could use an op-amp, and feed that signal into an analog input on the Arduino, but I felt more comfortable using the HX711, a two-channel ADC with integrated amplifier designed to be used with wheatstone bridge load cells. Here’s a code snippet showing how I converted the raw analog measurement to mbar.

-
float pressure_raw_to_mbar(int32_t pressure_raw) {
-  return (pressure_raw - 390000) * (1700.0 / (5600000 - 390000)) - 700;
-}
-

I calibrated it manually, comparing it to an analogue gauge. It’s calibrated to a zero point at atmospheric pressure in my locale, and from -700mbar to +1000mbar. I figured out that, when setting the HX711 to a gain of 64 with the Adafruit HX711 library, a change of 100mbar is a change in the ADC measurement by 30k, highly consistent across the entire pressure range that I tested. I can’t be 100% sure how accurate the analogue gauge is, but 100% accuracy doesn’t really matter for this application. All I really need to know is the fact that an adequate vacuum is present, and a general idea of the leak rate, which is a requirement that this setup meets.

- - -

Other stuff -
- - - # - - -

-

I got a beefy PWM motor driver with L298 logic, claiming a continuous current of 7 amps per channel, which nicely fit my requirements. 120mm PC fans are typically 0.2-0.3 amps, and mine in particular are 0.25. For 18 fans, it should be approximately 4.5 amps at 100% speed. It’s a bit oversized, and I’m only using one channel, but it leaves me the option in the future to use larger, generic radiator fans that have more demanding power requirements. I’m already down two from eighteen, eventually enough of them are going to fail that I’ll have to find another solution.

- - -
- -
Required additions to the solenoid, pump motor, and the complete assembly without cover.
-
-

In my initial tests, I found that operating the pump and solenoid would cause the Arduino to reset, seemingly at random, or cause other undefined behavior. Since they were not electrically isolated on a second power supply, that makes sense. They were backfeeding energy and causing a notable amount of general interference during operation, to the point that the LEDs on the inactive relay modules would dimly illuminate when the motor was in operation, and very visibly illuminate whenever the motor or the solenoid deactivated. I had to add flyback diodes, and, for peace of mind, I added ceramic filtering capacitors to the pump as well. Those additions completely eliminated the issue. Below is a video demonstrating the bad behavior.

- - -

I did a similar plug-drilling setup for the water temperature sensor with a generic Dallas temperature probe. The air probe was taped to the exterior of the box, in the path of the incoming air. All that remained was to solder up a sort of bus bar for the radiator fan connectors, get the temperature probes and pull-up resistors wired into the proto board, and hook everything up to the Arduino, then write the software to tie it all together.

- - -

The Software -
- - - # - - -

- -
- -
- - - - - - - - - -
- rawhide_k/server-watercooling-controller -
-
- -

- -

- -
- - -
- C++ -
- - - - - - - - - - -
- 0 -
- - - - - - - - - - -
- 0 -
- -
- -
- -
-

The Arduino operates independently, without a server. The fan speed and loop pressure are managed autonomously. The serial connection is only used to report vital stats, for later integration into more connected monitoring systems. Ultimately, there are only two actions it can take: Change the fan speed, and turn on the vacuum pump. Neither of these require any external knowledge. It doesn’t need any information about the connected hardware to function correctly. All it’s concerned with is keeping the water temperature at a certain delta above ambient temperature, and keeping the loop pressure within a certain range. Ultimately, very simple.

-

Once per second, the temperature sensors are sampled, the PID loop for the fans runs with the new temperature data points, and the fan speed, temperature data, vacuum pressure, and pump/flow measurements are sent over serial with the help of the ArduinoJSON library. I settled on a target water delta of 4*C relative to ambient, with a chosen min/max temperature range where the fans turn off or pin themselves to 100% completely. The 4*C delta is rather arbitrary. It’s approximately the delta that exists when the systems are on, but idle, and the fans are at their minimum speed. That delta can be maintained during 100% CPU load, and during medium-heavy GPU loads, but not both combined. It still stays well under a 10*C delta in that case, though, so I can’t complain.

-

There are also hard stops to turn the fans off if the water temperature hits 5*C, and pin them to max if it hits 40*C. I’m not sure how realistic either of those figures are, but it’s better to be safe than frozen up and/or exploded.

-
int fan_PID(float* air_temp, float* water_temp, uint32_t* cur_loop_timestamp) {
-  static const float kp = 120.0;
-  static const float ki = 0.16;
-  static const float kd = 4.0;
-
-  static float integral = 0;
-  static float derivative = 0;
-  static float last_error = 0;
-  static float error;
-  static float delta;
-  static float last_time = *cur_loop_timestamp;
-  static const float min_water_temp = 5.0;
-  static const float max_water_temp = 40.0;
-  static const uint8_t min_fan_speed = 90;
-  static const uint8_t max_fan_speed = 255;
-
-  static const uint8_t temp_target_offset = 4;
-  static const uint8_t fan_offset = 10;
-
-  static int16_t fan_speed;
-
-  if (*water_temp >= max_water_temp) {
-    return max_fan_speed;
-  }
-
-  else if (*water_temp <= min_water_temp) {
-    return 0;
-  }
-
-  else {
-    error = *water_temp - min(*air_temp + temp_target_offset, max_water_temp);
-    delta = *cur_loop_timestamp - last_time;
-
-    //mitigate unlimited integral windup
-    if (fan_speed == max_fan_speed) {
-      integral += error * delta;
-    }
-
-    if (*air_temp + temp_target_offset > *water_temp - 1) {
-      integral = 0;
-    }
-
-    derivative = (error - last_error) / delta;
-    fan_speed = round(constrain(min_fan_speed + fan_offset + (kp * error + ki * integral + kd * derivative), min_fan_speed, max_fan_speed));
-    last_error = error;
-    return fan_speed;
-  }
-}
-

Occasionally, the temperature probes as well as the HX711 return spurious readings that cause poor behavior, such as crashing the Arduino. In particular, the temperature probes will sometimes return -127, which caused my PID algorithm to crash the Arduino for reasons I could not divine.

-

For the temperature probes, I simply ignore the one problematic result that I’ve observed.

-
new_water_temp = sensors.getTempC(water_therm);
-new_air_temp = sensors.getTempC(air_therm);
-
-if (new_water_temp != -127) {
-  water_temp = new_water_temp;
-}
-
-if (new_air_temp != -127) {
-  air_temp = new_air_temp;
-}
-
-sensors.requestTemperatures();
-

In case of any other freezing/crashing issues, I also enabled the watchdog timer for 2 seconds. So, if, for some reason, it does freeze/crash, it should self reset after 2 seconds. It seems to be working, although I guess time will tell in the long-term. I haven’t experienced any operation issues since I added it over a month ago. The other concern is undefined behavior when the timer overflows. The Uno only has a 32-bit timer, so it will overflow around 50 days of uptime. This function pre-emptively resets it.

-
//we will use this function to periodically self-reset to avoid timer overflows
-void(* resetFunc) (void) = 0;
-
-...
-
-//reset the system when approaching timer overflow
-if (cur_loop_timestamp >= 4000000000) {
-  resetFunc();
-}
-

In addition to the temperature probe problem, the HX711 occasionally returns wildly wrong results that need to be filtered out. To compensate for that, if the pressure dips below the threshold, I wait one second, and if the pressure is still below the threshold, I then begin pumping. This check happens approximately ten times per second, as the default behavior of the HX711 board that I have is to run in 10hz mode. I’m not sure if the issue springs from some kind of interference with the tachometer interrupts messing up the signaling timing, or if I’m misunderstanding the correct way to sample the HX711 over time.

-
if (cur_loop_timestamp - last_pressure_check >= 100) {
-  loop_pressure = pressure_raw_to_mbar(hx711.readChannelRaw(CHAN_A_GAIN_64)); 
-
-  if (sucking == false) {
-    if (loop_pressure > low_pressure_threshold) {
-      if (checking_low_pressure == false) {
-        checking_low_pressure = true;
-        low_pressure_confirmation_timestamp = cur_loop_timestamp;
-      }
-      if (cur_loop_timestamp - low_pressure_confirmation_timestamp >= 1000) {
-        digitalWrite(pump_relay, HIGH);
-        digitalWrite(solenoid_relay, HIGH);
-        sucking = true;
-        checking_low_pressure = false;
-      }
-    }
-
-    else if (cur_loop_timestamp - low_pressure_confirmation_timestamp >= 1000) {
-      checking_low_pressure = false;
-    }
-  }
-
-  else {
-    if (loop_pressure < high_pressure_threshold) {
-      digitalWrite(pump_relay, LOW);
-      digitalWrite(solenoid_relay, LOW);
-      sucking = false;
-    }
-  }
-  last_pressure_check = cur_loop_timestamp;
-}
-

Currently, my server-side software is incomplete. It’s just a brute-force JSON-over-serial reader written in Python, that I glance at from time to time. I plan write a Zabbix bridge, and have that manage the monitoring, alerts, and reactions to catostraphic events, once I have Zabbix properly setup for my systems… But that hasn’t happened just yet. I don’t expect it to be a particularly interesting event, but if anything comes up I might write a post about it.

- - -

Other Thoughts? -
- - - # - - -

-

The Arduino’s software hadn’t been 100% finalized when I took the below pictures. The control box does have a lid now, and all the cable management is a lot cleaner… Promise!

- - -
- -
Everything installed and working!
-
-

When I was testing it, I had an incident where the Arduino crashed, which means the fans stopped… That’s a big drawback with the motor controller that I have, it fails off instead of on. But, I haven’t experienced any more issues after adding those software fixes. At that time, I was running a full GPU workload… The water temperature exceeded 70*C. It happened at night, and I have no idea how long it ran like that… Hours. Pretty scary stuff, but it all came out alright.

-

This project had a lot of firsts for me. It was the first time I’ve done any kind of embedded-adjacent development beyond “ooooo look at the blinky light, oooooooo it turns off when you press the button, wwaaaow”, and the first time I’d designed something with so many individual parts. I’ve never worked with air pumps, solenoids, or pressure sensing before, nor had to debug issues like the lack of flyback diodes.

-

The biggest mistake I made was using that stupid battery box. It’s steel, and I don’t have the tools or experience to work with steel in the way that I intended to. I thought it would look cool, and it does, but if I did it again, I’d use a generic aluminum or plastic project box instead, because it took two entire days plus waiting for new drill bits that can actually cut through it.

-

If I were to ever take it apart again, I’d add a passthrough for the SPI header, and/or an external reset button. I should have gotten a physical display of some type that could show the sensors and debug info on the device itself without being connected to another device to readout the data.

-

I’d like to get a second pump, for redundancy’s sake and to increase the flow rate. But it’s going to be such a pain to install that I feel like I’m never going to bother to do it, unless the current pump fails, or I add more components to be cooled and the flow is adversely affected. I was slightly concerned about the evaporation rate of the liquid via the vacuum tank, and that I’d need to add some kind of fluid level detection system, but there’s been no noticeable loss thus far. Now that I know the pump turns on so infrequently, I can’t imagine that it’s going to need to be topped up anytime soon.

-

In terms of value… This was unbelievably bad. Buying tower coolers would have allowed the CPUs to run without throttling, and buying another GPU would have overpowered any benefits gained by NVLINK. I haven’t tallied up exactly how much I spent on it, but it was at least $1000, including buying new tools and excess materials that I haven’t fully used, and excluding the original cost of re-using some parts I already had. I’ve added risk, maintenance overhead, and pain whenever I swap out hardware in the future. Custom watercooling4 is an ongoing abusive relationship between your fingertips and your ego, or your fascination for slightly more optimized numbers on a screen… But I’d do it again in a heartbeat, because it was fun.

-
-
-
    -
  1. -

    In modern, post-Turing cards, that is. Please stop buying mesozoic-era Kepler/Maxwell Quadros and Teslas just because they have VRAM. There’s a reason they’re going for like, $20, and if you paid more for anything from that era, I’m sorry. Electrical costs are a thing, and your life is worth more than waiting for any meaningful, current-year work to happen on those decrepit e-waste cards. I feel even worse for you if you got tricked into buying one of those “24GB” or “16GB” cards that are actually 2x12GB and 2x8GB. You can make an argument for Volta, but only if you’re doing some deranged pure FP64 stuff. Consumer Turing and newer are faster at everything else! And if you’re buying them for HW-accel encode… The quality is awful compared to any Intel ARC card. Buy one of those instead. ↩︎

    -
  2. -
  3. -

    I don’t understand why people don’t trust the manufacturer specifications when it comes to silicon temperature limits, beyond unfounded conspiracy nonsense around planned destruction/obselence. In terms of Intel server SKUs, you find that the throttling temp is higher than on consumer SKUs, despite the higher reliability demanded by the enterprise market… I’m assuming that this is due to reduced hotspot variance thanks to generally lower voltage spread from lower boosting clock speeds. On enterprise SKUs which are focused on single threaded performance, the throttling temp is typically lower than those without the ability to boost as high. If you have evidence to the contrary, let me know. ↩︎

    -
  4. -
  5. -

    NVIDIA overclocking on Linux is awful. There’s no way to edit the voltage-frequency curve through the Linux drivers. You can only set the offset. So you can’t really make use of dynamic boosting if you want to undervolt. I have the max clock speed clamped at 1800MHz with a core offset to emulate undervolting as you would do on Windows, but it’s hard to say if I’m getting the peak performance that I could be getting at whatever the core voltage is under these circumstances - because NVIDIA’s Linux drivers ALSO don’t report that. VRAM temperature? Nope. VRM? Nope. Hotspot? Nope. You better hope your card works with NVML, too, because otherwise you’re going to have to mess around with X to use nvidia-settings. ↩︎

    -
  6. -
  7. -

    Stop calling them open loops. Open loop systems exchange fluid with the environment. Unless you’re getting your water out of the sink and flushing it right down the drain, your system is not open loop. It’s closed. I don’t understand why people call custom loops “open” and AIOs “closed” when their modes of operation are identical. It’s just plain wrong. ↩︎

    -
  8. -
-
- - - - - - - Reply by Email - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - -
-
- - - - - - -
-
- - -
- - -
- - - +Watercooling My Homelab · N.E.E.T. Works +
Skip to main content
Table of Contents

Watercooling My Homelab

rawhide kobayashi
Author
rawhide kobayashi
ᗜ⩊ᗜ
·5240 words

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer

Overview
#

I’ve been watercooling my desktop since 2020, and case modding custom cooling solutions since my first modern dGPU in 2012. I enjoy it for the aesthetic, as well as the ability to run my hardware to the redline, despite the lower gains that modern hardware has… It’s still fun to try and see how high you can get on benchmark scoreboards. It was a big initial investment, but with most parts being reusable, the ongoing cost for component upgrades are minimal. Early in 2024, I bought some GPUs to use for dedicated ML tasks in my server rack, and immediately had watercooling on the mind. There weren’t particularly strong reasons to do so, but it would lower the power usage a bit, give me some more VRAM overclocking headroom, and give me a bit more core clock stability, as well as the ability to use a cheap two-slot NVLINK connector without suffocating a GPU.


My initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40.
My initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40.

I’ve never had a leak on my desktop, but with wider temperature swings in my garage, and collectively, a whole lot more expensive hardware that might get damaged than compared to my desktop setup, I was hesitant. The benefits seemed minimal, and I considered it a fun what-if scenario until I upgraded my main server and discovered that the forced-air passive chassis cooling was insufficient for my new CPUs. At that point, I had to make a decision: Get better heatsinks, which would be single-purpose and cost in excess of $100 each, or whole rack watercooling. I chose whole rack watercooling.

With enough reason for me to go ahead with the project, and the only thing holding me back being a fear of leaks, I had to figure out how to actively monitor for, and preferably prevent such an eventuality. I happened upon a product called LEAKSHIELD, from Aqua Computer, that advertised itself as doing exactly that.

How does it work? You pull a vacuum inside the fluid loop and monitor the loss rate. Water can’t get out if air is trying to get in, and if air gets in, the vacuum is reduced. It’s so simple, I don’t know why it took this long for such a product to enter the PC watercooling space. I could have just bought a LEAKSHIELD and called it a day, but Aqua Computer’s software doesn’t support Linux, and the specs for the vacuum pump seemed a bit weak for a loop of my scale. But, its functionality was something I was confident I could emulate with more robust off-the-shelf parts. Thus, sufficiently armed with esoteric plumbing knowledge, I took the plunge and started loading up on parts.

The Hardware
#

Most of the build uses pretty standard off-the-shelf parts for PC watercooling, but there are a few bits and pieces that most builders won’t have seen before, and a custom control system that offers a more relevant experience for a server rack. The control system is based on an Arduino Uno that feeds vital statistics over serial, and features pressure control and monitoring similar to the LEAKSHIELD, with fan control based on a PID algorithm keeping the water temperature at a fixed setpoint above ambient.

Off-the-shelf
#

General Details
#

The centerpiece of the build, which the control unit and pump mount to, is the “MOther of all RAdiators”, version 3, from Watercool. This is the 360mm version with support for up to 18x 120mm fans, or 8x 180mm fans. It’s constructed more in the spirit of a vehicle radiator than a traditional PC radiator, with a less restrictive fin stack and large, round tubes rather than thin rectangular ones. It provides several mounting points for accessories which I was able to utilize to secure it to my server rack in a satisfactorily sturdy fashion. An in-depth teardown on the construction method and material quality of the MO-RA can be found on igor’sLAB. For fans, I have a collection of old DC-control Corsair Air Series SP120s. They’ve all been retired from regular use, because of noise-related aging issues. In fact, one of them failed to turn at all once I had everything wired up, and another had its bearing disintegrate about 8 weeks after putting the thing into service. That being said, they did survive (and continue to survive, in the remaining 16 cases) 24/7 use for anywhere from 4-10 years, at bottom of the barrel pricing, so that’s not too bad. I’m not exactly pushing the limits of this radiator here, so a few fans breaking down over time isn’t the end of the world.


A MO-RA V3 360 PRO PC Watercooling Radiator from [Watercool](https://watercool.de)
A MO-RA V3 360 PRO PC Watercooling Radiator from Watercool

I got a secondhand Corsair XD5 pump/res combo from eBay for about sixty bucks, which is pretty good for a genuine D5-based pump/res combo. It has PWM support which I did wire up, but the flow ended up being rather anemic even at 100%, so I just run it full speed all the time. The flow rate is measured through an Aqua Computer flow sensor, which is simply a hall-effect tachometer translated to l/h through software. I did not attempt to verify the accuracy of the sensor in my setup. The absolute accuracy is less relevant than simply getting an overall idea of whether or not the measurement is consistent with flow behavior, which it is.


Simple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans.
Simple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans.

CPUs
#

My thermally problematic server upgrade was to dual Xeon Gold 6154s, which are Skylake-SP architecture. This specific SKU is pretty beefy, with 18 cores at sustained all-core speeds of 3.7GHz SSE / 3.3GHz AVX2 / 2.7GHz AVX512, and a TDP of 200 watts. The rated tjmax was 105C, and with the chassis cooling, they readily met that and started throttling under all-core loads, with idle as high as 60-70*C. I previously had Xeon E5-2697 v2s, which had TDPs of 130w. They got toasty, but never throttled. I’m not sure if the chassis had any easy fan upgrades available that might have made a difference, and I certainly could have moved to 4u-compatible tower coolers rather than forced air, but since I wanted to watercool the GPUs anyway, adding the CPUs as well would be minimal cost/effort, with more future compatibility for the waterblocks compared to a specialized LGA3647 tower cooler.


Alphacool Eisblock XPX Pro coldplate. Image credit & copyright - [igor'sLAB](https://www.igorslab.de/en/ryzen-threadripper-2990-wx-with-500-w-alphacool-iceblock-xpx-aurora-pro-plexi-digital-rgb-in-test/)
Alphacool Eisblock XPX Pro coldplate Image credit & copyright - igor’sLAB

The CPU waterblocks are Alphacool Eisblock XPX Pro Aurora Light models, which are significantly cheaper than the XPX Aurora Pro not-light version. They appear to be entirely identical, functionally… I’m not sure if there any actual performance benefits offered by the not-light version. It’s a relatively obscure block family without many thorough reviews, which makes sense, given this block is designed for full coverage on Xeons/Threadrippers. The coldplate appears to be skived, which is uncommon in this price bracket for a discrete block, and the fins are incredibly short and dense. In smaller desktop loops, I’ve seen this block criticized for having overly restrictive flow, but when you have four blocks + quick disconnects, “good” flow is relative. At the power limit of 200w, the maximum core temperature delta relative to the water temperature is 25*C, with a ~1-2*C average delta between the two serially-connected sockets at a flow rate of ~130L/h, and that’s more than sufficient.


Interior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components.
Interior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components.

GPUs
#

The GPU blocks are Phanteks 2080 Ti Founder’s Edition blocks. Nothing special, they’re just the cheapest matching ones I could find in 2024 that looked like they’d fit these almost-reference-but-not-quite OEM cards. They’re generic OEM models that would have gone in prebuilts. The most interesting thing about these cards, is that they’ve been modded to have 22GB of VRAM. There’s a dedicated supplier still offering them, and it’s by far the best $/GB value for VRAM in modern NVIDIA GPUs.1 Whether or not this is a better value overall than, say, a 3090 (Ti) depends on your usecase. Performance improvements in ML tasks between the 2080 Ti and 3090 (Ti) range from as little as ~20% to as much as ~100% depending on how memory bandwidth constrained your workload is. With secondhand 3090 (Ti)s still going for minimum $700 on the used market in the US, I found the alternative 2080 Ti option to be more alluring for my usecase, which is primarily single image super-resolution. More VRAM is desirable to increase the size of tiles for inference, and to increase the batch size during training. Training speed scales almost linearly, and inference speed scales linearly, per GPU. So, for my usecase, where I’m not really limited by the performance of a single GPU, the 2080 Ti mod route offers better overall value both for VRAM and combined core performance compared to 3090 (Ti)s. The idea of having a modded GPU in itself was also appealing and definitely part of why I made that decision. Pulling up a hardware monitor and seeing a 2080 Ti with 22GB of VRAM feels a little bit naughty, and I like that.


The blocks installed in an ASUS prebuilt gaming tower.
The blocks installed in an ASUS prebuilt gaming tower.

I did initially buy three of them, as pictured at the beginning of this post, but one of them failed just after the 30 day warranty period listed on their website. Despite that, they were kind enough to offer a full refund if I covered return shipping, and were very communicative and responded in <24 hours every time I sent them any kind of message/inquiry.

The biggest benefit that watercooling theoretically brings to modern video cards is a prolonged lifespan. Not due to lower core temperatures,2 in an absolute sense, but due to the reduced stress from thermal cycles. Mismatches in the rate of thermal expansion between the die and the substrate will eventually cause their bond to break, and this happens faster the larger your die is, and the more extreme the temperature differences are. Today’s GPU dies are huge, and it’s hard to say how many failures are attributable to this factor alone, but it is certain to be more of a risk than it has been in the past. I’d rather buy a used mining GPU than a used gaming GPU any day, because it has likely been kept at roughly the same temperature for most of its life, as opposed to experiencing wide periodic swings.


The GPU blocks required a moderate amount of light massaging to properly fit on these OEM model cards. The power plugs are in a different position and a singular capacitor on these models is slightly taller than on the actual Founder’s Edition reference card, but they’re otherwise close enough to identical.

That’s not to say that there are no benefits from lowering the operating temperature. As an absolute value, within manufacturer limits, it affects boost clocks, and leakage current. A cooler chip will use less power to run at the same clock speed compared to a hotter chip due to reduced leakage current, making them measurably more energy efficient per clock cycle the colder they run. In my case, with the fan on max, while not thermal throttling, these GPUs would bounce off the power limit of 280w while attempting to hit a core clock of 1800MHz. Under water, at a reported core temperature of ~30*C, the reported board power draw is only ~220w at 1800MHz3 core clock for the same workload. The type of fan typically found in these coolers is rated anywhere from 15-30w on its own, so a reduction of at least 30w can likely be attributed to a lower leakage current.

DIY Time
#

In no particular order, here is a list of the major components involved in the control system.

  • Generic metal box, formerly from a PBX system.
  • Arduino Uno clone, unknown brand
  • 60mm Corsair fan
  • RS232 TTL shifter
  • Aesthetic retro power switch
  • 12v DC vacuum pump
  • U.S. Solid 12V NC Solenoid
  • 12v relay modules
  • HX711 ADC
  • MD-PS002 Absolute Pressure Sensors
  • L298-like PWM motor driver
  • Apple White iMac PSU
  • Adafruit Arduino Uno Proto Shield
  • DS18B20 temperature probes

Fit check for all the major components.
Fit check for all the major components.

I didn’t take excruciatingly detailed pictures of every single step of the assembly/prototyping process. For the most part, I was just plugging pre-made components together. The most interesting production notes include the pressure sensor and the power supply.

Putting New Life into an iMac PSU
#

The power supply I used is from a first-gen Intel White iMac, which is visually very similar to the G5. It was one of the earliest things that I installed Linux on, and I used it as a seedbox for a bit, but eventually took it apart and saved some of the more interesting stuff.

All the credit goes to the user ersterhernd, from this thread on the tonymacx86.com forum for figuring out the pinout of this PSU, which is almost entirely identical to the one that was in my unit, apart from the power rating on mine being 200w. There are two banks of pins, half of which are always on, half of which are toggleable. Each bank has 12v, 5v, and 3.3v. I didn’t end up using 3.3v for anything other than the power switch. I have no idea what the energy efficiency of this unit is, obviously it doesn’t have an 80+ certification… But I’m assuming that Apple would make it at least halfway decent. Hopefully more efficient than a random 12v power brick with additional converters, I’d hope.


My schematic for the control unit. It was the first time I've ever used KiCad, and the first time I've ever made a schematic like this at all. I hope it's relatively legible.
My schematic for the control unit. It was the first time I’ve ever used KiCad, and the first time I’ve ever made a schematic like this at all. I hope it’s relatively legible.

As you can see in the schematic above, the always-on 3.3v pin is connected to SYS_POWERUP through a relay board. The relay input is pulled low by a single pole switch, which turns the relay on, which connects ground to SYS_POWERUP, engaging the other rail of the power supply. This is kind of a convoluted solution to not having a double-pole switch… But I didn’t have a double-pole switch, so that’s what I did.

Measuring vacuum
#

The leak-resisting aspect all hinges on monitoring the pressure of the loop… Or potentially running a vacuum pump constantly, but that’s stupid. For some reason, I had a really hard time finding a vacuum pressur sensor. There are plenty of physical, analogue vacuum gauges available, but as far as an electronic sensor… I just couldn’t find any located in the US, at a reasonable price. There were a few hobbyist grade differential sensors, but I wanted to be able to measure down to an almost complete vacuum, and they didn’t have the range. Maybe I had the wrong search terms, but I just wasn’t finding anything. Eventually I found an unpackaged sensor with obscure, not entirely legible datasheets that claimed to have an acceptable pressure range for my application. The MD-PS002 is what I settled on, available on Amazon in the US in a 2-pack for $8. It’s a tiny little thing, and it took two attempts to successfully create a sensor package that didn’t leak.


Sensor package details, installed and all gooped up.

I drilled a hole in a G1/4" plug, just slightly bigger than the metal ring on the sensor, coated that ring with J-B Weld, and inserted it, letting it cure before grinding away the exterior of the top of the plug and building up more J-B weld to add some strain relief for the wires as well as edge-to-edge sealing. The current vacuum loss rate, after running the system for a few months, allowing the loop to very thoroughly de-gas, is now less than 50mbar per day at -500 to -600mbar. I was slightly worried about the lifetime of the pump, given it’s a cheap thing from Amazon, but given it only has to run for about a second every 2-3 days, I imagine that won’t be an issue.

Here’s a quick video showing the system not leaking!

This pressure sensor is a wheatstone bridge, which works the same way as load cells for digital scales. The resistance changes are very, very low, thus the signal must be amplified before being fed into an ADC. You could use an op-amp, and feed that signal into an analog input on the Arduino, but I felt more comfortable using the HX711, a two-channel ADC with integrated amplifier designed to be used with wheatstone bridge load cells. Here’s a code snippet showing how I converted the raw analog measurement to mbar.

float pressure_raw_to_mbar(int32_t pressure_raw) {
+  return (pressure_raw - 390000) * (1700.0 / (5600000 - 390000)) - 700;
+}
+

I calibrated it manually, comparing it to an analogue gauge. It’s calibrated to a zero point at atmospheric pressure in my locale, and from -700mbar to +1000mbar. I figured out that, when setting the HX711 to a gain of 64 with the Adafruit HX711 library, a change of 100mbar is a change in the ADC measurement by 30k, highly consistent across the entire pressure range that I tested. I can’t be 100% sure how accurate the analogue gauge is, but 100% accuracy doesn’t really matter for this application. All I really need to know is the fact that an adequate vacuum is present, and a general idea of the leak rate, which is a requirement that this setup meets.

Other stuff
#

I got a beefy PWM motor driver with L298 logic, claiming a continuous current of 7 amps per channel, which nicely fit my requirements. 120mm PC fans are typically 0.2-0.3 amps, and mine in particular are 0.25. For 18 fans, it should be approximately 4.5 amps at 100% speed. It’s a bit oversized, and I’m only using one channel, but it leaves me the option in the future to use larger, generic radiator fans that have more demanding power requirements. I’m already down two from eighteen, eventually enough of them are going to fail that I’ll have to find another solution.


Required additions to the solenoid, pump motor, and the complete assembly without cover.

In my initial tests, I found that operating the pump and solenoid would cause the Arduino to reset, seemingly at random, or cause other undefined behavior. Since they were not electrically isolated on a second power supply, that makes sense. They were backfeeding energy and causing a notable amount of general interference during operation, to the point that the LEDs on the inactive relay modules would dimly illuminate when the motor was in operation, and very visibly illuminate whenever the motor or the solenoid deactivated. I had to add flyback diodes, and, for peace of mind, I added ceramic filtering capacitors to the pump as well. Those additions completely eliminated the issue. Below is a video demonstrating the bad behavior.

I did a similar plug-drilling setup for the water temperature sensor with a generic Dallas temperature probe. The air probe was taped to the exterior of the box, in the path of the incoming air. All that remained was to solder up a sort of bus bar for the radiator fan connectors, get the temperature probes and pull-up resistors wired into the proto board, and hook everything up to the Arduino, then write the software to tie it all together.

The Software
#

rawhide_k/server-watercooling-controller

C++
0
0

The Arduino operates independently, without a server. The fan speed and loop pressure are managed autonomously. The serial connection is only used to report vital stats, for later integration into more connected monitoring systems. Ultimately, there are only two actions it can take: Change the fan speed, and turn on the vacuum pump. Neither of these require any external knowledge. It doesn’t need any information about the connected hardware to function correctly. All it’s concerned with is keeping the water temperature at a certain delta above ambient temperature, and keeping the loop pressure within a certain range. Ultimately, very simple.

Once per second, the temperature sensors are sampled, the PID loop for the fans runs with the new temperature data points, and the fan speed, temperature data, vacuum pressure, and pump/flow measurements are sent over serial with the help of the ArduinoJSON library. I settled on a target water delta of 4*C relative to ambient, with a chosen min/max temperature range where the fans turn off or pin themselves to 100% completely. The 4*C delta is rather arbitrary. It’s approximately the delta that exists when the systems are on, but idle, and the fans are at their minimum speed. That delta can be maintained during 100% CPU load, and during medium-heavy GPU loads, but not both combined. It still stays well under a 10*C delta in that case, though, so I can’t complain.

There are also hard stops to turn the fans off if the water temperature hits 5*C, and pin them to max if it hits 40*C. I’m not sure how realistic either of those figures are, but it’s better to be safe than frozen up and/or exploded.

int fan_PID(float* air_temp, float* water_temp, uint32_t* cur_loop_timestamp) {
+  static const float kp = 120.0;
+  static const float ki = 0.16;
+  static const float kd = 4.0;
+
+  static float integral = 0;
+  static float derivative = 0;
+  static float last_error = 0;
+  static float error;
+  static float delta;
+  static float last_time = *cur_loop_timestamp;
+  static const float min_water_temp = 5.0;
+  static const float max_water_temp = 40.0;
+  static const uint8_t min_fan_speed = 90;
+  static const uint8_t max_fan_speed = 255;
+
+  static const uint8_t temp_target_offset = 4;
+  static const uint8_t fan_offset = 10;
+
+  static int16_t fan_speed;
+
+  if (*water_temp >= max_water_temp) {
+    return max_fan_speed;
+  }
+
+  else if (*water_temp <= min_water_temp) {
+    return 0;
+  }
+
+  else {
+    error = *water_temp - min(*air_temp + temp_target_offset, max_water_temp);
+    delta = *cur_loop_timestamp - last_time;
+
+    //mitigate unlimited integral windup
+    if (fan_speed == max_fan_speed) {
+      integral += error * delta;
+    }
+
+    if (*air_temp + temp_target_offset > *water_temp - 1) {
+      integral = 0;
+    }
+
+    derivative = (error - last_error) / delta;
+    fan_speed = round(constrain(min_fan_speed + fan_offset + (kp * error + ki * integral + kd * derivative), min_fan_speed, max_fan_speed));
+    last_error = error;
+    return fan_speed;
+  }
+}
+

Occasionally, the temperature probes as well as the HX711 return spurious readings that cause poor behavior, such as crashing the Arduino. In particular, the temperature probes will sometimes return -127, which caused my PID algorithm to crash the Arduino for reasons I could not divine.

For the temperature probes, I simply ignore the one problematic result that I’ve observed.

new_water_temp = sensors.getTempC(water_therm);
+new_air_temp = sensors.getTempC(air_therm);
+
+if (new_water_temp != -127) {
+  water_temp = new_water_temp;
+}
+
+if (new_air_temp != -127) {
+  air_temp = new_air_temp;
+}
+
+sensors.requestTemperatures();
+

In case of any other freezing/crashing issues, I also enabled the watchdog timer for 2 seconds. So, if, for some reason, it does freeze/crash, it should self reset after 2 seconds. It seems to be working, although I guess time will tell in the long-term. I haven’t experienced any operation issues since I added it over a month ago. The other concern is undefined behavior when the timer overflows. The Uno only has a 32-bit timer, so it will overflow around 50 days of uptime. This function pre-emptively resets it.

//we will use this function to periodically self-reset to avoid timer overflows
+void(* resetFunc) (void) = 0;
+
+...
+
+//reset the system when approaching timer overflow
+if (cur_loop_timestamp >= 4000000000) {
+  resetFunc();
+}
+

In addition to the temperature probe problem, the HX711 occasionally returns wildly wrong results that need to be filtered out. To compensate for that, if the pressure dips below the threshold, I wait one second, and if the pressure is still below the threshold, I then begin pumping. This check happens approximately ten times per second, as the default behavior of the HX711 board that I have is to run in 10hz mode. I’m not sure if the issue springs from some kind of interference with the tachometer interrupts messing up the signaling timing, or if I’m misunderstanding the correct way to sample the HX711 over time.

if (cur_loop_timestamp - last_pressure_check >= 100) {
+  loop_pressure = pressure_raw_to_mbar(hx711.readChannelRaw(CHAN_A_GAIN_64)); 
+
+  if (sucking == false) {
+    if (loop_pressure > low_pressure_threshold) {
+      if (checking_low_pressure == false) {
+        checking_low_pressure = true;
+        low_pressure_confirmation_timestamp = cur_loop_timestamp;
+      }
+      if (cur_loop_timestamp - low_pressure_confirmation_timestamp >= 1000) {
+        digitalWrite(pump_relay, HIGH);
+        digitalWrite(solenoid_relay, HIGH);
+        sucking = true;
+        checking_low_pressure = false;
+      }
+    }
+
+    else if (cur_loop_timestamp - low_pressure_confirmation_timestamp >= 1000) {
+      checking_low_pressure = false;
+    }
+  }
+
+  else {
+    if (loop_pressure < high_pressure_threshold) {
+      digitalWrite(pump_relay, LOW);
+      digitalWrite(solenoid_relay, LOW);
+      sucking = false;
+    }
+  }
+  last_pressure_check = cur_loop_timestamp;
+}
+

Currently, my server-side software is incomplete. It’s just a brute-force JSON-over-serial reader written in Python, that I glance at from time to time. I plan write a Zabbix bridge, and have that manage the monitoring, alerts, and reactions to catostraphic events, once I have Zabbix properly setup for my systems… But that hasn’t happened just yet. I don’t expect it to be a particularly interesting event, but if anything comes up I might write a post about it.

Other Thoughts?
#

The Arduino’s software hadn’t been 100% finalized when I took the below pictures. The control box does have a lid now, and all the cable management is a lot cleaner… Promise!


Everything installed and working!

When I was testing it, I had an incident where the Arduino crashed, which means the fans stopped… That’s a big drawback with the motor controller that I have, it fails off instead of on. But, I haven’t experienced any more issues after adding those software fixes. At that time, I was running a full GPU workload… The water temperature exceeded 70*C. It happened at night, and I have no idea how long it ran like that… Hours. Pretty scary stuff, but it all came out alright.

This project had a lot of firsts for me. It was the first time I’ve done any kind of embedded-adjacent development beyond “ooooo look at the blinky light, oooooooo it turns off when you press the button, wwaaaow”, and the first time I’d designed something with so many individual parts. I’ve never worked with air pumps, solenoids, or pressure sensing before, nor had to debug issues like the lack of flyback diodes.

The biggest mistake I made was using that stupid battery box. It’s steel, and I don’t have the tools or experience to work with steel in the way that I intended to. I thought it would look cool, and it does, but if I did it again, I’d use a generic aluminum or plastic project box instead, because it took two entire days plus waiting for new drill bits that can actually cut through it.

If I were to ever take it apart again, I’d add a passthrough for the SPI header, and/or an external reset button. I should have gotten a physical display of some type that could show the sensors and debug info on the device itself without being connected to another device to readout the data.

I’d like to get a second pump, for redundancy’s sake and to increase the flow rate. But it’s going to be such a pain to install that I feel like I’m never going to bother to do it, unless the current pump fails, or I add more components to be cooled and the flow is adversely affected. I was slightly concerned about the evaporation rate of the liquid via the vacuum tank, and that I’d need to add some kind of fluid level detection system, but there’s been no noticeable loss thus far. Now that I know the pump turns on so infrequently, I can’t imagine that it’s going to need to be topped up anytime soon.

In terms of value… This was unbelievably bad. Buying tower coolers would have allowed the CPUs to run without throttling, and buying another GPU would have overpowered any benefits gained by NVLINK. I haven’t tallied up exactly how much I spent on it, but it was at least $1000, including buying new tools and excess materials that I haven’t fully used, and excluding the original cost of re-using some parts I already had. I’ve added risk, maintenance overhead, and pain whenever I swap out hardware in the future. Custom watercooling4 is an ongoing abusive relationship between your fingertips and your ego, or your fascination for slightly more optimized numbers on a screen… But I’d do it again in a heartbeat, because it was fun.


  1. In modern, post-Turing cards, that is. Please stop buying mesozoic-era Kepler/Maxwell Quadros and Teslas just because they have VRAM. There’s a reason they’re going for like, $20, and if you paid more for anything from that era, I’m sorry. Electrical costs are a thing, and your life is worth more than waiting for any meaningful, current-year work to happen on those decrepit e-waste cards. I feel even worse for you if you got tricked into buying one of those “24GB” or “16GB” cards that are actually 2x12GB and 2x8GB. You can make an argument for Volta, but only if you’re doing some deranged pure FP64 stuff. Consumer Turing and newer are faster at everything else! And if you’re buying them for HW-accel encode… The quality is awful compared to any Intel ARC card. Buy one of those instead. ↩︎

  2. I don’t understand why people don’t trust the manufacturer specifications when it comes to silicon temperature limits, beyond unfounded conspiracy nonsense around planned destruction/obselence. In terms of Intel server SKUs, you find that the throttling temp is higher than on consumer SKUs, despite the higher reliability demanded by the enterprise market… I’m assuming that this is due to reduced hotspot variance thanks to generally lower voltage spread from lower boosting clock speeds. On enterprise SKUs which are focused on single threaded performance, the throttling temp is typically lower than those without the ability to boost as high. If you have evidence to the contrary, let me know. ↩︎

  3. NVIDIA overclocking on Linux is awful. There’s no way to edit the voltage-frequency curve through the Linux drivers. You can only set the offset. So you can’t really make use of dynamic boosting if you want to undervolt. I have the max clock speed clamped at 1800MHz with a core offset to emulate undervolting as you would do on Windows, but it’s hard to say if I’m getting the peak performance that I could be getting at whatever the core voltage is under these circumstances - because NVIDIA’s Linux drivers ALSO don’t report that. VRAM temperature? Nope. VRM? Nope. Hotspot? Nope. You better hope your card works with NVML, too, because otherwise you’re going to have to mess around with X to use nvidia-settings. ↩︎

  4. Stop calling them open loops. Open loop systems exchange fluid with the environment. Unless you’re getting your water out of the sink and flushing it right down the drain, your system is not open loop. It’s closed. I don’t understand why people call custom loops “open” and AIOs “closed” when their modes of operation are identical. It’s just plain wrong. ↩︎

Reply by Email
\ No newline at end of file diff --git a/public/posts/watercooling-my-homelab/featured.webp b/public/posts/watercooling-my-homelab/featured.webp deleted file mode 100644 index 13a7602..0000000 Binary files a/public/posts/watercooling-my-homelab/featured.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/featured_hu11504899310106128621.webp b/public/posts/watercooling-my-homelab/featured_hu11504899310106128621.webp deleted file mode 100644 index c367236..0000000 Binary files a/public/posts/watercooling-my-homelab/featured_hu11504899310106128621.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/featured_hu13568191302889737537.webp b/public/posts/watercooling-my-homelab/featured_hu13568191302889737537.webp deleted file mode 100644 index 87b93fe..0000000 Binary files a/public/posts/watercooling-my-homelab/featured_hu13568191302889737537.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A.webp deleted file mode 100644 index 7e3f636..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu1954630252676748703.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu1954630252676748703.webp deleted file mode 100644 index afd41bb..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu1954630252676748703.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu6560107379008232574.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu6560107379008232574.webp deleted file mode 100644 index 721b185..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu6560107379008232574.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu7088133987632116537.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu7088133987632116537.webp deleted file mode 100644 index 45b6320..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_A_hu7088133987632116537.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B.webp deleted file mode 100644 index ea421c2..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu12155478021797826213.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu12155478021797826213.webp deleted file mode 100644 index 5646d45..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu12155478021797826213.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu2333850158973680984.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu2333850158973680984.webp deleted file mode 100644 index c37bb25..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu2333850158973680984.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu5952309977048855875.webp b/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu5952309977048855875.webp deleted file mode 100644 index 4ca7a9d..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Block_Mod_Detail_B_hu5952309977048855875.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Coldplate.webp b/public/posts/watercooling-my-homelab/images/compressed/Coldplate.webp deleted file mode 100644 index d1a9c7d..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Coldplate.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu13174017899928575525.webp b/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu13174017899928575525.webp deleted file mode 100644 index b54c589..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu13174017899928575525.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu16258961307282205929.webp b/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu16258961307282205929.webp deleted file mode 100644 index f9ca293..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu16258961307282205929.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu3290250784134948227.webp b/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu3290250784134948227.webp deleted file mode 100644 index 38e9921..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Coldplate_hu3290250784134948227.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs.webp b/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs.webp deleted file mode 100644 index 1ba45cf..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu17890886748642996535.webp b/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu17890886748642996535.webp deleted file mode 100644 index f8e49e8..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu17890886748642996535.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu2378229743182206831.webp b/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu2378229743182206831.webp deleted file mode 100644 index dcf5915..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu2378229743182206831.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu3502703824848779819.webp b/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu3502703824848779819.webp deleted file mode 100644 index 65fd1a5..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Different_Plugs_hu3502703824848779819.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom.webp b/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom.webp deleted file mode 100644 index 15972ff..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu1233157730881247055.webp b/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu1233157730881247055.webp deleted file mode 100644 index 7985b6b..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu1233157730881247055.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu1716452709661764841.webp b/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu1716452709661764841.webp deleted file mode 100644 index 26a05c9..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu1716452709661764841.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu478575305574189147.webp b/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu478575305574189147.webp deleted file mode 100644 index 1e9fc92..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Dual_Blocks_Zoom_hu478575305574189147.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed.webp b/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed.webp deleted file mode 100644 index b545a26..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu1860541658624349795.webp b/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu1860541658624349795.webp deleted file mode 100644 index 74c07bd..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu1860541658624349795.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu1923429014339473058.webp b/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu1923429014339473058.webp deleted file mode 100644 index 8e6df53..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu1923429014339473058.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu4193758725753816349.webp b/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu4193758725753816349.webp deleted file mode 100644 index f9ad750..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/GPUs_Installed_hu4193758725753816349.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!.webp b/public/posts/watercooling-my-homelab/images/compressed/MO-RA!.webp deleted file mode 100644 index 9357b11..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu15264814207577810858.webp b/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu15264814207577810858.webp deleted file mode 100644 index 85185fa..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu15264814207577810858.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu6856946684884405237.webp b/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu6856946684884405237.webp deleted file mode 100644 index b7d29cd..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu6856946684884405237.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu7453820902150892044.webp b/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu7453820902150892044.webp deleted file mode 100644 index aa9a516..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/MO-RA!_hu7453820902150892044.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail.webp b/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail.webp deleted file mode 100644 index 8099cdb..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu11231283172588266533.webp b/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu11231283172588266533.webp deleted file mode 100644 index 4055cc0..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu11231283172588266533.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu1490212990626714303.webp b/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu1490212990626714303.webp deleted file mode 100644 index 8931075..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu1490212990626714303.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu3280937936208174423.webp b/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu3280937936208174423.webp deleted file mode 100644 index 734f8aa..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Mounting_Detail_hu3280937936208174423.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor.webp b/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor.webp deleted file mode 100644 index 06b27f6..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu1042940534242500862.webp b/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu1042940534242500862.webp deleted file mode 100644 index 1ca577f..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu1042940534242500862.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu11882410216080315790.webp b/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu11882410216080315790.webp deleted file mode 100644 index b62a5af..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu11882410216080315790.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu3985119007043451200.webp b/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu3985119007043451200.webp deleted file mode 100644 index a7b7c81..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Tall_Capacitor_hu3985119007043451200.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit.webp b/public/posts/watercooling-my-homelab/images/compressed/Test_Fit.webp deleted file mode 100644 index 51fdbef..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu2884804705215397458.webp b/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu2884804705215397458.webp deleted file mode 100644 index 878d0f2..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu2884804705215397458.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu4196319411009163019.webp b/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu4196319411009163019.webp deleted file mode 100644 index 95ea791..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu4196319411009163019.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu6466058294895506811.webp b/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu6466058294895506811.webp deleted file mode 100644 index 8314386..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Test_Fit_hu6466058294895506811.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank.webp b/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank.webp deleted file mode 100644 index c168c74..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu10619128996450324123.webp b/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu10619128996450324123.webp deleted file mode 100644 index 726476c..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu10619128996450324123.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu17456463471095554312.webp b/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu17456463471095554312.webp deleted file mode 100644 index c4d2169..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu17456463471095554312.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu3171065713872445154.webp b/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu3171065713872445154.webp deleted file mode 100644 index 3c9c7c4..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/Triple_Card_Jank_hu3171065713872445154.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_a.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_a.webp deleted file mode 100644 index 39a4915..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_a.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu11784685921316552556.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu11784685921316552556.webp deleted file mode 100644 index a58dd35..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu11784685921316552556.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu2347091142476872481.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu2347091142476872481.webp deleted file mode 100644 index 95d622f..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu2347091142476872481.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu2371455810172732269.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu2371455810172732269.webp deleted file mode 100644 index d5be382..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_a_hu2371455810172732269.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_assembly.webp deleted file mode 100644 index 2656402..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu13996029485759007548.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu13996029485759007548.webp deleted file mode 100644 index 6b20dd5..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu13996029485759007548.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu17913719379729244320.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu17913719379729244320.webp deleted file mode 100644 index f3e462f..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu17913719379729244320.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu402138244258743400.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu402138244258743400.webp deleted file mode 100644 index 40b3695..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_assembly_hu402138244258743400.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_b.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_b.webp deleted file mode 100644 index 7624992..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_b.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu10235357959924345043.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu10235357959924345043.webp deleted file mode 100644 index 1aee7a1..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu10235357959924345043.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu10444887637626475779.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu10444887637626475779.webp deleted file mode 100644 index 71f69df..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu10444887637626475779.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu12966552216401371125.webp b/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu12966552216401371125.webp deleted file mode 100644 index 7cdfe35..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/complete_b_hu12966552216401371125.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed.webp b/public/posts/watercooling-my-homelab/images/compressed/goopy_installed.webp deleted file mode 100644 index 892ab04..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu13878470882578617902.webp b/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu13878470882578617902.webp deleted file mode 100644 index 70fbf02..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu13878470882578617902.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu7775517930751145146.webp b/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu7775517930751145146.webp deleted file mode 100644 index a7ba651..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu7775517930751145146.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu8582164235252167480.webp b/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu8582164235252167480.webp deleted file mode 100644 index df813e2..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/goopy_installed_hu8582164235252167480.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom.webp deleted file mode 100644 index 6a5b125..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu12744847709972265499.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu12744847709972265499.webp deleted file mode 100644 index b00ac4e..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu12744847709972265499.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu3645814594706023691.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu3645814594706023691.webp deleted file mode 100644 index 2299aaf..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu3645814594706023691.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu3698649971536149681.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu3698649971536149681.webp deleted file mode 100644 index 8c313f0..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_bottom_hu3698649971536149681.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top.webp deleted file mode 100644 index ba5e400..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu13627305942680874943.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu13627305942680874943.webp deleted file mode 100644 index 50e5885..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu13627305942680874943.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu16358936284331608818.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu16358936284331608818.webp deleted file mode 100644 index 570750a..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu16358936284331608818.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu7787027711586187933.webp b/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu7787027711586187933.webp deleted file mode 100644 index 53347aa..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/plug_detail_top_hu7787027711586187933.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble.webp b/public/posts/watercooling-my-homelab/images/compressed/pump_greeble.webp deleted file mode 100644 index 7fb245d..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu1040829716072557719.webp b/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu1040829716072557719.webp deleted file mode 100644 index 46ec6fe..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu1040829716072557719.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu1471177938307566585.webp b/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu1471177938307566585.webp deleted file mode 100644 index 1bf2e3f..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu1471177938307566585.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu4319233910559987333.webp b/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu4319233910559987333.webp deleted file mode 100644 index 4bc261a..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/pump_greeble_hu4319233910559987333.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode.webp b/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode.webp deleted file mode 100644 index 1893a28..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu13681423255705621406.webp b/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu13681423255705621406.webp deleted file mode 100644 index 0272fff..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu13681423255705621406.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu14196543121366269339.webp b/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu14196543121366269339.webp deleted file mode 100644 index 25952f0..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu14196543121366269339.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu3904316093352162951.webp b/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu3904316093352162951.webp deleted file mode 100644 index 579ef82..0000000 Binary files a/public/posts/watercooling-my-homelab/images/compressed/solenoid_diode_hu3904316093352162951.webp and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Block_Mod_Detail_A.jpg b/public/posts/watercooling-my-homelab/images/original/Block_Mod_Detail_A.jpg deleted file mode 100644 index 5266b0f..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Block_Mod_Detail_A.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Block_Mod_Detail_B.jpg b/public/posts/watercooling-my-homelab/images/original/Block_Mod_Detail_B.jpg deleted file mode 100644 index 5abe309..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Block_Mod_Detail_B.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Coldplate.jpg b/public/posts/watercooling-my-homelab/images/original/Coldplate.jpg deleted file mode 100644 index 255d51b..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Coldplate.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Different_Plugs.jpg b/public/posts/watercooling-my-homelab/images/original/Different_Plugs.jpg deleted file mode 100644 index cad6902..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Different_Plugs.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Dual_Blocks_Zoom.jpg b/public/posts/watercooling-my-homelab/images/original/Dual_Blocks_Zoom.jpg deleted file mode 100644 index 61978ee..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Dual_Blocks_Zoom.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/GPUs_Installed.jpg b/public/posts/watercooling-my-homelab/images/original/GPUs_Installed.jpg deleted file mode 100644 index 5928d30..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/GPUs_Installed.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/MO-RA!.jpg b/public/posts/watercooling-my-homelab/images/original/MO-RA!.jpg deleted file mode 100644 index 511a10c..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/MO-RA!.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Mounting_Detail.jpg b/public/posts/watercooling-my-homelab/images/original/Mounting_Detail.jpg deleted file mode 100644 index 4840763..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Mounting_Detail.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Tall_Capacitor.jpg b/public/posts/watercooling-my-homelab/images/original/Tall_Capacitor.jpg deleted file mode 100644 index f5ef26a..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Tall_Capacitor.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Test_Fit.jpg b/public/posts/watercooling-my-homelab/images/original/Test_Fit.jpg deleted file mode 100644 index ba6a65f..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Test_Fit.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/Triple_Card_Jank.jpg b/public/posts/watercooling-my-homelab/images/original/Triple_Card_Jank.jpg deleted file mode 100644 index d42f624..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/Triple_Card_Jank.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/complete_a.jpg b/public/posts/watercooling-my-homelab/images/original/complete_a.jpg deleted file mode 100644 index b9c6604..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/complete_a.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/complete_assembly.jpg b/public/posts/watercooling-my-homelab/images/original/complete_assembly.jpg deleted file mode 100644 index 26e673e..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/complete_assembly.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/complete_b.jpg b/public/posts/watercooling-my-homelab/images/original/complete_b.jpg deleted file mode 100644 index 8bb3fb8..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/complete_b.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/featured.jpg b/public/posts/watercooling-my-homelab/images/original/featured.jpg deleted file mode 100644 index 73db392..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/featured.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/goopy_installed.jpg b/public/posts/watercooling-my-homelab/images/original/goopy_installed.jpg deleted file mode 100644 index cf2d831..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/goopy_installed.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/plug_detail_bottom.jpg b/public/posts/watercooling-my-homelab/images/original/plug_detail_bottom.jpg deleted file mode 100644 index d0b3595..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/plug_detail_bottom.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/plug_detail_top.jpg b/public/posts/watercooling-my-homelab/images/original/plug_detail_top.jpg deleted file mode 100644 index 0f5dd00..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/plug_detail_top.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/pump_greeble.jpg b/public/posts/watercooling-my-homelab/images/original/pump_greeble.jpg deleted file mode 100644 index a3b6e85..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/pump_greeble.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/images/original/solenoid_diode.jpg b/public/posts/watercooling-my-homelab/images/original/solenoid_diode.jpg deleted file mode 100644 index 875545b..0000000 Binary files a/public/posts/watercooling-my-homelab/images/original/solenoid_diode.jpg and /dev/null differ diff --git a/public/posts/watercooling-my-homelab/index.html b/public/posts/watercooling-my-homelab/index.html deleted file mode 100644 index 3f12581..0000000 --- a/public/posts/watercooling-my-homelab/index.html +++ /dev/null @@ -1,1842 +0,0 @@ - - - - - - - - - - Watercooling My Homelab · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- - - - - - - - - - - -
- - - -
-
-
-
-
- - - - -
- -
-
- - -
- - Table of Contents - - -
- - -
-
- - -
- -
- -

- Watercooling My Homelab -

- - - - - - - - - - - - -
- - - - - - - - - - - - - rawhide kobayashi - - -
- -
- Author -
-
- rawhide kobayashi -
- - -
ᗜ⩊ᗜ
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - - - - Draft - - - -
- - - - - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
-
- -
- - - - -
- - - - -
- - -

Overview -
- - - # - - -

-

I’ve been watercooling my desktop since 2020, and case modding custom cooling solutions since my first modern dGPU in 2012. I enjoy it for the aesthetic, as well as the ability to run my hardware to the redline, despite the lower gains that modern hardware has… It’s still fun to try and see how high you can get on benchmark scoreboards. It was a big initial investment, but with most parts being reusable, the ongoing cost for component upgrades are minimal. Early in 2024, I bought some GPUs to use for dedicated ML tasks in my server rack, and immediately had watercooling on the mind. There weren’t particularly strong reasons to do so, but it would lower the power usage a bit, give me some more VRAM overclocking headroom, and give me a bit more core clock stability, as well as the ability to use a cheap two-slot NVLINK connector without suffocating a GPU.

- - -
- -
- - - - My initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40. - -
-
My initial setup with 3x 2080 Tis, using m.2 NVMe to PCIe risers in an ASUS prebuilt. Two are connected by NVLINK, which I found to provide a slight performance benefit on the order of ~1-5% in multi-GPU SISR training, which is not worth the typical price for NVLINK bridges from this era. I was lucky to get this ugly, quadro-oriented bridge for just $40.
-
-

I’ve never had a leak on my desktop, but with wider temperature swings in my garage, and collectively, a whole lot more expensive hardware that might get damaged than compared to my desktop setup, I was hesitant. The benefits seemed minimal, and I considered it a fun what-if scenario until I upgraded my main server and discovered that the forced-air passive chassis cooling was insufficient for my new CPUs. At that point, I had to make a decision: Get better heatsinks, which would be single-purpose and cost in excess of $100 each, or whole rack watercooling. I chose whole rack watercooling.

-

With enough reason for me to go ahead with the project, and the only thing holding me back being a fear of leaks, I had to figure out how to actively monitor for, and preferably prevent such an eventuality. I happened upon a product called LEAKSHIELD, from Aqua Computer, that advertised itself as doing exactly that.

- - -

How does it work? You pull a vacuum inside the fluid loop and monitor the loss rate. Water can’t get out if air is trying to get in, and if air gets in, the vacuum is reduced. It’s so simple, I don’t know why it took this long for such a product to enter the PC watercooling space. I could have just bought a LEAKSHIELD and called it a day, but Aqua Computer’s software doesn’t support Linux, and the specs for the vacuum pump seemed a bit weak for a loop of my scale. But, its functionality was something I was confident I could emulate with more robust off-the-shelf parts. Thus, sufficiently armed with esoteric plumbing knowledge, I took the plunge and started loading up on parts.

- - -

The Hardware -
- - - # - - -

-

Most of the build uses pretty standard off-the-shelf parts for PC watercooling, but there are a few bits and pieces that most builders won’t have seen before, and a custom control system that offers a more relevant experience for a server rack. The control system is based on an Arduino Uno that feeds vital statistics over serial, and features pressure control and monitoring similar to the LEAKSHIELD, with fan control based on a PID algorithm keeping the water temperature at a fixed setpoint above ambient.

- - -

Off-the-shelf -
- - - # - - -

- - -

General Details -
- - - # - - -

-

The centerpiece of the build, which the control unit and pump mount to, is the “MOther of all RAdiators”, version 3, from Watercool. This is the 360mm version with support for up to 18x 120mm fans, or 8x 180mm fans. It’s constructed more in the spirit of a vehicle radiator than a traditional PC radiator, with a less restrictive fin stack and large, round tubes rather than thin rectangular ones. It provides several mounting points for accessories which I was able to utilize to secure it to my server rack in a satisfactorily sturdy fashion. An in-depth teardown on the construction method and material quality of the MO-RA can be found on igor’sLAB. For fans, I have a collection of old DC-control Corsair Air Series SP120s. They’ve all been retired from regular use, because of noise-related aging issues. In fact, one of them failed to turn at all once I had everything wired up, and another had its bearing disintegrate about 8 weeks after putting the thing into service. That being said, they did survive (and continue to survive, in the remaining 16 cases) 24/7 use for anywhere from 4-10 years, at bottom of the barrel pricing, so that’s not too bad. I’m not exactly pushing the limits of this radiator here, so a few fans breaking down over time isn’t the end of the world.

- - -
- -
- - - - A MO-RA V3 360 PRO PC Watercooling Radiator from [Watercool](https://watercool.de) - -
-
A MO-RA V3 360 PRO PC Watercooling Radiator from Watercool
-
-

I got a secondhand Corsair XD5 pump/res combo from eBay for about sixty bucks, which is pretty good for a genuine D5-based pump/res combo. It has PWM support which I did wire up, but the flow ended up being rather anemic even at 100%, so I just run it full speed all the time. The flow rate is measured through an Aqua Computer flow sensor, which is simply a hall-effect tachometer translated to l/h through software. I did not attempt to verify the accuracy of the sensor in my setup. The absolute accuracy is less relevant than simply getting an overall idea of whether or not the measurement is consistent with flow behavior, which it is.

- - -
- -
- - - - Simple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans. - -
-
Simple, cheap aluminum bars and angles mount to the studs on the radiator and into the stud holes on the server rack, and the pump and control box mount onto brackets along with the fans.
-
- - -

CPUs -
- - - # - - -

-

My thermally problematic server upgrade was to dual Xeon Gold 6154s, which are Skylake-SP architecture. This specific SKU is pretty beefy, with 18 cores at sustained all-core speeds of 3.7GHz SSE / 3.3GHz AVX2 / 2.7GHz AVX512, and a TDP of 200 watts. The rated tjmax was 105C, and with the chassis cooling, they readily met that and started throttling under all-core loads, with idle as high as 60-70*C. I previously had Xeon E5-2697 v2s, which had TDPs of 130w. They got toasty, but never throttled. I’m not sure if the chassis had any easy fan upgrades available that might have made a difference, and I certainly could have moved to 4u-compatible tower coolers rather than forced air, but since I wanted to watercool the GPUs anyway, adding the CPUs as well would be minimal cost/effort, with more future compatibility for the waterblocks compared to a specialized LGA3647 tower cooler.

- - -
- -
- - - - Alphacool Eisblock XPX Pro coldplate. Image credit & copyright - [igor'sLAB](https://www.igorslab.de/en/ryzen-threadripper-2990-wx-with-500-w-alphacool-iceblock-xpx-aurora-pro-plexi-digital-rgb-in-test/) - -
-
Alphacool Eisblock XPX Pro coldplate Image credit & copyright - igor’sLAB
-
-

The CPU waterblocks are Alphacool Eisblock XPX Pro Aurora Light models, which are significantly cheaper than the XPX Aurora Pro not-light version. They appear to be entirely identical, functionally… I’m not sure if there any actual performance benefits offered by the not-light version. It’s a relatively obscure block family without many thorough reviews, which makes sense, given this block is designed for full coverage on Xeons/Threadrippers. The coldplate appears to be skived, which is uncommon in this price bracket for a discrete block, and the fins are incredibly short and dense. In smaller desktop loops, I’ve seen this block criticized for having overly restrictive flow, but when you have four blocks + quick disconnects, “good” flow is relative. At the power limit of 200w, the maximum core temperature delta relative to the water temperature is 25*C, with a ~1-2*C average delta between the two serially-connected sockets at a flow rate of ~130L/h, and that’s more than sufficient.

- - -
- -
- - - - Interior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components. - -
-
Interior view of the Supermicro CSE-846 chassis showcasing the installed waterblocks and other components.
-
- - -

GPUs -
- - - # - - -

-

The GPU blocks are Phanteks 2080 Ti Founder’s Edition blocks. Nothing special, they’re just the cheapest matching ones I could find in 2024 that looked like they’d fit these almost-reference-but-not-quite OEM cards. They’re generic OEM models that would have gone in prebuilts. The most interesting thing about these cards, is that they’ve been modded to have 22GB of VRAM. There’s a dedicated supplier still offering them, and it’s by far the best $/GB value for VRAM in modern NVIDIA GPUs.1 Whether or not this is a better value overall than, say, a 3090 (Ti) depends on your usecase. Performance improvements in ML tasks between the 2080 Ti and 3090 (Ti) range from as little as ~20% to as much as ~100% depending on how memory bandwidth constrained your workload is. With secondhand 3090 (Ti)s still going for minimum $700 on the used market in the US, I found the alternative 2080 Ti option to be more alluring for my usecase, which is primarily single image super-resolution. More VRAM is desirable to increase the size of tiles for inference, and to increase the batch size during training. Training speed scales almost linearly, and inference speed scales linearly, per GPU. So, for my usecase, where I’m not really limited by the performance of a single GPU, the 2080 Ti mod route offers better overall value both for VRAM and combined core performance compared to 3090 (Ti)s. The idea of having a modded GPU in itself was also appealing and definitely part of why I made that decision. Pulling up a hardware monitor and seeing a 2080 Ti with 22GB of VRAM feels a little bit naughty, and I like that.

- - -
- -
- - - - The blocks installed in an ASUS prebuilt gaming tower. - -
-
The blocks installed in an ASUS prebuilt gaming tower.
-
-

I did initially buy three of them, as pictured at the beginning of this post, but one of them failed just after the 30 day warranty period listed on their website. Despite that, they were kind enough to offer a full refund if I covered return shipping, and were very communicative and responded in <24 hours every time I sent them any kind of message/inquiry.

-

The biggest benefit that watercooling theoretically brings to modern video cards is a prolonged lifespan. Not due to lower core temperatures,2 in an absolute sense, but due to the reduced stress from thermal cycles. Mismatches in the rate of thermal expansion between the die and the substrate will eventually cause their bond to break, and this happens faster the larger your die is, and the more extreme the temperature differences are. Today’s GPU dies are huge, and it’s hard to say how many failures are attributable to this factor alone, but it is certain to be more of a risk than it has been in the past. I’d rather buy a used mining GPU than a used gaming GPU any day, because it has likely been kept at roughly the same temperature for most of its life, as opposed to experiencing wide periodic swings.

- - -
- -
The GPU blocks required a moderate amount of light massaging to properly fit on these OEM model cards. The power plugs are in a different position and a singular capacitor on these models is slightly taller than on the actual Founder’s Edition reference card, but they’re otherwise close enough to identical.
-
-

That’s not to say that there are no benefits from lowering the operating temperature. As an absolute value, within manufacturer limits, it affects boost clocks, and leakage current. A cooler chip will use less power to run at the same clock speed compared to a hotter chip due to reduced leakage current, making them measurably more energy efficient per clock cycle the colder they run. In my case, with the fan on max, while not thermal throttling, these GPUs would bounce off the power limit of 280w while attempting to hit a core clock of 1800MHz. Under water, at a reported core temperature of ~30*C, the reported board power draw is only ~220w at 1800MHz3 core clock for the same workload. The type of fan typically found in these coolers is rated anywhere from 15-30w on its own, so a reduction of at least 30w can likely be attributed to a lower leakage current.

- - -

DIY Time -
- - - # - - -

-

In no particular order, here is a list of the major components involved in the control system.

-
    -
  • Generic metal box, formerly from a PBX system.
  • -
  • Arduino Uno clone, unknown brand
  • -
  • 60mm Corsair fan
  • -
  • RS232 TTL shifter
  • -
  • Aesthetic retro power switch
  • -
  • 12v DC vacuum pump
  • -
  • U.S. Solid 12V NC Solenoid
  • -
  • 12v relay modules
  • -
  • HX711 ADC
  • -
  • MD-PS002 Absolute Pressure Sensors
  • -
  • L298-like PWM motor driver
  • -
  • Apple White iMac PSU
  • -
  • Adafruit Arduino Uno Proto Shield
  • -
  • DS18B20 temperature probes
  • -
- - -
- -
- - - - Fit check for all the major components. - -
-
Fit check for all the major components.
-
-

I didn’t take excruciatingly detailed pictures of every single step of the assembly/prototyping process. For the most part, I was just plugging pre-made components together. The most interesting production notes include the pressure sensor and the power supply.

- - -

Putting New Life into an iMac PSU -
- - - # - - -

-

The power supply I used is from a first-gen Intel White iMac, which is visually very similar to the G5. It was one of the earliest things that I installed Linux on, and I used it as a seedbox for a bit, but eventually took it apart and saved some of the more interesting stuff.

-

All the credit goes to the user ersterhernd, from this thread on the tonymacx86.com forum for figuring out the pinout of this PSU, which is almost entirely identical to the one that was in my unit, apart from the power rating on mine being 200w. There are two banks of pins, half of which are always on, half of which are toggleable. Each bank has 12v, 5v, and 3.3v. I didn’t end up using 3.3v for anything other than the power switch. I have no idea what the energy efficiency of this unit is, obviously it doesn’t have an 80+ certification… But I’m assuming that Apple would make it at least halfway decent. Hopefully more efficient than a random 12v power brick with additional converters, I’d hope.

- - -
- -
- - My schematic for the control unit. It was the first time I've ever used KiCad, and the first time I've ever made a schematic like this at all. I hope it's relatively legible. - -
-
My schematic for the control unit. It was the first time I’ve ever used KiCad, and the first time I’ve ever made a schematic like this at all. I hope it’s relatively legible.
-
-

As you can see in the schematic above, the always-on 3.3v pin is connected to SYS_POWERUP through a relay board. The relay input is pulled low by a single pole switch, which turns the relay on, which connects ground to SYS_POWERUP, engaging the other rail of the power supply. This is kind of a convoluted solution to not having a double-pole switch… But I didn’t have a double-pole switch, so that’s what I did.

- - -

Measuring vacuum -
- - - # - - -

-

The leak-resisting aspect all hinges on monitoring the pressure of the loop… Or potentially running a vacuum pump constantly, but that’s stupid. For some reason, I had a really hard time finding a vacuum pressur sensor. There are plenty of physical, analogue vacuum gauges available, but as far as an electronic sensor… I just couldn’t find any located in the US, at a reasonable price. There were a few hobbyist grade differential sensors, but I wanted to be able to measure down to an almost complete vacuum, and they didn’t have the range. Maybe I had the wrong search terms, but I just wasn’t finding anything. Eventually I found an unpackaged sensor with obscure, not entirely legible datasheets that claimed to have an acceptable pressure range for my application. The MD-PS002 is what I settled on, available on Amazon in the US in a 2-pack for $8. It’s a tiny little thing, and it took two attempts to successfully create a sensor package that didn’t leak.

- - -
- -
Sensor package details, installed and all gooped up.
-
-

I drilled a hole in a G1/4" plug, just slightly bigger than the metal ring on the sensor, coated that ring with J-B Weld, and inserted it, letting it cure before grinding away the exterior of the top of the plug and building up more J-B weld to add some strain relief for the wires as well as edge-to-edge sealing. The current vacuum loss rate, after running the system for a few months, allowing the loop to very thoroughly de-gas, is now less than 50mbar per day at -500 to -600mbar. I was slightly worried about the lifetime of the pump, given it’s a cheap thing from Amazon, but given it only has to run for about a second every 2-3 days, I imagine that won’t be an issue.

-

Here’s a quick video showing the system not leaking!

- - -

This pressure sensor is a wheatstone bridge, which works the same way as load cells for digital scales. The resistance changes are very, very low, thus the signal must be amplified before being fed into an ADC. You could use an op-amp, and feed that signal into an analog input on the Arduino, but I felt more comfortable using the HX711, a two-channel ADC with integrated amplifier designed to be used with wheatstone bridge load cells. Here’s a code snippet showing how I converted the raw analog measurement to mbar.

-
float pressure_raw_to_mbar(int32_t pressure_raw) {
-  return (pressure_raw - 390000) * (1700.0 / (5600000 - 390000)) - 700;
-}
-

I calibrated it manually, comparing it to an analogue gauge. It’s calibrated to a zero point at atmospheric pressure in my locale, and from -700mbar to +1000mbar. I figured out that, when setting the HX711 to a gain of 64 with the Adafruit HX711 library, a change of 100mbar is a change in the ADC measurement by 30k, highly consistent across the entire pressure range that I tested. I can’t be 100% sure how accurate the analogue gauge is, but 100% accuracy doesn’t really matter for this application. All I really need to know is the fact that an adequate vacuum is present, and a general idea of the leak rate, which is a requirement that this setup meets.

- - -

Other stuff -
- - - # - - -

-

I got a beefy PWM motor driver with L298 logic, claiming a continuous current of 7 amps per channel, which nicely fit my requirements. 120mm PC fans are typically 0.2-0.3 amps, and mine in particular are 0.25. For 18 fans, it should be approximately 4.5 amps at 100% speed. It’s a bit oversized, and I’m only using one channel, but it leaves me the option in the future to use larger, generic radiator fans that have more demanding power requirements. I’m already down two from eighteen, eventually enough of them are going to fail that I’ll have to find another solution.

- - -
- -
Required additions to the solenoid, pump motor, and the complete assembly without cover.
-
-

In my initial tests, I found that operating the pump and solenoid would cause the Arduino to reset, seemingly at random, or cause other undefined behavior. Since they were not electrically isolated on a second power supply, that makes sense. They were backfeeding energy and causing a notable amount of general interference during operation, to the point that the LEDs on the inactive relay modules would dimly illuminate when the motor was in operation, and very visibly illuminate whenever the motor or the solenoid deactivated. I had to add flyback diodes, and, for peace of mind, I added ceramic filtering capacitors to the pump as well. Those additions completely eliminated the issue. Below is a video demonstrating the bad behavior.

- - -

I did a similar plug-drilling setup for the water temperature sensor with a generic Dallas temperature probe. The air probe was taped to the exterior of the box, in the path of the incoming air. All that remained was to solder up a sort of bus bar for the radiator fan connectors, get the temperature probes and pull-up resistors wired into the proto board, and hook everything up to the Arduino, then write the software to tie it all together.

- - -

The Software -
- - - # - - -

- -
- -
- - - - - - - - - -
- rawhide_k/server-watercooling-controller -
-
- -

- -

- -
- - -
- C++ -
- - - - - - - - - - -
- 0 -
- - - - - - - - - - -
- 0 -
- -
- -
- -
-

The Arduino operates independently, without a server. The fan speed and loop pressure are managed autonomously. The serial connection is only used to report vital stats, for later integration into more connected monitoring systems. Ultimately, there are only two actions it can take: Change the fan speed, and turn on the vacuum pump. Neither of these require any external knowledge. It doesn’t need any information about the connected hardware to function correctly. All it’s concerned with is keeping the water temperature at a certain delta above ambient temperature, and keeping the loop pressure within a certain range. Ultimately, very simple.

-

Once per second, the temperature sensors are sampled, the PID loop for the fans runs with the new temperature data points, and the fan speed, temperature data, vacuum pressure, and pump/flow measurements are sent over serial with the help of the ArduinoJSON library. I settled on a target water delta of 4*C relative to ambient, with a chosen min/max temperature range where the fans turn off or pin themselves to 100% completely. The 4*C delta is rather arbitrary. It’s approximately the delta that exists when the systems are on, but idle, and the fans are at their minimum speed. That delta can be maintained during 100% CPU load, and during medium-heavy GPU loads, but not both combined. It still stays well under a 10*C delta in that case, though, so I can’t complain.

-

There are also hard stops to turn the fans off if the water temperature hits 5*C, and pin them to max if it hits 40*C. I’m not sure how realistic either of those figures are, but it’s better to be safe than frozen up and/or exploded.

-
int fan_PID(float* air_temp, float* water_temp, uint32_t* cur_loop_timestamp) {
-  static const float kp = 120.0;
-  static const float ki = 0.16;
-  static const float kd = 4.0;
-
-  static float integral = 0;
-  static float derivative = 0;
-  static float last_error = 0;
-  static float error;
-  static float delta;
-  static float last_time = *cur_loop_timestamp;
-  static const float min_water_temp = 5.0;
-  static const float max_water_temp = 40.0;
-  static const uint8_t min_fan_speed = 90;
-  static const uint8_t max_fan_speed = 255;
-
-  static const uint8_t temp_target_offset = 4;
-  static const uint8_t fan_offset = 10;
-
-  static int16_t fan_speed;
-
-  if (*water_temp >= max_water_temp) {
-    return max_fan_speed;
-  }
-
-  else if (*water_temp <= min_water_temp) {
-    return 0;
-  }
-
-  else {
-    error = *water_temp - min(*air_temp + temp_target_offset, max_water_temp);
-    delta = *cur_loop_timestamp - last_time;
-
-    //mitigate unlimited integral windup
-    if (fan_speed == max_fan_speed) {
-      integral += error * delta;
-    }
-
-    if (*air_temp + temp_target_offset > *water_temp - 1) {
-      integral = 0;
-    }
-
-    derivative = (error - last_error) / delta;
-    fan_speed = round(constrain(min_fan_speed + fan_offset + (kp * error + ki * integral + kd * derivative), min_fan_speed, max_fan_speed));
-    last_error = error;
-    return fan_speed;
-  }
-}
-

Occasionally, the temperature probes as well as the HX711 return spurious readings that cause poor behavior, such as crashing the Arduino. In particular, the temperature probes will sometimes return -127, which caused my PID algorithm to crash the Arduino for reasons I could not divine.

-

For the temperature probes, I simply ignore the one problematic result that I’ve observed.

-
new_water_temp = sensors.getTempC(water_therm);
-new_air_temp = sensors.getTempC(air_therm);
-
-if (new_water_temp != -127) {
-  water_temp = new_water_temp;
-}
-
-if (new_air_temp != -127) {
-  air_temp = new_air_temp;
-}
-
-sensors.requestTemperatures();
-

In case of any other freezing/crashing issues, I also enabled the watchdog timer for 2 seconds. So, if, for some reason, it does freeze/crash, it should self reset after 2 seconds. It seems to be working, although I guess time will tell in the long-term. I haven’t experienced any operation issues since I added it over a month ago. The other concern is undefined behavior when the timer overflows. The Uno only has a 32-bit timer, so it will overflow around 50 days of uptime. This function pre-emptively resets it.

-
//we will use this function to periodically self-reset to avoid timer overflows
-void(* resetFunc) (void) = 0;
-
-...
-
-//reset the system when approaching timer overflow
-if (cur_loop_timestamp >= 4000000000) {
-  resetFunc();
-}
-

In addition to the temperature probe problem, the HX711 occasionally returns wildly wrong results that need to be filtered out. To compensate for that, if the pressure dips below the threshold, I wait one second, and if the pressure is still below the threshold, I then begin pumping. This check happens approximately ten times per second, as the default behavior of the HX711 board that I have is to run in 10hz mode. I’m not sure if the issue springs from some kind of interference with the tachometer interrupts messing up the signaling timing, or if I’m misunderstanding the correct way to sample the HX711 over time.

-
if (cur_loop_timestamp - last_pressure_check >= 100) {
-  loop_pressure = pressure_raw_to_mbar(hx711.readChannelRaw(CHAN_A_GAIN_64)); 
-
-  if (sucking == false) {
-    if (loop_pressure > low_pressure_threshold) {
-      if (checking_low_pressure == false) {
-        checking_low_pressure = true;
-        low_pressure_confirmation_timestamp = cur_loop_timestamp;
-      }
-      if (cur_loop_timestamp - low_pressure_confirmation_timestamp >= 1000) {
-        digitalWrite(pump_relay, HIGH);
-        digitalWrite(solenoid_relay, HIGH);
-        sucking = true;
-        checking_low_pressure = false;
-      }
-    }
-
-    else if (cur_loop_timestamp - low_pressure_confirmation_timestamp >= 1000) {
-      checking_low_pressure = false;
-    }
-  }
-
-  else {
-    if (loop_pressure < high_pressure_threshold) {
-      digitalWrite(pump_relay, LOW);
-      digitalWrite(solenoid_relay, LOW);
-      sucking = false;
-    }
-  }
-  last_pressure_check = cur_loop_timestamp;
-}
-

Currently, my server-side software is incomplete. It’s just a brute-force JSON-over-serial reader written in Python, that I glance at from time to time. I plan write a Zabbix bridge, and have that manage the monitoring, alerts, and reactions to catostraphic events, once I have Zabbix properly setup for my systems… But that hasn’t happened just yet. I don’t expect it to be a particularly interesting event, but if anything comes up I might write a post about it.

- - -

Other Thoughts? -
- - - # - - -

-

The Arduino’s software hadn’t been 100% finalized when I took the below pictures. The control box does have a lid now, and all the cable management is a lot cleaner… Promise!

- - -
- -
Everything installed and working!
-
-

When I was testing it, I had an incident where the Arduino crashed, which means the fans stopped… That’s a big drawback with the motor controller that I have, it fails off instead of on. But, I haven’t experienced any more issues after adding those software fixes. At that time, I was running a full GPU workload… The water temperature exceeded 70*C. It happened at night, and I have no idea how long it ran like that… Hours. Pretty scary stuff, but it all came out alright.

-

This project had a lot of firsts for me. It was the first time I’ve done any kind of embedded-adjacent development beyond “ooooo look at the blinky light, oooooooo it turns off when you press the button, wwaaaow”, and the first time I’d designed something with so many individual parts. I’ve never worked with air pumps, solenoids, or pressure sensing before, nor had to debug issues like the lack of flyback diodes.

-

The biggest mistake I made was using that stupid battery box. It’s steel, and I don’t have the tools or experience to work with steel in the way that I intended to. I thought it would look cool, and it does, but if I did it again, I’d use a generic aluminum or plastic project box instead, because it took two entire days plus waiting for new drill bits that can actually cut through it.

-

If I were to ever take it apart again, I’d add a passthrough for the SPI header, and/or an external reset button. I should have gotten a physical display of some type that could show the sensors and debug info on the device itself without being connected to another device to readout the data.

-

I’d like to get a second pump, for redundancy’s sake and to increase the flow rate. But it’s going to be such a pain to install that I feel like I’m never going to bother to do it, unless the current pump fails, or I add more components to be cooled and the flow is adversely affected. I was slightly concerned about the evaporation rate of the liquid via the vacuum tank, and that I’d need to add some kind of fluid level detection system, but there’s been no noticeable loss thus far. Now that I know the pump turns on so infrequently, I can’t imagine that it’s going to need to be topped up anytime soon.

-

In terms of value… This was unbelievably bad. Buying tower coolers would have allowed the CPUs to run without throttling, and buying another GPU would have overpowered any benefits gained by NVLINK. I haven’t tallied up exactly how much I spent on it, but it was at least $1000, including buying new tools and excess materials that I haven’t fully used, and excluding the original cost of re-using some parts I already had. I’ve added risk, maintenance overhead, and pain whenever I swap out hardware in the future. Custom watercooling4 is an ongoing abusive relationship between your fingertips and your ego, or your fascination for slightly more optimized numbers on a screen… But I’d do it again in a heartbeat, because it was fun.

-
-
-
    -
  1. -

    In modern, post-Turing cards, that is. Please stop buying mesozoic-era Kepler/Maxwell Quadros and Teslas just because they have VRAM. There’s a reason they’re going for like, $20, and if you paid more for anything from that era, I’m sorry. Electrical costs are a thing, and your life is worth more than waiting for any meaningful, current-year work to happen on those decrepit e-waste cards. I feel even worse for you if you got tricked into buying one of those “24GB” or “16GB” cards that are actually 2x12GB and 2x8GB. You can make an argument for Volta, but only if you’re doing some deranged pure FP64 stuff. Consumer Turing and newer are faster at everything else! And if you’re buying them for HW-accel encode… The quality is awful compared to any Intel ARC card. Buy one of those instead. ↩︎

    -
  2. -
  3. -

    I don’t understand why people don’t trust the manufacturer specifications when it comes to silicon temperature limits, beyond unfounded conspiracy nonsense around planned destruction/obselence. In terms of Intel server SKUs, you find that the throttling temp is higher than on consumer SKUs, despite the higher reliability demanded by the enterprise market… I’m assuming that this is due to reduced hotspot variance thanks to generally lower voltage spread from lower boosting clock speeds. On enterprise SKUs which are focused on single threaded performance, the throttling temp is typically lower than those without the ability to boost as high. If you have evidence to the contrary, let me know. ↩︎

    -
  4. -
  5. -

    NVIDIA overclocking on Linux is awful. There’s no way to edit the voltage-frequency curve through the Linux drivers. You can only set the offset. So you can’t really make use of dynamic boosting if you want to undervolt. I have the max clock speed clamped at 1800MHz with a core offset to emulate undervolting as you would do on Windows, but it’s hard to say if I’m getting the peak performance that I could be getting at whatever the core voltage is under these circumstances - because NVIDIA’s Linux drivers ALSO don’t report that. VRAM temperature? Nope. VRM? Nope. Hotspot? Nope. You better hope your card works with NVML, too, because otherwise you’re going to have to mess around with X to use nvidia-settings. ↩︎

    -
  6. -
  7. -

    Stop calling them open loops. Open loop systems exchange fluid with the environment. Unless you’re getting your water out of the sink and flushing it right down the drain, your system is not open loop. It’s closed. I don’t understand why people call custom loops “open” and AIOs “closed” when their modes of operation are identical. It’s just plain wrong. ↩︎

    -
  8. -
-
- - - - - - - Reply by Email - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - -
-
- - - - - - -
-
- - -
- - -
- - - diff --git a/public/posts/watercooling-my-homelab/schematic_minify.svg b/public/posts/watercooling-my-homelab/schematic_minify.svg deleted file mode 100644 index 22ed0ef..0000000 --- a/public/posts/watercooling-my-homelab/schematic_minify.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/series/index.html b/public/series/index.html index 3def1da..cf0e5d7 100644 --- a/public/series/index.html +++ b/public/series/index.html @@ -1,492 +1,6 @@ - - - - - - - - - - Series · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - - - -
- -

Series

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - - -
- -
- - - - - - -
- - -
- - - +Series · N.E.E.T. Works +
Skip to main content

Series

\ No newline at end of file diff --git a/public/series/index.xml b/public/series/index.xml index 7fc172f..7056ba3 100644 --- a/public/series/index.xml +++ b/public/series/index.xml @@ -1,15 +1 @@ - - - - Series on N.E.E.T. Works - https://blog.neet.works/series/ - Recent content in Series on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - - - - +Series on N.E.E.T. Workshttps://blog.neet.works/series/Recent content in Series on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml index b01a5ae..e0abbf8 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,23 +1 @@ - - - - - https://blog.neet.works/ - 2025-01-16T05:56:41+00:00 - daily - 0.5 - - - https://blog.neet.works/posts/ - 2025-01-16T05:56:41+00:00 - daily - 0.5 - - - https://blog.neet.works/posts/watercooling-homelab/ - 2025-01-16T05:56:41+00:00 - daily - 0.5 - - +https://blog.neet.works/2025-01-16T05:56:41+00:00daily0.5https://blog.neet.works/posts/2025-01-16T05:56:41+00:00daily0.5https://blog.neet.works/posts/watercooling-homelab/2025-01-16T05:56:41+00:00daily0.5 \ No newline at end of file diff --git a/public/tags/alphacool/index.html b/public/tags/alphacool/index.html index a227bb9..9c5e7ab 100644 --- a/public/tags/alphacool/index.html +++ b/public/tags/alphacool/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Alphacool · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Alphacool

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Alphacool · N.E.E.T. Works +
Skip to main content

Alphacool

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/tags/alphacool/index.xml b/public/tags/alphacool/index.xml index 5ee2629..63598d4 100644 --- a/public/tags/alphacool/index.xml +++ b/public/tags/alphacool/index.xml @@ -1,25 +1 @@ - - - - Alphacool on N.E.E.T. Works - https://blog.neet.works/tags/alphacool/ - Recent content in Alphacool on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Alphacool on N.E.E.T. Workshttps://blog.neet.works/tags/alphacool/Recent content in Alphacool on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/tags/alphacool/page/1/index.html b/public/tags/alphacool/page/1/index.html index db8ca8e..704246b 100644 --- a/public/tags/alphacool/page/1/index.html +++ b/public/tags/alphacool/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/tags/alphacool/ - - - - - - +https://blog.neet.works/tags/alphacool/ + \ No newline at end of file diff --git a/public/tags/aqua-computer/index.html b/public/tags/aqua-computer/index.html index 2ed7d59..8d64f11 100644 --- a/public/tags/aqua-computer/index.html +++ b/public/tags/aqua-computer/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Aqua Computer · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Aqua Computer

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Aqua Computer · N.E.E.T. Works +
Skip to main content

Aqua Computer

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/tags/aqua-computer/index.xml b/public/tags/aqua-computer/index.xml index d6f887f..b087031 100644 --- a/public/tags/aqua-computer/index.xml +++ b/public/tags/aqua-computer/index.xml @@ -1,25 +1 @@ - - - - Aqua Computer on N.E.E.T. Works - https://blog.neet.works/tags/aqua-computer/ - Recent content in Aqua Computer on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Aqua Computer on N.E.E.T. Workshttps://blog.neet.works/tags/aqua-computer/Recent content in Aqua Computer on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/tags/aqua-computer/page/1/index.html b/public/tags/aqua-computer/page/1/index.html index b403a32..04833f1 100644 --- a/public/tags/aqua-computer/page/1/index.html +++ b/public/tags/aqua-computer/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/tags/aqua-computer/ - - - - - - +https://blog.neet.works/tags/aqua-computer/ + \ No newline at end of file diff --git a/public/tags/arduino/index.html b/public/tags/arduino/index.html index 966c16e..bce5a91 100644 --- a/public/tags/arduino/index.html +++ b/public/tags/arduino/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Arduino · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Arduino

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Arduino · N.E.E.T. Works +
Skip to main content

Arduino

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/tags/arduino/index.xml b/public/tags/arduino/index.xml index b85dbac..cad7a78 100644 --- a/public/tags/arduino/index.xml +++ b/public/tags/arduino/index.xml @@ -1,25 +1 @@ - - - - Arduino on N.E.E.T. Works - https://blog.neet.works/tags/arduino/ - Recent content in Arduino on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Arduino on N.E.E.T. Workshttps://blog.neet.works/tags/arduino/Recent content in Arduino on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/tags/arduino/page/1/index.html b/public/tags/arduino/page/1/index.html index 566f39a..dd7c830 100644 --- a/public/tags/arduino/page/1/index.html +++ b/public/tags/arduino/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/tags/arduino/ - - - - - - +https://blog.neet.works/tags/arduino/ + \ No newline at end of file diff --git a/public/tags/index.html b/public/tags/index.html index 64c82ca..9276df8 100644 --- a/public/tags/index.html +++ b/public/tags/index.html @@ -1,588 +1,18 @@ - - - - - - - - - - Tags · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - - - -
- -

Tags

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - - -
- - - - - - - -
-

- Intel - - · - - 1 - - -

-
- -
-

- Nvidia - - · - - 1 - - -

-
- - - -
- - - - - - -
- - -
- - - +Tags · N.E.E.T. Works +
Skip to main content

Tags

\ No newline at end of file diff --git a/public/tags/index.xml b/public/tags/index.xml index f172e8e..164fb24 100644 --- a/public/tags/index.xml +++ b/public/tags/index.xml @@ -1,75 +1 @@ - - - - Tags on N.E.E.T. Works - https://blog.neet.works/tags/ - Recent content in Tags on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Alphacool - https://blog.neet.works/tags/alphacool/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/tags/alphacool/ - - - - - - Aqua Computer - https://blog.neet.works/tags/aqua-computer/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/tags/aqua-computer/ - - - - - - Arduino - https://blog.neet.works/tags/arduino/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/tags/arduino/ - - - - - - Intel - https://blog.neet.works/tags/intel/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/tags/intel/ - - - - - - Nvidia - https://blog.neet.works/tags/nvidia/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/tags/nvidia/ - - - - - - Supermicro - https://blog.neet.works/tags/supermicro/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/tags/supermicro/ - - - - - - +Tags on N.E.E.T. Workshttps://blog.neet.works/tags/Recent content in Tags on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Alphacoolhttps://blog.neet.works/tags/alphacool/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/tags/alphacool/Aqua Computerhttps://blog.neet.works/tags/aqua-computer/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/tags/aqua-computer/Arduinohttps://blog.neet.works/tags/arduino/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/tags/arduino/Intelhttps://blog.neet.works/tags/intel/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/tags/intel/Nvidiahttps://blog.neet.works/tags/nvidia/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/tags/nvidia/Supermicrohttps://blog.neet.works/tags/supermicro/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/tags/supermicro/ \ No newline at end of file diff --git a/public/tags/intel/index.html b/public/tags/intel/index.html index 8c71ed8..1ab9b2f 100644 --- a/public/tags/intel/index.html +++ b/public/tags/intel/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Intel · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Intel

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Intel · N.E.E.T. Works +
Skip to main content

Intel

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/tags/intel/index.xml b/public/tags/intel/index.xml index 7d4d3e7..3f51e77 100644 --- a/public/tags/intel/index.xml +++ b/public/tags/intel/index.xml @@ -1,25 +1 @@ - - - - Intel on N.E.E.T. Works - https://blog.neet.works/tags/intel/ - Recent content in Intel on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Intel on N.E.E.T. Workshttps://blog.neet.works/tags/intel/Recent content in Intel on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/tags/intel/page/1/index.html b/public/tags/intel/page/1/index.html index c56afeb..b640b6c 100644 --- a/public/tags/intel/page/1/index.html +++ b/public/tags/intel/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/tags/intel/ - - - - - - +https://blog.neet.works/tags/intel/ + \ No newline at end of file diff --git a/public/tags/nvidia/index.html b/public/tags/nvidia/index.html index 69283a0..64e43f3 100644 --- a/public/tags/nvidia/index.html +++ b/public/tags/nvidia/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Nvidia · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Nvidia

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Nvidia · N.E.E.T. Works +
Skip to main content

Nvidia

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/tags/nvidia/index.xml b/public/tags/nvidia/index.xml index b3061af..cc3234a 100644 --- a/public/tags/nvidia/index.xml +++ b/public/tags/nvidia/index.xml @@ -1,25 +1 @@ - - - - Nvidia on N.E.E.T. Works - https://blog.neet.works/tags/nvidia/ - Recent content in Nvidia on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Nvidia on N.E.E.T. Workshttps://blog.neet.works/tags/nvidia/Recent content in Nvidia on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/tags/nvidia/page/1/index.html b/public/tags/nvidia/page/1/index.html index 87dbda5..08ac136 100644 --- a/public/tags/nvidia/page/1/index.html +++ b/public/tags/nvidia/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/tags/nvidia/ - - - - - - +https://blog.neet.works/tags/nvidia/ + \ No newline at end of file diff --git a/public/tags/supermicro/index.html b/public/tags/supermicro/index.html index 596fe76..cb0f3f4 100644 --- a/public/tags/supermicro/index.html +++ b/public/tags/supermicro/index.html @@ -1,710 +1,15 @@ - - - - - - - - - - Supermicro · N.E.E.T. Works - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to main content -
- - - - - - - - - -
-
- - - -
- -

Supermicro

-
- - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- -
- -
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
Watercooling My Homelab
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - ·5240 words - - - - -
- - - - -
-
- Watercooling for my homelab with a custom, leak-resistant controller and monitoring! -
- - -
- - - -
- - - - - - - - - - Homelab - - - - - - - - Servers - - - - - - - - Watercooling - - - - - - - - Diy - - - - - - - - - - - - - - - - Alphacool - - - - - - - - Arduino - - - - - - - - Intel - - - - - - - - Nvidia - - - - - - - - Supermicro - - - - - - - - Aqua Computer - - - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - -
- - -
- - - +Supermicro · N.E.E.T. Works +
Skip to main content

Supermicro

Watercooling My Homelab
·5240 words

Watercooling for my homelab with a custom, leak-resistant controller and monitoring!

Homelab +Servers +Watercooling +Diy +Alphacool +Arduino +Intel +Nvidia +Supermicro +Aqua Computer
\ No newline at end of file diff --git a/public/tags/supermicro/index.xml b/public/tags/supermicro/index.xml index 9ce627f..1edf9d6 100644 --- a/public/tags/supermicro/index.xml +++ b/public/tags/supermicro/index.xml @@ -1,25 +1 @@ - - - - Supermicro on N.E.E.T. Works - https://blog.neet.works/tags/supermicro/ - Recent content in Supermicro on N.E.E.T. Works - Hugo -- gohugo.io - en - rawhide@neet.works (rawhide kobayashi) - rawhide@neet.works (rawhide kobayashi) - *© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.* - Thu, 16 Jan 2025 05:56:41 +0000 - - - Watercooling My Homelab - https://blog.neet.works/posts/watercooling-homelab/ - Thu, 16 Jan 2025 05:56:41 +0000 - rawhide@neet.works (rawhide kobayashi) - https://blog.neet.works/posts/watercooling-homelab/ - - - - - - +Supermicro on N.E.E.T. Workshttps://blog.neet.works/tags/supermicro/Recent content in Supermicro on N.E.E.T. WorksHugo -- gohugo.ioenrawhide@neet.works (rawhide kobayashi)rawhide@neet.works (rawhide kobayashi)*© 2025 rawhide kobayashi | **Original content** licensed under **[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)** unless otherwise noted.*Thu, 16 Jan 2025 05:56:41 +0000Watercooling My Homelabhttps://blog.neet.works/posts/watercooling-homelab/Thu, 16 Jan 2025 05:56:41 +0000rawhide@neet.works (rawhide kobayashi)https://blog.neet.works/posts/watercooling-homelab/ \ No newline at end of file diff --git a/public/tags/supermicro/page/1/index.html b/public/tags/supermicro/page/1/index.html index dfd002b..953d35e 100644 --- a/public/tags/supermicro/page/1/index.html +++ b/public/tags/supermicro/page/1/index.html @@ -1,10 +1,2 @@ - - - - https://blog.neet.works/tags/supermicro/ - - - - - - +https://blog.neet.works/tags/supermicro/ + \ No newline at end of file