Northern Virginia Personal portfolio

IT support.Linux infrastructure.Automation.

I’m Blessings. I build and document a Linux homelab, from the services it runs to the monitoring and troubleshooting that keep it understandable.

01 Selected work

One lab. The whole picture.

Inside the project
Compose stacks
5
Service definitions
49
Architecture decisions
24
Runbooks
23

Operations repository inventory · last updated September 2026Configuration and documentation counts, not live service status. The public repository contains selected work.

02 How I work

From configuration to understanding.

01 / OPERATE

Make systems repeatable.

Define services in Compose, keep configuration in Git, and validate changes before they reach a host.

Linux · Docker · GitHub Actions

Explore the workflow

02 / PROTECT

Be deliberate about access.

Route internal apps through HTTPS and use central identity for supported services. Keep credentials outside tracked configuration.

Caddy · Authentik · OIDC

See the access model

03 / UNDERSTAND

Leave a useful record.

Use metrics and logs to investigate problems, then document the cause, recovery, and work still outstanding.

Prometheus · Grafana · Loki

Read an incident example

03 Under the hood

A closer look at the homelab.

Browse the repository

A hands-on environment for learning how services fit together. The useful part is more than getting an app running: it is understanding its configuration, access, and failure modes.

01 / SYSTEMS

Configuration with a paper trail.

Two Proxmox VE hosts provide the foundation, with ZFS storage and separate virtual machines for apps and media. Docker Compose describes the services, while Git records the configuration changes.

The public repository’s GitHub Actions workflow validates each Compose stack using example environment files. It checks configuration on pushes and pull requests; deployment remains a separate step.

A concrete practice: example environment files make configuration checks possible without putting real credentials in the repository.

02 / ACCESS

Internal services.
Intentional access.

The apps stack is documented as LAN-only. Caddy routes HTTPS requests to internal services and obtains certificates through the DNS-01 challenge. Certificate issuance does not require opening inbound internet ports.

LAN clients
CaddyHTTPS
Internal apps
LAN clients reach internal apps through Caddy. Authentik provides OIDC sign-in for Grafana and Gitea; other services retain their own access controls.

03 / OPERATIONS

See the problem.
Document the lesson.

Prometheus collects host and container metrics; Grafana presents dashboards. Alloy ships container logs to Loki. Alert rules cover conditions such as unavailable targets, resource pressure, and expiring TLS certificates.

Incident note / July 12, 2026

A host address changed; monitoring lost its target. The postmortem records a DHCP address change that left Prometheus scraping the old address. Updating the references restored metrics. The documented permanent fix, a DHCP reservation, was still pending in that write-up.

Read the postmortem

04 Background

Learning, with something
to show for it.

My focus is Linux infrastructure, security, and automation. The homelab is where I put that learning into practice and document what I find.

github.com/bmoyo413
COMPLETED
CompTIA Linux+
CompTIA Security+
IN PROGRESS
Bachelor's degree in Computer SciencePursuing
STUDYING
CompTIA Cloud+Certification in progress
TOOLKIT
RHEL · Bash · GitServiceNow · Jira · Nmap · Wireshark

Open to work / Northern Virginia

Let’s talk about the work.

Interested in IT support, Linux systems, and infrastructure opportunities. Email is the best place to start.