Skip to content

muhammedabdelkader/home-lab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

πŸ§ͺ My Home Lab Setup

Welcome to my self-hosted lab β€” a playground for learning, automation, media streaming, and security testing. This setup runs on Raspberry Pi, Proxmox, and external storage, tied together with Docker, Portainer, and Cloudflare Tunnels.

  • πŸ” Authenticated access via GitHub OAuth + NGINX
  • 🌩️ Reverse proxy + automatic HTTPS
  • πŸ“‘ Monitored by alerting stack with notifications
  • πŸŽ₯ Streaming, πŸ“š reading, πŸ“ syncing β€” all automated
  • 🧠 Integrated with a private dashboard + VS Code in browser

🧱 Infrastructure Stack

Core services that make everything else possible.

πŸ” NGINX Proxy Manager

image: jc21/nginx-proxy-manager:latest
ports:
  - '80:80'
  - '81:81'
  - '443:443'

☁️ Nextcloud

image: lscr.io/linuxserver/nextcloud:latest
volumes:
  - /mnt/.docker/nginx/nextcloud/appdata:/config
  - /mnt/.docker/nginx/nextcloud/data:/data

🏑 Home Assistant

image: lscr.io/linuxserver/homeassistant:latest
volumes:
  - /mnt/.docker/nginx/hass/config:/config

πŸ›‘οΈ OAuth2 Proxy (GitHub)

 
image: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
ports:
  - "4180:4180"
# Note: Secrets have been redacted

πŸ§‘β€πŸ’» Code Server

image: lscr.io/linuxserver/code-server:latest
volumes:
  - /mnt/.docker/code-server/config:/config

πŸ“‹ Lab Dash

image: ghcr.io/anthonygress/lab-dash:latest
volumes:
  - /var/run/docker.sock:/var/run/docker.sock

πŸ“„ Stirling PDF

image: frooodle/s-pdf:latest
volumes:
  - /mnt/.docker/pdf/stirling-data:/usr/share/tessdata

🧠 WIP (Personal Tracker)

image: eigenfocus/eigenfocus:1.2.0-free

🎞️ Media Stack

Automated content pipeline β€” books, movies, and torrents.

🌊 qBittorrent

image: lscr.io/linuxserver/qbittorrent:latest
volumes:
  - /mnt/nfs-media/downloads:/downloads

πŸ“š Readarr + Calibre Web

image: lscr.io/linuxserver/readarr:develop
volumes:
  - /mnt/nfs-media/books:/books
  - /mnt/nfs-media/downloads:/downloads
image: linuxserver/calibre-web
volumes:
  - /mnt/nfs-media/books:/books

🎬 Radarr + Jellyfin

image: lscr.io/linuxserver/radarr:latest
volumes:
  - /mnt/nfs-media/movies:/movies
  - /mnt/nfs-media/downloads:/downloads
image: jellyfin/jellyfin:latest
volumes:
  - /mnt/nfs-media/movies:/media/movies

πŸ—£οΈ Bazarr (Subtitles)

image: lscr.io/linuxserver/bazarr:latest
volumes:
  - /mnt/nfs-media/movies:/movies
  - /mnt/nfs-media/tv:/tv

πŸ” Jackett

image: lscr.io/linuxserver/jackett:latest
volumes:
  - /mnt/nfs-media/jackett/config:/config
  - /mnt/nfs-media/downloads:/downloads

πŸ“ˆ Monitoring Stack

Know when anything goes down. Instantly.

πŸ“³ Gotify + iGotify

image: gotify/server
volumes:
  - /mnt/.docker/gotify-data:/app/data
