- Headscale는 Tailscale 컨트롤 서버를 오픈소스·셀프 호스팅으로 구현한 프로젝트이며, self-hoster와 취미 개발자의 프로젝트·랩 환경을 목표로 함
- Tailscale은 WireGuard 기반 현대적 VPN이며, NAT traversal을 사용해 네트워크의 컴퓨터 사이에 오버레이 네트워크처럼 동작함
- Tailscale의 컨트롤 서버는 노드의 WireGuard 공개키 교환, 클라이언트 IP 할당, 사용자 경계 생성, 사용자 간 머신 공유, 노드가 광고한 라우트 노출을 담당함
- Headscale은 개인 사용이나 소규모 오픈소스 조직에 적합한 단일 Tailscale 네트워크(tailnet) 구현을 좁은 범위로 제공함
- 프로젝트는 Tailscale Inc.와 관련이 없으며, Headscale 실행에는 리버스 프록시와 컨테이너 사용을 지원하거나 권장하지 않음
Headscale의 목적과 범위
- Headscale는 Tailscale 컨트롤 서버의 셀프 호스팅 가능한 오픈소스 대안을 목표로 함
- 대상 사용자는 self-hoster, 취미 개발자, 개인 프로젝트와 랩 환경 사용자임
- 구현 범위는 좁게 잡혀 있으며, 단일 tailnet을 제공함
- 개인 사용에 적합함
- 소규모 오픈소스 조직에도 적합함
Tailscale과 컨트롤 서버의 역할
- Tailscale은 WireGuard 위에 구축된 현대적 VPN임
- Tailscale은 네트워크의 컴퓨터 사이에서 오버레이 네트워크처럼 동작하며, NAT traversal을 사용함
- Tailscale에서 GUI 클라이언트 일부와 컨트롤 서버를 제외한 모든 요소는 오픈소스임
- 예외로 언급된 GUI 클라이언트는 Windows와 macOS/iOS 같은 독점 OS용 클라이언트임
- 컨트롤 서버는 Tailscale 네트워크 노드 간 WireGuard 공개키 교환 지점으로 동작함
- 클라이언트 IP 주소를 할당함
- 사용자 간 경계를 생성함
- 사용자 간 머신 공유를 가능하게 함
- 노드가 광고한 라우트를 노출함
- Tailscale network, 즉 tailnet은 Tailscale이 개인 사용자나 조직에 할당하는 사설 네트워크임
문서와 버전 주의사항
- 사용 중인 릴리스 버전에 맞는 예제 설정을 보려면 항상 동일한 GitHub tag를 선택해야 함
main브랜치에는 아직 릴리스되지 않은 변경사항이 들어 있을 수 있음- 문서는 안정 버전과 개발 버전으로 제공됨
- 기능 목록은 Features 문서에서 확인하도록 안내함
- 클라이언트와 운영체제 지원 범위는 Client and operating system support 문서에서 확인하도록 안내함
실행과 빌드
- Headscale 실행에는 리버스 프록시와 컨테이너 사용을 지원하거나 권장하지 않음
- 실행 방법은 공식 문서를 보도록 안내함
- NixOS 사용자를 위한 모듈은
nix/디렉터리에 있음 main브랜치의 개발 빌드는 컨테이너 이미지와 바이너리로 제공됨- 세부 내용은 development builds 문서를 참조함
프로젝트 관계와 기여
- 이 프로젝트는 Tailscale Inc.와 관련이 없음
- Headscale의 활성 메인테이너 중 한 명은 Tailscale에 고용되어 있으며, 근무 시간에 프로젝트에 기여할 수 있음
- 해당 메인테이너의 기여는 다른 메인테이너가 리뷰함
- 메인테이너들은 self-hoster, 열성 사용자, 취미 개발자 커뮤니티를 지원하면서 지속 가능한 프로젝트를 만드는 원칙 아래 프로젝트 방향을 함께 정함
- 기여자는 CONTRIBUTING.md를 읽어야 함
개발 환경과 워크플로
- 기여에는 최신 Go와 Buf가 필요함
- Buf는 Protobuf 생성기로 사용됨
- 개발 환경 설정에는 Nix 사용을 권장함
nix develop을 실행하면 필요한 도구를 설치하고 셸을 제공함- 이 방식은 Headscale 메인테이너와 동일한 개발 환경을 보장함
- Go 코드는
golangci-lint로 린트하고,golines,gofumpt로 포맷함golines폭은 88로 설정됨- 커밋 전
make lint와make fmt실행을 권장함
- Proto 코드는
buf로 린트하고clang-format으로 포맷함 - 문서는
mdformat, Markdown·YAML 등 나머지 파일은prettier로 포맷함 proto/변경 시 Protobuf에서 Go 코드 생성을 다시 해야 함- 명령어는
make generate gen/변경사항은 리뷰를 쉽게 하기 위해 별도 커밋으로 넣도록 권장함
- 명령어는
- 테스트와 빌드는 각각
make test,make build로 실행함 - 권장 워크플로는
nix develop이후make test,make build를 실행하는 방식임- 직접 의존성을 관리하는 경우 Make를 바로 사용할 수 있음
- Makefile은 필요한 도구가 없으면 경고하고
nix develop실행을 제안함 - 사용 가능한 대상은
make help로 확인함