<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Road to Homelab]]></title><description><![CDATA[Exploring, failing, and learning within the world of homelabs]]></description><link>https://roadtohomelab.blog/</link><image><url>https://roadtohomelab.blog/favicon.png</url><title>Road to Homelab</title><link>https://roadtohomelab.blog/</link></image><generator>Ghost 5.85</generator><lastBuildDate>Wed, 15 Apr 2026 19:00:22 GMT</lastBuildDate><atom:link href="https://roadtohomelab.blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup]]></title><description><![CDATA[<p>When I&#x2019;m helping customers troubleshoot Rancher issues I spin up and tear down local Rancher environments constantly. </p><p>Most of the time, everything runs locally with no need for public access (and if I need to access it remotely I do so with Tailscale). But some tests, like provisioning</p>]]></description><link>https://roadtohomelab.blog/rancher-behind-cloudflare-tunnel-nginx-docker-setup/</link><guid isPermaLink="false">6918c9f0e55961050ffb7b25</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Sat, 15 Nov 2025 19:51:36 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1667372459470-5f61c93c6d3f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGt1YmVybmV0ZXN8ZW58MHx8fHwxNzYzMjM1NzI3fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1667372459470-5f61c93c6d3f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGt1YmVybmV0ZXN8ZW58MHx8fHwxNzYzMjM1NzI3fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup"><p>When I&#x2019;m helping customers troubleshoot Rancher issues I spin up and tear down local Rancher environments constantly. </p><p>Most of the time, everything runs locally with no need for public access (and if I need to access it remotely I do so with Tailscale). But some tests, like provisioning clusters in a cloud k8s offering (EKS, AKS, GKE) or using Rancher&#x2019;s built-in EC2 cluster provisioning require my Rancher server to be publicly reachable. </p><p>What I <em>didn&#x2019;t</em> want was a Rancher instance that&#x2019;s permanently exposed to the internet or a requirement to open ports on my pfSense router every time I need to run a test. I wanted something I could turn on for a few hours, run my cloud-provisioning tests, and then shut back down as soon as I&#x2019;m done.</p><p>That&#x2019;s what led me to Cloudflare Tunnel (cloudflared). I already make use of NGINX Load Balancer in Docker for my Rancher environment load balancing, so I can securely expose my local Rancher environment to the internet on demand, no firewall changes, no static public IP, and no long-term exposure. </p><p>In this guide, I&#x2019;ll walk through how I set it up and how you can do the same.</p><hr><h2 id="prerequisites">Prerequisites</h2><p>The prerequisites here are:</p><ol><li>A Cloudflare domain name </li><li>A local NGINX LB running in Docker</li><li>A Rancher environment (3 nodes, in my case)</li></ol><p>If you don&apos;t have these set up that&apos;s okay, I think it&apos;ll still be worth your time.</p><h2 id="architecture">Architecture</h2><p>Let&apos;s briefly discuss the architecture.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/11/5W5ooo000100240000r43CBB179666621.png" class="kg-image" alt="Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup" loading="lazy" width="1109" height="1227" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/11/5W5ooo000100240000r43CBB179666621.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2025/11/5W5ooo000100240000r43CBB179666621.png 1000w, https://roadtohomelab.blog/content/images/2025/11/5W5ooo000100240000r43CBB179666621.png 1109w" sizes="(min-width: 720px) 720px"></figure><p>The <a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/?ref=roadtohomelab.blog" rel="noreferrer">Cloudflare tunnel</a> is what we&apos;ll set up in the next section. It&apos;s job is to securely route traffic from the Cloudflare network (i.e. the internet) to wherever you determine. </p><p><a href="https://github.com/cloudflare/cloudflared?ref=roadtohomelab.blog" rel="noreferrer">Cloudflared</a> is the client, which can be installed on macOS, Windows, Linux, or Docker. In our case, as you can see above, we&apos;ll be installing the client on the same Docker host providing our load balancing.</p><p><a href="https://nginx.org/en/docs/http/load_balancing.html?ref=roadtohomelab.blog" rel="noreferrer">NGINX Load Balancer</a> is what handles the traffic from my local network and balances those connections to my Rancher cluster. </p><p><a href="https://www.rancher.com/?ref=roadtohomelab.blog" rel="noreferrer">Rancher</a> is what I&apos;m using for all my kubernetes management. It runs on an RKE2 cluster in my lab.</p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Quick note about DNS: Outside of this blog post I just a DNS server (pihole) and have a record that points the domain name I purchased from Cloudflare directly to the IP address of my NGINX LB. This traffic never leaves my network.</div></div><p></p><h2 id="make-a-cloudflare-tunnel">Make a Cloudflare Tunnel</h2><p>Assuming you already have a domain name through Cloudflare, setting up a tunnel is simple. Go to:</p><p>Zero Trust -&gt; Networks -&gt; Tunnels</p><p>Then click &quot;Create a Tunnel&quot;. Chose &quot;Cloudflared&quot; as the type.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.16.16-PM.png" class="kg-image" alt="Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup" loading="lazy" width="910" height="918" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/11/Screenshot-2025-11-15-at-2.16.16-PM.png 600w, https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.16.16-PM.png 910w" sizes="(min-width: 720px) 720px"></figure><p>Give your tunnel a good name, and on the next page click &quot;Docker&quot;.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.17.17-PM.png" class="kg-image" alt="Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup" loading="lazy" width="2000" height="993" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/11/Screenshot-2025-11-15-at-2.17.17-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2025/11/Screenshot-2025-11-15-at-2.17.17-PM.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2025/11/Screenshot-2025-11-15-at-2.17.17-PM.png 1600w, https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.17.17-PM.png 2196w" sizes="(min-width: 720px) 720px"></figure><p>Cloudflare will generate a &quot;docker run&quot; command for you at the bottom of the page, copy that, we&apos;ll need to edit it before we run it. </p><p>Click &quot;Next&quot;.</p><p>On the next page you&apos;ll configure the application that&apos;s going to be exposed with this tunnel. Copy the settings below while also adding in your own domain and subdomain.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.26.03-PM.png" class="kg-image" alt="Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup" loading="lazy" width="2000" height="629" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/11/Screenshot-2025-11-15-at-2.26.03-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2025/11/Screenshot-2025-11-15-at-2.26.03-PM.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2025/11/Screenshot-2025-11-15-at-2.26.03-PM.png 1600w, https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.26.03-PM.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Note: this will create a CNAME record to point this subdomain to the tunnel.</p><p>Click &quot;Complete Setup&quot;.</p><p></p><h2 id="nginx-load-balancer">NGINX Load Balancer</h2><p>Here&apos;s my LB config you can use. My certs are in ~/user/certs and I have my 3 Rancher node IPs listed in the &quot;rancher_backend&quot; section.</p><pre><code>worker_processes 1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        return 301 https://$host$request_uri;
    }

    upstream rancher_backend {
        least_conn;
        server &lt;server_IP_1&gt;:443;
        server &lt;server_IP_2&gt;:443;
        server &lt;server_IP_3&gt;:443;
    }

    server {
        listen 443 ssl;

        ssl_certificate /etc/nginx/certs/cert.pem;
        ssl_certificate_key /etc/nginx/certs/key.pem;

        location / {
            # Block WebSockets
            if ($http_upgrade ~* &quot;websocket&quot;) {
                return 403;
            }

            proxy_pass https://rancher_backend;
            proxy_ssl_server_name on;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}</code></pre><p>Here&apos;s how I run NGINX passing in ~/user/certs for it to consume my certs and serve them up.</p><pre><code>docker run -d --name rancher-lb \
    -p 80:80 -p 443:443 \
    -v /etc/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v /home/user/certs:/etc/nginx/certs:ro \
    --restart unless-stopped \
    nginx</code></pre><p></p><h2 id="run-cloudflared">Run Cloudflared</h2><p>Now, take the token from the generated Docker command and paste it in the below command that you&apos;ll run on your Docker host. </p><pre><code>docker run -d \
  --name cloudflared \
  --add-host=host.docker.internal:host-gateway \
  cloudflare/cloudflared:latest tunnel \
  --no-autoupdate run \
  --token xxxxxxxxxxxxxxxxxxxxxxxxx</code></pre><p>This simply:</p><ul><li>pulls/runs the cloudflared container</li><li>passes in the token to authenticate with Cloudflare</li><li>add the host.docker.internal DNS entry to the container so that it can reach the host machine</li></ul><p>If you&apos;re following closely you&apos;ll notice that the Cloudflare tunnel points to port 443 on the host machine so that it&apos;ll function just like it would if you were on the local network hitting the IP address of the load balancer host. </p><p>Once you run the command above^ if your tunnel is up, it should show as healthy in the Tunnels page on Cloudflare.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/11/Screenshot-2025-11-15-at-2.48.56-PM.png" class="kg-image" alt="Local Rancher Behind Cloudflare Tunnel: NGINX LB + Docker Setup" loading="lazy" width="344" height="180"></figure><p>You should now have a publicly accessible Rancher URL, ready to be used with any cloud provider. Whenever you&apos;d like to turn it off, just stop the cloudflared Docker container and your Rancher instance won&apos;t be publicly accessible. </p>]]></content:encoded></item><item><title><![CDATA[Plex migration: TrueNAS Core -> Scale]]></title><description><![CDATA[<p>I&apos;ve found myself in a bit of a pickle. I want to upgrade my TrueNAS server from Core to Scale, but I&apos;m currently using the Plex jail install on Core that isn&apos;t compatible with Scale.</p><p>So I&apos;ve decided to write up this</p>]]></description><link>https://roadtohomelab.blog/truenas-core-to-truenas-scale-plex-migration/</link><guid isPermaLink="false">681e56eae55961050ffb795d</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Mon, 12 May 2025 01:39:27 GMT</pubDate><media:content url="https://roadtohomelab.blog/content/images/2025/05/00-hero.webp" medium="image"/><content:encoded><![CDATA[<img src="https://roadtohomelab.blog/content/images/2025/05/00-hero.webp" alt="Plex migration: TrueNAS Core -&gt; Scale"><p>I&apos;ve found myself in a bit of a pickle. I want to upgrade my TrueNAS server from Core to Scale, but I&apos;m currently using the Plex jail install on Core that isn&apos;t compatible with Scale.</p><p>So I&apos;ve decided to write up this short tutorial about how I did move my Plex install from the &quot;jail&quot; kind of install over to the &quot;app&quot; install while retaining all my settings/config.</p><p>If all this sounds interesting to you, follow along.</p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">DISCLAIMER<br>This is <i><em class="italic" style="white-space: pre-wrap;">not</em></i> a tutorial on upgrading from TrueNAS Core to TrueNAS Scale., fyi.<br><br>The upgrade can be tricky and may break stuff. Make sure you have a backup of your data and of your TrueNAS config. Follow the official TrueNAS docs.</div></div><p></p><h2 id="pre-upgrade-steps">Pre Upgrade Steps</h2><p>First things first, make a new dataset in TrueNAS. This will be the home of our Plex config. In my case it&apos;s <code>/mnt/PlexData/plex_config/</code></p><p>Stop the Plex jail so there are not additional changes to your config (your users will be fine).</p><p>Copy the contents from the current Plex config to the new dataset that our <a href="https://www.truenas.com/community/threads/moving-plex-from-core-to-scale.91936/?ref=roadtohomelab.blog#post-637125">Plex container will eventually reference</a> . For me, this is at:</p><pre><code>/mnt/&lt;dataset&gt;/iocage/jails/&lt;jailname&gt;/root/Plex Media Server</code></pre><p>The below command will copy the current contents of the Plex config jail to the new dataset using <code>rsync</code>.</p><pre><code class="language-` ">rsync -a --progress --info=stats2 &quot;/mnt/&lt;dataset&gt;/iocage/jails/&lt;jailname&gt;/root/Plex Media Server&quot; /mnt/PlexData/plex_config/</code></pre><p>Once that completes, we need to make sure permissions are correct on the new config dataset. Plex will need permissions to be <code>UID/GID 1000:1000</code> so it can read/write to this new dataset. Below is the command to do so.</p><pre><code>chown -R 1000:1000 /mnt/PlexData/plex_config/</code></pre><p>You&apos;re basically ready to upgrade now. But before you do, be sure to take backup of your TrueNAS config. </p><p>I&apos;m not going to give steps on how to do the upgrade because the official TrueNAS doc is great. For me it&apos;ll be <code>Dragonfish-24.04.2.5</code> for now to match my backup server.</p><p>However you do it, I&apos;ll see you on TrueNAS Scale.</p><h2 id="plex-setup">Plex Setup</h2><p>With your TrueNAS server migrated to Scale it might be a good idea to confirm everything looks okay in your settings and that the migration didn&apos;t break anything. This isn&apos;t a tutorial on that so I&apos;m going to keep moving.</p><p>Start by going to Apps on the left hand bar and search for &quot;Plex&quot;. Once you find it, install it. You&apos;ll need to choose the correct pool to install the app to.</p><p>You&apos;ll then be presented with the setup of your new Plex app. </p><p>If you&apos;re migrating from a previous Plex install, don&apos;t forget to get your claim code and enter that in the config using <a href="https://www.plex.tv/claim.?ref=roadtohomelab.blog">https://www.plex.tv/claim.</a></p><p>Now, this next part took a little bit of learning on my end, so hopefully I can help you out. The goal here is to point Plex to <em>both </em>the storage dataset (i.e. movies, tv shows, etc.) and config dataset we created earlier. Below is my setup for reference, but really it&apos;s important to make sure that Plex is able to find:</p><p><code>media -&gt; &quot;Storage Configuration&quot;<br>config -&gt; &quot;Plex Configuration Storage&quot;</code></p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/05/Screenshot-2025-05-10-at-2.10.19-PM.png" class="kg-image" alt="Plex migration: TrueNAS Core -&gt; Scale" loading="lazy" width="808" height="986" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/05/Screenshot-2025-05-10-at-2.10.19-PM.png 600w, https://roadtohomelab.blog/content/images/2025/05/Screenshot-2025-05-10-at-2.10.19-PM.png 808w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/05/Screenshot-2025-05-10-at-2.11.47-PM.png" class="kg-image" alt="Plex migration: TrueNAS Core -&gt; Scale" loading="lazy" width="764" height="908" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/05/Screenshot-2025-05-10-at-2.11.47-PM.png 600w, https://roadtohomelab.blog/content/images/2025/05/Screenshot-2025-05-10-at-2.11.47-PM.png 764w" sizes="(min-width: 720px) 720px"></figure><p>I used <a href="https://www.reddit.com/r/truenas/comments/1h6nykg/truenas_scale_24102_install_and_setup_plex/?ref=roadtohomelab.blog#lightbox" rel="noreferrer">this reddit post</a> to make sure my permissions were correct on both datasets. The first two photos are the important ones here, as they give you a template to use for the datasets. Very important to have the below options set on the dataset as Read/Write/Execute.</p><p><code>User - apps</code> <br><code>Group - apps</code></p><p>Also, something I had to figure out the hard way was that my previous Plex install inside a jail didn&apos;t have the correct folder structure for what Plex was looking for in this installation. If you&apos;re coming from a jail install, it may be the same for you. <a href="https://support.plex.tv/articles/202915258-where-is-the-plex-media-server-data-directory-located/?ref=roadtohomelab.blog" rel="noreferrer">Check this page for reference.</a></p><p>See, it&apos;s looking for <code>Library/Application Support</code> in the new setup but my jail didn&apos;t have this. The link above shows that the &quot;FreeNAS 11.3 or newer&quot; location is: </p><pre><code>${JAIL_ROOT}/Plex Media Server/</code></pre><p>So what I ended up doing was creating said structure within my <code>plex_config</code> dataset and moving the <code>Plex Media Server</code> directory under it. So it ended up like:</p><p><code>/plex_config/Library/Application Support/Plex Media Server</code></p><p>Once I did that, Plex recognized my previous configuration files.</p><hr><p>Lastly, because this tripped me up too. This new install mounts the media to the <code>/data</code> directory. This is not where I had the actual Plex application pointing within the app itself, because previously the media was mounted at a <code>/mnt</code> location. So I had to go to</p><p><code>Settings -&gt; Manage - Libraries -&gt; library_name -&gt; Edit Library -&gt; Add Folders</code></p><p>and change the library location to the new media mount starting with <code>/data</code>. You&apos;ll need to do this for each library.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2025/05/Screenshot-2025-05-11-at-9.37.37-PM.png" class="kg-image" alt="Plex migration: TrueNAS Core -&gt; Scale" loading="lazy" width="1464" height="1068" srcset="https://roadtohomelab.blog/content/images/size/w600/2025/05/Screenshot-2025-05-11-at-9.37.37-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2025/05/Screenshot-2025-05-11-at-9.37.37-PM.png 1000w, https://roadtohomelab.blog/content/images/2025/05/Screenshot-2025-05-11-at-9.37.37-PM.png 1464w" sizes="(min-width: 720px) 720px"></figure><h2 id="final-thoughts">Final thoughts</h2><p>You&apos;re done! Hopefully you have a running your Plex server on TrueNAS Scale. </p>]]></content:encoded></item><item><title><![CDATA[Monitor your homelab infrastructure externally for free*]]></title><description><![CDATA[Let's use Uptimedoctor, Pushover, and Cloudflare Tunnels to monitor our internal Uptime Kuma instance.]]></description><link>https://roadtohomelab.blog/monitor-infrastructure-for-free/</link><guid isPermaLink="false">665b6c3289bc27047c48b59f</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Thu, 20 Jun 2024 17:00:27 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1581089781785-603411fa81e5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25pdG9yfGVufDB8fHx8MTcxODY1NTU4MXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1581089781785-603411fa81e5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25pdG9yfGVufDB8fHx8MTcxODY1NTU4MXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Monitor your homelab infrastructure externally for free*"><p><em>proceed with caution - we&apos;re getting cheeky here, folks</em></p><p>If you haven&apos;t read my previous post on monitoring internal resources using Tailscale on an external VPS, I recommend you read it first. This post will be an iteration of that project.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://roadtohomelab.blog/monitor-your-homelab-from-the-cloud-uptime-kuma-on-a-vps-using-linode-tailscale-and-pfsense/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense</div><div class="kg-bookmark-description">I&#x2019;ll show you how I configure a VPS to safely monitor my homelab.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://roadtohomelab.blog/favicon.ico" alt="Monitor your homelab infrastructure externally for free*"><span class="kg-bookmark-author">Road to Homelab</span><span class="kg-bookmark-publisher">Dustin Groh</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHNlcnZlcnxlbnwwfHx8fDE2OTE0MTk2MTl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Monitor your homelab infrastructure externally for free*"></div></a></figure><p>My Uptime Kuma notifications coming from a Linode VPS have been working great and I don&apos;t need to change it up... but there&apos;s always room to simplify my homelab. Up until this project I had two Kuma instances (public and internal) and multiple VPS&apos; with different providers. To clean that up, I&apos;m getting rid of the Linode VPS entirely, although it&apos;s been awesome. </p><h2 id="free99">$free.99</h2><p>To do this for free* you&apos;ll need to already have purchased Pushover... which I&apos;m hoping you&apos;ve done in the first version of the project.</p><p>Oh, also you will need a domain from Cloudflare.</p><p><em>... so it&apos;s not completely free, okay? I admit it, leave me alone. </em></p><h2 id="getting-started">Getting started</h2><p>I hope you try to avoid opening any ports on your firewall if you don&apos;t need to. My rule has been I don&apos;t host public things on my home network. However, we&apos;ll be using Cloudflare Tunnels today, which technically will be allowing public traffic to an internally hosted service - but no ports will be opened. It&apos;s sort of magic, and they explain it better than me so <a href="https://www.cloudflare.com/products/tunnel/?ref=roadtohomelab.blog" rel="noreferrer">check it out</a>. </p><p>Fair warning, once I got this set up with my new domain on Cloudflare I got HAMMERED with spam calls about logo designs, website designs, etc. Just be aware.</p><p>I&apos;ll be using a few different platforms to make this work today.</p><p>First, the main component that allows this to work, like we said, is <strong>Cloudflare Tunnels</strong>. This will allow us to expose our internal Uptime Kuma instance publicly without opening any ports on our firewall.  Check out the docs below.</p><p>Next, <strong>Uptimedoctor</strong>. The idea here is a service to monitor a public website and notify you if it&apos;s down. Uptimedoctor does that (for 5 websites) for free.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.uptimedoctor.com/en/controlpanel.php?newuser=yes&amp;qtid=0&amp;r=0&amp;ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Log In to Your Account - Uptime Doctor</div><div class="kg-bookmark-description">Log in to the monitoring control panel.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.uptimedoctor.com/images/favicon-ud.ico" alt="Monitor your homelab infrastructure externally for free*"><span class="kg-bookmark-author">Partners
Contact
Language
Login</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.uptimedoctor.com/themes/-3-352767567/images/logo.png" alt="Monitor your homelab infrastructure externally for free*"></div></a></figure><p>Last is <strong>Pushover</strong>, which I mentioned in the first iteration of this project. It&apos;s a service that lets you set up push notifications to many different devices in many different ways. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://pushover.net/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Pushover: Simple Notifications for Android, iPhone, iPad, and Desktop</div><div class="kg-bookmark-description">Pushover makes it easy to get real-time notifications on your Android, iPhone, iPad, and Desktop (Android Wear and Apple Watch, too!)</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://pushover.net/favicon.ico" alt="Monitor your homelab infrastructure externally for free*"></div></div><div class="kg-bookmark-thumbnail"><img src="https://pushover.net/assets/writing-header-c251fe65a610047a0209640b75d38e79f7b23b67d64135f629e6062f3e25c2f3.png" alt="Monitor your homelab infrastructure externally for free*"></div></a></figure><p><strong><u>TL;DR</u></strong></p><ol><li>Use a <strong>Cloudflare Tunnel</strong> to expose your Uptime Kuma instance on a public domain without opening any ports on your firewall.</li><li>Use <strong>Uptimedoctor</strong> to notify you if that website goes down.</li><li>Use <strong>Pushover</strong> to receive push notifications about the status of the Uptime Kuma wesbite.</li></ol><h2 id="lets-do-it">Let&apos;s do it</h2><p>So, with the assumption you&apos;re already running Uptime Kuma, let&apos;s get started. Make sure you have a domain in Cloudflare ready to use. I&apos;m the kind of person who isn&apos;t going to rehash something if there&apos;s already good documentation for it. So using the docs below, <strong>set up a Cloudflare Tunnel for Uptime Kuma</strong>.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy-with-Cloudflare-Tunnel?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Reverse Proxy with Cloudflare Tunnel</div><div class="kg-bookmark-description">A fancy self-hosted monitoring tool. Contribute to louislam/uptime-kuma development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Monitor your homelab infrastructure externally for free*"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">louislam</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/382496361/f21b61f5-693a-4925-9f1f-fea237ade223" alt="Monitor your homelab infrastructure externally for free*"></div></a></figure><p>At this point you <em>should</em> be able to navigate to your Uptime Kuma instance from the public internet, which is cool. Next we need a way to be notified if that website goes down for some reason, which is where Uptimedoctor comes in.</p><p>Get an account with Uptimedoctor and set up your monitor to be pointed at the domain you got from Cloudflare. </p><p>You&apos;ll also need to login to Pushover and grab the email address they&apos;ve set up for you to input into Uptimedoctor. Essentially any emails that come to that email address generate a Push notification on your device of choice, simple. When you log into Pushover you&apos;ll see a section titled &quot;Your E-Mail Aliases&quot;, and that will be the email address you&apos;ll input to Uptimedoctor.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-3.59.43-PM.png" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1161" height="308" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/Screenshot-2024-06-17-at-3.59.43-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/Screenshot-2024-06-17-at-3.59.43-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-3.59.43-PM.png 1161w" sizes="(min-width: 720px) 720px"></figure><p>Once complete it should look something like this, where at minimum you&apos;ll be receiving an email to your Pushover email address if Uptimedoctor sees this site go down.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-3.55.34-PM.png" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1165" height="184" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/Screenshot-2024-06-17-at-3.55.34-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/Screenshot-2024-06-17-at-3.55.34-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-3.55.34-PM.png 1165w" sizes="(min-width: 720px) 720px"></figure><p></p><h2 id="test-the-magic">Test the magic</h2><p>Now, it&apos;s probably worthwhile to test it out. </p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><i><em class="italic" style="white-space: pre-wrap;">Think logically about this test.</em></i> Following along with me could mean you aren&apos;t able to access your Uptime Kuma instance temporarily, make sure you are understanding what you&apos;re actually doing.</div></div><p>Go on back to Uptime Kuma &gt; Settings &gt; Reverse Proxy you&apos;ll see a big red &quot;stop cloudflared&quot; button. Doing so will make your tunnel go down. After a few minutes there should be pretty substantial impact to what we just set up. In the Cloudflare Tunnel portal you should see your tunnel as &quot;down&quot; as well.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-4.06.18-PM.png" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1146" height="610" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/Screenshot-2024-06-17-at-4.06.18-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/Screenshot-2024-06-17-at-4.06.18-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-4.06.18-PM.png 1146w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-4.03.50-PM.png" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1411" height="47" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/Screenshot-2024-06-17-at-4.03.50-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/Screenshot-2024-06-17-at-4.03.50-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-4.03.50-PM.png 1411w" sizes="(min-width: 720px) 720px"></figure><p>And finally, we should get a Push notification from Pushover.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/IMG_0430-1.PNG" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1170" height="1023" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/IMG_0430-1.PNG 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/IMG_0430-1.PNG 1000w, https://roadtohomelab.blog/content/images/2024/06/IMG_0430-1.PNG 1170w" sizes="(min-width: 720px) 720px"></figure><p>Excellent! Now, back in Uptime Kuma click &quot;Start cloudflared&quot;.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-4.05.51-PM.png" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1151" height="534" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/Screenshot-2024-06-17-at-4.05.51-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/Screenshot-2024-06-17-at-4.05.51-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/06/Screenshot-2024-06-17-at-4.05.51-PM.png 1151w" sizes="(min-width: 720px) 720px"></figure><p>Once you receive the UP notification - you&apos;re good to go.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/06/IMG_0431.PNG" class="kg-image" alt="Monitor your homelab infrastructure externally for free*" loading="lazy" width="1170" height="1018" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/06/IMG_0431.PNG 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/06/IMG_0431.PNG 1000w, https://roadtohomelab.blog/content/images/2024/06/IMG_0431.PNG 1170w" sizes="(min-width: 720px) 720px"></figure><p>Hope this works well for you, enjoy.</p>]]></content:encoded></item><item><title><![CDATA[Dead simple container VPN: Gluetun, Portainer, and Private Internet Access]]></title><description><![CDATA[Need to set up a VPN for containers? I got you. ]]></description><link>https://roadtohomelab.blog/container-vpn/</link><guid isPermaLink="false">663a1e2c89bc27047c48b477</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Fri, 17 May 2024 19:37:52 GMT</pubDate><media:content url="https://roadtohomelab.blog/content/images/2024/05/1200x600wa.png" medium="image"/><content:encoded><![CDATA[<img src="https://roadtohomelab.blog/content/images/2024/05/1200x600wa.png" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access"><p>I&apos;ve seen an increase in people asking about container VPNs, and at one point I had the same questions. Hopefully this blog post can help answer those questions and get you up and running with a VPN for your containers.</p><p>In my situation I have a few containers that I want connecting to a VPN, but not all of them. So, I can&apos;t just put a VPN client on my Docker host machine and call it done. What&apos;s the best method to route select containers to a VPN while keeping others off it? </p><p>Well, I don&apos;t know if it&apos;s <em>the best</em>, but Gluetun is perfect for just that.</p><h2 id="what-is-gluetun">What is Gluetun?</h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/qdm12/gluetun?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - qdm12/gluetun: VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in.</div><div class="kg-bookmark-description">VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in. - qdm12/gluetun</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">qdm12</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/120530079/50055d80-9861-11ea-8d0c-b3537b043772" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access"></div></a></figure><p>If you haven&apos;t heard of Gluetun before, let me explain. </p><p>It&apos;s simply a container that you configure to use your VPN provider. Once the Gluetun container is connected to your VPN service you can then <strong>connect other containers to it</strong> and those containers will be utilizing a VPN connection.</p><p>Anyways, let&apos;s get started. If you&apos;d like to follow along, it&apos;s important to note I&apos;ll be using Portainer to do my container configs, but you can do this all through the CLI if you want. I use Private Internet Access as my VPN, so that&apos;s what I&apos;ll be showing in my examples. Check this link to see all of the supported VPN options. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/qdm12/gluetun/tree/master/internal/provider?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">gluetun/internal/provider at master &#xB7; qdm12/gluetun</div><div class="kg-bookmark-description">VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in. - qdm12/gluetun</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">qdm12</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/120530079/50055d80-9861-11ea-8d0c-b3537b043772" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access"></div></a></figure><p>First, let&apos;s get Gluetun deployed with some PIA options.</p><h2 id="deploying-gluetun"><br>Deploying Gluetun</h2><p>On the documentation page there is a very simple docker-compose file to get started with. In general for these self-hosted services it&apos;s a good idea to understand what they&apos;re doing before you just haul off and run the command. We&apos;ll need to input a few details like our PIA username and pw, the region we&apos;d like to connect to, etc. Below is a template you could use, make sure to fill your details in before you use the file.</p><pre><code class="language-yaml">version: &quot;3&quot;
services:
  gluetun:
    image: qmcgaw/gluetun
    cap_add:
      - NET_ADMIN
    volumes:
      - /yourpath:/gluetun
    environment:
      - VPN_SERVICE_PROVIDER=private internet access
      - OPENVPN_USER=PIA_USER
      - OPENVPN_PASSWORD=PIA_PW
      - SERVER_REGIONS=PIA_REGION</code></pre><p>Using this file, we&apos;re going to create a stack in Portainer like so:</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-13-at-9.54.26-AM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="873" height="805" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/05/Screenshot-2024-05-13-at-9.54.26-AM.png 600w, https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-13-at-9.54.26-AM.png 873w" sizes="(min-width: 720px) 720px"></figure><p>Deploy the stack.</p><h2 id="test-if-the-vpn-is-up">Test if the VPN is up</h2><p>&quot;But how will I know if the Gluetun container is <em>actually</em> using the VPN?&quot;</p><p>Well, good question. Let&apos;s test that. Exec into a container that is <em>not</em> Gluetun and run this, if you have curl, <code>curl ifconfig.me</code>. Below is an example output (your not getting my public IP, nerds)</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.02.03-PM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="376" height="53"></figure><p>If you don&apos;t have curl, this also works. <code>wget </code><a href="http://ipecho.net/plain?ref=roadtohomelab.blog"><code>http://ipecho.net/plain</code></a><code> -O - -q ; echo</code> and here&apos;s an example.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-2.57.26-PM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="676" height="96" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/05/Screenshot-2024-05-17-at-2.57.26-PM.png 600w, https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-2.57.26-PM.png 676w"></figure><p>After that, exec into your Gluetun container and use this command to grab the public IP that the container is using for it&apos;s connection to the internet. <strong>Note: this should be different than the IP you just saw.</strong></p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.06.05-PM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="407" height="37"></figure><p>As you can see my Gluetun IP address is different than the container above, which confirms it&apos;s using the VPN we set up earlier.</p><p></p><h2 id="connect-containers-to-gluetun">Connect containers to Gluetun</h2><p>We have Gluetun up and running, but let&apos;s connect a service to it.</p><p>In Portainer pick a container and scroll to the bottom where it shows the networking options. Unless you&apos;ve edited things in the past, it will likely say &quot;bridge&quot; under &quot;Connected networks&quot;. Click &quot;Leave network&quot;. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.12.45-PM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="1189" height="241" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/05/Screenshot-2024-05-17-at-3.12.45-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/05/Screenshot-2024-05-17-at-3.12.45-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.12.45-PM.png 1189w" sizes="(min-width: 720px) 720px"></figure><p>If there are published ports for your container, you&apos;ll need to remove those before continuing.</p><p>Then, at the top select &quot;Duplicate/Edit&quot; and scroll to the bottom of the page to look for the &quot;Advanced container settings&quot;. </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">It might be tempting to select the network titled &quot;gluetun_default&quot; - that&apos;s not what we want.</div></div><p>Select the network tab, and change the Network from &quot;bridge&quot; to &quot;container&quot;. Then, under &quot;Container&quot;, select the Gluetun container. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.18.35-PM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="1196" height="248" srcset="https://roadtohomelab.blog/content/images/size/w600/2024/05/Screenshot-2024-05-17-at-3.18.35-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2024/05/Screenshot-2024-05-17-at-3.18.35-PM.png 1000w, https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.18.35-PM.png 1196w" sizes="(min-width: 720px) 720px"></figure><p>Now select &quot;Deploy the container&quot;. Once the container deploys it&apos;s time to confirm the IP of the container and we should see it using the VPN through Glutetun!</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2024/05/Screenshot-2024-05-17-at-3.21.51-PM.png" class="kg-image" alt="Dead simple container VPN: Gluetun, Portainer, and Private Internet Access" loading="lazy" width="412" height="39"></figure><p></p><p>If you enjoyed this or it helped you, consider subscribing or buying me a coffee. Even if not, you&apos;re still welcome to come on by anytime.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://buymeacoffee.com/dustingroh?ref=roadtohomelab.blog" class="kg-btn kg-btn-accent">buy me coffee</a></div>]]></content:encoded></item><item><title><![CDATA[Homelab Push Notifications Using Uptime Kuma and Pushover]]></title><description><![CDATA[So you have Uptime Kuma set up, how about Push notifications?]]></description><link>https://roadtohomelab.blog/pushover-notifications/</link><guid isPermaLink="false">64e3b1581a4c930492185549</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Thu, 31 Aug 2023 13:00:54 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1584091377126-3817650725fc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fG5vdGlmaWNhdGlvbnxlbnwwfHx8fDE3MTg1NjUyODd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1584091377126-3817650725fc?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fG5vdGlmaWNhdGlvbnxlbnwwfHx8fDE3MTg1NjUyODd8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Homelab Push Notifications Using Uptime Kuma and Pushover"><p></p><hr><p><em>Do you get notified if your services go down (which they never do...) and come back up? Have you ever wanted those notifications to look like this?</em></p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://roadtohomelab.blog/content/images/2023/08/IMG_6107-1.PNG" width="1170" height="1535" loading="lazy" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/IMG_6107-1.PNG 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/IMG_6107-1.PNG 1000w, https://roadtohomelab.blog/content/images/2023/08/IMG_6107-1.PNG 1170w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://roadtohomelab.blog/content/images/2023/08/IMG_6109.PNG" width="1170" height="1343" loading="lazy" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/IMG_6109.PNG 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/IMG_6109.PNG 1000w, https://roadtohomelab.blog/content/images/2023/08/IMG_6109.PNG 1170w" sizes="(min-width: 720px) 720px"></div></div></div></figure><p>Well, today we&apos;ll make that happen.</p><p>Previously I had set up an instance of Uptime Kuma on a Linode in order to monitor my homelab &quot;from the cloud&quot; (check the link below if you&apos;d like to read about it). This blog will be an extension of the blog above because now I&apos;d like to set up Push notifications about my lab, to my phone, from the cloud. We&apos;ll be using Pushover to handle sending my phone (or any device, in your case) said notification.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://roadtohomelab.blog/monitor-your-homelab-from-the-cloud-uptime-kuma-on-a-vps-using-linode-tailscale-and-pfsense/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense</div><div class="kg-bookmark-description">I&#x2019;ll show you how I configure a VPS to safely monitor my homelab.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://roadtohomelab.blog/favicon.ico" alt="Homelab Push Notifications Using Uptime Kuma and Pushover"><span class="kg-bookmark-author">Road to Homelab</span><span class="kg-bookmark-publisher">Dustin Groh</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHNlcnZlcnxlbnwwfHx8fDE2OTE0MTk2MTl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Homelab Push Notifications Using Uptime Kuma and Pushover"></div></a></figure><p></p><h4 id="consider-signing-up">Consider signing up</h4><p>Before we get into it, if you&apos;re interested in getting emails when I post something new, click sign up below. It&apos;s free and I don&apos;t run ads.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://roadtohomelab.blog/#/portal/signup/free" class="kg-btn kg-btn-accent">Sign Up</a></div><h3 id="what-is-pushover">What is Pushover?</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://pushover.net/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Pushover: Simple Notifications for Android, iPhone, iPad, and Desktop</div><div class="kg-bookmark-description">Pushover makes it easy to get real-time notifications on your Android, iPhone, iPad, and Desktop (Android Wear and Apple Watch, too!)</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://pushover.net/favicon.ico" alt="Homelab Push Notifications Using Uptime Kuma and Pushover"></div></div><div class="kg-bookmark-thumbnail"><img src="https://pushover.net/assets/writing-header-c251fe65a610047a0209640b75d38e79f7b23b67d64135f629e6062f3e25c2f3.png" alt="Homelab Push Notifications Using Uptime Kuma and Pushover"></div></a></figure><p>Pushover is a service that allows you to receive simple notifications on your iPhone/iPad/Android/Desktop. </p><p>Although it&apos;s not free, there is a 30 day trial. To purchase it there&apos;s a $5 <em>one time purchase</em> per platform (I&apos;m a big fan of platforms that are one time purchases). That means if you want to receive notifications on your phone and desktop, you&apos;ll be out $10. Very reasonable.</p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">I&apos;m not sponsored by this platform, just a happy user.</div></div><p>Anyway, you&apos;ll obviously need a Pushover account and then you&apos;ll need to download the app on what ever platform you want to receive notifications on. For me, that&apos;s my iPhone. Login to your new Pushover account on the app you downloaded.</p><p>When you login on any of the Pushover apps you&apos;ll be asked to register the device you&apos;re on. I gave mine the name &quot;iphone&quot;, but you can call yours whatever you like.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/IMG_6076-1.PNG" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="1170" height="1246" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/IMG_6076-1.PNG 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/IMG_6076-1.PNG 1000w, https://roadtohomelab.blog/content/images/2023/08/IMG_6076-1.PNG 1170w" sizes="(min-width: 720px) 720px"></figure><p>Now login to your Pushover account on a web browser.</p><p>On the home page, you&apos;ll want to take note of your &quot;User Key&quot; in the top right corner, you&apos;ll need this later on.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/image-12.png" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="1072" height="732" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/image-12.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/image-12.png 1000w, https://roadtohomelab.blog/content/images/2023/08/image-12.png 1072w" sizes="(min-width: 720px) 720px"></figure><p></p><p>Click &quot;Create an Application/API Token&quot; at the bottom of the page. On the next page fill in the details of the application you&apos;re making and click &quot;Create Application&quot;.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-29-111017.png" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="1920" height="1063" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-29-111017.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-29-111017.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-29-111017.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-29-111017.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>You&apos;ll be presented with a page that displays the API Token/Key for this application. That value will be copy/pasted into Uptime Kuma, so go ahead and copy it.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-29-110653-1.png" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="1920" height="1545" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-29-110653-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-29-110653-1.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-29-110653-1.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-29-110653-1.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>Now, let&apos;s head over to the Uptime Kuma instance. </p><p></p><h3 id="uptime-kuma-config">Uptime Kuma config</h3><p>Under &quot;Settings&quot; &gt; &quot;Notifications&quot;, click &quot;Setup Notification&quot;.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/image-10.png" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="460" height="334"></figure><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/image-11.png" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="313" height="415"></figure><p>This screen will allow us to configure our notification. Uptime Kuma has tons of ways to get notified about your services, here are a few that standout as good options to me:</p><ul><li>Discord bot</li><li>Slack</li><li>Microsoft Teams</li><li>Email</li><li>SMS</li><li>Push notification</li></ul><p>We&apos;re obviously going with Push notifications today, but I&apos;ve used the Discord bot in the past and it worked perfectly. In the popup box I&apos;ll select &quot;Pushover&quot; as my Notification Type. Also, give it a friendly name and message title.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/image-9.png" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="564" height="1338"></figure><p>You&apos;re going to paste in three additional pieces of info from Pushover to make Uptime Kuma communicate with it: </p><ul><li>the Application Token (or API Token/Key), found when you click the name of your Application at the bottom of the homepage.</li><li>your User Key, found on the right side of the homepage.</li><li>the name of a device you&apos;d like these notifications to go to (as a reminder, I gave mine the name &quot;iphone&quot;).</li></ul><p>So head back over to Pushover, grab that info, and put it in this popup within Uptime Kuma like my screenshot above.</p><p>You&apos;re welcome to edit some of the other fields like Message Title (i.e. the actual title of the Push notification you&apos;ll receive)., TTL, Priority, etc. I&apos;ve also chosen to select &quot;Default enabled&quot; and &quot;Apply on all existing monitors&quot; at the bottom.</p><p>That&apos;s it! Click &quot;Test&quot; to confirm your notification works the way you want.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/IMG_6079.PNG" class="kg-image" alt="Homelab Push Notifications Using Uptime Kuma and Pushover" loading="lazy" width="1170" height="2532" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/IMG_6079.PNG 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/IMG_6079.PNG 1000w, https://roadtohomelab.blog/content/images/2023/08/IMG_6079.PNG 1170w" sizes="(min-width: 720px) 720px"></figure><p>Look at that. You now have Push notifications set up for your homelab. </p>]]></content:encoded></item><item><title><![CDATA[The Ultimate Homelab Homepage Guide]]></title><description><![CDATA[Ever wanted to set up a homepage for your homelab? I'll show you how to set up seven different options.]]></description><link>https://roadtohomelab.blog/homelab-homepage-guide/</link><guid isPermaLink="false">64d0ec952e696e24b3e5f2bd</guid><category><![CDATA[review]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Thu, 24 Aug 2023 20:55:00 GMT</pubDate><media:content url="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-23-103827-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-23-103827-2.png" alt="The Ultimate Homelab Homepage Guide"><p>If you haven&apos;t heard, hosting a local static homepage for your homelab is all the rage. Also, you&apos;re very uncool if you haven&apos;t done one yet.</p><p>Obviously that&apos;s not true, because I haven&apos;t done one yet! <em>So why don&apos;t we do one (or six) together? </em></p><p>I&apos;m going to be setting up seven options today (SUI, Flame, Heimdall, Homepage, Homer, Dashy, and Homarr) so we can see how easy/hard they are to get going, how beginner friendly they are, and what their feature sets are. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">This isn&apos;t the ultimate guide for <i><em class="italic" style="white-space: pre-wrap;">everything </em></i>related to homepages, but it&apos;ll be perfect for a newcomer who wants a homepage but isn&apos;t sure how to get started.</div></div><p>Before we get into it, it&apos;s important to think about what it is you might be looking for. Maybe you want something very simple that&apos;s configurable with a GUI and strictly just has links to your most used services. Maybe you want the most complex homepage you can build with API integrations into your services and statistics on your Docker hosts and VMs. Maybe you want something in the middle. Regardless, having a rough idea of what you&apos;re looking for will help you weed out the options that won&apos;t work for you in this post. </p><p>My goal here is to give you a framework, or, a way to think about how I find it useful to setup and configure these apps, in order for you to use them in your own lab. <u>There&apos;s no point in you doing exactly what I did if that doesn&apos;t work for you!</u> Chances are you&apos;re hosting different services than me - but of course you&apos;re welcome to copy what I&apos;m doing if that blows your hair back.</p><p>Also remember, all of these projects are free - and that in and of itself is amazing. Please go show the developers some love!</p><h4 id="consider-signing-up">Consider signing up</h4><p>If you&apos;re interested in getting emails when I post something new, click sign up below. It&apos;s free.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://roadtohomelab.blog/#/portal/signup/free" class="kg-btn kg-btn-accent">Sign up</a></div><h1 id="sui">SUI</h1><hr><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://github.com/jeroenpardon/sui?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - jeroenpardon/sui: a startpage for your server and / or new tab page</div><div class="kg-bookmark-description">a startpage for your server and / or new tab page. Contribute to jeroenpardon/sui development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">jeroenpardon</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/eaf1e33d9b1301e93699261c47a690c2d90c00130ec7a1b8d9a4cc5140ba6cd2/jeroenpardon/sui" alt="The Ultimate Homelab Homepage Guide"></div></a><figcaption><p><span style="white-space: pre-wrap;">-</span></p></figcaption></figure><p>We&apos;re starting off simple. </p><p>SUI, and it&apos;s sister, Flame, are the easiest setup/configuration of the bunch. I&apos;d recommend this one to anyone who doesn&apos;t care about integrations or having additional stats of services shown on their startpage (like ping).</p><p><em>For those of you who like to tinker and incorporate as much as possible into these platforms, SUI and Flame will likely be a touch too simple for you.</em></p><h3 id="install">Install</h3><p>Like most of the others we&apos;ll go through today, it&apos;s very easy to get started with Docker Compose. Just make a directory on your Docker host, mine is <code>/home/docker/sui</code>, <code>cd</code> to it, and run the below command.</p><pre><code>git clone https://github.com/jeroenpardon/sui</code></pre><p>Then, bring up the container.</p><pre><code>docker-compose up -d</code></pre><p>Then promptly receive an error that the Docker network cannot be found, just a reminder that I&apos;m learning too! </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-123720.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1509" height="52" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-123720.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-10-123720.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-123720.png 1509w" sizes="(min-width: 720px) 720px"></figure><p>I just ran the command in the error message and fixed it.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-123740.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="651" height="21" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-123740.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-123740.png 651w"></figure><h3 id="config">Config</h3><p>And now, SUI is accessible on <code>localhost:4000</code>. We&apos;re greeted with a very nice example page with plenty to get started with.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-123450.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1585" height="1618" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-123450.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-10-123450.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-123450.png 1585w" sizes="(min-width: 720px) 720px"></figure><p>Editing the apps list requires editing the <code>apps.json</code> file inside the repo you cloned. Here&apos;s what I came up with if you&apos;re interested in a starting point, don&apos;t forget to update your URLs.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-125507.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1242" height="343" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-125507.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-10-125507.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-125507.png 1242w" sizes="(min-width: 720px) 720px"></figure><pre><code class="language-json">{
    &quot;apps&quot; : [
        {&quot;name&quot;:&quot;pfsense&quot;,&quot;url&quot;:&quot;10.1.1.1&quot;,&quot;icon&quot;:&quot;wall&quot;},
        {&quot;name&quot;:&quot;Nginx Proxy Manager&quot;,&quot;url&quot;:&quot;nginx.domain.com&quot;,&quot;icon&quot;:&quot;arrow-decision&quot;},
        {&quot;name&quot;:&quot;TrueNAS&quot;,&quot;url&quot;:&quot;Truenas.domain.com&quot;,&quot;icon&quot;:&quot;tape-drive&quot;},
        {&quot;name&quot;:&quot;Pi-hole&quot;,&quot;url&quot;:&quot;pihole.domain.com&quot;,&quot;icon&quot;:&quot;do-not-disturb&quot;},
        {&quot;name&quot;:&quot;Portainer&quot;,&quot;url&quot;:&quot;portainer.domain.com&quot;,&quot;icon&quot;:&quot;docker&quot;},
        {&quot;name&quot;:&quot;Plex&quot;,&quot;url&quot;:&quot;plex.tv&quot;,&quot;icon&quot;:&quot;plex&quot;},
        {&quot;name&quot;:&quot;Tautulli&quot;,&quot;url&quot;:&quot;tautulli.domain.com&quot;,&quot;icon&quot;:&quot;chart-box&quot;},
        {&quot;name&quot;:&quot;Speedtest Tracker&quot;,&quot;url&quot;:&quot;speedtest.domain.com&quot;,&quot;icon&quot;:&quot;speedometer&quot;}
    ]
}</code></pre><div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">How do those icons work?</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">SUI and Flame both use </span><a href="https://pictogrammers.com/library/mdi/?ref=roadtohomelab.blog"><span style="white-space: pre-wrap;">Material Design Icons</span></a><span style="white-space: pre-wrap;">, also known as MDI, to render the icons next to your services using just a shortcode.</span></p></div>
        </div><p>You can also edit the bookmarks section by editing <code>links.json</code> in the same way, I&apos;m not going to get into that though. Lastly, there is a color theme option in the bottom lefthand corner, which is pretty nifty since dark themes are life.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-125900.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="862" height="316" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-125900.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-125900.png 862w" sizes="(min-width: 720px) 720px"></figure><p>I do wish you could give the applications a subtitle or description, as it&apos;s nice to have alternate text associated with some services. Overall, it&apos;s a simple app that works as expected and looks nice doing it. I personally like that it&apos;s no frills, and if that&apos;s what you&apos;re looking for I think SUI could be a great option for you. </p><p></p><h1 id="flame">Flame</h1><hr><figure class="kg-card kg-bookmark-card kg-card-hascaption"><a class="kg-bookmark-container" href="https://github.com/pawelmalak/flame?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - pawelmalak/flame: Flame is self-hosted startpage for your server. Easily manage your apps and bookmarks with built-in editors.</div><div class="kg-bookmark-description">Flame is self-hosted startpage for your server. Easily manage your apps and bookmarks with built-in editors. - GitHub - pawelmalak/flame: Flame is self-hosted startpage for your server. Easily mana&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">pawelmalak</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/365565715/41e1c378-2d4a-4350-b432-b59abbc67c9f" alt="The Ultimate Homelab Homepage Guide"></div></a><figcaption><p><span style="white-space: pre-wrap;">-</span></p></figcaption></figure><p>Flame was inspired (heavily, in the dev&apos;s words) by SUI, so you&apos;ll see the look is very similar. The major difference, from what I see, is that Flame is SUI with a GUI. No file editing necessary, it&apos;s all done right inside Flame&apos;s GUI here, which is <em>very </em>easy to use. Flame easily takes the cake for &quot;easiest configuration&quot;. It&apos;s the perfect choice for someone who wants a really great looking startpage but doesn&apos;t want to have to edit it via yaml or json file. </p><h3 id="install-1">Install</h3><p>On your Docker host just run the below command to get started.</p><pre><code>docker run -p 5005:5005 -v /path/to/data:/app/data -e PASSWORD=flame_password pawelmalak/flame</code></pre><h3 id="config-1">Config</h3><p>After installing, accessing the app from <code>localhost:5005</code>, and logging in (I changed my theme to &quot;Mint&quot; as well) you&apos;ll be greeted with this page.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/image-4.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1221" height="729" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/image-4.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/image-4.png 1000w, https://roadtohomelab.blog/content/images/2023/08/image-4.png 1221w" sizes="(min-width: 720px) 720px"></figure><p>Unlike SUI, Flame starts off empty. Clicking &quot;Applications&quot; brings you to the applications editor, and it&apos;s as simple as adding each service you want a link to on your homepage. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-094308.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1138" height="858" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-094308.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-10-094308.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-094308.png 1138w" sizes="(min-width: 720px) 720px"></figure><p>You can set all these fields up however you want. One thing I like is the icons option (using MDI like I mentioned above), it feels like a simple way to make this your own. Here&apos;s how this application would look using the &quot;television&quot; icon.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-095536.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="839" height="335" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-095536.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-095536.png 839w" sizes="(min-width: 720px) 720px"></figure><p>Add as many apps as you want in addition to Bookmarks (to idk, maybe your favorite homelab blog?) and you&apos;ve got a beautiful, simple startpage for your homelab. Since this is similar to SUI I won&apos;t bore you with my final dashboard. Side note, this one has a weather widget - check it out.</p><p></p><h1 id="heimdall">Heimdall</h1><hr><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/linuxserver/Heimdall?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - linuxserver/Heimdall: An Application dashboard and launcher</div><div class="kg-bookmark-description">An Application dashboard and launcher. Contribute to linuxserver/Heimdall development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">linuxserver</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/81c96e2f53085fcbb2f071d3de67cce1eb518a3ef24018a067166dc2f0afa333/linuxserver/Heimdall" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>If you&apos;ve researched the best homepages anytime in the past few years, you&apos;ll see that <em>lots </em>of people have been using Heimdall. I&apos;ve avoided it, partly because of it&apos;s popularity but also partly because the look of it isn&apos;t really my vibe. I think it&apos;s time to find out what all the hype is about.</p><h3 id="install-2">Install</h3><p>I&apos;m going to create another directory here<code>/home/docker/heimdall</code> and run the following command to install Heimdall.</p><pre><code>sudo docker run --name=heimdall -d -v /home/kodestar/docker/heimdall:/config -e PGID=1000 -e PUID=1000 -p 8080:80 -p 8443:443 linuxserver/heimdall</code></pre><p>Going to <code>localhost:8080</code> will take you to this very ominous photo of a hot air balloon getting lost forever over the ocean.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-161235.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1920" height="1070" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-11-161235.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-11-161235.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-11-161235.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-161235.png 1920w" sizes="(min-width: 720px) 720px"></figure><h3 id="config-2">Config</h3><p>There&apos;s a little button that says &quot;Add an application here&quot;, so I&apos;m gunna click that without reading the documentation and let Heimdall sweep me away. Clicking that link brings up this dialog. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-162402-1.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1539" height="913" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-11-162402-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-11-162402-1.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-162402-1.png 1539w" sizes="(min-width: 720px) 720px"></figure><p>Choosing &quot;Application Type&quot; allows you to pick from a gigantic list of services that are pre-built and changes the button to match that service. Here are some examples.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-162633.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1347" height="214" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-11-162633.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-11-162633.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-162633.png 1347w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-14-090721.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1338" height="196" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-14-090721.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-14-090721.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-14-090721.png 1338w" sizes="(min-width: 720px) 720px"></figure><p>Again, these are templates so you can change the color, icon, text, URL, etc. if you don&apos;t like the template. If the app you&apos;re adding is classified as an &quot;Enhanced App&quot; it will likely have another section below called &quot;Config&quot; that allows you to integrate your services with Heimdall via username and password or API. <em>Here&apos;s a good example with the Speedtest Tracker integration as it&apos;s showing the current download speed it&apos;s getting.</em></p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-16-145701-2.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="430" height="145"></figure><p>Probably one of my favorite things is that the services are drag-and-droppable once you add them to the dashboard. Fancy a change? Just click &quot;Reorder and pin items&quot; in the bottom right hand corner and you can move them around without ever having to touch a yaml file.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-16-145316-1.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1743" height="841" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-16-145316-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-16-145316-1.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-16-145316-1.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-16-145316-1.png 1743w" sizes="(min-width: 720px) 720px"></figure><p>I changed up my background to something less busy under <strong>Settings &gt; Appearance</strong>, and here&apos;s my final Heimdall dashboard.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-21-135522.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1575" height="945" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-21-135522.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-21-135522.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-21-135522.png 1575w" sizes="(min-width: 720px) 720px"></figure><p>I will say, I judged Heimdall too soon. The integrations are pretty extensive and it&apos;s really quite delightful to use.</p><p></p><h1 id="homepage">Homepage</h1><hr><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/benphelps/homepage?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - benphelps/homepage: A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.</div><div class="kg-bookmark-description">A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations. - GitHub - benphelps/homepage: A highly customizable homepage (or startpage / applica&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">benphelps</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/8db64a1a072caf5762ca59a5b35b8177a159415b363e352fafa3365a94eea5a7/benphelps/homepage" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>From what I see, Homepage gets lots of the attention in the homelab space recently - and for good reason. Clean look, easy to configure via YAML file, and lots of integrations to make your installation shine.</p><h3 id="install-3">Install</h3><p>Setting this up is a breeze using Docker Compose... </p><pre><code>version: &quot;3.3&quot;
