Overview
I built my home lab to move beyond coursework and gain practical experience operating real systems. It gives me a controlled environment where I can deploy services, configure networks, troubleshoot problems, monitor system health, automate recurring tasks, and test security controls.
The lab is centered around a physical Ubuntu Server running Docker services for monitoring, infrastructure management, DNS filtering, media hosting, and system visibility. I also integrate the environment with AWS for centralized logging and Cloud Operations practice.
Lab Architecture
The environment combines local infrastructure, containerized services, custom monitoring, secure remote access, and AWS logging. This architecture gives me experience working across Linux, networking, containers, security, automation, and cloud services in one environment.
Home lab architecture showing the Ubuntu server, Docker services, monitoring tools, local network, security controls, and AWS CloudWatch integration.
Infrastructure & Security
- Built a dedicated Ubuntu Server using repurposed physical hardware.
- Configured local network connectivity and a static IP for reliable server access.
- Implemented SSH key authentication for secure remote administration.
- Configured UFW firewall rules to limit unnecessary network exposure.
- Installed and configured Fail2Ban to monitor and block suspicious authentication attempts.
- Implemented Tailscale for encrypted remote access to the lab.
- Perform ongoing Linux administration, updates, service management, permissions troubleshooting, and network troubleshooting.
Docker Environment
Docker allows me to run and manage multiple services on one physical server while keeping each application isolated and easier to maintain. Docker Compose is used to define and manage the environment.
- Homepage — Central dashboard for lab services and infrastructure visibility.
- Portainer — Web-based management and visibility for Docker containers.
- Netdata — Detailed real-time system and infrastructure monitoring.
- Pi-hole — Network-wide DNS filtering and visibility into DNS activity.
- Jellyfin — Self-hosted media server used to gain additional experience operating containerized applications.
Monitoring & Automation
Monitoring has become one of the main areas of focus in my lab. Instead of only deploying applications, I want to understand how the environment behaves when it is running and how to identify problems before they become larger outages.
- Integrated Linux system logs with Amazon CloudWatch Logs.
- Configured the CloudWatch Agent to collect and send system logs securely to AWS.
- Developed a Python operations monitor to check CPU, memory, disk, Docker container status, and application availability.
- Added health checks and automated reports to provide a quick view of overall system status.
- Configured scheduled execution of monitoring tasks using systemd.
- Use Netdata for detailed real-time visibility into server performance, processes, networking, and disk activity.
Python Operations Dashboard
I built a custom Python monitoring application to provide a lightweight operational view of the home lab. The dashboard summarizes the information I care about most during routine checks.
Custom Python operations dashboard showing system utilization, Docker status, monitored containers, and service health.
Netdata Real-Time Monitoring
While my Python dashboard provides a quick operational summary, Netdata gives me deeper visibility into system performance and helps with troubleshooting when I need more detailed metrics.
Netdata provides detailed real-time monitoring of system performance, resource utilization, processes, network activity, and disk I/O.
AWS Integration
The lab is also connected to my AWS environment. This allows me to practice hybrid monitoring concepts and work with centralized log collection outside of the local server.
- Installed and configured the Amazon CloudWatch Agent on Ubuntu.
- Send Linux authentication and system logs to Amazon CloudWatch Logs.
- Configured IAM permissions required for secure CloudWatch access.
- Troubleshot agent configuration, credentials, DNS, permissions, and log delivery issues.
- Review log volume, retention, and CloudWatch cost considerations.
What I've Learned
- Building a service is only the first step. Monitoring, troubleshooting, maintenance, and documentation are just as important.
- Linux permissions, DNS, routing, authentication, and container networking frequently overlap when troubleshooting system issues.
- Simple automation can remove repetitive operational checks and make infrastructure problems easier to identify.
- Centralized logging makes troubleshooting easier because system activity remains available even when I am away from the local environment.
- Running multiple services on one host requires attention to ports, dependencies, resource utilization, and security.
Current Focus
- Improving Python monitoring and automation.
- Expanding infrastructure monitoring and alerting.
- Strengthening Linux administration and troubleshooting skills.
- Continuing security hardening of the environment.
- Improving documentation and architecture diagrams.
- Expanding Docker services while keeping the environment manageable and reliable.
What's Next
My goal is to continue evolving the lab into a more production-style environment. Future improvements will focus on alerting, backup and recovery, additional automation, centralized monitoring, cloud integration, and operational practices that reflect the work performed in Cloud Operations environments.