Post

Homelab Is Still Running After Missle Shot

Homelab Is Still Running After Missle Shot

Homelab Is Still Running After Missile Shot

Introduction

A missile detonated only thirty metres from a home in Ukraine, shattering windows and rattling the foundations of a residential building. Yet the personal server – an Intel i5‑6600T with 16 GB RAM and a modest Nvidia P102‑100 GPU – kept humming, still serving containers, still crunching AI models, still generating output from the Qwen 3.8 27B model. The incident sparked a flood of Reddit comments ranging from “Stay safe brother” to jokes about Ubuntu’s bullet‑proof nature.

For DevOps engineers and seasoned sysadmins, this anecdote is more than a viral moment; it is a vivid illustration of why homelab resilience, security hardening, and threat prevention matter. A homelab is often the testing ground for infrastructure concepts that later migrate to production environments. When a physical shock cannot bring it down, the real question becomes: How do we design a self‑hosted environment that survives not only hardware failures but also targeted attacks, misconfigurations, and emergent threats?

In this guide we will walk through a systematic approach to building a homelab that remains operational under duress. The focus is on three pillars:

  1. Security hardening – reducing the attack surface, enforcing least‑privilege access, and applying defense‑in‑depth controls.
  2. Access control – managing who can interact with which services, using authentication, authorization, and network segmentation.
  3. Threat prevention – detecting anomalies, isolating compromised components, and planning for rapid recovery.

Readers will learn how to evaluate hardware choices, select appropriate software stacks, implement hardened Docker configurations, and integrate monitoring and backup strategies. By the end, you will have a clear roadmap for turning a fragile testbed into a robust, self‑hosted platform that can weather both literal and figurative “missile” events.


Understanding the Topic

What Is a Homelab?

A homelab is a private, self‑hosted environment where individuals or small teams experiment with servers, networking, storage, and automation. It typically runs on commodity hardware or repurposed equipment, sits behind a home router, and provides services such as web servers, CI/CD pipelines, virtualization platforms, and AI inference engines.

Historical Context

The concept of a personal lab dates back to the early 2000s when hobbyists used old PCs to run Linux distributions for learning networking and system administration. With the rise of virtualization (VMware ESXi, VirtualBox) and containerization (Docker, Podman), homelabs evolved into sophisticated testbeds capable of running full‑stack applications.

Key Features and Capabilities

  • Isolation – Containers or VMs separate workloads, preventing a compromised service from affecting others.
  • Scalability – Adding nodes or expanding resources can be done incrementally.
  • Automation – Infrastructure as Code (IaC) tools like Ansible, Terraform, or Pulumi enable repeatable deployments.
  • Learning – Safe spaces to practice advanced topics such as Kubernetes, service meshes, and AI model serving.

Pros and Cons

AdvantagesDisadvantages
Full control over software stackLimited physical redundancy compared to data‑center gear
Low cost when reusing hardwarePower and cooling constraints at scale
Immediate feedback loop for experimentationPotential exposure to home network vulnerabilities
Community‑driven tutorials and open‑source toolsRequires disciplined security practices to avoid lateral movement

Modern homelabs increasingly adopt the same security posture as enterprise environments: network segmentation, zero‑trust access, and automated patch management. Emerging trends include:

  • Edge AI – Running inference models locally for privacy‑preserving applications.
  • Secure Boot and TPM integration – Leveraging hardware roots of trust to verify firmware integrity.
  • Infrastructure as Code for homelab – Treating the lab as a production environment, using GitOps pipelines.

Comparison to Alternatives

AlternativeTypical Use‑CaseSecurity Posture
Cloud‑only labs (e.g., AWS Free Tier)Quick prototyping, no hardware investmentShared responsibility model; relies on provider security
Dedicated lab appliances (e.g., OPNsense box)Network‑focused testingHardened OS, but limited flexibility
Full‑scale data‑centerEnterprise workloadsHighest redundancy, but overkill for personal testing

For most hobbyists and small teams, a well‑hardened homelab offers the sweet spot between flexibility and security.

Real‑World Applications and Success Stories

  • Home‑grown CI/CD – Companies like GitLab and Jenkins have origins in personal labs that later scaled to enterprise platforms.
  • Local AI inference – Researchers use GPU‑enabled homelabs to serve models like Qwen 3.8 27B without exposing proprietary data to external APIs.
  • Network security research – Security analysts simulate attack vectors on isolated lab networks to develop detection rules before deploying to production firewalls.

Prerequisites

System Requirements

ComponentMinimum SpecificationRecommended Specification
CPU4‑core x86_64 (e.g., Intel i5‑6600T)6‑core or newer (e.g., AMD Ryzen 5 5600X)
RAM8 GB16 GB or more
Storage250 GB SSD500 GB NVMe SSD (fast I/O for containers)
GPUOptional for AI workloadsNvidia P102‑100 or equivalent (compute capability 6.1+)
NetworkGigabit Ethernet2.5 GbE or 10 GbE for high‑throughput services

Required Software

  • Operating System – Ubuntu 22.04 LTS or Debian 12 (stable).
  • Docker Engine – Version 24.x or later.
  • Docker Compose – Plugin version 2.20 or later.
  • UFW – Uncomplicated Firewall for host‑level filtering.
  • Fail2Ban – Intrusion prevention for brute‑force detection.
  • Prometheus + Grafana – Optional monitoring stack.