services:
  homepage:
    image: ghcr.io/benphelps/homepage:latest
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - /path/to/config:/app/config # Make sure your local config directory exists
      - /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations</code></pre><p>or Docker Run.</p><pre><code>docker run -p 3000:3000 -v /path/to/config:/app/config -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/benphelps/homepage:latest</code></pre><h3 id="config-3">Config</h3><p>When you&apos;re done, go to <code>localhost:3000</code> and you&apos;re greeted with a fresh Hompage. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-130729.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1624" height="1024" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-130729.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-10-130729.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-10-130729.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-130729.png 1624w" sizes="(min-width: 720px) 720px"></figure><p>Now, the extensibility of this app is what makes it really cool, and if you&apos;d like to see the integrations/configurations they support check it out here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gethomepage.dev/en/configs/services/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Services - Homepage</div><div class="kg-bookmark-description">Service Configuration</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://gethomepage.dev/apple-touch-icon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">Homepage</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://gethomepage.dev/homepage-og.png" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>Like this documentation says, we need to configure our <code>services.yml file</code> (located at <code>/path/to/config/</code>) in order to add our services and configure the page how we want. </p><p>Homepage is split into four main categories, the first two of them look familiar. </p><p><strong>Bookmarks </strong>are exactly like you&apos;d expect bookmarks to be, static links. </p><p><strong>Services </strong>are the actual services you want to link to and can have properties attached to them like a description, icon, Docker integration, or ping.</p><p>Adding properties, such as ping or description, is as easy as nesting them under the service they&apos;re connected to. </p><pre><code>- Network Services:
    - Service A:
        href: http://IPADDRESS/
        ping: http://IPADDRESS

    - Service B:
        href: http://IPADDRESS/
        description: my docker host</code></pre><p>You can set up <strong>Information Widgets</strong>, which are the pieces of info like CPU and Disk space that show up next to the search bar at the top. The few options here are pretty cool - things like the weather, Unifi Controller stats, Kubernetes resources, or a custom logo. Look into these on your own.</p><p>You can also set up a <strong>Service Widget</strong> which is an integration (usually API) designed for that specific service. </p><p>The possibilities inside Service Widgets are really quite impressive, most common services have some kind of API integration for you to pull in lots of really helpful info right onto your homepage. I left out a ton of integrations that you can set up, the list is <em>extensive</em>.</p><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Warning</strong></b>: Homepage very much has the potential to tempt you into hosting additional services <i><em class="italic" style="white-space: pre-wrap;">just</em></i> to add them (and their Service Widgets) to your homepage. I fully support that, I&apos;m just sayin&apos;.</div></div><p>Here&apos;s my &quot;final&quot; dashboard! I&apos;m a big fan of the look of Homepage.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-23-103827-1.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1708" height="1414" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-23-103827-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-23-103827-1.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-23-103827-1.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-23-103827-1.png 1708w" sizes="(min-width: 720px) 720px"></figure><p>Here&apos;s my complete services.yml file. You can find all the info about setting up corresponding APIs in the link I added below my file.</p><pre><code class="language-yaml">- Network Services:
    - pfSense:
        icon: mdi-wall-fire
        href: http://IPADDRESS
        description: Firewall
        ping: http://IPADDRESS
    - pihole:
        icon: mdi-pi-hole
        href: http://IPADDRESS
        description: network ad blocking
        ping: http://IPADDRESS
        widget:
            type: pihole
            url: http://IPADDRESS
            key: APIKEY
    - Unifi Controller:
        icon: mdi-wifi
        href: https://IPADDRESS
        description: wifi controller
        ping: https://IPADDRESS
        container: unifi-controller
        widget:
            type: unifi
            url: https://IPADDRESS
            username: username
            password: password

