설계 원칙¶
이 홈랩을 운영하는 규칙들입니다. 새로운 결정을 내릴 때는 먼저 이 목록에 비춰봅니다.
저장소가 곧 서버다¶
Git 저장소가 단일 진실 공급원입니다. 호스트에서 설정을 직접 고치지 않습니다 — 저장소에서 수정하고 검증한 뒤 배포하고 커밋합니다. 호스트와 저장소가 어긋나면 저장소가 옳고 호스트를 저장소에 맞게 재구축합니다.
열린 포트 0개¶
애플리케이션 포트를 공개 인터넷에 직접 노출하지 않습니다. 외부 트래픽은 오직 Cloudflare Tunnel → Caddy 경로로만 들어오므로, 방화벽은 닫힌 채로 유지되고 공격 표면은 호스트가 아니라 터널이 됩니다. 전체 그림은 보안 모델 참고.
tailnet이 내부 경계다¶
호스트 간 통신은 Tailscale 위에서 이루어지고 tailnet 멤버십이 "내부"의 기준입니다. 운영자 전용 화면(Grafana, 이 사이트)은 공개 엔드포인트의 비밀번호가 아니라 tailnet 주소 대역으로 차단합니다.
비밀은 스토어에 닿지 않는다¶
평문 비밀은 .nix 파일에도 Nix 스토어에도 절대 넣지 않습니다. 민감한
값은 모두 sops 암호화 YAML에 있고 각 호스트가 자기 SSH 키로 활성화
시점에 복호화합니다. 저장소가 유출되어도 평문 비밀은 노출되지 않습니다.
전부 고정한다¶
- 컨테이너 이미지 태그는 고정 —
latest금지. flake.lock이 시스템 전체를 고정하며nix flake update로만 의도적으로 갱신하고 손으로 편집하지 않습니다.system.stateVersion은 설치 시점 기본값의 기록이며 올리지 않습니다.
yggdrasil은 가볍게¶
엣지 노드는 RAM이 4 GB이고 역할은 라우팅과 관측 둘뿐입니다. 애플리케이션은 midgard에서 돌립니다. 새 서비스가 인그레스도 모니터링도 아니라면 yggdrasil에 둘 이유가 없습니다.
NixOS 모듈 우선¶
인프라는 NixOS 모듈을 우선합니다. 업스트림이 컨테이너로 확실히 더 잘 패키징할 때만 OCI 컨테이너(Podman, midgard 전용)를 씁니다.
한 번에 하나씩¶
작고 집중된 변경: 로컬 검증 → just test → just switch → 커밋.
무관한 변경 두 개를 같은 배포에 싣지 않습니다.