<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelabbing on A blog by Dennis Hilhorst</title><link>https://blog.dennishilhorst.nl/categories/homelabbing/</link><description>Recent content in Homelabbing on A blog by Dennis Hilhorst</description><generator>Hugo -- gohugo.io</generator><language>nl-nl</language><lastBuildDate>Wed, 12 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.dennishilhorst.nl/categories/homelabbing/index.xml" rel="self" type="application/rss+xml"/><item><title>Homelab - Setting up Telegraf on TrueNAS SCALE for InfluxDB2 / Grafana telemetry with dataset stats</title><link>https://blog.dennishilhorst.nl/post/homelab-setting-up-telegraf-on-truenas-scale-for-influxdb2-telemetry/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.dennishilhorst.nl/post/homelab-setting-up-telegraf-on-truenas-scale-for-influxdb2-telemetry/</guid><description>&lt;img src="https://blog.dennishilhorst.nl/post/homelab-setting-up-telegraf-on-truenas-scale-for-influxdb2-telemetry/images/truenas-grafana.png" alt="Featured image of post Homelab - Setting up Telegraf on TrueNAS SCALE for InfluxDB2 / Grafana telemetry with dataset stats" /&gt;&lt;p&gt;I want to set up a Grafana dashboard for monitoring my homelab resource usage. Since Proxmox has integrated support for InfluxDB2, I am already hosting Grafana + InfluxDB2, and I would like to integrate my TrueNAS SCALE system into the same logging. Sadly, there is not much documentation for how to set this up. Initially, I got it sort of working by running telegraf from the InfluxDB2 LXC (on a proxmox host), and registering a Graphite exporter in TrueNAS. I didn&amp;rsquo;t really like this setup, since it doesn&amp;rsquo;t really seem to be the way Telegraf is supposed to be used. If you want to do it this way, see &lt;a class="link" href="https://www.truenas.com/community/threads/metrics-from-truenas-scale-server-into-grafana.115903/#post-803622" target="_blank" rel="noopener"
 &gt;this forum comment&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I mainly followed the discussion in &lt;a class="link" href="https://www.reddit.com/r/homelab/comments/13rxlux/telegraf_on_truenas_scale/" target="_blank" rel="noopener"
 &gt;this Reddit post&lt;/a&gt;, with some minor fixes / changes to get everything working. The post itself is kind of concise, so I will elaborate a bit more on what to do.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a dataset on your TrueNAS system which will store (read-only) files for telegraf (mainly telegraf.conf and docker setup/entrypoint scripts). For me, this was &lt;code&gt;/mnt/usb-pool/telegraf&lt;/code&gt; (I used usb-pool because I didn&amp;rsquo;t partition my boot SSD before installing, and I didn&amp;rsquo;t want apps to run on HDDs).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Optional:&lt;/strong&gt; Create an NFS share for it so we can initialize the files we need from a Linux system, though you can also do it from a shell on your TrueNAS host. I found the web shell is rather annoying with copy/pasting, and I didn&amp;rsquo;t have SSH configured, so I just did it this way.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the dataset, create a file &lt;code&gt;telegraf.conf&lt;/code&gt; with the following contents (replace the &lt;code&gt;hostname&lt;/code&gt; with whatever you want (I did &lt;code&gt;truenas&lt;/code&gt;) and set the influxdb_v2 values (the influxdb host IP, token, organization and bucket)):&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;global_tags&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;agent&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;interval&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;10s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;round_interval&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;metric_batch_size&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;metric_buffer_limit&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;collection_jitter&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;0s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;flush_interval&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;10s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;flush_jitter&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;0s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;precision&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;hostname&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;your_host_name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;omit_hostname&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;outputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;influxdb_v2&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;urls&lt;/span&gt; = [&lt;span style="color:#e6db74"&gt;&amp;#34;http://your_ip:8086&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;your_token&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;your_organization&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;bucket&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;your_bucket&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cpu&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;percpu&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;totalcpu&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;collect_cpu_time&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;report_active&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;diskio&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;kernel&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;mem&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;swap&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;system&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;net&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sensors&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;execd&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;command&lt;/span&gt; = [&lt;span style="color:#e6db74"&gt;&amp;#34;/mnt/zfs_libs/zpool_influxdb&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;--execd&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;environment&lt;/span&gt; = [&lt;span style="color:#e6db74"&gt;&amp;#34;LD_LIBRARY_PATH=/mnt/zfs_libs&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;signal&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;STDIN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;restart_delay&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;10s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data_format&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;influx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;zfs&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;kstatPath&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;/hostfs/proc/spl/kstat/zfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;poolMetrics&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;datasetMetrics&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;smart&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;30s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;attributes&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;use_sudo&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;inputs&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exec&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;commands&lt;/span&gt; = [&lt;span style="color:#e6db74"&gt;&amp;#34;/zfs_dataset_stats.sh&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data_format&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;influx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;interval&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;60s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Create an &lt;code&gt;entrypoint.sh&lt;/code&gt; file with the following contents:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install -y sudo smartmontools nvme-cli
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;telegraf ALL=NOPASSWD:/usr/sbin/smartctl&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sudoers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;telegraf ALL = NOPASSWD: /mnt/zfs_libs/zpool_influxdb&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sudoers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Defaults:telegraf !requiretty, !syslog&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sudoers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/mnt/zfs_libs:&lt;/span&gt;$PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;1:0:1&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -- telegraf &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$@&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $EUID -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exec &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$@&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setcap cap_net_raw,cap_net_bind_service+ep /usr/bin/telegraf &lt;span style="color:#f92672"&gt;||&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Failed to set additional capabilities on /usr/bin/telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exec setpriv --reuid telegraf --init-groups &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$@&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ldconfig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Custom Entrypoint Startup Complete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Make the script executable by running &lt;code&gt;chmod +x entrypoint.sh&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a script &lt;code&gt;zfs_dataset_stats.sh&lt;/code&gt; with the following contents:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ZFS_BIN&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/host_sbin/zfs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ZFS_BIN list -Hp -o name,used,avail | awk &lt;span style="color:#e6db74"&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;BEGIN {print &amp;#34;&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;NR&amp;gt;1 {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; printf &amp;#34;zfs_dataset,name=%s used=%s,avail=%s\n&amp;#34;, $1, $2, $3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Make the script executable by running &lt;code&gt;chmod +x zfs_dataset_stats.sh&lt;/code&gt;. This script will gather dataset-level information about used / available space. It will need a mount of &lt;code&gt;/sbin&lt;/code&gt; to acces zfs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;setup.sh&lt;/code&gt; script with the following contents, and make it executable with &lt;code&gt;chmod +x setup.sh&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some paths are updated from the original script in the post. Mainly, the &lt;code&gt;libzfs.so&lt;/code&gt;, &lt;code&gt;libcrypto.so&lt;/code&gt; and &lt;code&gt;zpool_influxdb&lt;/code&gt; paths. It may be the case that on later versions of TrueNAS SCALE, these files are renamed / moved. The &lt;code&gt;zpool_influxdb&lt;/code&gt; file was really moved, but the so&amp;rsquo;s just had newer versions. If you run this script at a later stage and you find that it tells you it is missing files, simply go to the directory and try to find the newer version, so you can update the path in the script.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;current_dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;pwd&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir $current_dir/zfs_libs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libnvpair.so.3 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libzfs.so.6 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libbsd.so.0 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libc.so.6 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libzfs_core.so.3 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libuutil.so.3 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libm.so.6 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libcrypto.so.3 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libz.so.1 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libpthread.so.0 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libdl.so.2 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libmd.so.0 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib64/ld-linux-x86-64.so.2 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libuuid.so.1 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/librt.so.1 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libblkid.so.1 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /lib/x86_64-linux-gnu/libudev.so.1 $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /usr/lib/zfs-linux/zpool_influxdb $current_dir/zfs_libs/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chown -R 0:0 $current_dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod -R &lt;span style="color:#ae81ff"&gt;777&lt;/span&gt; $current_dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s /etc $current_dir/etc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s /proc $current_dir/proc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s /sys $current_dir/sys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s /var $current_dir/var
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s /run $current_dir/run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;setup.sh&lt;/code&gt; (after making it executable). You can still do this from another Linux machine if you decided to mount the dataset as an NFS share. If this succeeds you are ready to add the telegraf application from the TrueNAS GUI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We now need to create the Telegraf application. The easiest way of doing this is by going to &lt;strong&gt;Apps &amp;gt; Discover Apps &amp;gt; Install via YAML&lt;/strong&gt; (where this last option is in the three-dot menu on the top right hand side of the screen). Paste the following YAML (replacing &lt;code&gt;/mnt/usb-pool/telegraf&lt;/code&gt; with whatever dataset path you put your telegraf config files):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; This YAML varies slightly from the YAML in the top comment, where the user was also monitoring GPU usage it seems, and the zfs_tools path was invalid. Also the latest telegraf image was taken, and no extra deploy options were needed (as I am not doing anything with the GPU).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;telegraf&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;telegraf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_ETC=/hostfs/etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_PROC=/hostfs/proc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_SYS=/hostfs/sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_VAR=/hostfs/var&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_RUN=/hostfs/run&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_MOUNT_PREFIX=/hostfs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;LD_LIBRARY_PATH=/mnt/zfs_libs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_ROOT=/hostfs/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;HOST_MNT=/hostfs/mnt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;docker.io/telegraf:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#39;10000:10000&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;privileged&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/sbin:/host_sbin:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/etc:/hostfs/etc:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/proc:/hostfs/proc:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/sys:/hostfs/sys:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/run:/hostfs/run:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/entrypoint.sh:/entrypoint.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/zfs_dataset_stats.sh:/zfs_dataset_stats.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/zfs_libs:/mnt/zfs_libs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/var:/hostfs/var:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;/mnt/usb-pool/telegraf/mnt:/hostfs/mnt:ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Now simply start your app, and it should run! In the logs, telegraf complained about not being able to get disk names for their &lt;code&gt;sdX&lt;/code&gt;-based names. This didn&amp;rsquo;t really seem to be a problem, as I was able to see disk stats based on the serial numbers anyway, and I am mostly interested in the ZFS pool data.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Homelab - Installing Proxmox, settings and troubleshooting</title><link>https://blog.dennishilhorst.nl/post/homelab-installing-proxmox-settings-and-troubleshooting/</link><pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.dennishilhorst.nl/post/homelab-installing-proxmox-settings-and-troubleshooting/</guid><description>&lt;p&gt;My homelab runs on Proxmox, which was easy to set up, is very easy to work with, but gave me some trouble sometimes nontheless. I wanted to just leave this here for future reference, or it may be useful to others.&lt;/p&gt;
&lt;h2 id="installing-from-usb"&gt;Installing from USB
&lt;/h2&gt;&lt;p&gt;Since my hardware didn&amp;rsquo;t like booting from a bootable USB with the Proxmox ISO created with Rufus, I had to take another route. I followed &lt;a class="link" href="https://www.reddit.com/r/intelnuc/comments/1bx2yf3/comment/l2p13zk/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" target="_blank" rel="noopener"
 &gt;this advice from a Reddit comment&lt;/a&gt;. I had never heard of Ventoy before this, but I am really loving it, it has come in useful multiple times. Basically, it is easier to create a bootable USB with Ventoy, and drop ISOs on there. On Windows, just download Ventoy, run Ventoy2Disk and install it on a USB.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I had to install it with GPT format instead of MBR to get it to work, but it has never failed me ever since.&lt;/p&gt;
&lt;h3 id="leftover-signatures-on-disk"&gt;Leftover signatures on disk
&lt;/h3&gt;&lt;p&gt;If there are leftover signatures on the disk you are trying to install proxmox on, the installer will stop. You will have to boot into a Linux shell (e.g. through your Ventoy USB!) and then find your disk device name with &lt;code&gt;lsblk&lt;/code&gt; or &lt;code&gt;blkid&lt;/code&gt;, and then run&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo wipefs -fa /dev/sdX
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;replacing &lt;code&gt;sdX&lt;/code&gt; with the disk you are trying to install Proxmox on.&lt;/p&gt;
&lt;h2 id="post-install"&gt;Post-install
&lt;/h2&gt;&lt;p&gt;There are various settings you might want to configure for power saving or performance, but here is what I did.&lt;/p&gt;
&lt;h3 id="reducing-ssd-wear"&gt;Reducing SSD wear
&lt;/h3&gt;&lt;p&gt;I read a lot online that Proxmox can really wear out your SSD quickly if you do not alter some settings and use ramdisks for certain tasks / logging. I mainly followed instructions from &lt;a class="link" href="https://www.reddit.com/r/Proxmox/comments/1j4ehgq/comment/mg9y8ze/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" target="_blank" rel="noopener"
 &gt;this Reddit comment&lt;/a&gt;. Run the following to disable some write-heavy services (though it seemed &lt;code&gt;pvesr.timer&lt;/code&gt; did not exist):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl stop pve-ha-crm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl stop pvesr.timer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl stop corosync.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl disable pve-ha-lrm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl disable pve-ha-crm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl disable pvesr.timer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemctl disable corosync.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Enable &lt;code&gt;WRITE_TIMEOUT=3600&lt;/code&gt; in &lt;code&gt;/etc/defaults/rrdcached&lt;/code&gt; config file to reduce disk IOPS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disable &lt;code&gt;JOURNAL_PATH=/var/lib/rrdcached/journal/&lt;/code&gt; in &lt;code&gt;/etc/defaults/rrdcached&lt;/code&gt; config file to reduce disk IOPS. (comment the line)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added &lt;code&gt;&amp;quot;${FLUSH_TIMEOUT:+-f ${FLUSH_TIMEOUT}} &amp;quot;&lt;/code&gt; to &lt;code&gt;/etc/init.d/rrdcached&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;[log2ram](https://github.com/azlux/log2ram)&lt;/code&gt; and make sure &lt;code&gt;rsync&lt;/code&gt; is installed (reboot after installing!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mount &lt;code&gt;/tmp&lt;/code&gt; to a ramdisk by adding the following to &lt;code&gt;/etc/fstab&lt;/code&gt; and run &lt;code&gt;mount -a&lt;/code&gt; to create a 1GB ramdisk for &lt;code&gt;/tmp&lt;/code&gt; which only uses up RAM as it is being filled. You can check if it worked by running &lt;code&gt;df -h /tmp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,mode=1777,size=1G 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="helper-scripts"&gt;Helper scripts
&lt;/h3&gt;&lt;p&gt;I ran the &lt;code&gt;install-post.sh&lt;/code&gt; script from &lt;a class="link" href="https://github.com/extremeshok/xshok-proxmox" target="_blank" rel="noopener"
 &gt;this repo&lt;/a&gt; (&lt;a class="link" href="https://github.com/DenSinH/xshok-proxmox" target="_blank" rel="noopener"
 &gt;mirror on my own GitHub&lt;/a&gt;). There may be more post-install helper scripts (for example in Tteck&amp;rsquo;s helper scripts), but I didn&amp;rsquo;t run any others.&lt;/p&gt;
&lt;h3 id="power-saving-stuff"&gt;Power saving stuff
&lt;/h3&gt;&lt;p&gt;You can do some stuff outside of Proxmox by changing some power saving settings in your BIOS (F2 on boot for Intel NUCs), but I also followed advice from &lt;a class="link" href="https://forum.proxmox.com/threads/turn-off-proxmox-primary-monitor.120769/" target="_blank" rel="noopener"
 &gt;this forum thread&lt;/a&gt;:&lt;/p&gt;
&lt;h4 id="terminal-sleep-after-timeout"&gt;Terminal sleep after timeout
&lt;/h4&gt;&lt;p&gt;Create and edit the script file: &lt;code&gt;nano /root/down_monitor.sh&lt;/code&gt; and add the following lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setterm -term linux -blank &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; -powersave powerdown -powerdown &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &amp;lt;/dev/tty1 &amp;gt;/dev/tty1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then we need to enable the script with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;chmod +x /root/down_monitor.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run &lt;code&gt;crontab -e&lt;/code&gt;, select your favorite editor and add a line &lt;code&gt;@reboot /root/down_monitor.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;bash /root/down_monitor.sh&lt;/code&gt; to enable it for this session.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also followed another tip from that thread:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nano /etc/default/grub&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet&amp;quot;&lt;/code&gt; with &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet consoleblank=60&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;update-grub&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reboot&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="powertop-on-boot"&gt;PowerTOP on boot
&lt;/h4&gt;&lt;p&gt;Run the following command to create a systemd service that runs &lt;code&gt;powertop --auto-tune&lt;/code&gt; on boot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF | tee /etc/systemd/system/powertop.service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Description=powertop auto-tune
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Type=oneshot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Environment=&amp;#34;TERM=dumb&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;RemainAfterExit=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ExecStart=/usr/sbin/powertop --auto-tune
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable powertop.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="setting-cpu-governer-to-powersave"&gt;Setting CPU governer to &amp;lsquo;powersave&amp;rsquo;
&lt;/h4&gt;&lt;p&gt;Check what cpu governors are available with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You will likely get results like &lt;code&gt;performance&lt;/code&gt;, &lt;code&gt;powersave&lt;/code&gt; and maybe even &lt;code&gt;dynamic&lt;/code&gt; or &lt;code&gt;ondemand&lt;/code&gt;. You can set all core&amp;rsquo;s CPU governer to &lt;code&gt;powersave&lt;/code&gt; with&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo powersave | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="installing-services"&gt;Installing services
&lt;/h2&gt;&lt;p&gt;In general, I can really recommend the &lt;a class="link" href="https://community-scripts.github.io/ProxmoxVE/" target="_blank" rel="noopener"
 &gt;Proxmox VE Helper Scripts&lt;/a&gt;. They automatically set up (most) of the LXCs you might want. Some caveats:&lt;/p&gt;
&lt;h4 id="ip-dhcp-configuration"&gt;IP DHCP Configuration
&lt;/h4&gt;&lt;p&gt;Most helper scripts set the IP to DHCP by default. You may want to reconfigure the IP to a static one in the LXC / VM settings, and/or set the IP in your router&amp;rsquo;s configuration (or whatever DHCP server you use).&lt;/p&gt;
&lt;h4 id="home-assistant-zigbee-dongle-passthrough"&gt;Home Assistant ZigBee dongle passthrough
&lt;/h4&gt;&lt;p&gt;I followed &lt;a class="link" href="https://smarthomescene.com/guides/how-to-passthrough-usb-devices-to-home-assistant-in-proxmox/" target="_blank" rel="noopener"
 &gt;this tutorial&lt;/a&gt; for it. If you do it properly, it should detect the USB device even if it is connected to another port. Basically, in Proxmox, in your VM settings in Hardware, click &amp;ldquo;Add&amp;rdquo;, then &amp;ldquo;USB Device&amp;rdquo; and select &amp;ldquo;Use Vendor/Device ID&amp;rdquo;. Select your device and click add.&lt;/p&gt;
&lt;h4 id="tailscale-in-proxmox-lxc"&gt;Tailscale in Proxmox LXC
&lt;/h4&gt;&lt;p&gt;Installing Tailscale on a proxmox LXC is fairly easy. Edit &lt;code&gt;/etc/pve/lxc/&amp;lt;id&amp;gt;.conf&lt;/code&gt; and add the following 2 lines:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The install tailscale as usual for a Linux host (by running the following)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://tailscale.com/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then run &lt;code&gt;tailscale up&lt;/code&gt; as it suggests (or add additional options to this command) and follow the link to add it to your tailnet.&lt;/p&gt;
&lt;h2 id="troubleshooting"&gt;Troubleshooting
&lt;/h2&gt;&lt;h4 id="network-issues-with-intel-nucs"&gt;Network issues with Intel NUCs
&lt;/h4&gt;&lt;p&gt;At some point, I started having issues with my network. Since my pihole runs as an LXC, DNS would become unavailable and our entire home internet would break. The pihole was also configured as DNS server in my VPN (Tailscale), so internet would break even when away from home! It is therefore important to make sure your Proxmox host &lt;em&gt;always&lt;/em&gt; has a stable internet connection. This is the reason why I also decided to disable tailscale on my Proxmox host. The strange thing was, I wasn&amp;rsquo;t even able to ping (even local!) IP addresses directly from my Proxmox host or any LXCs. It turns out there was something going on with the NIC of my Intel NUC. When shutting down, it started printing error messages:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;e1000e 0000:00:19.0 enp0s25: Detected Hardware Unit Hang:
 THD &amp;lt;88&amp;gt;
 TDT &amp;lt;a7&amp;gt;
 next_to_use &amp;lt;a7&amp;gt;
 next_to_clean &amp;lt;88&amp;gt;
buffer_into[next_to_clean]:
 time_stamp &amp;lt;102252f3c&amp;gt;
 next_to_watch &amp;lt;89&amp;gt;
 jiffies &amp;lt;104ca3900&amp;gt;
 next_to_watch.status &amp;lt;0&amp;gt;
MAC Status &amp;lt;80083&amp;gt;
PHY Status &amp;lt;796d&amp;gt;
PHY 1000BASE-T Status &amp;lt;3800&amp;gt;
PHY Extended Status &amp;lt;3000&amp;gt;
PCI Status &amp;lt;10&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It turns out, &lt;a class="link" href="https://www.reddit.com/r/Proxmox/comments/1drs89s/intel_nic_e1000e_hardware_unit_hang/" target="_blank" rel="noopener"
 &gt;this is a known issue with a published workaround&lt;/a&gt;. The solution was quite simple in the end (even though I tried a &lt;em&gt;lot&lt;/em&gt; of things, including chaning power settings for the network card, messing around with tailscale a &lt;em&gt;lot&lt;/em&gt;). Simply include this in your &lt;code&gt;/etc/network/interfaces&lt;/code&gt; config (replace &lt;code&gt;enp0s25&lt;/code&gt; for the name of your NIC, which you can just deduce from the existing file contents):&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;iface enp0s25 inet manual
 post-up ethtool -K enp0s25 tso off gso off
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and for your current session, you may want to just run &lt;code&gt;post-up ethtool -K enp0s25 tso off gso off&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="permission-denied-when-adding-truenas-nfs-share"&gt;Permission denied when adding TrueNAS NFS share
&lt;/h4&gt;&lt;p&gt;A simple fix is to simply go to the share, click &amp;ldquo;Advanced Options&amp;rdquo; and set &amp;ldquo;Mapall User&amp;rdquo; to &amp;ldquo;root&amp;rdquo;.&lt;/p&gt;
&lt;h4 id="cts--vms--storage-showing-up-as-unknown"&gt;CTs / VMs / Storage showing up as &amp;ldquo;unknown&amp;rdquo;
&lt;/h4&gt;&lt;p&gt;In this case, most likely the &lt;code&gt;pvestatd&lt;/code&gt; service failed. Check the logs. Mine looked like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Dec 02 11:48:28 proxmox1 pvestatd[1056]: storage status update error: Can&amp;#39;t use an undefined value as a subroutine reference at /usr/share/perl5/PVE/Status/InfluxDB.pm line 153.
Dec 02 11:48:38 proxmox1 pvestatd[1056]: storage status update error: Can&amp;#39;t use an undefined value as a subroutine reference at /usr/share/perl5/PVE/Status/InfluxDB.pm line 153.
&amp;lt; many times &amp;gt;
Dec 02 11:51:19 proxmox1 pvestatd[1056]: storage status update error: Can&amp;#39;t use an undefined value as a subroutine reference at /usr/share/perl5/PVE/Status/InfluxDB.pm line 153.
Dec 02 11:51:28 proxmox1 pvestatd[1056]: storage status update error: Can&amp;#39;t use an undefined value as a subroutine reference at /usr/share/perl5/PVE/Status/InfluxDB.pm line 153.
Dec 02 11:51:29 proxmox1 pvestatd[1056]: auth key pair too old, rotating..
Dec 02 11:51:29 proxmox1 systemd[1]: pvestatd.service: Main process exited, code=killed, status=11/SEGV
Dec 02 11:51:29 proxmox1 systemd[1]: pvestatd.service: Failed with result &amp;#39;signal&amp;#39;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can restart the service, though it may crash again later. It seems there is a forum thread about it &lt;a class="link" href="https://forum.proxmox.com/threads/pvestatd-crashes-every-few-days.165597/" target="_blank" rel="noopener"
 &gt;here&lt;/a&gt;. A temporary hack is the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl edit pvestatd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then in the part of the file you can edit, enter&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;Service&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Restart&lt;/span&gt;=&lt;span style="color:#a6e22e"&gt;on-failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save and exit and run&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will make sure the pvestatd service will restart if it ever crashes.&lt;/p&gt;
&lt;h4 id="setting-vmid-range"&gt;Setting VMID range
&lt;/h4&gt;&lt;p&gt;To get the next VM ID, run&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pvesh get /cluster/nextid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To set the range, run&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pvesh set /cluster/options -next-id lower&lt;span style="color:#f92672"&gt;=&lt;/span&gt;300,upper&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;399&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can get the next VM ID to check that the range is properly configured now.&lt;/p&gt;</description></item><item><title>Homelab - Setting up a Cloudflare tunnel to Traefik</title><link>https://blog.dennishilhorst.nl/post/homelab-setting-up-a-cloudflare-tunnel-to-traefik/</link><pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.dennishilhorst.nl/post/homelab-setting-up-a-cloudflare-tunnel-to-traefik/</guid><description>&lt;img src="https://blog.dennishilhorst.nl/post/homelab-setting-up-a-cloudflare-tunnel-to-traefik/images/cloudflare-tunnel.webp" alt="Featured image of post Homelab - Setting up a Cloudflare tunnel to Traefik" /&gt;&lt;p&gt;Before I started self hosting all of my stuff, I was using a VPS to host my web services. This was relatively easy to manage, while still giving me the freedom of hosting whatever webservices I want. After setting up my first small homelab, I wanted to host this myself as well, from home. I found it a little bit scary to migrate, but simply copying over the entire docker data directory to my new Ubuntu server VM seemed to work just fine. The problem came with reaching the server from the outside though. My setup is as follows: I have Traefik set up as a reverse proxy, and hosted portainer for managing all my (docker-based) services, which works together well with Traefik. I am using Cloudflare to manage my DNS already, first pointing everything to the public IP of my VPS (without proxying, as that messes up Traefik since it tampers with the Host header).&lt;/p&gt;
&lt;p&gt;With self-hosting my services, I decided to first go for the &amp;ldquo;easy&amp;rdquo; option: port forwarding. I was a bit naive, and got my public IP and routed all traffic there. Unfortunately, after a while, nothing was reachable anymore. I don&amp;rsquo;t have a static IP with my ISP, and so my IP address got rotated at some point. I moved to using using DDNS. Since I have my own router (ASUS AX-57) behind my ISPs router, I couldn&amp;rsquo;t really use the DDNS service that ASUS provides for free with its hardware, as my own router&amp;rsquo;s WAN IP was a private IP, assigned &lt;em&gt;in the ISP router&lt;/em&gt;. Fortunately, my ISPs router has built-in support for various DDNS providers, so I just created a noip account and set it up through there, forwarding ports 80 and 443 to my own router, which in turn forwarded those ports to my server VM.&lt;/p&gt;
&lt;p&gt;This is not very satisfying though, because though it is simple it has some flaws:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You have to forward ports, which may come with security risks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have to configure stuff in my ISPs router, so if I switch ISP or if it gets replaced I have to do it over again&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have to configure stuff in my own router, which I don&amp;rsquo;t mind too much (I am using its DHCP server as well), but the less configuration in my router, the better.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So since I am already with Cloudflare, I decided I want to set up a Cloudflare tunnel. Here is the process I went through:&lt;/p&gt;
&lt;h3 id="setting-up-a-cloudflare-tunnel-to-a-traefik-reverse-proxy"&gt;Setting up a Cloudflare tunnel to a Traefik reverse-proxy
&lt;/h3&gt;&lt;p&gt;There is &lt;a class="link" href="https://github.com/sfnemis/proxmox-traefikproxy-cloudflaretunnel" target="_blank" rel="noopener"
 &gt;a nice tutorial written by GitHub user sfnemis&lt;/a&gt; (&lt;a class="link" href="https://github.com/DenSinH/proxmox-traefikproxy-cloudflaretunnel" target="_blank" rel="noopener"
 &gt;mirror on my own GitHub&lt;/a&gt;). I partly used this, I partly used ChatGPT and I partly Googled around to fix issues.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a (free) account for &lt;a class="link" href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener"
 &gt;Cloudflare Zero Trust&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the &lt;a class="link" href="https://community-scripts.github.io/ProxmoxVE/scripts?id=cloudflared&amp;amp;category=Network&amp;#43;%26&amp;#43;Firewall" target="_blank" rel="noopener"
 &gt;Proxmox Helper Script for a Cloudflared LXC&lt;/a&gt;. If you are not using Proxmox, you should be able to just install cloudflared.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Also configure the local (static) IP, and everything else you might want to configure for your Proxmox LXCs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In your LXC (or your system with cloudflared installed), run &lt;code&gt;cloudflared tunnel login&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This will output a URL, open it, log in and select your domain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It will create a file &lt;code&gt;/root/.cloudflared/cert.pem&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; I first ran cloudflared through Docker on my server VM (which ChatGPT suggested, but it was an annoying suggestion). It should &amp;ldquo;integrate better with my existing docker network&amp;rdquo;. In the end, it seems to have placed this certificate in some Docker volume, making me lose my mind when I couldn&amp;rsquo;t find it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a tunnel (e.g. &lt;code&gt;vps-tunnel&lt;/code&gt;) with &lt;code&gt;cloudflared tunnel create vps-tunnel&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This will output some info, like the location of your credentials file (at &lt;code&gt;/root/.cloudflared/vps-tunnel.json&lt;/code&gt;) and the tunnel UUID. Store the UUID in an environment variable with &lt;code&gt;TUNNEL_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a systemd service file for cloudflared:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create service file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; /etc/systemd/system/cloudflared.service &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Description=Cloudflare Tunnel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;After=network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Wants=network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;User=root
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ExecStart=/usr/bin/cloudflared tunnel run
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Restart=on-failure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;RestartSec=5s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Enable and start service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable cloudflared
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl start cloudflared
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create DNS entries for the tunnel (replace example.com with your domain):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a wildcard subdomain DNS record for the tunnel with &lt;code&gt;cloudflared tunnel route dns $TUNNEL_ID &amp;quot;*.example.com&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; this will serve as a &amp;ldquo;catchall&amp;rdquo; for any subdomains that are not configured to have a specific DNS record. If you are migrating your setup (like I was), you can then easily migrate every service separately by removing their existing DNS records one-by-one, but in the end they should all be gone from your Cloudflare DNS dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also create a route for your root domain with &lt;code&gt;cloudflared tunnel route dns $TUNNEL_ID example.com&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart the cloudflared service with &lt;code&gt;systemctl restart cloudflared&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it can&amp;rsquo;t find the credentials file, it will tell you where it expects it to be. You can fix the location with: &lt;code&gt;cp /root/.cloudflared/TUNNEL_ID.json /etc/cloudflared/credentials.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At this point, I tried creating the configuration file, configuring the tunnel from my VPS and routing traffic through there, but I kept getting 404s from Traefik. At this point, I just migrated the tunnel management to the Cloudflare Zero Trust platform.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the Cloudflare Zero Trust platform, go to &lt;strong&gt;Networks &amp;gt; Tunnels&lt;/strong&gt; and click your tunnel. It will tell you that it is not managed from the Cloudflare Zero Trust platform, and have a wizard to migrate it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It seems that the 404&amp;rsquo;s came from the fact that Traefik is set to only allow HTTPS, but the records I had configured in the cloudflared config.yml were set to be HTTP-type services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; migrating your tunnel management to the Cloudflare Zero Trust platform is &lt;em&gt;irreversible&lt;/em&gt;. If you want to keep everything local, you can, but you&amp;rsquo;d have to translate these instructions to the &lt;code&gt;/etc/cloudflared/config.yml&lt;/code&gt;-based setup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Cloudflare Zero Trust, go to &lt;strong&gt;Networks &amp;gt; Tunnels&lt;/strong&gt; and click your tunnel&amp;rsquo;s name, (vps-tunnel) and click &amp;ldquo;Edit&amp;rdquo;. Go to the &amp;ldquo;Published application routes&amp;rdquo;. You can now add routes for your applications (tied to subdomains of your own domain). To add a service, do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Click add a published application route.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter the subdomain your service is at (this should be what Traefik expects it to be, though you can even configure it to be something else, and set the Host header to whatever Traefik expects it to be for the service you want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select your domain (and optionally a path)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set the service type to HTTPS.&lt;/strong&gt; This is &lt;strong&gt;very&lt;/strong&gt; important if your Traefik reverse proxy is set to disallow insecure requests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the URL, set the IP (or hostname) from which your cloudflared LXC or machine can access Traefik. For me, this was &lt;code&gt;192.168.50.30&lt;/code&gt;, as that is the IP of my server VM on my LAN, but for you it may just be &lt;code&gt;localhost&lt;/code&gt; (if &lt;code&gt;cloudflared&lt;/code&gt; is running on the same machine as Traefik) or some other IP or hostname.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &amp;ldquo;Additional application settings&amp;rdquo; configure the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTTP Settings &amp;gt; HTTP Host Header&lt;/strong&gt;: Set it to the URL Traefik expects for the service you are configuring. This is very important, as otherwise Traefik can&amp;rsquo;t route the request properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TLS &amp;gt; No TLS Verify&lt;/strong&gt;: Turn this on, as otherwise cloudflared may not accept the self-signed certificates you may currently be using.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Cloudflare tunnels do &lt;strong&gt;not&lt;/strong&gt; support multi-part subdomains (i.e. something.other.example.com), unless you pay for a premium subscription. I found this quite a shame, but I could just replace the dots with dashes (something-other.example.com). It&amp;rsquo;s less pretty, but oh well. At least I could just keep the HTTP Host Header setting to the multi-part subdomain I had configured in Traefik already, so lazy me didn&amp;rsquo;t have to go around changing docker compose files.&lt;/p&gt;</description></item><item><title>Homelab - Setting up TrueNAS on a HP MicroServer Gen 8 ODD SATA port</title><link>https://blog.dennishilhorst.nl/post/homelab-setting-up-truenas-on-a-hp-microserver-gen-8-odd-sata-port/</link><pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.dennishilhorst.nl/post/homelab-setting-up-truenas-on-a-hp-microserver-gen-8-odd-sata-port/</guid><description>&lt;img src="https://blog.dennishilhorst.nl/post/homelab-setting-up-truenas-on-a-hp-microserver-gen-8-odd-sata-port/images/installing-truenas.webp" alt="Featured image of post Homelab - Setting up TrueNAS on a HP MicroServer Gen 8 ODD SATA port" /&gt;&lt;p&gt;It&amp;rsquo;s a long title, worthy of the long time it took to get this working properly (even though there is one thing I did wish I do differently, but oh well, it works now). After having bought a second hand HP MicroServer Gen 8 (with an SSD already installed on the ODD port, though it ran unRAID), I figured out that it is notoriously hard to get the HP MicroServer Gen 8 to run its OS off of the internal ODD port (meant for optical drives). If you don&amp;rsquo;t install the OS properly, it will be installed in one of the drives in one of the 4 3.5&amp;quot; HDD bays, meaning that you will NOT be able to remove, replace or change that drive (!). Since it would be a fresh install, and it would be my first NAS I wanted to do everything properly.&lt;/p&gt;
&lt;h3 id="in-short"&gt;In short
&lt;/h3&gt;&lt;p&gt;Basically, in short why it is so annoying to install TrueNAS and boot it off of the ODD port (if I remember properly):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The TrueNAS ISO doesn&amp;rsquo;t like to work together with Ventoy (at least, I couldn&amp;rsquo;t get it to work properly).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.reddit.com/r/homelab/comments/18pasep/comment/l5rhxp1/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" target="_blank" rel="noopener"
 &gt;You &lt;em&gt;can&lt;/em&gt; boot off of the ODD port, but only if you have the SATA controller set to legacy mode&lt;/a&gt;, which has significant performance implications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In AHCI mode, the secondary SATA controller (with the ODD) port is not considered for boot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The internal USB port and SD card readers &lt;em&gt;are&lt;/em&gt; considered for boot, so you have to install your OS on your ODD-connected SSD, and install a bootloader on the internal USB, then boot from the USB.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-i-wish-i-did-differently"&gt;What I wish I did differently
&lt;/h3&gt;&lt;p&gt;Apparently, apps in TrueNAS have to be assigned some pool to log to. This cannot be the boot pool, but since I didn&amp;rsquo;t partition the SSD before installing TrueNAS, I wasn&amp;rsquo;t able to use the SSD for this. In the end, I just stuck a USB stick in one of the back USB ports, created a pool with that and used it for apps, since the intermittent logging from Tailscale made my HDDs spin up every 5 seconds or so (they should be able to idle most of the time, as the NAS will not be running anything other than TrueNAS itself). I already started using it (I started using it before installing Tailscale, so it wasn&amp;rsquo;t running any apps) so it was too late to start over for me at that point.&lt;/p&gt;
&lt;p&gt;In short, my tip for anyone out there is: &lt;strong&gt;partition your boot SSD before installing TrueNAS to use as an app pool&lt;/strong&gt;. I haven&amp;rsquo;t done this myself, so I can&amp;rsquo;t tell you how to do this exactly, but it should be possible. It will save you a USB stick (and some annoyance). Of course, if you don&amp;rsquo;t care about the noise, since your NAS may be stuffed away in some back corner in your house, it might not matter, but I did feel that it&amp;rsquo;s probably good for the HDDs&amp;rsquo; lifetimes to not spin up and down every 5 seconds for all eternity.&lt;/p&gt;
&lt;h3 id="installing-truenas-on-the-microserver-gen-8"&gt;Installing TrueNAS on the MicroServer Gen 8
&lt;/h3&gt;&lt;p&gt;I mainly followed &lt;a class="link" href="https://www.untruenorth.co.uk/blog/2022-11-20-gen8-hp-microserver-vs-truenas-scale" target="_blank" rel="noopener"
 &gt;this tutorial&lt;/a&gt;. What you will need and some preliminaries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A bootable USB with the latest TrueNAS ISO installed in &lt;code&gt;dd&lt;/code&gt; mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Ventoy USB stick with the latest Ubuntu image on it (unless you are on Linux already, then you may be able to do this directly on your existing PC).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A USB stick (or SD card) to leave inside of your MicroServer Gen 8 to boot off of&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configured your BIOS settings properly (F9 on boot):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set the SATA controller mode to AHCI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The KeyStone USB is set as the first option in the boot order. You may also want to set the USB boot order to have the &amp;ldquo;Internal&amp;rdquo; USB port first (we will be booting off of this later anyway).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are using an SD card, you may have to set that as the first option after installing everything.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove all drives from your HDD bays. I did this to make sure that the OS was not accidentally installed to one of my HDDs. Note that the HP MicroServer Gen 8 &lt;a class="link" href="https://www.reddit.com/r/homelab/comments/7o5wyt/comment/ds9i4v0/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" target="_blank" rel="noopener"
 &gt;does not support hotswap&lt;/a&gt; (though this practically means that the components may get damaged if you do attempt to hot swap them).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I don&amp;rsquo;t remember exactly but it may have been the case that the installer didn&amp;rsquo;t like being ran without &lt;em&gt;any&lt;/em&gt; drives in the bays. I had some old drives, so I decided to just put those in the bays, and then replace them later.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To install TrueNAS, we first install TrueNAS SCALE on the SSD and then install GRUB on the other USB Stick / SD Card.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;If you want to partition your SSD before installing TrueNAS, do it now!&lt;/strong&gt; You may have to boot into Ubuntu from your Ventoy USB and then run some commands, I haven&amp;rsquo;t done this so I am not sure how but you might be able to find this online. It is to create a datapool for your apps on the SSD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plug in the TrueNAS ISO USB and boot into it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You should be able to get an option to install TrueNAS SCALE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select your SSD (which should be the only drive that is connected. If your SSD is the the only drive that is connected, and TrueNAS SCALE does NOT allow you to install (errors like &amp;ldquo;unable to read C/H/S&amp;rdquo; or other errors), you may want to try some of the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set the SATA controller mode to Legacy in the BIOS temporarily for the TrueNAS installation, then revert it before we go to installing GRUB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may also have to set the &amp;ldquo;Coot Controller Order&amp;rdquo; so that the ODD port&amp;rsquo;s SATA controller is first (that means having Sata Controller #2 as the first option).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If this fails, you may also plug in some HDDs into the bays to see if that gets it to find the SSD. The most important thing is that TrueNAS SCALE is in fact installed to your SSD, and &lt;em&gt;not&lt;/em&gt; your HDDs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let it install, then power down your system after it is done.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You may want to revert any of the BIOS settings you changed for the installer at this point.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boot into Ubuntu (either on your existing system or through the Ventoy USB with Ubuntu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insert a fresh USB stick into an external USB port, or the SD card into an SD slot. We will be installing GRUB on this and leave this stick inside the MicroServer to boot off of. If your USB stick / SD card is not fresh, &lt;a class="link" href="https://askubuntu.com/questions/185815/how-do-i-clear-everything-data-viruses-from-a-thumbdrive" target="_blank" rel="noopener"
 &gt;you may do the following from Ubuntu to clear it&lt;/a&gt;. Open a terminal and do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;sudo blkid&lt;/code&gt; to identify your USB stick. If you can&amp;rsquo;t determine which it is based on the names, you may run &lt;code&gt;lsblk&lt;/code&gt; and check based on the volume sizes. Let&amp;rsquo;s assume your USB stick is &lt;code&gt;/dev/sdb1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;sudo dd if=/dev/zero of=/dev/sdb bs=4k status=progress &amp;amp;&amp;amp; sync&lt;/code&gt; to zero out the USB stick. This might take a while, it took about 15 minutes to clear a 16GB stick for me. The argument &lt;a class="link" href="https://askubuntu.com/questions/215505/how-do-you-monitor-the-progress-of-dd" target="_blank" rel="noopener"
 &gt;&lt;code&gt;status=progress&lt;/code&gt; should work&lt;/a&gt;, though I didn&amp;rsquo;t try it at that time, since it wasn&amp;rsquo;t in the original post I took these instructions from. If you did start it without this argument, you may want to open another terminal and run &lt;code&gt;`watch -n5 'sudo kill -USR1 $(pgrep ^dd$)'`&lt;/code&gt;, which will send a KILL signal to the &lt;code&gt;dd&lt;/code&gt; process every 5 seconds, but don&amp;rsquo;t worry, it will not stop the process, it will merely print the current status in the terminal running &lt;code&gt;dd&lt;/code&gt; for you to track progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You are done! You don&amp;rsquo;t need to create a new partition on the drive, as we will do this later on in the tutorial.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We will now install GRUB on the USB stick / SD card. We will still assume it is in &lt;code&gt;/dev/sdb&lt;/code&gt;, though you may have to replace that with the location of your USB stick. We first partition the USB stick:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;fdisk /dev/sdb&lt;/code&gt; and answer the prompts as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;n&lt;/code&gt; to create a new partition&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set to &lt;code&gt;p&lt;/code&gt; for &amp;ldquo;primary&amp;rdquo; (default)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;1&lt;/code&gt; to select the first partition (default)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Leave everything as is in the first sector&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;+128M&lt;/code&gt; to create a 128MB partition&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;a&lt;/code&gt; to set the start flag&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may have to enter &lt;code&gt;1&lt;/code&gt; to choose the first partition if it didn&amp;rsquo;t automatically&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;w&lt;/code&gt; to save and apply&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a file system by running &lt;code&gt;mkfs -t ext2 /dev/sdb1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mount the SD card somewhere&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mkdir /tmp/usb&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mount /dev/sdX1 /tmp/usb&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the folder where GRUB will live (this &lt;em&gt;must&lt;/em&gt; be named &lt;code&gt;boot&lt;/code&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir /tmp/usb/boot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install GRUB&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;grub-install --boot-directory=/tmp/usb/boot /dev/sdb&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This will populate &lt;code&gt;/tmp/usb/boot/grub&lt;/code&gt; and put a boot block on the USB stick / SD card&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the GRUB configuration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nano /tmp/usb/boot/grub/grub.cfg&lt;/code&gt; (or your another editor if you prefer)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fill it with the file contents below. Afterwards, save it, close it and unmount your USB stick / SD card with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cd /&lt;/code&gt; and then &lt;code&gt;umount /tmp/usb&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Beware:&lt;/strong&gt; The hdX references WILL NOT line up with &lt;code&gt;/dev/sdX&lt;/code&gt; references from &lt;code&gt;dmesg&lt;/code&gt; once Linux has booted. The hdX numbers appear to reflect drives actually installed in the not-actually-hot-swap SATA bays and the optical drive port.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This is all from the BIOS’s perspective. What this gives me, in my circumstances, is a way to boot from the SSD on the optical drive SATA connector, whether I’ve got 0, 1, 2, 3 or 4 drives in the not-actually-hot-swap SATA bays. You can use the default variable to pick which one will be chosen once the 10 second timeout expires, and I assume it’ll fall back to a prompt if, say, you’ve added or removed a drive causing the TrueNAS drive to change number.  This example shows &lt;code&gt;default=2&lt;/code&gt; as I had two HDDs in the 6Gbps SATA slots, two empty bays, and the boot drive.  Hence, the third entry in the menuentry items is the one corresponding to hd3, my boot drive.  Add more drives in the not-hot-swap bays, and the drive in the optical slot gets bumped to hd4 or hd5.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;set default=&amp;#39;2&amp;#39;
set timeout=&amp;#39;10&amp;#39;

menuentry &amp;#39;TrueNAS SCALE hd5&amp;#39; {
 set root=(hd5)
 chainloader +1
}

menuentry &amp;#39;TrueNAS SCALE hd4&amp;#39; {
 set root=(hd4)
 chainloader +1
}

menuentry &amp;#39;TrueNAS SCALE hd3&amp;#39; {
 set root=(hd3)
 chainloader +1
}

menuentry &amp;#39;TrueNAS SCALE hd2&amp;#39; {
 set root=(hd2)
 chainloader +1
}

menuentry &amp;#39;TrueNAS SCALE hd1&amp;#39; {
 set root=(hd1)
 chainloader +1
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After following these instructions, you can shut down your MicroServer. Pull out the Ventoy Ubuntu USB (if you were not doing this on your own Linux-based system), put the GRUB-installed USB stick / SD card in the internal slot in your MicroServer, and you should be able to boot into the TrueNAS SCALE OS on the SSD in your ODD slot. You will see the GRUB menu first, which should have the correct &lt;code&gt;hdX&lt;/code&gt; option selected, it will automatically boot this option, which will show the TrueNAS SCALE boot options, and then automatically boot into TrueNAS scale.&lt;/p&gt;
&lt;h3 id="configuration-after-install"&gt;Configuration after install
&lt;/h3&gt;&lt;p&gt;There are some configurations I changed after installing TrueNAS.&lt;/p&gt;
&lt;h4 id="disabling-video-output-after-inactivity"&gt;Disabling video output after inactivity
&lt;/h4&gt;&lt;p&gt;To clear the console to black after a period of no interaction, see &lt;a class="link" href="https://forums.truenas.com/t/is-there-a-way-to-turn-off-the-screen-on-truenas-scale/4212/6" target="_blank" rel="noopener"
 &gt;this forum comment&lt;/a&gt;. Basically, in the terminal (either directly on the server or through the web UI &lt;strong&gt;System &amp;gt; Shell&lt;/strong&gt;), run&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;midclt call system.advanced.update &amp;#39;{ &amp;#34;kernel_extra_options&amp;#34;: &amp;#34;consoleblank=60&amp;#34; }&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will make the entire screen black. Note that this does not completely disable video output. In order to disable video output completely, we do the same as we have done for Proxmox hosts. You will need to do this &lt;em&gt;from the actual shell&lt;/em&gt;, by first opening a Linux shell.&lt;/p&gt;
&lt;p&gt;Create and edit the script file: &lt;code&gt;nano /root/down_monitor.sh&lt;/code&gt; and add the following lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setterm -term linux -blank &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; -powersave powerdown -powerdown &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &amp;lt;/dev/tty1 &amp;gt;/dev/tty1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then we need to enable the script with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;chmod +x /root/down_monitor.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run &lt;code&gt;crontab -e&lt;/code&gt;, select your favorite editor and add a line &lt;code&gt;@reboot /root/down_monitor.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;bash /root/down_monitor.sh&lt;/code&gt; to enable it for this session.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your video output should disable after 1 minute of inactivity now, it is good to first give this a try.&lt;/p&gt;
&lt;h4 id="setting-power-saving-options-in-the-bios"&gt;Setting power saving options in the BIOS
&lt;/h4&gt;&lt;p&gt;I just took advice from &lt;a class="link" href="https://xpenology.com/forum/topic/13414-hpe-proliant-gen8-microserver-bios-settings-for-xpenology/" target="_blank" rel="noopener"
 &gt;this forum post&lt;/a&gt; and set the following settings in the BIOS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;System Options&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Embedded NICs:&lt;/strong&gt; Network boot disabled for both (unless you PXE boot from the Network)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;USB Options&amp;gt;Removable Flash Media Boot Sequence:&lt;/strong&gt; Internal DriveKeys First (that is where XPEnology lives)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SATA Controller Options&amp;gt;Embedded SATA Configuration:&lt;/strong&gt; Enable SATA AHCI Support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SATA Controller Options&amp;gt;Drive Write Cache:&lt;/strong&gt; Disabled&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Power Management Options&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HP Power Profile:&lt;/strong&gt; Set to Custom&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HP Power Regulator:&lt;/strong&gt; OS Control Mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Power Management Options&amp;gt;Advanced Power Management Options:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intel QPI Link Power Management:&lt;/strong&gt; Enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Minimum Processor Idle Power Core State:&lt;/strong&gt; C1E State&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Minimum Processor Idle Power Package State:&lt;/strong&gt; Package C6 (retention) State&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maximum Memory Bus Frequency:&lt;/strong&gt; I set mine to 1333MHz (This depends on your RAM)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory Interleaving:&lt;/strong&gt; Full Interleaving&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PCI-E Gen 3 Control:&lt;/strong&gt; I disabled mine because I have no use for it, helps with power draw. If you have something  plugged in don&amp;rsquo;t disable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Power Savings Mode Response:&lt;/strong&gt; Fast&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collaborative Power Control:&lt;/strong&gt; Enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DIMM Voltage Preference:&lt;/strong&gt; Optimized for Power, again this depends on your RAM&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Server Availability&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wake-On LAN:&lt;/strong&gt; Enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thermal Shutdown:&lt;/strong&gt; Enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Power Button:&lt;/strong&gt; Enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic Power-On:&lt;/strong&gt; Restore Last Power State&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced Options &amp;gt; Advanced System ROM Options&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MPS Table Mode:&lt;/strong&gt; Full Table APIC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Power-On Logo:&lt;/strong&gt; Disabled, it speeds up the bootup time and still has a prompt for F9 to get into BIOS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="disk-spindown-script"&gt;Disk spindown script
&lt;/h4&gt;&lt;p&gt;There is a disk spindown script for TrueNAS SCALE. I guess this shouldn&amp;rsquo;t really be used as power saving option, as it doesn&amp;rsquo;t really save much power. I mostly ran it to reduce noise, as my NAS is primarily for storing movies, Proxmox images, and in the future also photo backups. For now that means that the use of it is mostly at night or whenever I am not sitting right next to it in our office. Find the script &lt;a class="link" href="https://github.com/ngandrass/truenas-spindown-timer" target="_blank" rel="noopener"
 &gt;here&lt;/a&gt; (&lt;a class="link" href="https://github.com/DenSinH/truenas-spindown-timer" target="_blank" rel="noopener"
 &gt;fork on my own GitHub&lt;/a&gt;). Follow the instructions in the README to install, especially the instructions to test whether the script is running is useful.&lt;/p&gt;
&lt;h4 id="powertop"&gt;PowerTOP
&lt;/h4&gt;&lt;p&gt;You can run powertop on boot by adding a post-init script in the advanced settings with &lt;code&gt;powertop --auto-tune&lt;/code&gt; as command.&lt;/p&gt;
&lt;h4 id="resetting-ilo-password"&gt;Resetting iLO password
&lt;/h4&gt;&lt;p&gt;You can enter the iLO setup by pressing F8 on boot. Reset the iLO password by going to Users &amp;gt; Edit and editing the Administrator user.&lt;/p&gt;
&lt;h4 id="disabling-ilo"&gt;Disabling iLO
&lt;/h4&gt;&lt;p&gt;See &lt;a class="link" href="https://www.aptgetlife.co.uk/disable-ilo-on-hp-microserver-gen8/" target="_blank" rel="noopener"
 &gt;this blog post&lt;/a&gt;. It may save a few watts to completely disable iLO, which I am not using anyway. To disable it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enter iLO RBSU: Press F8 during the Power-On Self-Test (POST) to access the iLO configuration utility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to Configuration Settings: Select Settings -&amp;gt; Configure, and press Enter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modify iLO Functionality: Select the iLO Functionality option and press the Spacebar to toggle the setting between ENABLED and DISABLED. A warning message will be displayed when selecting DISABLED.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save Configuration: Press F10 to save the modified settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exit iLO RBSU: Select File -&amp;gt; Exit to close the utility.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When managing iLO (Integrated Lights-Out) functionality on HP servers, disabling and re-enabling iLO requires specific steps involving both RBSU (ROM-Based Setup Utility) and the system board’s iLO Override Switch.&lt;/p&gt;
&lt;p&gt;To re-enable iLO using the Security Override Switch:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Power down the server completely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the S1 system maintenance switch to the ON position. (See the manual, under &amp;ldquo;Component Identification &amp;gt; System Maintenance Switch&amp;rdquo;, you will see the different controls for the different switch numbers. They are small switches, that you can toggle carefully using a flat head screwdriver).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power on the server and wait for the F8 prompt to appear. Press F8 to enter iLO RBSU.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Re-enable iLO through the configuration utility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power off the server again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Return the S1 switch to its default OFF position.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="setting-zfs-cache-level-for-cold-datasets"&gt;Setting ZFS cache level for cold datasets
&lt;/h4&gt;&lt;p&gt;If you have some backup datasets on your TrueNAS system, you may want to set the ZFS cache level, so that cold datasets don&amp;rsquo;t flood your ZFS cache. You can do this by running&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo zfs set primarycache&lt;span style="color:#f92672"&gt;=&lt;/span&gt;metadata data-backup/photos-backup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo zfs set secondarycache&lt;span style="color:#f92672"&gt;=&lt;/span&gt;metadata data-backup/photos-backup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="hardware-modding"&gt;Hardware Modding
&lt;/h3&gt;&lt;h4 id="ram"&gt;RAM
&lt;/h4&gt;&lt;p&gt;I updated the RAM to 16GB (the max supported). The MicroServer Gen 8 is very specific about what RAM you can install: it needs to be unbuffered DDR3 ECC RAM. And at most 16GB (2x8GB). I got this set: &lt;a class="link" href="https://www.ebay.nl/itm/226311604875?mkevt=1&amp;amp;mkpid=0&amp;amp;emsid=e11996.m144671.l197929&amp;amp;mkcid=7&amp;amp;ch=osgood&amp;amp;euid=1750b00c2814488a8522c94afe0e31ff&amp;amp;bu=45438359912&amp;amp;exe=0&amp;amp;ext=0&amp;amp;osub=-1%7E1&amp;amp;crd=20251205062348&amp;amp;segname=11996" target="_blank" rel="noopener"
 &gt;DDR3 16G 2x8GB ECC UDIMM PC3L-12800E Ram für HP ProLiant Microserver Gen8 G1610T&lt;/a&gt; and it works well.&lt;/p&gt;
&lt;h4 id="fan"&gt;Fan
&lt;/h4&gt;&lt;p&gt;Updating the fan is kind of tough because of the proprietary 6 pin fan connector (with inverted PWM) as opposed to a standard 4 pin connector. I have tried this &lt;a class="link" href="https://www.moddiy.com/products/6499/HP-Microserver-Gen8-Special-6-Pin-to-Standard-4-Pin-PWM-Adapter-Cable.html" target="_blank" rel="noopener"
 &gt;HP Microserver Gen8 Special 6 Pin to Standard 4 Pin PWM Adapter Cable&lt;/a&gt; from MODDIY. I tried it with a 1700RPM Noctua fan, but it intermittently errors out when booting with that. I will try with a higher RPM fan later.&lt;/p&gt;
&lt;h3 id="manual"&gt;Manual
&lt;/h3&gt;&lt;p&gt;Find the manual for the HP ProLiant MicroServer Gen 8 below.&lt;/p&gt;
&lt;p&gt;[pdfjs-viewer attachment_id=485 url=https://blog.dennishilhorst.nl/wp-content/uploads/2025/10/hp-proliant-microserver-gen8-maintenance-and-service-guide.pdf viewer_width=0 viewer_height=800 url=https://blog.dennishilhorst.nl/wp-content/uploads/2025/10/hp-proliant-microserver-gen8-maintenance-and-service-guide.pdf download=true print=true fullscreen=true fullscreen_target=true fullscreen_text=&amp;ldquo;View Fullscreen&amp;rdquo; zoom=auto ]&lt;/p&gt;</description></item></channel></rss>