- Media Services:
    - TrueNAS:
        icon: mdi-nas
        href: http://IPADDRESS
        description: NAS
        ping: http://IPADDRESS
        widget:
          type: truenas
          url: http://IPADDRESS
          username:
          password:
          key: APIKEY
    - Plex:
        icon: plex
        href: http://IPADDRESS
        description: media
        ping: https://IPADDRESS
    - Tautili:
        icon: mdi-folder-play
        href: http://IPADDRESS
        description: plex stats
        ping: http://IPADDRESS
        container: tautulli
        widget:
          type: tautulli
          url: http://IPADDRESS
          key: APIKEY

- Applications: 
    - Portainer:
        icon: mdi-docker
        href: http://IPADDRESS
        description: docker controller 
        ping: http://IPADDRESS
        container: portainer
    - Uptime Kuma:
        icon: mdi-bell
        href: http://IPADDRESS
        description: uptime monitoring
        ping: http://IPADDRESS
        container: uptime-kuma
        widget:
          type: uptimekuma
          url: http://IPADDRESS
          slug: SLUG
    - Proxmox:
        icon:  mdi-server
        href: https://IPADDRESS
        description: hypervisor
        ping: https://IPADDRESS
    - Dozzle:
        icon: mdi-database
        href: http://IPADDRESS
        description: docker logs
        ping: http://IPADDRESS

