import type { ActionFunctionArgs, LoaderFunctionArgs } from 'react-router'; import { useLoaderData } from 'react-router'; import Code from '~/components/Code'; import Notice from '~/components/Notice'; import type { LoadContext } from '~/server'; import ManageDomains from './components/manage-domains'; import ManageNS from './components/manage-ns'; import ManageRecords from './components/manage-records'; import RenameTailnet from './components/rename-tailnet'; import ToggleMagic from './components/toggle-magic'; import { dnsAction } from './dns-actions'; import ToggleOverrideLocalDns from './components/toggle-override-local-dns'; // We do not want to expose every config value export async function loader({ context }: LoaderFunctionArgs) { if (!context.hs.readable()) { throw new Error('No configuration is available'); } const config = context.hs.c!; const dns = { prefixes: config.prefixes, magicDns: config.dns.magic_dns, baseDomain: config.dns.base_domain, nameservers: config.dns.nameservers.global, splitDns: config.dns.nameservers.split, searchDomains: config.dns.search_domains, extraRecords: config.dns.extra_records, overrideLocalDns: config.dns.override_local_dns, }; return { ...dns, writable: context.hs.writable(), }; } export async function action(data: ActionFunctionArgs) { return dnsAction(data); } export default function Page() { const data = useLoaderData(); const allNs: Record = {}; for (const key of Object.keys(data.splitDns)) { allNs[key] = data.splitDns[key]; } allNs.global = data.nameservers; const isDisabled = data.writable === false; return (
{data.writable ? undefined : ( The Headscale configuration is read-only. You cannot make changes to the configuration )}

Local DNS Override

When enabled, Headscale will override the local DNS configuration of connected clients, forcing them to use the configured DNS servers.

Magic DNS

Automatically register domain names for each device on the tailnet. Devices will be accessible at{' '} [device]. {data.baseDomain} {' '} when Magic DNS is enabled.

); }