<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://sullie.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sullie.dev/" rel="alternate" type="text/html" /><updated>2026-07-06T12:22:59+00:00</updated><id>https://sullie.dev/feed.xml</id><title type="html">Eoghan Sullivan — IT, Networking &amp;amp; Infrastructure</title><subtitle>Homelab-driven IT portfolio. Networking, server administration, and security fundamentals — certification roadmap and hands-on build/break/fix writeups.</subtitle><entry><title type="html">Why I Added Grafana, Prometheus, and Loki to the Homelab</title><link href="https://sullie.dev/writeups/server-monitoring-observability/" rel="alternate" type="text/html" title="Why I Added Grafana, Prometheus, and Loki to the Homelab" /><published>2026-07-03T00:00:00+00:00</published><updated>2026-07-03T00:00:00+00:00</updated><id>https://sullie.dev/writeups/server-monitoring-observability</id><content type="html" xml:base="https://sullie.dev/writeups/server-monitoring-observability/"><![CDATA[<h2 id="what-this-is">What this is</h2>

<p>A writeup on the reasoning behind adding a full observability stack — Grafana,
Prometheus, Loki, and Promtail — to my Docker/Dockge-based home server, on top
of the security stack (Wazuh, Suricata) already running there.</p>

<h2 id="the-gap">The gap</h2>

<p>Wazuh and Suricata are good at telling me <em>something is wrong</em> — an alert fires,
a rule triggers, an IOC matches. What they’re not built for is answering the
everyday operational question: <em>is the server itself healthy right now?</em> CPU,
memory, disk, container uptime, log volume over time. Without that, I was flying
blind on the infrastructure underneath my own detection tools.</p>

<p>That gap became obvious the hard way during a full-disk incident that crashed
OpenSearch and took Wazuh down with it. There was no dashboard warning me disk
usage was climbing toward the edge — I only found out when things had already
broken. That incident was the direct trigger for this addition.</p>

<div class="callout"><strong>Lesson:</strong> a SIEM without infrastructure observability underneath it is a blind spot, not a safety net.</div>

<h2 id="why-this-stack-specifically">Why this stack specifically</h2>

<ul>
  <li><strong>Prometheus</strong> — pulls time-series metrics (CPU, memory, disk, container
health) on a scrape interval, giving me a queryable history instead of just
point-in-time snapshots.</li>
  <li><strong>Grafana</strong> — turns those metrics (and Loki’s logs) into dashboards I can
actually glance at, rather than digging through raw numbers or <code class="language-plaintext highlighter-rouge">docker stats</code>.</li>
  <li><strong>Loki + Promtail</strong> — centralizes container and system logs so I’m not SSH-ing
in and <code class="language-plaintext highlighter-rouge">docker logs</code>-ing services one at a time when something misbehaves.</li>
</ul>

<p>Together they cover the layer Wazuh doesn’t: system and container-level health,
trended over time, in one place.</p>

<h2 id="why-it-matters-for-the-portfolio">Why it matters for the portfolio</h2>

<p>Beyond the practical need, this stack rounds out the homelab as a portfolio
piece. It’s the difference between a project that says “I can detect security
events” and one that says “I can also run and monitor the infrastructure those
tools depend on” — which maps more directly onto GRC and Security Analyst roles
where uptime, logging discipline, and operational visibility are as much the job
as alert triage.</p>

<h2 id="result">Result</h2>

<p>Grafana, Prometheus, Loki, and Promtail now sit alongside Wazuh, Suricata,
Cloudflare Tunnel, n8n, and Authentik in the Docker/Dockge stack — closing the
visibility gap that caused the disk-crash incident in the first place.</p>]]></content><author><name></name></author><category term="Homelab" /><category term="Observability" /><category term="Docker" /><category term="Grafana" /><category term="Prometheus" /><category term="Loki" /><summary type="html"><![CDATA[Adding a metrics and logging stack alongside Wazuh and Suricata, and why visibility matters as much as detection.]]></summary></entry><entry><title type="html">Test writeup</title><link href="https://sullie.dev/writeups/test-writeup/" rel="alternate" type="text/html" title="Test writeup" /><published>2026-07-03T00:00:00+00:00</published><updated>2026-07-03T00:00:00+00:00</updated><id>https://sullie.dev/writeups/test-writeup</id><content type="html" xml:base="https://sullie.dev/writeups/test-writeup/"><![CDATA[<h2 id="what-this-is">What this is</h2>

<p>This is a temporary test writeup. Its only purpose is to confirm that posts written in Markdown are picked up by Jekyll, listed on the writeups page, and rendered with the same post layout as the preview design.</p>

<div class="callout"><strong>Test note:</strong> if you can see this styled callout on the post page, the custom HTML helpers inside Markdown are working too.</div>

<h2 id="markdown-checks">Markdown checks</h2>

<p>This section checks the normal content you will probably use in real writeups:</p>

<ul>
  <li>Bullet lists</li>
  <li><strong>Bold text</strong></li>
  <li><em>Italic text</em></li>
  <li>Inline code like <code class="language-plaintext highlighter-rouge">docker ps</code></li>
  <li>Links, such as <a href="https://github.com/o-inn">GitHub</a></li>
</ul>

<h2 id="code-block">Code block</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker ps
<span class="nb">df</span> <span class="nt">-h</span>
bundle <span class="nb">exec </span>jekyll serve
</code></pre></div></div>

<h2 id="result">Result</h2>

<p>If this page appears at <code class="language-plaintext highlighter-rouge">/writeups/test-writeup/</code>, the Markdown-to-post workflow is working.</p>]]></content><author><name></name></author><category term="Test" /><category term="Markdown" /><category term="Jekyll" /><summary type="html"><![CDATA[A temporary test post to confirm Markdown writeups render correctly through the Jekyll layout.]]></summary></entry></feed>