- Information:
    - Speedtest Tracker:
        icon: mdi-speedometer
        href: http://IPADDRESS
        description: speedtest
        ping: http://IPADDRESS
        container: speedtest
        widget:
            type: speedtest
            url: http://IPADDRESS   
    - Tailscale:
        icon: mdi-tailwind
        href: https://tailscale.com
        description: router connection
        ping: https://tailscale.com
        widget:
            type: tailscale
            deviceid: DEVICEID
            key: APIKEY</code></pre><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gethomepage.dev/en/configs/service-widgets/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Service Widgets - Homepage</div><div class="kg-bookmark-description">Service Widget Configuration</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://gethomepage.dev/apple-touch-icon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">Homepage</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://gethomepage.dev/homepage-og.png" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>I couldn&apos;t get the Portainer widget working, but I&apos;m guessing it&apos;s something on my end. Homepage is a special one. I think the devs did a fantastic job adding integrations to really make Homepage stand out from competitors.</p><p></p><h1 id="homer">Homer</h1><hr><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/bastienwirtz/homer?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - bastienwirtz/homer: A very simple static homepage for your server.</div><div class="kg-bookmark-description">A very simple static homepage for your server. Contribute to bastienwirtz/homer development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">bastienwirtz</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/cde64244848afee91b76640bba4369c623bc110ad148221915088647fcb5992d/bastienwirtz/homer" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>Homer is a nice option for hosting a server homepage. It&apos;s somewhere in the middle of simple and complex to setup, with a simple and kind of cartoon-ish look and feel overall. </p><h3 id="install-4">Install</h3><p>Using Docker Compose...</p><pre><code>version: &quot;2&quot;
