Post

Build a Jekyll documentation site for your homelab

How to turn your homelab notes into a public Jekyll documentation website without leaking secrets.

Build a Jekyll documentation site for your homelab

If you build homelab services, document them while the details are fresh. Future you will thank you, and other nerds searching the internet will learn from the exact mistakes you already solved.

This site is built with Jekyll because it is simple:

  • Markdown posts
  • static HTML output
  • easy Git history
  • easy Docker deployment
  • no database to secure
  • fast pages for search engines

Golden rule: never publish secrets

Before publishing any guide, remove:

  • API keys
  • database passwords
  • S3 access keys and secret keys
  • Cloudflare tokens
  • private SSH keys
  • OAuth client secrets
  • session cookies
  • admin bootstrap passwords
  • real internal-only IPs if they matter

Use placeholders instead:

CF_DNS_API_TOKEN=<your-cloudflare-dns-token>
AUTHENTIK_SECRET_KEY=<generate-a-long-secret>
GARAGE_DEFAULT_SECRET_KEY=<your-s3-secret-key>

Project layout

1
2
3
4
5
6
7
8
9
jekyll/
├── _config.yml
├── _posts/
│   └── 2026-05-08-example-post.md
├── assets/
│   └── img/
│       └── posts/
├── Dockerfile
└── docker-compose.yml

Posts use front matter:

1
2
3
4
5
6
7
8
9
---
layout: post
title: "My homelab service"
date: 2026-05-08 19:00:00 +0000
categories: [Homelab]
tags: [docker, traefik]
description: "Short SEO-friendly summary."
image: /assets/img/posts/example.png
---

Production Dockerfile

1
2
3
4
5
6
7
8
9
10
FROM ruby:3.3 AS build
WORKDIR /site
RUN apt-get update && apt-get install -y build-essential git && rm -rf /var/lib/apt/lists/*
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY . .
RUN JEKYLL_ENV=production bundle exec jekyll build

FROM nginx:stable-alpine
COPY --from=build /site/_site /usr/share/nginx/html

Production compose with Traefik

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
  docs:
    build: .
    container_name: homelab-docs
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.docs.entrypoints=http"
      - "traefik.http.routers.docs.rule=Host(`docs.<your-domain>`)"
      - "traefik.http.middlewares.docs-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.docs.middlewares=docs-https-redirect"
      - "traefik.http.routers.docs-secure.entrypoints=https"
      - "traefik.http.routers.docs-secure.rule=Host(`docs.<your-domain>`)"
      - "traefik.http.routers.docs-secure.tls=true"
      - "traefik.http.routers.docs-secure.tls.certresolver=cloudflare"
      - "traefik.http.routers.docs-secure.service=docs"
      - "traefik.http.services.docs.loadbalancer.server.port=80"

networks:
  proxy:
    external: true

This site is public documentation, so it normally does not use Authentik. If you protect it, search engines and readers cannot access it.


Local development

1
2
bundle install
bundle exec jekyll serve --host 0.0.0.0 --port 4000 --livereload

Or with Docker:

1
docker compose up

Content template for service posts

Use this structure for every service:

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
39
## What we are building

Short explanation of the service and why it exists.

## Architecture

Domain, containers, networks, ports, volumes.

## Folder layout

Where files live.

## Compose file

Copy-paste-ready compose with placeholders.

## Environment file

Only placeholders, never secrets.

## First startup

Commands to start and initialize.

## Traefik labels

How routing works.

## Authentik integration

Only if the app is a human-facing dashboard.

## Verification

curl commands and expected outputs.

## Troubleshooting

Real errors and fixes.

Can this make money with ads?

Yes, but only if the site earns traffic and trust.

Realistic path:

  1. Publish useful, specific guides.
  2. Target problems people actually search for.
  3. Add diagrams and copy-paste examples.
  4. Keep posts updated.
  5. Add analytics.
  6. Apply for Google AdSense or another ad network once the site has enough real content and traffic.

Do not expect meaningful money early. Homelab content is niche. But niche technical traffic can be valuable because readers are serious and search with intent.

Better monetization options later:

  • Google AdSense
  • affiliate links for VPS providers, domains, hardware, backup tools
  • sponsorships from self-hosting tools
  • paid templates/checklists
  • consulting leads

The priority should be quality. If the docs solve real problems, traffic and revenue options come later.

These posts connect to this topic and help build the bigger homelab picture:

This post is licensed under CC BY 4.0 by the author.