Basic Home Lab Configuration
A Home Lab self-contained in a single mini-computer.

Figure 1: Proxmox VE 9.2.3 / Minicomputer Architecture & Network Diagram
Note: If you want to use this information in an AI window – select this section into your chat window to reference the entire configuration. This can be helpful if you want to ask any AI questions regarding your Home Lab configuration. Just tell your AI client "gemini" to load this config your reference in your conversation. It might be helpful to tell your AI conversation:
"Please start a clean conversation, flush all buffers and caches and then load this config for reference."
========================================================================= Barnes Home Lab Configuration KAMRUI HYPER H2 MINI PC (10C / 16T | 32GB RAM / up to 4.9GHz) Proxmox VE 9.2.3 / Dedicated Ethernet / Intel Core i7-13620H Integrated GPU: Intel UHD Graphics (13th Gen) / 1TB PCIe NVMe SSD ========================================================================= [ PROXMOX VE HOST ] --------- Reserve 2GB RAM / 2 Threads for overhead ] │ 192.168.86.250 ├──► [ VM 101 ] HOME ASSISTANT OS (HAOS) │ ├── CPU: 2 Cores (vCPUs) │ ├── RAM: 4 GB (Dedicated) │ ├── STO: 32 GB - 64 GB NVMe │ ├── 192.168.86.251 - Primary LAN Segment (vmbr0) eth0 │ └── 10.0.10.1/24 - Isolated Backend Segment (vmbr1 - │ No Gateway/DNS Emulation) eth1 ├──► [ LXC 100 ] DNSMASQ SERVER (PiHole) │ ├── CPU: 1 Core (vCPU) │ ├── RAM: 512 MB (Ultra-lightweight) │ ├── STO: 2 GB NVMe │ └── 192.168.86.254 (Currently .249 until production release) ├──► [ LXC 102 ] NGINX PROXY MANAGER │ ├── CPU: 2 Cores (vCPUs) │ ├── RAM: 1 GB (Scalable) │ ├── STO: 8 GB (OS) + Mount point to external storage for media │ └── 192.168.86.252 ├──► [ LXC 103 ] OLLAMA LLM ENGINE │ ├── CPU: 6 Cores (vCPUs) ---> (Uses high-perf Intel P-Cores) │ ├── GPU Passthru: Vulkan0 Intel(R) Graphics (RPL-P) │ type=iGPU total=23.3 GiB Ram │ ├── RAM: 16 GB (Allows up to 8B/11B parameter models) │ ├── STO: 40 GB NVMe --------> (Large capacity for model weights) │ ├── LAM: gemma3:4b ---------> Multimodal (Vision) & 128K Context Window │ ├── LAM: phi4-mini:latest --> Logic, Intense Reasoning, & Tool Calling │ ├── LAM: qwen2.5-coder:7b --> Complex Automation Engineering, │ Code Sandbox, & YAML Chat │ ├── LAM: qwen2.5-coder:1.5b -> Inline IDE Autocomplete Engine │ (Fed via Desktop on LAN) │ ├── LAM: nomic-embed-text --> Vector Embeddings & Local │ Document Context Parsing │ ├── 192.168.86.253 - Primary LAN Segment (vmbr0) eth0 │ └── 10.0.10.3/24 - Isolated Backend Segment (vmbr1 - No │ Gateway/DNS Emulation) eth1 ├──► [ LXC 104 ] WYOMING-DOCKER │ ├── CPU: 2 Cores (vCPUs) │ ├── RAM: 2 GB (Scalable) │ ├── STO: 10 GB (OS) + Mount point to external storage for │ media │ ├── ports: 10200:10200 │ ├── volumes: piper-data:/data │ ├── 192.168.86.248 - Primary LAN Segment (vmbr0) eth0 │ └── 10.0.10.4/24 - Isolated Backend Segment (vmbr1) eth1 └──► [ LXC 105 ] TWINGATE CONNECTOR ├── CPU: 1 Core (vCPU) ├── RAM: 512 MB (Ultra-lightweight) ├── STO: 2 GB NVMe (OS Only) └── 192.168.86.247 - Primary LAN Segment (vmbr0) eth0 (Routes 192.168.86.0/24 Securely) |
|---|
Code 1: Barnes Home Lab Configuration
Setting up a Domain Name
Reserve your spot now if you think you want to present an image to the external world. Names are unique to the individual person or company. Cost can influence your Domain Name. I have found that a .us domain costs around $7 US dollars per year. That is probably the cheapest you can find. I have a reference paper that you can read in helping you decide what extension you want. I also have found the cheapest overall solution is to skip the middleman (can introduce unknown costs and make the creation and decision more complicated). Read my paper called Choosing a Domain Name. Here are the steps, when you are ready to register your Domain Name.
Create an account on GitHub if you don't already have one.
Create an account on Cloudfare.com
Point the connector to your GitHub account for login purposes to simplify authentication.
Step 1: Register Your New Domain
Cloudflare operates as an official domain registrar, selling domain names at wholesale cost without added markups.
Log in to your Cloudflare Dashboard.
On the left sidebar of your account home page, click Domain Registration > Register Domains.
Type the domain name you want in the search bar and press Enter.
Check the availability list. Click Add to cart next to your preferred extension (e.g., .com, .org, .net).
Click Purchase Now.
Select your registration term length (e.g., 1 year) and fill out your Contact Information (required by ICANN for domain ownership logs). Cloudflare provides free WHOIS privacy, so your personal details will stay hidden from the public.
Enter your payment details and click Finalize Checkout.
Step 2: Access Your New DNS Dashboard
Because you bought the domain directly through Cloudflare, the nameservers are already configured automatically. You do not need to change any registrar settings to start using it.
Go back to your main Cloudflare Dashboard home page.
Click on your newly purchased domain name from your website list.
In the left sidebar, navigate to DNS > Records.
From the active DNS management pane, click Add Record to point your new domain to your web host, GitHub Pages, or an email provider using the exact setup steps described previously.
Setting up a Public Repository on Github
To share files and host a web page on GitHub, you need to create a repository, upload your files, and activate GitHub Pages.
Follow this step-by-step process to get everything up and running.
Step 1: Create a Public Repository
GitHub Pages requires a public repository to host web pages for free.
Log in to your GitHub account.
Click the + (plus) icon in the top-right corner and select New repository.
Configure your repository settings:
Repository name: Type a name (e.g., home-lab-site).
Public/Private: Select Public.
Initialize this repository with: Check the box for Add a README file.
Click Create repository.
Step 2: Upload Your Files
Your main web page must be named exactly index.html (all lowercase, and no spaces) for GitHub to recognize it as the homepage.
Since you don’t have any files yet just skip this step for now:
Inside your new repository
- click the Add file dropdown button and choose Upload files.
Drag and drop your website files into the box. Ensure your main page is named index.html. You can also drop any other files (like PDFs, images, or ZIPs) you want to share.
Scroll down to Commit changes
- add a short note describing your upload and click Commit changes.
Step 3: Turn on GitHub Pages
Now, tell GitHub to turn those uploaded files into a live website.
Click the Settings tab at the top of your repository.
In the left-hand sidebar menu, scroll down to the Code and automation section and click Pages.
Under Build and deployment > Source, keep it set to Deploy from a branch.
Under Branch, click the dropdown that says None, change it to main (or master), leave the folder as / (root), and click Save.
Wait about 1 to 2 minutes. Refresh the page, and a live link will appear at the top of the Pages section (e.g., https://github.io).
Step 4: Install Github Desltop
Its time to install Github Desltop and sync it to your Git Repository
Step 1: Install and Authenticate
Download the Installer: Go to desktop.github.com and download the version for your operating system (macOS or Windows).
Run the Setup: Open the downloaded file and follow the standard installation prompts.
Sign In: Once it opens, you will be prompted to sign into your account. Click Sign in to GitHub.com
Authorize: This will open your web browser. Confirm your credentials and click Authorize desktop. Your browser will then ask for permission to redirect you back to the application.
Step 2: Connect Your Repository
Depending on whether your repository already exists on GitHub or only exists as a folder on your computer, choose one of the methods below. We will be using the cloning method (Option A) since we do not have any web pages yet.
Option A: If your repository is already on GitHub (Cloning)
This is the most common path if you created the repo on the website first.
In GitHub Desktop, go to the top menu and select File > Clone Repository.
Click the GitHub.com tab. You will see a list of all your online repositories.
Select your repository from the list.
Choose the Local Path (the folder on your computer where you want the project files to live).
Click Clone.
Option B: If the folder is only on your computer (Adding & Publishing)
Use this if you have a local project folder that you want to upload to GitHub for the first time.
Go to File > Add Local Repository.
Browse and select your project's folder, then click Add Repository.
If it isn't a Git repository yet, the app will ask if you want to initialize it. Click Create a repository.
Once added, look at the top bar and click Publish repository to push it to your online GitHub account.
Step 3: Syncing Your Changes Going Forward
To keep your local computer and your online GitHub repository perfectly in sync, you will follow a simple 3-step loop whenever you do work:
[ Your Code Changes ] ──> [ Commit (Save Locally) ] ──> [ Push (Sync to GitHub) ]
Make Changes: Edit, add, or delete files in your project folder using your favorite code editor. GitHub Desktop will automatically track these changes in the left sidebar under the Changes tab.
Commit Your Changes: * At the bottom of the left sidebar, write a short summary of what you changed (e.g., "Updated home page text").
- Click the blue Commit to main (or master) button. This saves a snapshot of your work locally on your computer.
Push to GitHub: Look at the top menu bar. Click Push origin. This uploads your local commits to the cloud on GitHub.com.
💡 Pro-Tip: Before you start working next time, always click the Fetch origin (or Pull origin) button at the top. This downloads any changes made to the GitHub repository (like updates made from another computer or by a teammate) so your local files stay up to date.
Step 5: Share Your Files and Site
To share the live website: Give people the URL generated in Step 3.
To share direct file downloads:
Append the exact file name to your website URL. For
example, if you uploaded a file named brochure.pdf, your
shareable download link is:
https://github.io
Pointing Cloudfare to Git Hub
To point a custom domain managed by Cloudflare to a GitHub Pages web page, you need to configure specific DNS records in Cloudflare and input your domain inside your GitHub repository settings.
Follow this complete step-by-step walkthrough to link your domain.
Step 1: Configure DNS Records in Cloudflare
First, you need to map your root domain (e.g., example.com) and your subdomain (e.g., www.example.com) to GitHub's infrastructure.
Log in to your Cloudflare Dashboard and select your domain name.
In the left-hand sidebar, navigate to DNS > Records.
Delete any existing A or CNAME records that are currently pointing your root (@) or www subdomains to another host.
Add four separate A records for your root domain using GitHub’s official IP addresses:
Click Add Record, choose Type A, set the Name to @, Proxy status set to DNS Only (grey cloud), and input the IPv4 address 185.199.108.153.
Repeat this process to add the remaining three IP addresses:
185.199.109.153
185.199.110.153
185.199.111.153
Add a CNAME record to handle traffic arriving via www:
- Click Add Record, choose Type CNAME, set the Name to www, and set the Target to your default GitHub Pages URL (e.g., yourusername.github.io).
Add MX Records (Mail Exchange
You must delete any existing MX records from previous email hosts and add three separate Cloudflare MX records:
Type Mail Server Priority
MX @ route3.mx.cloudflare.net 45
MX @ Route2.mx.cloudflare.net 19
MX @ route1.mx.cloudflare.net 2
- Add SPF Record (Sender Policy Framework)
This TXT record authorizes Cloudflare to safely forward your emails without major email providers (like Gmail) flagging them as spam.
Type: TXT
**Name: @**
Value: "v=spf1 include:_spf.mx.cloudflare.net ~all"
Note: You are only allowed to have one SPF record on your root domain. If you already have an existing SPF record (for example, from Google Workspace or Microsoft 365), you must merge them together by inserting
include:_spf.mx.cloudflare.net right before the ~all or -all tag.
- Find the Value in Your Settings
Log in to the Cloudflare Dashboard and select your domain name.
In the left-hand sidebar, click Compute > Email Service > Email Routing.
Click on the Settings tab at the top of the page.
Scroll down to the DNS records section.
Look for the row where the record name begins with cf2024-1._domainkey.
Click on that row to expand it, and copy the full value string (the long text code starting with v=DKIM1; p=).
- Publish the Record to Your DNS
If Cloudflare doesn't add it automatically, or if you prefer to publish it manually:
In the left sidebar of your dashboard, click DNS > Records.
Click the Add record button.
Set the Type dropdown to TXT.
In the Name field, type exactly: cf2024-1._domainkey.
In the Content (or Value) field, paste the long text string you just copied from your Email Routing settings.
Leave the TTL on Auto, make sure Proxy Status is set to DNS Only (grey cloud), and click Save.
- Important Proxy Status Rule: Ensure the Proxy status toggle for all five newly created records is set to DNS Only (grey cloud) during the initial setup. This allows GitHub to verify the domain ownership and successfully issue an SSL certificate. You should change this to Proxied (orange cloud) later to enforce Cloudflare's security protections.

Figure 2: Cloudflare DNS Configuration
Step 2: Configure Your Custom Domain in GitHub
Now, inform GitHub that your repository should accept traffic originating from your custom domain.
Log in to GitHub and open the repository hosting your web page.
Click on the Settings tab located at the top of your repository navigation bar.
Scroll down the left sidebar menu and click on Pages.
Under the Custom domain section, type your root domain (e.g., example.com) into the text box and click Save.
GitHub will instantly create a file named CNAME in the root of your main repository branch.
Wait a few minutes (1-15) for the DNS check on the GitHub page to clear and the Enforce HTTPS box to become available.
The "Enforce HTTPS" checkbox on GitHub is grayed out for one specific reason: GitHub hasn't finished provisioning your SSL/TLS security certificate yet.
When you change your DNS settings (like fixing that CNAME record), GitHub has to talk to Let's Encrypt to issue a secure certificate for your custom domain. Until that process completes, it won't let you check that box.
- Once it successfully clears, check the box labeled Enforce HTTPS to secure your live site.
Step 3. Enable Email Routing
1. Set Up Enable Email Routing
Log in to your Cloudflare Dashboard.
Select your domain from the list.
On the left sidebar, click Email > Email Routing.
Click the blue Get Started button.
2. Set Up Your Destination Address
Enter your Destination address (your personal email, like yourname@gmail.com).
Click Save.
Check your personal inbox for a verification email from Cloudflare and click the Verify email address link.
3. Create a Routing Rule
Go back to the Email Routing page in Cloudflare.
Click the Routes tab at the top, then click Create address.
In the Custom address field, type the alias you want (e.g., hello or contact).
Under Action, select Forward to and choose your verified destination email.
Click Save.
4. Test It Out
To make sure it is working seamlessly:
Open a completely separate email account (like a personal email or a work address).
Send a blank test email to your new custom domain address (e.g., hello@smart-home-edge-systems.us).
Check your destination inbox (the destination address you verified in Cloudflare earlier) to confirm the message arrives safely.
If it arrives, you are officially finished with the setup and can completely ignore the top-left status warnings.
Step 4. Custom Email Return Address in Gmail
Step 1: Add Your Custom Address to Gmail
Open Gmail on your computer, click the Settings gear icon (⚙️) in the upper right, and choose See all settings.
Click the Accounts and Import tab.
Find the Send mail as line item and click Add another email address.
A small popup window will appear:
Name: Type the display name you want recipients to see (e.g., your name or business title).
Email address: Type your exact custom domain alias (info@smart-home-edge-systems.us).
Treat as an alias: Keep this checkbox checked.
Click Next Step.
Step 2: Configure Outbound Server Settings
In the next section of the popup configuration panel, fill out the settings exactly as shown below to hook into Google's relay pipeline:
SMTP Server: smtp.gmail.com
Port: 587
Username: Enter your full personal Gmail address (edwin.m.barnes@gmail.com).
Password: Paste the 16-character App Password you copied during Step 1.
Secured connection choice: Choose Secured connection using TLS.
Click Add Account.
Step 3: Verify and Lock it Down
Google will send an automated verification email with a code inside to your custom address.
Because your Cloudflare forwarding is already live, this verification message will land right back in your primary Gmail inbox within a minute.
Copy the numeric code from the body of that email, paste it into the open popup window validation field, and click Verify.
Back on your Gmail Accounts and Import settings menu, locate the line beneath Send mail as titled When replying to a message.
Toggle this option to Reply from the same address the message was sent to.
Now, whenever anyone fires off a message to info@smart-home-edge-systems.us, hitting reply inside Gmail will automatically formulate your outbound response from your professional domain name instead of your personal address.
Would you like help setting up a custom email signature specifically for your new info@ sending profile, or would you like to build an automated vacation auto-responder for it?
References
🌐 Cloudflare & DNS Resources
Cloudflare Docs: Register a New Domain
Cloudflare Docs: Domain Configuration for Email Service [1, 2]
🛠️ GitHub Pages Resources
GitHub Docs: Managing a Custom Domain for Your GitHub Pages Site
GitHub Docs: Configuring a Publishing Source for Your GitHub Pages Site [1]
✉️ Gmail & Outbound Pipeline Resources
Google Account Help: Sign in with App Passwords
🐳 Self-Hosted & Environment Stack