services:
  homer:
    image: b4bz/homer
    #To build from source, comment previous line and uncomment below
    #build: .
    container_name: homer
    volumes:
      - /your/local/assets/:/www/assets
    ports:
      - 8080:8080
    user: 1000:1000 # default
    environment:
      - INIT_ASSETS=1 # default</code></pre><p>or Docker run you can get started quickly.</p><pre><code>docker run -d \
  -p 8080:8080 \
  -v &lt;/your/local/assets/&gt;:/www/assets \
  --restart=always \
  b4bz/homer:latest</code></pre><h3 id="config-4">Config</h3><p>Homer will then be accessible from <code>localhost:8080</code>. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-122105.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1897" height="979" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-11-122105.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-11-122105.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-11-122105.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-11-122105.png 1897w" sizes="(min-width: 720px) 720px"></figure><p>Homer is customizable via editing the <code>assets/config.yml</code> file. Here&apos;s a snippet of what we&apos;d need to edit to customize our homepage. Similar to Homepage above, you can group services into categories based on their function. </p><pre><code>  - name: &quot;Group 1&quot;
    icon: &quot;fas fa-code-branch&quot;
    items:
      - name: &quot;Application 1&quot;
        logo: &quot;assets/tools/sample.png&quot;
        subtitle: &quot;Bookmark example&quot;
        tag: &quot;app&quot;
        keywords: &quot;self hosted reddit&quot;
        url: &quot;https://www.reddit.com/r/selfhosted/&quot;
        target: &quot;_blank&quot; # optional html tag target attribute
        
      - name: &quot;Application 2&quot;
        logo: &quot;assets/tools/sample2.png&quot;
        subtitle: &quot;Another application&quot;
        tag: &quot;app&quot;
        tagstyle: &quot;is-success&quot;
        url: &quot;#&quot;</code></pre><p>You&apos;ll need to go through and add services (including any <a href="https://github.com/bastienwirtz/homer/blob/main/docs/customservices.md?ref=roadtohomelab.blog">custom services</a>), change names, links, etc. in addition to any icons you&apos;d like to use. Here&apos;s the final look of my page. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-25-095542-1.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1863" height="1105" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-25-095542-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-25-095542-1.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-25-095542-1.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-25-095542-1.png 1863w" sizes="(min-width: 720px) 720px"></figure><p>If you want a starting point, here&apos;s the &quot;services&quot; section of my configuration file. </p><pre><code>services:
  - name: &quot;Network Services&quot;
    icon: &quot;fas fa-code-branch&quot;
    items:
      - name: &quot;pfsense&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/pfsense.png?raw=true&quot;
        subtitle: &quot;firewall&quot;
        tag: &quot;app&quot;
        url: &quot;https://IPADDRESS&quot;
      - name: &quot;Pi-hole&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/pihole.png?raw=true&quot;
        subtitle: &quot;local DNS&quot;
        url: &quot;http://IPADDRESS&quot;
      - name: &quot;NGINX Proxy Manager&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/nginxproxymanager.png?raw=true&quot;
        subtitle: &quot;reverse proxy&quot;
        url: &quot;http://IPADDRESS&quot;
      - name: &quot;Uptime Kuma&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/uptimekuma.png?raw=true&quot;
        subtitle: &quot;system uptime&quot;
        url: &quot;http://IPADDRESS&quot;
      - name: &quot;Speedtest Tracker&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/windows98.png?raw=true&quot;
        subtitle: &quot;internet speedtest&quot;
        url: &quot;http://IPADDRESS&quot;
  - name: &quot;Media Services&quot;
    icon: &quot;fas fa-database&quot;
    items:
      - name: &quot;TrueNAS&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/truenas.png?raw=true&quot;
        subtitle: &quot;NAS&quot;
        url: &quot;https://IPADDRESS&quot;
      - name: &quot;Plex&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/plex.png?raw=true&quot;
        subtitle: &quot;movies and tv&quot;
        url: &quot;https://plex.tv&quot;
      - name: &quot;Tautulli&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/tautulli.png?raw=true&quot;
        subtitle: &quot;plex stats&quot;
        url: &quot;http://IPADDRESS&quot;
  - name: &quot;Applications&quot;
    icon: &quot;fas fa-tablet-screen-button&quot;
    items:
      - name: &quot;Proxmox&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/proxmox.png?raw=true&quot;
        subtitle: &quot;hypervisor&quot;
        tag: &quot;other&quot;
        url: &quot;http://IPADDRESS&quot;
      - name: &quot;Portainer&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/portainer.png?raw=true&quot;
        subtitle: &quot;docker management&quot;
        tag: &quot;other&quot;
        url: &quot;http://IPADDRESS&quot;
      - name: &quot;Unifi Controller&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/unifi.png?raw=true&quot;
        subtitle: &quot;wifi controller&quot;
        tag: &quot;other&quot;
        url: &quot;http://IPADDRESS&quot;
      - name: &quot;Dozzle&quot;
        logo: &quot;https://github.com/NX211/homer-icons/blob/master/png/dozzle.png?raw=true&quot;
        subtitle: &quot;docker logs&quot;
        tag: &quot;other&quot;
        url: &quot;http://IPADDRESS&quot;</code></pre><p>Homer also has widgets you can set up, check out their documentation. I like that you can use icons and images next to your services and links to make Homer unique, in addition to picking your own hex colors to change the theme however you want.</p><p></p><h1 id="dashy">Dashy</h1><hr><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/Lissy93/dashy?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - Lissy93/dashy: &#x1F680; A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more!</div><div class="kg-bookmark-description">&#x1F680; A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! - GitHub - Lissy93/dashy: &#x1F680; A self-hostable personal dashboard&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">Lissy93</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/343078060/82f850a2-b1af-4e9f-9245-c92700d74856" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>Dashy is the most unique option I&apos;ll be going over today - the style it&apos;s designed with is noticeably different than the rest.</p><h3 id="install-5">Install</h3><p>Dashy has <em>a lot</em> of install options, I recommend you read through their deployment page.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/Lissy93/dashy/blob/master/docs/deployment.md?ref=roadtohomelab.blog#using-docker-compose"><div class="kg-bookmark-content"><div class="kg-bookmark-title">dashy/docs/deployment.md at master &#xB7; Lissy93/dashy</div><div class="kg-bookmark-description">&#x1F680; A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! - Lissy93/dashy</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">Lissy93</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/343078060/82f850a2-b1af-4e9f-9245-c92700d74856" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>If you want to go the Docker Compose route like me, here you go,</p><pre><code>version: &quot;3.8&quot;
