Repository for setting up my homelab
  • Nix 80.8%
  • TypeScript 14.5%
  • Just 4.7%
Find a file
Sangmin Kim 904535ef66
Some checks failed
Deploy / switch alfheim (push) Has been cancelled
Deploy / switch midgard (push) Has been cancelled
Deploy / switch yggdrasil (push) Has been cancelled
flake: update blog input to c858bd194a3c (#53)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-18 14:35:46 +00:00
.agents Show open PR number in statusline HUD 2026-06-12 17:25:08 +09:00
.claude claude model fable -> opus 2026-06-15 09:58:17 +09:00
.codex Use GPT-5.6-Sol for Codex 2026-07-13 17:36:57 +09:00
.github/workflows ci: generalize update-blog workflow to any flake input (#47) 2026-07-16 12:49:55 +00:00
docs Revert deploy tooling to nixos-rebuild 2026-07-14 13:24:54 +09:00
home/poby [codex] add hermes-agent local bin path 2026-06-22 22:15:56 +09:00
hosts Remove blog and docs static servers from midgard 2026-07-09 16:22:55 +09:00
modules Add GitHub Actions CI/CD for homelab deploys 2026-06-16 22:37:06 +09:00
secrets Remove stale grafana/* keys from secrets/ingress.yaml 2026-07-06 19:07:26 +09:00
services Remove blog and docs static servers from midgard 2026-07-09 16:22:55 +09:00
.gitignore feat: ignore Mac store file 2026-06-12 13:45:49 +09:00
.mcp.json Add Claude Code project configuration 2026-06-12 01:09:39 +09:00
.sops.yaml deploy jamye-plz to alfheim 2026-06-18 10:49:32 +09:00
AGENTS.md Remove Grafana/Prometheus/Loki/Alloy stack (migration phase 5 teardown) 2026-07-06 18:55:39 +09:00
CLAUDE.md Add shared agent guidance in AGENTS.md 2026-06-12 01:09:18 +09:00
flake.lock flake: update blog input to c858bd194a3c (#53) 2026-07-18 14:35:46 +00:00
flake.nix Revert deploy tooling to nixos-rebuild 2026-07-14 13:24:54 +09:00
Justfile Gate just switch behind an interactive confirm 2026-07-14 13:51:57 +09:00
README-ko.md Document static site routing 2026-07-06 14:54:36 +09:00
README.md Document static site routing 2026-07-06 14:54:36 +09:00

Homelab

English | 한국어

This repository is the source of truth for a NixOS homelab. Host configuration, shared modules, services, operator environment, and encrypted secrets are declared in a single Nix flake and deployed through GitHub Actions.

Documentation

The detailed documentation lives on the docs site:

Use the docs site for architecture details, host runbooks, service notes, secrets, CI/CD, rollback, and operational procedures.

Overview

The homelab is split into an edge/infra node, an application host, and an ARM cloud node. Public traffic enters through Cloudflare Tunnel and lands on Caddy on yggdrasil; internal backend traffic moves over Tailscale. The repository is treated as the server: changes are made here, reviewed through pull requests, and rolled out by CI/CD.

Hosts

Host Role Notes
yggdrasil Edge / infrastructure Cloudflare Tunnel, Caddy ingress, monitoring, status page
midgard Application host Static sites, Forgejo, Vaultwarden, Homepage, Podman-backed applications
alfheim OCI ARM node ARM/cloud-host validation and jamye-plz

Architecture

flake.nix pins NixOS 26.05 and exposes one nixosConfiguration per host. Shared system behavior comes from modules/; service definitions live under services/; each host wires in its hardware and host-specific modules from hosts/<host>/.

External users reach public services through:

Internet -> Cloudflare -> cloudflared on yggdrasil -> Caddy -> service backend

Private administration and host-to-host traffic use the Tailscale tailnet. Application ports are not opened directly to the public Internet.

Repository Layout

Path Purpose
flake.nix / flake.lock Nix flake inputs and host outputs
hosts/ Per-host NixOS configuration, hardware config, and disk layout
modules/ Shared NixOS modules used across hosts
services/ Service modules and ingress/monitoring configuration
home/ Home Manager profile for the poby operator account
secrets/ sops-nix encrypted secrets
docs/ English and Korean documentation site source

Change Flow

Normal changes follow the GitHub Actions workflow:

edit -> pull request -> CI builds every host -> merge -> CD deploys all nodes

Local just test and just switch are explicit-request break-glass or bootstrap commands, not the default validation or deployment path.

Useful Docs