```yaml
image: ghcr.io/androidseb25/igotify-notification-assist:latest
# Note: Secrets have been redacted

πŸ“Ÿ Uptime Kuma

image: louislam/uptime-kuma:latest
volumes:
  - /mnt/.docker/uptime-kuma:/app/data

🚨 Alertmanager

image: prom/alertmanager
volumes:
  - /mnt/.docker/alertmanager:/etc/alertmanager

🧩 Networking

All services share the same secure network:

networks:
  shared-net:
    external: true

πŸ” Secrets & Security

GitHub OAuth secrets and notification tokens have been redacted

Services like OAuth2 Proxy, Gotify, and iGotify require proper environment setup for secure production use

πŸ“ Create Required Docker Volume Directories

Before running your Docker Compose stacks, make sure all the necessary host directories exist. Use this script to automate creating them.

πŸ› οΈ Step-by-Step Setup

Save the script below as create-docker-volumes.sh

Make it executable

chmod +x create-docker-volumes.sh

Run the script

./create-docker-volumes.sh

πŸ“œ create-docker-volumes.sh

#!/bin/bash
set -e
# Create all necessary volume directories for the home lab
mkdir -p "/mnt/.docker/alertmanager"
mkdir -p "/mnt/.docker/bazarr/config"
mkdir -p "/mnt/.docker/calibre-web/config"
mkdir -p "/mnt/.docker/code-server/config"
mkdir -p "/mnt/.docker/eigenfocus/app-data"
mkdir -p "/mnt/.docker/gotify-data"
mkdir -p "/mnt/.docker/gotify-data/api-data"
mkdir -p "/mnt/.docker/homepage/config"
mkdir -p "/mnt/.docker/jellyfin/config"
mkdir -p "/mnt/.docker/lab-dash/config"
mkdir -p "/mnt/.docker/lab-dash/uploads"
mkdir -p "/mnt/.docker/nginx/data"
mkdir -p "/mnt/.docker/nginx/letsencrypt"
mkdir -p "/mnt/.docker/nginx/hass/config"
mkdir -p "/mnt/.docker/nginx/nextcloud/appdata"
mkdir -p "/mnt/.docker/nginx/nextcloud/data"
mkdir -p "/mnt/.docker/nginx-stack"
mkdir -p "/mnt/.docker/pdf/configs"
mkdir -p "/mnt/.docker/pdf/stirling-data"
mkdir -p "/mnt/.docker/qbittorrent/config"
mkdir -p "/mnt/.docker/radarr/config"
mkdir -p "/mnt/.docker/readarr/config"
mkdir -p "/mnt/.docker/uptime-kuma"
mkdir -p "/mnt/nfs-media/books"
mkdir -p "/mnt/nfs-media/downloads"
mkdir -p "/mnt/nfs-media/jackett/config"
mkdir -p "/mnt/nfs-media/movies"
mkdir -p "/mnt/nfs-media/tv"

βœ… What This Script Does

Creates all Docker volume paths required by:

  • 🧱 Infrastructure stack

  • 🎞️ Media stack

  • πŸ“ˆ Monitoring stack

  • Avoids permission issues at runtime

  • Keeps host filesystem organized under /mnt/.docker/ and /mnt/nfs-media/

You can modify the paths if your setup uses different mount points or external drives.

πŸš€ How to Use This Repository

This repository contains all the stack definitions and tools for spinning up your self-hosted home lab.

πŸ“¦ Folder Structure

.
β”œβ”€β”€ README.md                        # πŸ“˜ You’re reading it!
β”œβ”€β”€ create-docker-volumes.sh         # πŸ“ Directory setup script
β”œβ”€β”€ infrastructure-stack/            # 🧱 Core infrastructure services
β”‚   └── Dockerfile
β”œβ”€β”€ media-stack/                     # 🎞️ Media automation and streaming
β”‚   └── Dockerfile
β”œβ”€β”€ monitoring-stack/                # πŸ“ˆ Notifications and uptime tracking
β”‚   └── Dockerfile

πŸ”§ Prerequisites

βœ… Docker + Docker Compose installed

βœ… /mnt/.docker/ and /mnt/nfs-media/ available on host

βœ… Optional: NFS share or external storage mounted

βœ… (Recommended) Reverse proxy and DNS management via NGINX Proxy Manager + Cloudflare

🧰 Setup Instructions

Clone the repository

git clone https://github.com/muhammedabdelkader/home-lab.git
cd home-lab

Create required directories

chmod +x create-docker-volumes.sh
./create-docker-volumes.sh

Configure .env files (if needed)

Add secrets like GitHub OAuth or Gotify tokens in a secure .env file or use secrets manager.

Deploy stacks

You can use docker compose or Portainer for each stack:

cd infrastructure-stack
docker compose up -d

cd ../media-stack
docker compose up -d

cd ../monitoring-stack
docker compose up -d

Access services

Stack Service Access URL Example
Infrastructure NGINX Proxy Manager https://proxy.yourdomain.com
Media Jellyfin https://media.yourdomain.com
Monitoring Uptime Kuma https://status.yourdomain.com

✨ Final Words

This home lab project is not only a passion but a learning platform. It helps me:

  • Practice infrastructure automation

  • Self-host powerful alternatives to SaaS tools

  • Monitor uptime and notifications

  • Stay sharp for bug bounty and security testing

πŸ“¬ Support & Contributions

Have suggestions, issues, or ideas? Feel free to open an issue or submit a pull request!

Happy homelabbing! 🧠πŸ§ͺπŸš€