services:
  dashy:
    # To build from source, replace &apos;image: lissy93/dashy&apos; with &apos;build: .&apos;
    # build: .
    image: lissy93/dashy
    container_name: Dashy
    # Pass in your config file below, by specifying the path on your host machine
    volumes:
      - /home/docker/dashy/my-config.yml:/app/public/conf.yml
    ports:
      - 4000:80
    # Set any environmental variables
    environment:
      - NODE_ENV=production
    # Specify your user ID and group ID. You can find this by running `id -u` and `id -g`
    #  - UID=1000
    #  - GID=1000
    # Specify restart policy
    restart: unless-stopped
    # Configure healthchecks
    healthcheck:
      test: [&apos;CMD&apos;, &apos;node&apos;, &apos;/app/services/healthcheck&apos;]
      interval: 1m30s
      timeout: 10s
      retries: 3
      start_period: 40s</code></pre><p><em>Note: I premade a config file just so I knew where it was, you don&apos;t have to do this.</em></p><h3 id="config-5">Config</h3><p>Dashy is accessible via <code>localhost:8080</code>.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-135221.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1920" height="816" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-10-135221.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-10-135221.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-10-135221.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-10-135221.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>I&apos;ll just say this, Dashy is powerful. I highly recommend you read the configuration guide below to get more infor about the 3 ways to configure Dashy. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/Lissy93/dashy/blob/master/docs/configuring.md?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">dashy/docs/configuring.md at master &#xB7; Lissy93/dashy</div><div class="kg-bookmark-description">&#x1F680; A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! - Lissy93/dashy</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">Lissy93</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/343078060/82f850a2-b1af-4e9f-9245-c92700d74856" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>The three options to configure it are:</p><ol><li><strong>Directly in the YAML file</strong> <em>(5/5 reliability, 3/5 usability)</em></li><li><strong>UI JSON Editor</strong> <em>(4/5 reliability, 4/5 usability)</em></li><li><strong>UI Visual Editor</strong> <em>(3/5 reliability, 5/5 usability)</em></li></ol><p>I&apos;m going to be setting mine up directly through the YAML file since that&apos;s what I&apos;m most comfortable with, but you&apos;re welcome to do it however you see fit. I could spend a lot of time talking about all the cool ways to configure Dashy. There are some really creative general widgets (like weather, sports scores, crypto prices, flight trackers, etc.) and even more if you&apos;ve got some services self-hosted. </p><p>From what I can tell, Dashy becomes <em>really</em> powerful once you use it with Glances. </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://nicolargo.github.io/glances/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Glances - An Eye on your system</div><div class="kg-bookmark-description">Glances is a cross-platform curses-based system monitoring tool written in Python.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://nicolargo.github.io/glances/favicon.ico" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">An Eye on your system</span><span class="kg-bookmark-publisher">Nicolas Hennion, Alessio Sergi, and Glances contributors</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://nicolargo.github.io/glances/public/images/glances.png" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>This is something I&apos;m not currently hosting, but it&apos;s the way to display tons of graphs and visual data about your system. If you&apos;re interested in running Dashy and would like to use it to it&apos;s full potential, I recommend getting Glances as well.</p><p>One of my favorite parts of Dashy is the theme options, knock yourself out.</p><p>Here&apos;s what I ultimately came up with.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-24-135612.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1920" height="1919" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-24-135612.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-24-135612.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-24-135612.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-24-135612.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>Go birds.</p><pre><code>---
# Page meta info, like heading, footer text and nav links
pageInfo:
  title: Road to Homelab Dashboard
  description: look at the money you&apos;ve wasted

# Optional app settings and configuration
appConfig:
  statusCheck: false
  theme: charry-blossom
  fontAwesomeKey: c94dc2b452
  customCss: &apos;.clock p.time { font-size: 3rem !important; }&apos;
  layout: vertical
  iconSize: small

# Main content - An array of sections, each containing an array of items
sections:
- name: Today
  icon: 
  displayData:
    collapsed: false
    hideForGuests: false
  widgets:
  - type: clock
  - type: weather
    options:
      apiKey: efdbade728b37086877a5e83442004db
      city: Indianapolis
      units: imperial
  - type: sports-scores
    options:
      teamId: 134936
      pastOrFuture: future
      limit: 1

- name: My Network
  icon: mdi-web
  displayData:
    collapsed: false
    hideForGuests: false
  widgets:
  - type: public-ip
  - type: pi-hole-stats
    options:
      hostname: http://IPADDRESS
      apiKey: APIKEY
      useProxy: true

- name: Dev &amp; Cloud
  icon: far fa-code
  items:
  - title: Linode
    icon: favicon
    url: https://linode.com
  - title: DigitalOcean
    icon: favicon
    url: https://cloud.digitalocean.com/
  - title: GitHub
    icon: favicon
    url: https://github.com/
  - title: StackOverflow
    icon: favicon
    url: http://stackoverflow.com/
  - title: CloudFlare
    icon: favicon
    url: https://dash.cloudflare.com/
    statusCheckAcceptCodes: &apos;403&apos;
  - title: Blog
    icon: favicon
    url: https://roadtohomelab.blog
  - title: Documentation
    subItems:
    - title: JavaScript
      url: https://developer.mozilla.org
      icon: si-javascript
      color: &apos;#F7DF1E&apos;
    - title: TypeScript
      url: https://www.typescriptlang.org/docs
      icon: si-typescript
      color: &apos;#3178C6&apos;
    - title: Svelt
      url: https://svelte.dev/docs
      icon: si-svelte
      color: &apos;#FF3E00&apos;
    - title: Go
      url: https://go.dev/doc
      icon: si-go
      color: &apos;#00ADD8&apos;
    - title: Rust
      url: https://doc.rust-lang.org/reference
      icon: si-rust
      color: &apos;#000000&apos;
    - title: Docker
      url: https://docs.docker.com/
      icon: si-docker
      color: &apos;#2496ED&apos;

- name: Network Services
  icon: mdi-network
  items:
  - title: pfsense
    description: firewall
    icon: mdi-wall-fire
    url: http://IPADDRESS
  - title: pi-hole
    description: local DNS
    icon: mdi-pi-hole
    url: http://IPADDRESS
  - title: Speedtest Tracker
    description: internet speedtest
    icon: mdi-speedometer
    url: http://IPADDRESS
  - title: Unifi Controller
    description: wifi controller
    icon: mdi-wifi
    url: http://IPADDRESS

- name: Media
  icon: mdi-folder-multiple-image
  items:
  - title: TrueNas
    description: NAS
    icon: mdi-nas
    url: http://IPADDRESS
  - title: plex
    description: media
    icon: mdi-plex
    url: https://plex.tv
  - title: Tautulli
    description: plex stats
    icon: mdi-folder-play
    url: http://IPADDRESS

- name: Applications
  icon: mdi-application
  items:
  - title: Portainer
    description: docker management
    icon: mdi-docker
    url: http://IPADDRESS
  - title: Uptime Kuma
    description: system monitoring
    icon: mdi-bell
    url: https://IPADDRESS
  - title: Proxmox
    description: hypervisor
    icon: mdi-server
    url: https://IPADDRESS
  - title: Dozzle
    description: docker logs
    icon: mdi-database
    url: https://IPADDRESS</code></pre><p>The bells and whistles abound on this one. </p><p></p><h1 id="homarr">Homarr</h1><hr><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://homarr.dev/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home | Homarr Docs</div><div class="kg-bookmark-description">Simplify the management of your server with Homarr - a sleek, modern dashboard that puts all of your apps and services at your fingertips. With Homarr, you can access and control everything in one convenient location. Homarr seamlessly integrates with the apps you&#x2019;ve added, providing you with valuab&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://homarr.dev/img/favicon.png" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">Homarr</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://homarr.dev/img/pictures/reviews/maeglin.webp" alt="The Ultimate Homelab Homepage Guide"></div></a></figure><p>Homarr is a sleek option for those who don&apos;t want to mess with yaml. It&apos;s mostly drag and drop, with some widget options that really bring it up a level.</p><h3 id="install-6">Install</h3><p>You can use Docker run (like me) or Docker compose. If you use the below command, just make sure to update the two -v flags to be the path to your resources.</p><pre><code>docker run  \                                                                         --name homarr \
  --restart unless-stopped \
  -p 7575:7575 \
  -v /home/docker/homarr/configs:/app/data/configs \
  -v /home/docker/homarr/icons:/app/public/icons \
  -d ghcr.io/ajnart/homarr:latest</code></pre><p>Homarr is accessible via <code>localhost:7575</code>.</p><h3 id="config-6">Config</h3><p>After install you&apos;re met with this page.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/image-6.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1906" height="844" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/image-6.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/image-6.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/image-6.png 1600w, https://roadtohomelab.blog/content/images/2023/08/image-6.png 1906w" sizes="(min-width: 720px) 720px"></figure><p>By clicking the little edit button in the top righthand corner you are able to drag the icons around. All I can say is this GUI is <em>slick. </em>First thing to note is the settings menu under the hamburger icon at the top right. Under settings you can:</p><ul><li>enable ping on services</li><li>change the number of columns displayed when the screen is different sizes</li><li>change accessibility options</li><li>change the color scheme and appearance of Homarr</li></ul><p>When you&apos;re ready to add apps and bookmarks just click the &quot;enter edit mode&quot; button in the top right and then &quot;add a tile&quot;. You&apos;ll be presented with this popup.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-28-094409.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="937" height="784" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-28-094409.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-28-094409.png 937w" sizes="(min-width: 720px) 720px"></figure><p>If you start typing the name of your app, for instance, &quot;Plex&quot;, Homarr will automatically go grab the icon for you, which is excellent design. Then you fill out the address that the button should take you to (i.e. the IP of your app).</p><p>&quot;Behavior&quot; let&apos;s you choose if the link opens in a new tab or the same page.</p><p>&quot;Network&quot; allows you to customize the status checker feature of Homarr.</p><p>&quot;Appearance&quot; let&apos;s you to pick or change the icon associated with that link in addition to some other display options.</p><p>&quot;Integration&quot; gives you some options to use API keys to further integrate your services into Homarr. There isn&apos;t a huge list, but the one&apos;s I&apos;ve played with so look great. Here&apos;s an example of a Pi-Hole integration.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-28-094816.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="748" height="379" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-28-094816.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-28-094816.png 748w" sizes="(min-width: 720px) 720px"></figure><p>One thing that Homarr is missing is that there isn&apos;t a way, that I see, to drag or resize your Categories. That means a Category will take up an entire row of space, no matter how many services are in there. This is a little annoying since I really like to play around with the look of my dashboard until it&apos;s <em>just</em> right.</p><p>Here&apos;s what I came up with.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-28-103118-1.png" class="kg-image" alt="The Ultimate Homelab Homepage Guide" loading="lazy" width="1920" height="1906" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-28-103118-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-28-103118-1.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-28-103118-1.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-28-103118-1.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>The options for a markdown notebook, iframe, and weather/calendar widgets is fantastic and welcomed. Good stuff Homarr.<br></p><p></p><hr><p>Thanks for reading.</p><p>Did I miss any? </p><p>I could only dive in to some of the configurations for these platforms, if you&apos;re interested in more of what they can do I recommend you read the documentation and support the developers. </p><p>If you&apos;re interested in having your internal DNS point a custom domain to your new homepage, I wrote a blog just for you.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://roadtohomelab.blog/local-dns-for-docker-containers-using-pi-hole-portainer-nginx-proxy-manager/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager</div><div class="kg-bookmark-description">Like most people running Docker, I gathered quite a few containers running on my very professional Ubuntu server (it&#x2019;s an 8 year old Lenovo laptop sitting in my garage). Because of this, I started to have a problem. New containers I deploy want to use ports that I already have</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://roadtohomelab.blog/favicon.ico" alt="The Ultimate Homelab Homepage Guide"><span class="kg-bookmark-author">Road to Homelab</span><span class="kg-bookmark-publisher">Dustin Groh</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://roadtohomelab.blog/content/images/2023/08/98879880-6796-11ea-8a07-a3f907697ec6.png" alt="The Ultimate Homelab Homepage Guide"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense]]></title><description><![CDATA[I'll show you how I configure a VPS to safely monitor my homelab.]]></description><link>https://roadtohomelab.blog/monitor-your-homelab-from-the-cloud-uptime-kuma-on-a-vps-using-linode-tailscale-and-pfsense/</link><guid isPermaLink="false">64cd689e8465c6197b334929</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Mon, 14 Aug 2023 16:27:37 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHNlcnZlcnxlbnwwfHx8fDE2OTE0MTk2MTl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1558494949-ef010cbdcc31?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHNlcnZlcnxlbnwwfHx8fDE2OTE0MTk2MTl8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense"><p>I really love monitoring my homelab with <a href="https://github.com/louislam/uptime-kuma?ref=roadtohomelab.blog">Uptime Kuma</a>.</p><p>But, the worrier in me has started to wonder &quot;what would happen if the server I have Uptime Kuma running on died?&quot; I would have no way of knowing the status of it, or of any of my services! </p><p><em>Can you imagine? </em></p><p>So, I sought out to solve this problem, and this blog will explain how you can do the same. There are a few ways of achieving this, probably other better ones, I understand. But I&apos;ll be showing you the one I came up with. My criteria for this project are as follows:</p><ol><li>Monitor the uptime of my homelab on something that is not my hardware.</li><li>Spend as little money as possible.</li><li>Use cool tech.</li><li>Keep my homelab safe.</li></ol><p>To check off #1 and #2, I chose to utilize the cheapest tier of VPS from Linode which is $5/month (I&apos;m not sponsored by Linode - but I&apos;d like to be). </p><h2 id="assumptions">Assumptions</h2><p>I&apos;m assuming a few things about you, and your homelab if you&apos;re following along here. First, that you can generally get around Linux, Docker, and the like. If so, you should be fine because I barely can. Next, that you have pfsense (or some other firewall/router that can run Tailscale and expose routes). Lastly, that you can set up a Linode account, and spare $5 a month.</p><p>^<em>that&apos;s one coffee.... figure it out</em></p><h5 id="disclaimer">Disclaimer</h5><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Look, idk your setup. Use common sense, and if you don&apos;t know what you&apos;re doing <i><em class="italic" style="white-space: pre-wrap;">that&apos;s okay.</em></i> Ask somewhere like r/homelab, the community there is great. That means if you do something dumb here and expose your home network don&apos;t come at me, you chose to follow some random instructions on the internet.</div></div><h2 id="set-up-a-linode-account">Set up a Linode account</h2><p>Okay after all that preamble, let&apos;s jump in. </p><p>I&apos;m setting up my itty bitty server in Chicago since I&apos;m in the Midwest, and installing Ubuntu on it since that&apos;s what I prefer - you can pick any region or Linux distro you want, be aware that could impact the effectiveness of these instructions.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-07-105113.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="1750" height="1591" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-07-105113.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-07-105113.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-07-105113.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-07-105113.png 1750w" sizes="(min-width: 720px) 720px"></figure><p>Once the box has been created, I recommend you create an SSH key to add a layer of security and remove the annoyance of authenticating every time you SSH in. Once complete, we&apos;re ready to start installing stuff. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-07-25-163936.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="1617" height="1591" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-07-25-163936.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-07-25-163936.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-07-25-163936.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-07-25-163936.png 1617w" sizes="(min-width: 720px) 720px"></figure><p>I&apos;ve redacted some info, but you&apos;ll be presented with this page once it completes provisioning the server. And frankly, this is really cool. The fact that you now have a dashboard for the cloud-hosted VPS that built to your specs in under a minute is wild.</p><p>Using the command below and the root password you set up, to connect to your box.</p><pre><code class="language-shell">ssh root@ipaddress</code></pre><h2 id="install-tailscale-on-pfsense">Install Tailscale on pfsense</h2><p>There is a simple process outlined in the below link on how to install Tailscale on pfsense. <strong>Take note, for this process you will need to setup Tailscale as an exit node, which turns Tailscale into a Full-Tunnel VPN. You&apos;ll also need to make sure to follow the instructions on adding your local subnet as an &quot;advertised route&quot;.</strong></p><p>I ran into an issue initially because my appliance was out of date, just something to note.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.wundertech.net/how-to-set-up-tailscale-on-pfsense/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to Set Up Tailscale on pfSense in 2023 - WunderTech</div><div class="kg-bookmark-description">This tutorial looks at how to set up Tailscale on pfSense! Tailscale is a no-configuration VPN that doesn&#x2019;t require port forwarding! Quick setup!</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.wundertech.net/wp-content/uploads/2020/07/cropped-WordPressSiteIcon-270x270.png" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense"><span class="kg-bookmark-author">WunderTech</span><span class="kg-bookmark-publisher">WunderTech</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.wundertech.net/wp-content/uploads/2022/10/thumb-2.jpg" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense"></div></a></figure><p>Once complete, do the following:</p><ol><li>Ensure your router shows up in your Tailscale account as connected.</li></ol><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-09-114615.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="1920" height="499" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-09-114615.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-09-114615.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-09-114615.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-09-114615.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>2. Under the three dots next to your router -&gt; &quot;Edit Route Settings&quot; you&apos;ll need to turn on both options.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-09-114720.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="760" height="487" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-09-114720.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-09-114720.png 760w" sizes="(min-width: 720px) 720px"></figure><p>If that is all true and good, you&apos;re ready to move on.</p><h2 id="install-docker-tailscale-and-uptime-kuma-on-ubuntu">Install Docker, Tailscale, and Uptime Kuma on Ubuntu</h2><p>There&apos;s frankly lots of work you can do to secure this Linux box to the outside world, I&apos;m not going to get into it in this post - but I highly recommend you do some research on how to lock it down since it will be public facing.</p><p>We&apos;ll be using Docker Compose, but you can do whatever you want with your life.</p><h4 id="docker">Docker</h4><p>Using <a href="https://docs.docker.com/engine/install/ubuntu/?ref=roadtohomelab.blog">this</a> guide on the Docker site, set up the Docker repo. Then, go ahead and install Docker Engine, containerd, and Docker Compose.</p><pre><code>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</code></pre><p>Confirm Docker is indeed working.</p><pre><code>sudo docker run hello-world</code></pre><h4 id="tailscale">Tailscale</h4><p>Great, now we have an Ubuntu server running on a Linode that is running Docker. But, how are we going to get this server to see our home network? As of right now it&apos;s just a box floating out there in the void of the Internet, we can change that with Tailscale! The great thing about Tailscale is it&apos;s based on Wireguard and requires <em>no port forwarding</em> on your router.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/data-src-image-bf20d1db-0a8c-4932-8487-349ee778cd49.jpeg" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="259" height="194"></figure><p>So let&apos;s install Tailscale on the Linux box. I&apos;m taking these directions right from the official Tailscale site below.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://tailscale.com/kb/1187/install-ubuntu-2204/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Setting up Tailscale on Ubuntu 22.04 (jammy)</div><div class="kg-bookmark-description">Packages are available for x86 and ARM CPUs, in both 32-bit and 64-bit variants.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://tailscale.com/files/apple-touch-icon.png" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense"><span class="kg-bookmark-author">Tailscale</span><span class="kg-bookmark-publisher">Tailscale</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://tailscale.com/files/images/og-image.png" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense"></div></a></figure><pre><code>curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg &gt;/dev/null</code></pre><pre><code>curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list</code></pre><pre><code>sudo apt-get update