Network and Security Considerations

  1. Static IP Assignment – Reserve a DHCP lease for the lab host to simplify firewall rules.
  2. Port Exposure – Only expose necessary ports to the LAN; keep external ports closed unless a reverse proxy with TLS termination is required.
  3. DNS – Use a local DNS server (e.g., Pi‑hole) to resolve internal service names, avoiding reliance on public DNS that could be hijacked.

User Permissions and Access Levels

  • Root Access – Reserved for system‑level tasks only; daily operations should be performed by a non‑root user with sudo privileges.
  • Docker Group – Add trusted users to the docker group to allow container management without sudo.
  • RBAC in Portainer – Implement role‑based access control to restrict who can start, stop, or modify containers.

Pre‑Installation Checklist

  • Verify BIOS settings: enable virtualization (VT‑x/AMD‑V), disable legacy boot if using UEFI.
  • Update OS packages: sudo apt update && sudo apt upgrade -y.
  • Install Docker Engine following the official convenience script or repository method.
  • Configure UFW to allow only required ports (e.g., 22/tcp for SSH, 80/tcp and 443/tcp for web services).
  • Enable Fail2Ban with a custom jail for SSH brute‑force protection.

Installation & Setup

Below is a step‑by‑step guide to install Docker, configure a hardened container runtime, and deploy a sample AI inference service that survived the missile‑adjacent incident.

1. Install Docker Engine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Update package index
sudo apt-get update

# Install prerequisite packages
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Set up the stable repository
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Refresh the apt cache
sudo apt-get update

# Install Docker Engine and CLI
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# Verify installation
docker version

Why this matters: Using the official Docker repository ensures you receive security‑patched binaries and eliminates the risk of outdated packages that may contain known vulnerabilities.

2. Add Non‑Root User to Docker Group

1
2
3
4
5
6
7
8
# Create a dedicated user for lab operations
sudo adduser --disabled-password --gecos "" homelab

# Add the user to the docker group
sudo usermod -aG docker homelab

# Apply group changes without logout
newgrp docker

Security note: Membership in the docker group grants near‑root privileges. Restrict this group to trusted users only and consider using Docker’s user namespaces for added isolation.

3. Enable Docker Daemon Security Options

Create or edit /etc/docker/daemon.json with the following hardened configuration:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "exec-opts": ["no-new-privileges"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "oom-kill-disable": false,
  "pids-rlimit": 1024,
  "userns-remap": "default",
  "icc": false,
  "kernel-memory": "",
  "default-ulimit": {
    "core": 0,
    "nofile": 1024,
    "nproc": 1024,
    "rtc": 1000
  },
  "live-restore": true,
  "disable-legacy-cadvisor": true,
  "security-opt": [
    "no-new-privileges",
    "label=disable"
  ],
  "containerd": {
    "default-runtime": "runc",
    "shim-cgroup-config": {
      "namespaces": [
        "pid",
        "network",
        "ipc",
        "uts",
        "cgroup"
      ]
    }
  }
}

Explanation:

  • no-new-privileges prevents a container from gaining extra capabilities.
  • userns-remap isolates container UIDs from the host, mitigating privilege escalation.
  • icc: false disables inter‑container communication unless explicitly allowed.

After editing, reload the daemon:

1
sudo systemctl restart docker

4. Deploy a Sample AI Inference Service

The Reddit post mentioned a Qwen 3.8 27B model running on the lab server. We will use the official vLLM image, which provides efficient inference for large language models.

4.1 Pull the Image

1
docker pull ghcr.io/vllm-project/vllm:0.4.0

4.2 Create a Configuration Directory

1
mkdir -p $HOME/vllm/config

4.3 Write a Runtime Configuration File

Create $HOME/vllm/config/model_config.yaml with the following content:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
model:
  name: Qwen/Qwen-3.8-27B-Chat
  download_dir: /models/Qwen-3.8-27B-Chat
  tensor_parallel_size: 1

generation:
  max_new_tokens: 256
  temperature: 0.7
  top_p: 0.9
  repetition_penalty: 1.1

serving:
  enable_http: true
  http_port: 8000
  host: 0.0.0.0

Tip: Adjust tensor_parallel_size if you later add additional GPUs for multi‑node inference.

4.4 Run the Container with Hardening Flags

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
docker run -d \
  --name vllm-inference \
  --restart unless-stopped \
  --user $(id -u):$(id -g) \
  --userns-remap=default \
  --security-opt=no-new-privileges \
  --cap-drop=ALL \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=64m \
  -e MODEL_PATH=/models/Qwen-3.8-27B-Chat \
  -e CONFIG_PATH=/config/model_config.yaml \
  -p 8000:8000 \
  -v $HOME/vllm/config:/config:ro \
  -v $HOME/vllm/models:/models:ro \
  ghcr.io/vllm-project/vllm:0.4.0 \
  serve \
    --model $MODEL_PATH \
    --tensor-parallel-size 1 \
    --dtype float16 \
    --host 0.0.0.0 \
    --port 8000 \
    --config $CONFIG_PATH

Key Hardening Elements:

  • --userns-remap=default – isolates UID/GID mappings.
  • --cap-drop=ALL – removes all Linux capabilities.
  • --read-only – prevents the container from writing to its filesystem.
  • --tmpfs /tmp – provides a temporary, non‑persistent storage area.
  • --security-opt=no-new-privileges – mirrors the daemon setting.

4.5 Verify Container Health

1
docker ps --filter "name=vllm-inference" --format "table {{.ID}}\
This post is licensed under CC BY 4.0 by the author.