<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Express on homelab</title>
    <link>https://homelab.nbkelley.com/tags/express/</link>
    <description>Recent content in Express on homelab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 01 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://homelab.nbkelley.com/tags/express/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Homelab Dashboard</title>
      <link>https://homelab.nbkelley.com/docs/services/homelab-dashboard/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/homelab-dashboard/</guid>
      <description>&lt;h1 id=&#34;homelab-dashboard&#34;&gt;Homelab Dashboard&lt;a class=&#34;anchor&#34; href=&#34;#homelab-dashboard&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A Node.js + Express dashboard is deployed at &lt;code&gt;https://status.nbkelley.com&lt;/code&gt;, serving homelab monitoring data. All API calls are server-side — no internal IPs, credentials, or raw API responses reach the browser.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;a class=&#34;anchor&#34; href=&#34;#deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Public URL&lt;/td&gt;&#xA;          &lt;td&gt;&lt;a href=&#34;https://status.nbkelley.com&#34;&gt;https://status.nbkelley.com&lt;/a&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Host&lt;/td&gt;&#xA;          &lt;td&gt;proxy VM (192.168.1.222)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Port&lt;/td&gt;&#xA;          &lt;td&gt;3002&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Runtime&lt;/td&gt;&#xA;          &lt;td&gt;Node.js + Express, Docker container&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;compose.yaml location&lt;/td&gt;&#xA;          &lt;td&gt;/home/iluvatar/compose.yaml on proxy VM&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;App directory&lt;/td&gt;&#xA;          &lt;td&gt;/opt/homelab-dashboard/ on proxy VM&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Routing&lt;/td&gt;&#xA;          &lt;td&gt;Cloudflare Tunnel → 127.0.0.1:3002&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;file-structure&#34;&gt;File Structure&lt;a class=&#34;anchor&#34; href=&#34;#file-structure&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/opt/homelab-dashboard/&#xA;  server.js         ← Express app, all API logic&#xA;  package.json&#xA;  package-lock.json&#xA;  dockerfile&#xA;  start.sh&#xA;  node_modules/&#xA;  public/&#xA;    index.html&#xA;    styles.css&#xA;    app.js          ← frontend render engine&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;composeyaml-entry&#34;&gt;compose.yaml Entry&lt;a class=&#34;anchor&#34; href=&#34;#composeyaml-entry&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;homelab-dashboard&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/opt/homelab-dashboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;homelab-dashboard&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;network_mode&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;host&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;PORT=3002&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;network_mode: host&lt;/code&gt; means the app binds directly to host port 3002. The &lt;code&gt;ports:&lt;/code&gt; mapping is ignored when using host networking.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