sudo apt-get install tailscale</code></pre><pre><code>sudo tailscale up</code></pre><p>This will prompt you with a link, and you&apos;ll need to click it and authenticate your new Tailscale node into your account.</p><p>Next, do the following command to make sure your Linux box sees your Tailnet.</p><pre><code class="language-shell">tailscale status</code></pre><p>You should see your pfsense box (and any other devices on your Tailnet), and next to it you should see that it&apos;s offering routes + is an exit node. </p><p>For example in the photo below, the red is the names of my Tailscale devices, blue is the OS/IP of those machines, and the orange is the public IP of my router.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-07-26-151113.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="1226" height="182" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-07-26-151113.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-07-26-151113.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-07-26-151113.png 1226w" sizes="(min-width: 720px) 720px"></figure><p>You could also check the admin console of Tailscale to confirm the VPS is represented there as well.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-09-115603.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="1920" height="100" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-09-115603.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-09-115603.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-09-115603.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-09-115603.png 1920w" sizes="(min-width: 720px) 720px"></figure><p>Well, it&apos;s looking pretty good. Next, let&apos;s ping something on our <em>local </em>network to see if our Linode box can actually see it.</p><pre><code class="language-shell">ping IPADDRESS</code></pre><p>If you get a response, like me, that&apos;s a good thing.</p><h4 id="uptime-kuma">Uptime Kuma</h4><p>Let&apos;s install Uptime Kuma now. I&apos;m taking these instructions right from the Github page here <a href="https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install?ref=roadtohomelab.blog">https://github.com/louislam/uptime-kuma/wiki/&#x1F527;-How-to-Install</a> which I&apos;d recommend you read, since there are tons of ways to install this. I&apos;ll be doing it the simple way, with via CLI.</p><pre><code class="language-bash">curl -Lo kuma_install.sh https://git.kuma.pet/install.sh &amp;&amp; sudo bash kuma_install.sh</code></pre><p>After running through the simple CLI commands our Uptime Kuma instance is accessible through </p><pre><code class="language-shell">IP_OF_VPS:3001</code></pre><p>Now, go to your Uptime Kuma instance and try adding a new monitor for a local device. Below I added my TrueNAS server with it&apos;s local IP - Uptime Kuma says it&apos;s up.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-14-103756.png" class="kg-image" alt="Monitor Your Homelab from the Cloud: Uptime Kuma on a VPS using Linode + Tailscale + pfsense" loading="lazy" width="1276" height="766" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-14-103756.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-14-103756.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-14-103756.png 1276w" sizes="(min-width: 720px) 720px"></figure><p>I tried one last thing to really be sure the connection over Tailscale is working right. Once I let the above monitor run for a bit I killed Tailscale on my VPS with the command below:</p><pre><code>tailscale down</code></pre><p>Instantly Uptime Kuma showed this device as down! Task failed successfully? </p><p>The only thing left to do is to set up Uptime Kuma&apos;s notifications for when a device goes down. I&apos;ll let you run with that on your own.</p><p>Probably one of the easiest ways to cut this guide a little bit short would be to just set up <em>this </em>Linode instance of Uptime Kuma we&apos;re about to set up to monitor another instance of Uptime Kuma on your local network... that way if your local one goes down you&apos;ll be notified. You&apos;re totally welcome to do it that way, or you can monitor your whole homelab from the cloud.</p><p>Thanks for reading.</p>]]></content:encoded></item><item><title><![CDATA[How I Host This Blog (Self-hosting Ghost Using DigitalOcean)]]></title><description><![CDATA[Interested in how I host this blog? Read up.]]></description><link>https://roadtohomelab.blog/self-hosting-ghost-using-digitalocean/</link><guid isPermaLink="false">64ce9a458465c6197b334945</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Tue, 08 Aug 2023 18:58:48 GMT</pubDate><media:content url="https://roadtohomelab.blog/content/images/2023/08/image-2-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://roadtohomelab.blog/content/images/2023/08/image-2-1.png" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)"><p>If you&apos;re anything like me, you love simply structured, beautiful, easy to consume content. This is why I love Markdown (and my fav editor, Typora) and Apple marketing. </p><p>This has felt like the main barrier for me starting a blog since I never felt like the heavy-hitters in the blog space, like Wordpress, really had the look I was going for. They were too busy, too unpolished, too complicated. I felt like it took away from the writing.</p><p>Then, I found Ghost. </p><p>Ghost is about a lot more than just blogging, and it&apos;s designed for the current landscape of content writers, creators, and consumers. You can pay them a small fee per month to use a Ghost-hosted (Ghosted, if you will) blog, or you can host it yourself for free.** All of their branding content is very thoughtful, the designs are clean, the editor is world-class, plus they have a really excellent community of creators.</p><p><em>I&apos;m not sponsored by Ghost but I love them, truly. Please for the love of God Ghost, sponsor me, I&apos;m begging you.</em></p><p>**Obviously it&apos;s not free, but Ghost doesn&apos;t charge you if you self-host. You&apos;ll still have to pay one way or another for the resources to run the blog, whether on your hardware or not. </p><h3 id="background">Background</h3><p>I understand there are plenty of tutorials showing how to do this, but I wanted to detail how <em>I</em> host my blog, in case you&apos;re interested.</p><p>Now, self-hosting isn&apos;t for everyone, and if you read this article and think &quot;nah&quot;, no shame. I still recommend Ghost. </p><p>Don&apos;t be scared, we aren&apos;t <em>really </em>self-hosting like the people at <a href="http://reddit.com/r/selfhosted?ref=roadtohomelab.blog">r/selfhosted</a> are. We won&apos;t be hosting this on our own physical hardware. We&apos;re going to be using a DigitalOcean droplet to house our shiny blog. Also, I&apos;m assuming that if you&apos;re reading this you&apos;re at least interested in the world of tech, servers, and blinking lights. If you have an interest + any experience at all, I think you can make it through this.</p><p>Ghost has a simple tutorial if you&apos;d like to just install Ghost on Ubuntu yourself, to play with (or run it in production) <a href="https://ghost.org/docs/install/ubuntu/?ref=roadtohomelab.blog">https://ghost.org/docs/install/ubuntu/</a>. But, there are inherent risks with hosting a website intended for public consumption on your local setup. That&apos;s why we&apos;ll be doing this a different way.</p><h3 id="why-digitalocean">Why DigitalOcean?</h3><p>In previous projects I&apos;ve use Linode for my VPS, which I really enjoy. But I don&apos;t discriminate when it comes to hosting providers. In fact, the reason why I&apos;m using a different provider is bigger than my normal &quot;idk cuz I feel like it&quot;. DigitalOcean&apos;s apps marketplace has a Ghost one-click option, which makes the setup of this wonderful blog platform very simple.</p><p>So first, create a DigitalOcean account if you don&apos;t have one already. You&apos;ll then be asked to create your first project. Don&apos;t over think it, just call it something related to Ghost.</p><p>Next, we need to create a <em>droplet. </em>Also known as a VPS (Virtual Private Server). Basically, a little VM that DigitalOcean hosts for us, installs our OS of choice on, and gives us the access to make changes to. </p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-104526.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="440" height="568"></figure><p>Chose your region, but instead of choosing an OS like usual we&apos;re going to go to the Marketplace and choose Ghost. This will install Ubuntu 22.04 <em>and</em> Ghost on your droplet. The DigitalOcean Marketplace is full of one-click apps and services that you can deploy really easily. I picked the $6/month machine. Here&apos;s what my deployment page looks like before I create the droplet.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-105630.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="1630" height="1833" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-08-105630.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-08-105630.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-08-105630.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-105630.png 1630w" sizes="(min-width: 720px) 720px"></figure><p>Set a root password or SSH key, change the hostname at the bottom (if you want) and click &quot;create droplet&quot;. </p><p>Now that it&apos;s done, let&apos;s access the shell of our droplet to make some changes. You can do this by ssh-ing into the IP provided on the dashboard, or you can click the ellipses on the right -&gt; &quot;access console&quot;, which gives you a web console.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-104950-1.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="1548" height="628" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-08-104950-1.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-08-104950-1.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-104950-1.png 1548w" sizes="(min-width: 720px) 720px"></figure><p>Once you&apos;re all done with that, head over to the console of your droplet, and you&apos;ll eventually be shown this:</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-123641-1.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="827" height="251" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-08-123641-1.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-123641-1.png 827w" sizes="(min-width: 720px) 720px"></figure><p>Whoops, we didn&apos;t set up our domain yet! We&apos;ll come back to Ghost in a minute.</p><h3 id="domain-name-set-up">Domain Name Set Up</h3><p>Since this is going to be a blog, you&apos;ll need a domain name. You can do this through many different platforms like Name, Namecheap, etc. Go find a domain you want, or use one you already have.</p><p>The basics of what we&apos;ll be doing is simple, and applies to pretty much any site you&apos;ll ever host. You&apos;re going to need to: </p><ol><li>make an A record which directs your domain name, verycoolblog.com, to the IP of the droplet you just created, hosting your very cool blog.</li><li>make a CNAME record which <em>re-</em>directs traffic pointed at www.verycoolblog.com over to your actual domain name which is verycoolblog.com.</li></ol><p>Here&apos;s are my DNS records for this blog, which you can match other than the IP of your droplet IP.</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-115816.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="1916" height="550" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-08-115816.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-08-115816.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-08-115816.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-115816.png 1916w" sizes="(min-width: 720px) 720px"></figure><p>DNS takes some time to propagate, so if this doesn&apos;t work instantly don&apos;t stress it, we can continue the config by accessing Ghost directly via IP.</p><p>Back to the console. </p><h3 id="ghost-config">Ghost Config</h3><p>Now, go ahead and click Enter on the console to jump into the config. It&apos;ll download and install Ghost, so you&apos;ll need to wait a little bit. </p><p>You&apos;ll then be asked for your &quot;blog URL&quot;, which will be the domain we set up earlier. The process will then set up SSL, and ask you for an email to associate with it. Finally, it&apos;ll start up Ghost.</p><p>If everything goes smoothly you should be able to go to <strong>http://domain/ghost</strong> in a web browser and get to a Ghost setup page.</p><p><em>If things did not go smoothly, that&apos;s okay too. Go to <strong>http://dropletIP/ghost </strong>to get around the domain thing for now, I&apos;ve got some troubleshooting steps at the end of this post. We&apos;ll get you sorted.</em></p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-130140.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="1265" height="1718" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-08-130140.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-08-130140.png 1000w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-130140.png 1265w" sizes="(min-width: 720px) 720px"></figure><p>At this stage, you&apos;re ready to login and configure your Ghost instance. That wasn&apos;t too bad! Have fun playing around with your new blog.</p><p>Thanks for reading, if I missed anything please let me know!</p><p></p><h3 id="troubleshooting">Troubleshooting</h3><p>I ran into an issue that I thought others might run into as well. When Ghost installs via the CLI one of two things can happen here, either:</p><ol><li>no errors on the CLI</li><li>something broke and you see something like this:</li></ol><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-125250-1.png" class="kg-image" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)" loading="lazy" width="808" height="159" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-08-125250-1.png 600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-08-125250-1.png 808w" sizes="(min-width: 720px) 720px"></figure><p>In my case, this was because I had typed the Ghost URL incorrectly. I fixed this with these commands: </p><figure class="kg-card kg-code-card"><pre><code class="language-shell">sudo -i -u ghost-mgr</code></pre><figcaption><p><span style="white-space: pre-wrap;">this makes you the ghost mgr user</span></p></figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-shell">cd var/www/ghost</code></pre><figcaption><p><span style="white-space: pre-wrap;">change directories to where ghost is installed</span></p></figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-shell">ghost config url http://domain</code></pre><figcaption><p><span style="white-space: pre-wrap;">reinitiate the ghost URL</span></p></figcaption></figure><p>Here&apos;s a solid blog that gives some troubleshooting steps for getting Ghost started.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gloathost.com/blog/how-to-update-the-url-of-your-self-hosted-ghost-site/?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to update the URL of your self-hosted Ghost site</div><div class="kg-bookmark-description">Five quick steps to change your Ghost site&#x2019;s URL.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://gloathost.com/content/images/size/w256h256/2021/08/favicon.png" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)"><span class="kg-bookmark-author">Gloat &#xB7; Start a paid publication</span><span class="kg-bookmark-publisher">Dan Rowden</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://gloathost.com/content/images/2021/08/twitter-ghost-url.png" alt="How I Host This Blog (Self-hosting Ghost Using DigitalOcean)"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager]]></title><description><![CDATA[How to use Pi-Hole to easy-to-remember DNS names for your local services.]]></description><link>https://roadtohomelab.blog/local-dns-for-docker-containers-using-pi-hole-portainer-nginx-proxy-manager/</link><guid isPermaLink="false">64ce9aea8465c6197b334954</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Dustin Groh]]></dc:creator><pubDate>Sat, 05 Aug 2023 19:04:07 GMT</pubDate><media:content url="https://roadtohomelab.blog/content/images/2023/08/98879880-6796-11ea-8a07-a3f907697ec6.png" medium="image"/><content:encoded><![CDATA[<img src="https://roadtohomelab.blog/content/images/2023/08/98879880-6796-11ea-8a07-a3f907697ec6.png" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager"><p>Like most people running Docker, I gathered quite a few containers running on my very professional Ubuntu server (it&apos;s an 8 year old Lenovo laptop sitting in my garage).</p><p>Because of this, I started to have a problem.</p><p>New containers I deploy want to use ports that I already have allocated on my host machine. This begged the question, <em>how can I run multiple containers on one host that require the use of the same ports?</em></p><p>Well, enter <a href="https://nginxproxymanager.com/?ref=roadtohomelab.blog">Nginx Proxy Manager</a> (NPM). </p><p>It&#x2019;s a reverse proxy that has a clean UI, is easy to use, and runs in a container. The reverse proxy will help us by being the recipient service of our requests, and will forward them to the right container depending on the subdomain name entered. For example, instead of typing in <strong>portainerIP:port </strong>to get to your Unifi Controller you could type <strong>unifi.domain.com</strong> which would forward your request to the Unifi Controller container. Moreover, this means you could run <em>another </em>container on the same Docker host that requires the same port, but because you&apos;ll be proxying requests to through NPM it&#x2019;ll work just the same!</p><h3 id="ways-to-use-npm">Ways to use NPM</h3><p>Now, there are other great tutorials out there to use Nginx Proxy Manager to safely get your services exposed to the outside world using port forwarding at your router however, I&#x2019;m not interested in getting access to these services outside of my home network that right now. So, for my example, I&#x2019;ll be using pihole for my local DNS.</p><h2 id="pi-hole">Pi-hole</h2><p><em>This guide assumes you have pihole set up as your DNS server and Docker + Portainer installed already.</em></p><h3 id="a-records">A Records</h3><p>First step is to come up with a list of A records for pihole to know where to send traffic when a subdomain is queried. Since this is exclusively local traffic and we&#x2019;re not worried about SSL/TLS (if you are, watch this <a href="https://www.youtube.com/watch?v=qlcVx-k-02E&amp;t=606s&amp;ref=roadtohomelab.blog">video</a>) you can pick any domain name you want. </p><p>For this guide I&#x2019;ll be using the Unifi Controller container as our example. Here&#x2019;s an example of the kind of A record we need:</p><pre><code>portainer.domain.com &#x2192; 10.x.x.x</code></pre><p><em>^IP address of Docker host that will run NPM</em></p><figure class="kg-card kg-image-card"><img src="https://theroadtohomelab.files.wordpress.com/2023/07/screenshot-2023-07-21-at-11.04.50-am.png?w=1024" class="kg-image" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager" loading="lazy" width="1024" height="522"></figure><h3 id="cname-records">CNAME Records</h3><p>Next, we&#x2019;re going to make list of our services (containers, in this case) that we&#x2019;d like to point to the A record we just made. Here&#x2019;s an example:</p><pre><code>unifi.domain.com &#x2192; portainer.domain.com</code></pre><figure class="kg-card kg-image-card"><img src="https://theroadtohomelab.files.wordpress.com/2023/07/screenshot-2023-07-21-at-11.05.07-am.png?w=1024" class="kg-image" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager" loading="lazy" width="1022" height="453"></figure><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">The reason we do a CNAME record here instead of an A record is because these are <i><em class="italic" style="white-space: pre-wrap;">services </em></i>running on Portainer. The idea here is if we ever need to update the IP address of Portainer we only need to update one A record since the CNAME records of the containers are pointing to the domain <b><strong style="white-space: pre-wrap;">portainer.domain.com</strong></b> and not the IP itself.&#x200B;</div></div><p>Cool! Once all your services are all in pihole, we&#x2019;re good to head over to Docker, install Nginx Proxy Manager, and get logged in. I&#x2019;m not going to go into detail about the Nginx install process, other people have done a better job of that : </p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/How-to-setup-the-Nginx-Proxy-Manager-example?ref=roadtohomelab.blog"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to setup the Nginx Proxy Manager Docker example</div><div class="kg-bookmark-description">Learn how to setup and install the Nginx Proxy Manager from Docker Hub. This simple tool greatly simplifies the configuration of Nginx reverse proxy servers, asset caching, host redirecting and SSL&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.theserverside.com/apple-touch-icon-144x144.png" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager"><span class="kg-bookmark-author">TheServerSide.com</span><span class="kg-bookmark-publisher">Cameron McKenzie</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.ttgtmedia.com/rms/amp/AMPdefaultImage.jpg" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager"></div></a></figure><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/P3imFC7GSr0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Nginx Proxy Manager - How-To Installation and Configuration"></iframe></figure><h2 id="docker-portainer">Docker + Portainer</h2><p>Once you have Nginx Proxy Manager installed you&#x2019;ll need to do a few important steps.</p><p>Let&#x2019;s think about this logically - we made some changes on pihole, but what exactly is the impact of the changes we made?</p><ul><li>Right now you can still access your containers via the host machine IP + port for the container.</li><li>Using a subdomain + domain like <strong>unifi.domain.com</strong> doesn&#x2019;t get us to the Unifi Controller container, but if our DNS is working right it should be pointing us to the <em>host</em> machine for the service.</li></ul><p>This means not only is Nginx <em>not </em>proxying the requests to those services, but the DNS entries we added aren&#x2019;t really working. You&#x2019;re probably wondering &#x201C;does this guy even know what he&#x2019;s doing?&#x201D;</p><p>And don&#x2019;t worry, the answer is kind of.</p><h3 id="container-config">Container config</h3><p>How do we make it so that we can only get to those services via Nginx?</p><p>First, we need to <strong>take note of and</strong> <strong>remove </strong>the port designations on the containers we&#x2019;re working with (it&#x2019;s a good idea to save these in case you need to roll back) so that they aren&#x2019;t accessible directly.</p><figure class="kg-card kg-image-card"><img src="https://theroadtohomelab.files.wordpress.com/2023/07/screenshot-2023-07-18-at-9.58.03-pm.png?w=1024" class="kg-image" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager" loading="lazy" width="1018" height="109"></figure><p>Next, let&#x2019;s make sure the containers we&#x2019;re working with are on the same Portainer network as Nginx.</p><figure class="kg-card kg-image-card"><img src="https://theroadtohomelab.files.wordpress.com/2023/07/screenshot-2023-07-21-at-11.06.00-am.png?w=1024" class="kg-image" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager" loading="lazy" width="1024" height="192"></figure><p>That should be it! Let&#x2019;s head over to NPM.</p><h2 id="nginx-proxy-manager">Nginx Proxy Manager</h2><p>In Proxy Hosts, add a Proxy Host. This is where we tell Nginx <em>which container</em> to send traffic to depending on the DNS name entered. In a correctly configured state it should send <strong>unifi.domain.com</strong> traffic to the Unifi Controller container (duh) and <strong>uptimekuma.domain.com</strong> traffic to the Uptime Kuma container (duh again).</p><p>We want to create a record for <strong>unifi.domain.com</strong> that forwards the traffic to the port that Unifi Controller requires to get to the webpage, in the case of the Unifi Controller it&#x2019;s port 3000, like the screenshot below. We also can specify just the container name in the &#x201C;hostname&#x201D; section.</p><figure class="kg-card kg-image-card"><img src="https://theroadtohomelab.files.wordpress.com/2023/07/screenshot-2023-07-21-at-11.07.38-am.png?w=930" class="kg-image" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager" loading="lazy" width="929" height="1023"></figure><p>That should do it. Now try <strong>unifi.domain.com</strong>!</p><figure class="kg-card kg-image-card"><img src="https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-05-at-3.02.58-PM.png" class="kg-image" alt="Local DNS for Docker Containers using Pi-hole + Portainer + Nginx Proxy Manager" loading="lazy" width="2000" height="1528" srcset="https://roadtohomelab.blog/content/images/size/w600/2023/08/Screenshot-2023-08-05-at-3.02.58-PM.png 600w, https://roadtohomelab.blog/content/images/size/w1000/2023/08/Screenshot-2023-08-05-at-3.02.58-PM.png 1000w, https://roadtohomelab.blog/content/images/size/w1600/2023/08/Screenshot-2023-08-05-at-3.02.58-PM.png 1600w, https://roadtohomelab.blog/content/images/2023/08/Screenshot-2023-08-05-at-3.02.58-PM.png 2212w" sizes="(min-width: 720px) 720px"></figure><p>Pretty slick. Let me know if you have any questions, issues, or ways to make this better!</p>]]></content:encoded></item></channel></rss>