mirror of
https://github.com/tale/headplane.git
synced 2026-07-28 00:28:56 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a0d6905123 | |||
| 4095ed2a68 | |||
| 58e98278d1 |
@@ -1,3 +1,7 @@
|
|||||||
|
### 0.3.0 (September 25, 2024)
|
||||||
|
- Bumped the minimum supported version of Headscale to 0.23.
|
||||||
|
- Updated the UI to respect `dns.use_username_in_magic_dns`.
|
||||||
|
|
||||||
### 0.2.4 (August 24, 2024)
|
### 0.2.4 (August 24, 2024)
|
||||||
- Removed ACL management from the integration since Headscale 0.23-beta2 now supports it natively.
|
- Removed ACL management from the integration since Headscale 0.23-beta2 now supports it natively.
|
||||||
- Removed the `ACL_FILE` environment variable since it's no longer needed.
|
- Removed the `ACL_FILE` environment variable since it's no longer needed.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export default function Modal({ name, disabled }: Properties) {
|
|||||||
Devices are accessible at
|
Devices are accessible at
|
||||||
{' '}
|
{' '}
|
||||||
<Code>
|
<Code>
|
||||||
[device].[user].{name}
|
[device].{name}
|
||||||
</Code>
|
</Code>
|
||||||
{' '}
|
{' '}
|
||||||
when Magic DNS is enabled.
|
when Magic DNS is enabled.
|
||||||
|
|||||||
@@ -25,7 +25,9 @@ export async function loader() {
|
|||||||
const dns = {
|
const dns = {
|
||||||
prefixes: config.prefixes,
|
prefixes: config.prefixes,
|
||||||
magicDns: config.dns.magic_dns,
|
magicDns: config.dns.magic_dns,
|
||||||
baseDomain: config.dns.base_domain,
|
baseDomain: config.dns.use_username_in_magic_dns
|
||||||
|
? `[user].${config.dns.base_domain}`
|
||||||
|
: config.dns.base_domain,
|
||||||
nameservers: config.dns.nameservers.global,
|
nameservers: config.dns.nameservers.global,
|
||||||
splitDns: config.dns.nameservers.split,
|
splitDns: config.dns.nameservers.split,
|
||||||
searchDomains: config.dns.search_domains,
|
searchDomains: config.dns.search_domains,
|
||||||
@@ -107,7 +109,7 @@ export default function Page() {
|
|||||||
on the tailnet. Devices will be accessible at
|
on the tailnet. Devices will be accessible at
|
||||||
{' '}
|
{' '}
|
||||||
<Code>
|
<Code>
|
||||||
[device].[user].
|
[device].
|
||||||
{data.baseDomain}
|
{data.baseDomain}
|
||||||
</Code>
|
</Code>
|
||||||
{' '}
|
{' '}
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ export default function MachineRow({ machine, routes, magic, users }: Props) {
|
|||||||
tags.unshift('Expired')
|
tags.unshift('Expired')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let prefix = magic?.startsWith('[user]')
|
||||||
|
? magic.replace('[user]', machine.user.name)
|
||||||
|
: magic
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={machine.id}
|
key={machine.id}
|
||||||
@@ -102,16 +106,14 @@ export default function MachineRow({ machine, routes, magic, users }: Props) {
|
|||||||
'justify-between w-full break-keep',
|
'justify-between w-full break-keep',
|
||||||
)}
|
)}
|
||||||
onPress={async () => {
|
onPress={async () => {
|
||||||
const ip = `${machine.givenName}.${machine.user.name}.${magic}`
|
const ip = `${machine.givenName}.${prefix}`
|
||||||
await navigator.clipboard.writeText(ip)
|
await navigator.clipboard.writeText(ip)
|
||||||
toast('Copied hostname to clipboard')
|
toast('Copied hostname to clipboard')
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{machine.givenName}
|
{machine.givenName}
|
||||||
.
|
.
|
||||||
{machine.user.name}
|
{prefix}
|
||||||
.
|
|
||||||
{magic}
|
|
||||||
<CopyIcon className="w-3 h-3" />
|
<CopyIcon className="w-3 h-3" />
|
||||||
</Menu.ItemButton>
|
</Menu.ItemButton>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
|||||||
if (config.dns.magic_dns) {
|
if (config.dns.magic_dns) {
|
||||||
magic = config.dns.base_domain
|
magic = config.dns.base_domain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.dns.use_username_in_magic_dns) {
|
||||||
|
magic = `[user].${magic}`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -76,7 +80,7 @@ export default function Page() {
|
|||||||
based on their name and also at
|
based on their name and also at
|
||||||
{' '}
|
{' '}
|
||||||
<Code>
|
<Code>
|
||||||
[name].[user].
|
[name].
|
||||||
{data.magic}
|
{data.magic}
|
||||||
</Code>
|
</Code>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ export default function Add({ magic }: Props) {
|
|||||||
{' '}
|
{' '}
|
||||||
<Code>
|
<Code>
|
||||||
[machine].
|
[machine].
|
||||||
{username.length > 0 ? username : '[username]'}
|
|
||||||
.
|
.
|
||||||
{magic}
|
{magic}
|
||||||
</Code>
|
</Code>
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ export default function Rename({ username, magic }: Props) {
|
|||||||
{' '}
|
{' '}
|
||||||
<Code>
|
<Code>
|
||||||
[machine].
|
[machine].
|
||||||
{newName.length > 0 ? newName : '[new-username]'}
|
|
||||||
.
|
.
|
||||||
{magic}
|
{magic}
|
||||||
</Code>
|
</Code>
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ ACLs when the file is changed.
|
|||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
- Headscale 0.23 beta-2 or later
|
- Headscale 0.23 or newer
|
||||||
- Headscale and Headplane need a Reverse Proxy (NGINX, Traefik, Caddy, etc)
|
- Headscale and Headplane need a Reverse Proxy (NGINX, Traefik, Caddy, etc)
|
||||||
|
|
||||||
Currently there are 3 integration providers that can do this for you:
|
Currently there are 3 integration providers that can do this for you:
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Headplane in a production environment.
|
|||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
- Headscale 0.23 beta-2 or later
|
- Headscale 0.23 or newer
|
||||||
- Headscale and Headplane need a Reverse Proxy (NGINX, Traefik, Caddy, etc)
|
- Headscale and Headplane need a Reverse Proxy (NGINX, Traefik, Caddy, etc)
|
||||||
|
|
||||||
Docker heavily simplifies the deployment process, but this process can be
|
Docker heavily simplifies the deployment process, but this process can be
|
||||||
@@ -29,7 +29,7 @@ Here is a simple Docker Compose deployment:
|
|||||||
services:
|
services:
|
||||||
headplane:
|
headplane:
|
||||||
container_name: headplane
|
container_name: headplane
|
||||||
image: ghcr.io/tale/headplane:latest
|
image: ghcr.io/tale/headplane:0.3.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- '3000:3000'
|
- '3000:3000'
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ that you'll NEED to setup a reverse proxy and this is incomplete:
|
|||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
headscale:
|
headscale:
|
||||||
image: 'headscale/headscale:0.23.0-beta2'
|
image: 'headscale/headscale:0.23.0'
|
||||||
container_name: 'headscale'
|
container_name: 'headscale'
|
||||||
restart: 'unless-stopped'
|
restart: 'unless-stopped'
|
||||||
command: 'serve'
|
command: 'serve'
|
||||||
@@ -50,7 +50,7 @@ services:
|
|||||||
TZ: 'America/New_York'
|
TZ: 'America/New_York'
|
||||||
headplane:
|
headplane:
|
||||||
container_name: headplane
|
container_name: headplane
|
||||||
image: ghcr.io/tale/headplane:latest
|
image: ghcr.io/tale/headplane:0.3.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- './data:/var/lib/headscale'
|
- './data:/var/lib/headscale'
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ spec:
|
|||||||
serviceAccountName: default
|
serviceAccountName: default
|
||||||
containers:
|
containers:
|
||||||
- name: headplane
|
- name: headplane
|
||||||
image: ghcr.io/tale/headplane:latest
|
image: ghcr.io/tale/headplane:0.3.0
|
||||||
env:
|
env:
|
||||||
- name: COOKIE_SECRET
|
- name: COOKIE_SECRET
|
||||||
value: 'abcdefghijklmnopqrstuvwxyz'
|
value: 'abcdefghijklmnopqrstuvwxyz'
|
||||||
@@ -107,7 +107,7 @@ spec:
|
|||||||
mountPath: /etc/headscale
|
mountPath: /etc/headscale
|
||||||
|
|
||||||
- name: headscale
|
- name: headscale
|
||||||
image: headscale/headscale:0.23.0-beta2
|
image: headscale/headscale:0.23.0
|
||||||
command: ['serve']
|
command: ['serve']
|
||||||
env:
|
env:
|
||||||
- name: TZ
|
- name: TZ
|
||||||
|
|||||||
Reference in New Issue
Block a user