mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			149 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  description = "headscale - Open Source Tailscale Control server";
 | 
						|
 | 
						|
  inputs = {
 | 
						|
    # TODO: Use unstable when Go 1.18 has made it in
 | 
						|
    # https://nixpk.gs/pr-tracker.html?pr=164292
 | 
						|
    # nixpkgs.url = "nixpkgs/nixpkgs-unstable";
 | 
						|
    nixpkgs.url = "nixpkgs/master";
 | 
						|
    flake-utils.url = "github:numtide/flake-utils";
 | 
						|
  };
 | 
						|
 | 
						|
  outputs = { self, nixpkgs, flake-utils, ... }:
 | 
						|
    let
 | 
						|
      headscaleVersion = if (self ? shortRev) then self.shortRev else "dev";
 | 
						|
    in
 | 
						|
    {
 | 
						|
      overlay = final: prev:
 | 
						|
        let
 | 
						|
          pkgs = nixpkgs.legacyPackages.${prev.system};
 | 
						|
        in
 | 
						|
        rec {
 | 
						|
          golines =
 | 
						|
            pkgs.buildGoModule rec {
 | 
						|
              pname = "golines";
 | 
						|
              version = "0.9.0";
 | 
						|
 | 
						|
              src = pkgs.fetchFromGitHub {
 | 
						|
                owner = "segmentio";
 | 
						|
                repo = "golines";
 | 
						|
                rev = "v${version}";
 | 
						|
                sha256 = "sha256-BUXEg+4r9L/gqe4DhTlhN55P3jWt7ZyWFQycO6QePrw=";
 | 
						|
              };
 | 
						|
 | 
						|
              vendorSha256 = "sha256-sEzWUeVk5GB0H41wrp12P8sBWRjg0FHUX6ABDEEBqK8=";
 | 
						|
 | 
						|
              nativeBuildInputs = [ pkgs.installShellFiles ];
 | 
						|
            };
 | 
						|
 | 
						|
          protoc-gen-grpc-gateway =
 | 
						|
            pkgs.buildGoModule rec {
 | 
						|
              pname = "grpc-gateway";
 | 
						|
              version = "2.8.0";
 | 
						|
 | 
						|
              src = pkgs.fetchFromGitHub {
 | 
						|
                owner = "grpc-ecosystem";
 | 
						|
                repo = "grpc-gateway";
 | 
						|
                rev = "v${version}";
 | 
						|
                sha256 = "sha256-8eBBBYJ+tBjB2fgPMX/ZlbN3eeS75e8TAZYOKXs6hcg=";
 | 
						|
              };
 | 
						|
 | 
						|
              vendorSha256 = "sha256-AW2Gn/mlZyLMwF+NpK59eiOmQrYWW/9HPjbunYc9Ij4=";
 | 
						|
 | 
						|
              nativeBuildInputs = [ pkgs.installShellFiles ];
 | 
						|
 | 
						|
              subPackages = [ "protoc-gen-grpc-gateway" "protoc-gen-openapiv2" ];
 | 
						|
            };
 | 
						|
 | 
						|
          headscale =
 | 
						|
            pkgs.buildGo118Module rec {
 | 
						|
              pname = "headscale";
 | 
						|
              version = headscaleVersion;
 | 
						|
              src = pkgs.lib.cleanSource self;
 | 
						|
 | 
						|
              # When updating go.mod or go.sum, a new sha will need to be calculated,
 | 
						|
              # update this if you have a mismatch after doing a change to thos files.
 | 
						|
              vendorSha256 = "sha256-bYEN0Rz7D1oJIIUjAHxdPB0CkVlb91f1lIQbucLnirg=";
 | 
						|
 | 
						|
              ldflags = [ "-s" "-w" "-X github.com/juanfont/headscale/cmd/headscale/cli.Version=v${version}" ];
 | 
						|
            };
 | 
						|
        };
 | 
						|
    } // flake-utils.lib.eachDefaultSystem
 | 
						|
      (system:
 | 
						|
        let
 | 
						|
          pkgs = import nixpkgs {
 | 
						|
            overlays = [ self.overlay ];
 | 
						|
            inherit system;
 | 
						|
          };
 | 
						|
          buildDeps = with pkgs; [ git go_1_18 gnumake ];
 | 
						|
          devDeps = with pkgs;
 | 
						|
            buildDeps ++ [
 | 
						|
              golangci-lint
 | 
						|
              golines
 | 
						|
              nodePackages.prettier
 | 
						|
 | 
						|
              # Protobuf dependencies
 | 
						|
              protobuf
 | 
						|
              protoc-gen-go
 | 
						|
              protoc-gen-go-grpc
 | 
						|
              protoc-gen-grpc-gateway
 | 
						|
              buf
 | 
						|
              clang-tools # clang-format
 | 
						|
            ];
 | 
						|
 | 
						|
 | 
						|
          # Add entry to build a docker image with headscale
 | 
						|
          # caveat: only works on Linux
 | 
						|
          #
 | 
						|
          # Usage:
 | 
						|
          # nix build .#headscale-docker
 | 
						|
          # docker load < result
 | 
						|
          headscale-docker = pkgs.dockerTools.buildLayeredImage {
 | 
						|
            name = "headscale";
 | 
						|
            tag = headscaleVersion;
 | 
						|
            contents = [ pkgs.headscale ];
 | 
						|
            config.Entrypoint = [ (pkgs.headscale + "/bin/headscale") ];
 | 
						|
          };
 | 
						|
        in
 | 
						|
        rec {
 | 
						|
          # `nix develop`
 | 
						|
          devShell = pkgs.mkShell { buildInputs = devDeps; };
 | 
						|
 | 
						|
          # `nix build`
 | 
						|
          packages = with pkgs; {
 | 
						|
            inherit headscale;
 | 
						|
            inherit headscale-docker;
 | 
						|
          };
 | 
						|
 | 
						|
          defaultPackage = pkgs.headscale;
 | 
						|
 | 
						|
          # `nix run`
 | 
						|
          apps.headscale = flake-utils.lib.mkApp {
 | 
						|
            drv = packages.headscale;
 | 
						|
          };
 | 
						|
          defaultApp = apps.headscale;
 | 
						|
 | 
						|
          checks = {
 | 
						|
            format = pkgs.runCommand "check-format"
 | 
						|
              {
 | 
						|
                buildInputs = with pkgs; [
 | 
						|
                  gnumake
 | 
						|
                  nixpkgs-fmt
 | 
						|
                  golangci-lint
 | 
						|
                  nodePackages.prettier
 | 
						|
                  golines
 | 
						|
                  clang-tools
 | 
						|
                ];
 | 
						|
              } ''
 | 
						|
              ${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt ${./.}
 | 
						|
              ${pkgs.golangci-lint}/bin/golangci-lint run --fix --timeout 10m
 | 
						|
              ${pkgs.nodePackages.prettier}/bin/prettier --write '**/**.{ts,js,md,yaml,yml,sass,css,scss,html}'
 | 
						|
              ${pkgs.golines}/bin/golines --max-len=88 --base-formatter=gofumpt -w ${./.}
 | 
						|
              ${pkgs.clang-tools}/bin/clang-format -style="{BasedOnStyle: Google, IndentWidth: 4, AlignConsecutiveDeclarations: true, AlignConsecutiveAssignments: true, ColumnLimit: 0}" -i ${./.}
 | 
						|
            '';
 | 
						|
          };
 | 
						|
 | 
						|
 | 
						|
        });
 | 
						|
}
 |