콘텐츠로 이동

아키텍처

구성은 엣지/인프라 노드(yggdrasil)와 애플리케이션 노드(midgard)로 나뉩니다. 외부 트래픽은 포트를 직접 열지 않고 Cloudflare Tunnel → Caddy 경로로만 들어오며 호스트 간 내부 통신은 Tailscale tailnet을 경계로 삼습니다.

flowchart TD
    internet["인터넷 사용자"]
    cloudflare["Cloudflare<br/>DNS / Tunnel 엣지"]

    subgraph yggdrasil["yggdrasil: 엣지 / 인프라 노드"]
        cloudflared["cloudflared<br/>Cloudflare Tunnel 클라이언트"]
        caddy["Caddy<br/>HTTPS 인그레스 / 리버스 프록시"]
        kuma["Uptime Kuma<br/>127.0.0.1:3001"]
        prometheus["Prometheus<br/>127.0.0.1:9090"]
        grafana["Grafana<br/>127.0.0.1:3003"]
        docsSite["문서 사이트<br/>정적 파일"]
        yNodeExporter["node_exporter<br/>:9100"]
    end

    subgraph tailnet["Tailscale tailnet"]
        midgardDns["midgard.tail6fc192.ts.net"]

        subgraph midgard["midgard: 애플리케이션 호스트"]
            homepage["Homepage 대시보드<br/>:8082"]
            forgejo["Forgejo<br/>:3000"]
            vaultwarden["Vaultwarden<br/>:8222"]
            mNodeExporter["node_exporter<br/>:9100"]
        end
    end

    internet --> cloudflare
    cloudflare --> cloudflared
    cloudflared -->|"home/git/vault/status/docs.ridewithmin.com<br/>https://localhost:443"| caddy

    caddy -->|"status.ridewithmin.com"| kuma
    caddy -->|"home.ridewithmin.com"| homepage
    caddy -->|"git.ridewithmin.com"| forgejo
    caddy -->|"vault.ridewithmin.com"| vaultwarden
    caddy -->|"grafana.ridewithmin.com<br/>tailnet 전용"| grafana
    caddy -->|"docs.ridewithmin.com"| docsSite

    caddy -.->|Tailscale 경유 백엔드 접근| midgardDns
    midgardDns -.-> homepage
    midgardDns -.-> forgejo
    midgardDns -.-> vaultwarden

    prometheus --> yNodeExporter
    prometheus -.->|Tailscale 경유 수집| mNodeExporter
    grafana --> prometheus

이 경계들 — 공개 인터넷, tailnet, localhost — 을 누가 넘는지는 보안 모델에서 다룹니다.

공유 시스템 구성

모든 호스트는 flake.nix에서 공통 모듈을 로드합니다.

모듈 내용
modules/base.nix flakes/nix-command, systemd-boot, NetworkManager, 방화벽
modules/gc.nix 주간 Nix GC + 스토어 자동 최적화
modules/swap.nix zram 스왑 (별도 스왑 파티션 없음)
modules/users.nix 운영자 poby (wheel, passwordless sudo)
modules/ssh.nix OpenSSH, 패스워드/루트 로그인 비활성
modules/tailscale.nix Tailscale
modules/secrets.nix sops-nix 기본 설정
services/node-exporter.nix 모든 호스트의 node_exporter (:9100)
services/alloy.nix 로그 수집 (Loki로 전송)

스토리지

디스크 레이아웃은 disko로 선언하며 모든 호스트가 단일 디스크 GPT 레이아웃을 사용합니다.

GPT 파티션 테이블
512M EFI 시스템 파티션  -> /boot, vfat
나머지 디스크           -> /, ext4

사용자 환경

Home Manager는 NixOS 모듈로 활성화되어 호스트 switch 시 함께 적용되며 poby 운영자 환경 전용입니다. 장기 실행 서비스에는 사용하지 않습니다. 공유 프로필(home/poby/base.nix, ops.nix)에 셸/Git/tmux 설정과 age·sops·just 같은 운영 도구가 들어가고 호스트별 프로필이 각 호스트에 맞는 별칭을 추가합니다.