mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Merge branch 'main' into embedded-derp
This commit is contained in:
		
						commit
						237f7f1027
					
				| @ -18,6 +18,7 @@ | ||||
| - Add support for writing ACL files with YAML [#359](https://github.com/juanfont/headscale/pull/359) | ||||
| - Users can now use emails in ACL's groups [#372](https://github.com/juanfont/headscale/issues/372) | ||||
| - Add shorthand aliases for commands and subcommands [#376](https://github.com/juanfont/headscale/pull/376) | ||||
| - Add `/windows` endpoint for Windows configuration instructions + registry file download [#392](https://github.com/juanfont/headscale/pull/392) | ||||
| 
 | ||||
| ### Changes | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| # Builder image | ||||
| FROM docker.io/golang:1.17.7-bullseye AS build | ||||
| FROM docker.io/golang:1.17.8-bullseye AS build | ||||
| ENV GOPATH /go | ||||
| WORKDIR /go/src/headscale | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| # Builder image | ||||
| FROM docker.io/golang:1.17.7-alpine AS build | ||||
| FROM docker.io/golang:1.17.8-alpine AS build | ||||
| ENV GOPATH /go | ||||
| WORKDIR /go/src/headscale | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| # Builder image | ||||
| FROM docker.io/golang:1.17.7-bullseye AS build | ||||
| FROM docker.io/golang:1.17.8-bullseye AS build | ||||
| ENV GOPATH /go | ||||
| WORKDIR /go/src/headscale | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										43
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								README.md
									
									
									
									
									
								
							| @ -198,6 +198,13 @@ make build | ||||
|             <sub style="font-size:14px"><b>Alessandro (Ale) Segala</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/e-zk> | ||||
|             <img src=https://avatars.githubusercontent.com/u/58356365?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=e-zk/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>e-zk</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/unreality> | ||||
|             <img src=https://avatars.githubusercontent.com/u/352522?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=unreality/> | ||||
| @ -206,10 +213,10 @@ make build | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/e-zk> | ||||
|             <img src=https://avatars.githubusercontent.com/u/58356365?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=e-zk/> | ||||
|         <a href=https://github.com/reynico> | ||||
|             <img src=https://avatars.githubusercontent.com/u/715768?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Nico/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>e-zk</b></sub> | ||||
|             <sub style="font-size:14px"><b>Nico</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
| @ -226,6 +233,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Aaron Bieber</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/fdelucchijr> | ||||
|             <img src=https://avatars.githubusercontent.com/u/69133647?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Fernando De Lucchi/> | ||||
| @ -233,8 +242,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Fernando De Lucchi</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/hdhoang> | ||||
|             <img src=https://avatars.githubusercontent.com/u/12537?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Hoàng Đức Hiếu/> | ||||
| @ -270,6 +277,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Silver Bullet</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/majst01> | ||||
|             <img src=https://avatars.githubusercontent.com/u/410110?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Stefan Majer/> | ||||
| @ -277,13 +286,11 @@ make build | ||||
|             <sub style="font-size:14px"><b>Stefan Majer</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/fincac> | ||||
|             <img src=https://avatars.githubusercontent.com/u/98844035?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=fincac/> | ||||
|         <a href=https://github.com/lachy2849> | ||||
|             <img src=https://avatars.githubusercontent.com/u/98844035?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=lachy2849/> | ||||
|             <br /> | ||||
|             <sub style="font-size:14px"><b>fincac</b></sub> | ||||
|             <sub style="font-size:14px"><b>lachy2849</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
| @ -314,6 +321,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Arthur Woimbée</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/stensonb> | ||||
|             <img src=https://avatars.githubusercontent.com/u/933389?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Bryan Stenson/> | ||||
| @ -321,8 +330,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Bryan Stenson</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/fkr> | ||||
|             <img src=https://avatars.githubusercontent.com/u/51063?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Felix Kronlage-Dammers/> | ||||
| @ -358,6 +365,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Jim Tittsler</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/piec> | ||||
|             <img src=https://avatars.githubusercontent.com/u/781471?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Pierre Carru/> | ||||
| @ -365,8 +374,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>Pierre Carru</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/rcursaru> | ||||
|             <img src=https://avatars.githubusercontent.com/u/16259641?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=rcursaru/> | ||||
| @ -402,6 +409,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>Teteros</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/gitter-badger> | ||||
|             <img src=https://avatars.githubusercontent.com/u/8518239?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=The Gitter Badger/> | ||||
| @ -409,8 +418,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>The Gitter Badger</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/tianon> | ||||
|             <img src=https://avatars.githubusercontent.com/u/161631?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Tianon Gravi/> | ||||
| @ -446,6 +453,8 @@ make build | ||||
|             <sub style="font-size:14px"><b>derelm</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/ignoramous> | ||||
|             <img src=https://avatars.githubusercontent.com/u/852289?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=ignoramous/> | ||||
| @ -453,8 +462,6 @@ make build | ||||
|             <sub style="font-size:14px"><b>ignoramous</b></sub> | ||||
|         </a> | ||||
|     </td> | ||||
| </tr> | ||||
| <tr> | ||||
|     <td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0"> | ||||
|         <a href=https://github.com/lion24> | ||||
|             <img src=https://avatars.githubusercontent.com/u/1382102?v=4 width="100;"  style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=lion24/> | ||||
|  | ||||
							
								
								
									
										4
									
								
								app.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								app.go
									
									
									
									
									
								
							| @ -508,8 +508,10 @@ func (h *Headscale) createRouter(grpcMux *runtime.ServeMux) *gin.Engine { | ||||
| 	router.POST("/machine/:id", h.RegistrationHandler) | ||||
| 	router.GET("/oidc/register/:mkey", h.RegisterOIDC) | ||||
| 	router.GET("/oidc/callback", h.OIDCCallback) | ||||
| 	router.GET("/apple", h.AppleMobileConfig) | ||||
| 	router.GET("/apple", h.AppleConfigMessage) | ||||
| 	router.GET("/apple/:platform", h.ApplePlatformConfig) | ||||
| 	router.GET("/windows", h.WindowsConfigMessage) | ||||
| 	router.GET("/windows/tailscale.reg", h.WindowsRegConfig) | ||||
| 	router.GET("/swagger", SwaggerUI) | ||||
| 	router.GET("/swagger/v1/openapiv2.json", SwaggerAPIv1) | ||||
| 
 | ||||
|  | ||||
| @ -128,7 +128,7 @@ tls_client_auth_mode: relaxed | ||||
| tls_letsencrypt_cache_dir: /var/lib/headscale/cache | ||||
| 
 | ||||
| # Type of ACME challenge to use, currently supported types: | ||||
| # HTTP-01 or TLS_ALPN-01 | ||||
| # HTTP-01 or TLS-ALPN-01 | ||||
| # See [docs/tls.md](docs/tls.md) for more information | ||||
| tls_letsencrypt_challenge_type: HTTP-01 | ||||
| # When HTTP-01 challenge is chosen, letsencrypt must set up a | ||||
|  | ||||
| @ -11,26 +11,118 @@ import ( | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| 
 | ||||
| // AppleMobileConfig shows a simple message in the browser to point to the CLI
 | ||||
| // Listens in /register.
 | ||||
| func (h *Headscale) AppleMobileConfig(ctx *gin.Context) { | ||||
| // WindowsConfigMessage shows a simple message in the browser for how to configure the Windows Tailscale client.
 | ||||
| func (h *Headscale) WindowsConfigMessage(ctx *gin.Context) { | ||||
| 	winTemplate := template.Must(template.New("windows").Parse(` | ||||
| <html> | ||||
| 	<body> | ||||
| 		<h1>headscale</h1> | ||||
| 		<h2>Windows registry configuration</h2> | ||||
| 		<p> | ||||
| 		    This page provides Windows registry information for the official Windows Tailscale client. | ||||
| 		<p> | ||||
| 		<p> | ||||
| 		    The registry file will configure Tailscale to use <code>{{.URL}}</code> as its control server. | ||||
| 		<p> | ||||
| 		<h3>Caution</h3> | ||||
| 		<p>You should always download and inspect the registry file before installing it:</p> | ||||
| 		<pre><code>curl {{.URL}}/windows/tailscale.reg</code></pre> | ||||
| 
 | ||||
| 		<h2>Installation</h2> | ||||
| 		<p>Headscale can be set to the default server by running the registry file:</p> | ||||
| 
 | ||||
| 		<p> | ||||
| 		    <a href="/windows/tailscale.reg" download="tailscale.reg">Windows registry file</a> | ||||
| 		</p> | ||||
| 
 | ||||
| 		<ol> | ||||
| 			<li>Download the registry file, then run it</li> | ||||
| 			<li>Follow the prompts</li> | ||||
| 			<li>Install and run the official windows Tailscale client</li> | ||||
| 			<li>When the installation has finished, start Tailscale, and log in by clicking the icon in the system tray</li> | ||||
| 		</ol> | ||||
| 		<p>Or</p> | ||||
| 		<p>Open command prompt with Administrator rights. Issue the following commands to add the required registry entries:</p> | ||||
| 		<pre> | ||||
| <code>REG ADD "HKLM\Software\Tailscale IPN" /v UnattendedMode /t REG_SZ /d always | ||||
| REG ADD "HKLM\Software\Tailscale IPN" /v LoginURL /t REG_SZ /d "{{.URL}}"</code></pre> | ||||
| 		<p> | ||||
| 		    Restart Tailscale and log in. | ||||
| 		<p> | ||||
| 	</body> | ||||
| </html> | ||||
| `)) | ||||
| 
 | ||||
| 	config := map[string]interface{}{ | ||||
| 		"URL": h.cfg.ServerURL, | ||||
| 	} | ||||
| 
 | ||||
| 	var payload bytes.Buffer | ||||
| 	if err := winTemplate.Execute(&payload, config); err != nil { | ||||
| 		log.Error(). | ||||
| 			Str("handler", "WindowsRegConfig"). | ||||
| 			Err(err). | ||||
| 			Msg("Could not render Windows index template") | ||||
| 		ctx.Data( | ||||
| 			http.StatusInternalServerError, | ||||
| 			"text/html; charset=utf-8", | ||||
| 			[]byte("Could not render Windows index template"), | ||||
| 		) | ||||
| 
 | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	ctx.Data(http.StatusOK, "text/html; charset=utf-8", payload.Bytes()) | ||||
| } | ||||
| 
 | ||||
| // WindowsRegConfig generates and serves a .reg file configured with the Headscale server address.
 | ||||
| func (h *Headscale) WindowsRegConfig(ctx *gin.Context) { | ||||
| 	config := WindowsRegistryConfig{ | ||||
| 		URL: h.cfg.ServerURL, | ||||
| 	} | ||||
| 
 | ||||
| 	var content bytes.Buffer | ||||
| 	if err := windowsRegTemplate.Execute(&content, config); err != nil { | ||||
| 		log.Error(). | ||||
| 			Str("handler", "WindowsRegConfig"). | ||||
| 			Err(err). | ||||
| 			Msg("Could not render Apple macOS template") | ||||
| 		ctx.Data( | ||||
| 			http.StatusInternalServerError, | ||||
| 			"text/html; charset=utf-8", | ||||
| 			[]byte("Could not render Windows registry template"), | ||||
| 		) | ||||
| 
 | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	ctx.Data( | ||||
| 		http.StatusOK, | ||||
| 		"text/x-ms-regedit; charset=utf-8", | ||||
| 		content.Bytes(), | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| // AppleConfigMessage shows a simple message in the browser to point the user to the iOS/MacOS profile and instructions for how to install it.
 | ||||
| func (h *Headscale) AppleConfigMessage(ctx *gin.Context) { | ||||
| 	appleTemplate := template.Must(template.New("apple").Parse(` | ||||
| <html> | ||||
| 	<body> | ||||
| 		<h1>Apple configuration profiles</h1> | ||||
| 		<h1>headscale</h1> | ||||
| 		<h2>Apple configuration profiles</h2> | ||||
| 		<p> | ||||
| 		    This page provides <a href="https://support.apple.com/guide/mdm/mdm-overview-mdmbf9e668/web">configuration profiles</a> for the official Tailscale clients for <a href="https://apps.apple.com/us/app/tailscale/id1470499037?ls=1">iOS</a> and <a href="https://apps.apple.com/ca/app/tailscale/id1475387142?mt=12">macOS</a>. | ||||
| 		</p> | ||||
| 		<p> | ||||
| 		    The profiles will configure Tailscale.app to use {{.Url}} as its control server. | ||||
| 		    The profiles will configure Tailscale.app to use <code>{{.URL}}</code> as its control server. | ||||
| 		</p> | ||||
| 
 | ||||
| 		<h3>Caution</h3> | ||||
| 		<p>You should always inspect the profile before installing it:</p> | ||||
| 		<p>You should always download and inspect the profile before installing it:</p> | ||||
| 		<!-- | ||||
| 		<p><code>curl {{.Url}}/apple/ios</code></p> | ||||
| 		<pre><code>curl {{.URL}}/apple/ios</code></pre> | ||||
| 		--> | ||||
| 		<p><code>curl {{.Url}}/apple/macos</code></p> | ||||
| 		<pre><code>curl {{.URL}}/apple/macos</code></pre> | ||||
| 
 | ||||
| 		<h2>Profiles</h2> | ||||
| 
 | ||||
| @ -192,6 +284,10 @@ func (h *Headscale) ApplePlatformConfig(ctx *gin.Context) { | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| type WindowsRegistryConfig struct { | ||||
| 	URL string | ||||
| } | ||||
| 
 | ||||
| type AppleMobileConfig struct { | ||||
| 	UUID    uuid.UUID | ||||
| 	URL     string | ||||
| @ -203,6 +299,14 @@ type AppleMobilePlatformConfig struct { | ||||
| 	URL  string | ||||
| } | ||||
| 
 | ||||
| var windowsRegTemplate = textTemplate.Must( | ||||
| 	textTemplate.New("windowsconfig").Parse(`Windows Registry Editor Version 5.00 | ||||
| 
 | ||||
| [HKEY_LOCAL_MACHINE\SOFTWARE\Tailscale IPN] | ||||
| "UnattendedMode"="always" | ||||
| "LoginURL"="{{.URL}}" | ||||
| `)) | ||||
| 
 | ||||
| var commonTemplate = textTemplate.Must( | ||||
| 	textTemplate.New("mobileconfig").Parse(`<?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user