{ "slug": "technitium", "kind": "compose", "metadata": { "name": "Technitium DNS Server", "description": "Authoritative and recursive DNS server with a web console, DNS blocking, and optional forwarders for self-hosted networks.", "tags": [ "traefik", "network", "volume", "dns" ], "icon": { "provider": "selfhst", "id": "technitium" }, "draft": false, "version": { "name": "15.1.0", "source_dep_name": "docker.io/technitium/dns-server", "source_dep_version": "15.1.0" } }, "variables": [ { "title": "General", "name": "general", "items": [ { "name": "service_name", "type": "str", "title": "Service Name", "required": false, "default": "technitium", "config": { "placeholder": "technitium" } }, { "name": "container_name", "type": "str", "title": "Container Name", "required": false, "default": "technitium", "config": { "placeholder": "technitium" } }, { "name": "container_hostname", "type": "str", "title": "Container Hostname", "required": false, "default": "technitium", "config": { "placeholder": "technitium" } }, { "name": "restart_policy", "type": "enum", "title": "Restart Policy", "required": true, "default": "unless-stopped", "config": { "options": [ "unless-stopped", "always", "on-failure", "no" ] } } ] }, { "title": "DNS Server", "name": "dns-server", "items": [ { "name": "dns_server_domain", "type": "str", "title": "Server Domain", "required": true, "default": "dns-server", "config": { "placeholder": "dns-server" }, "description": "Primary domain name used by this DNS server to identify itself." }, { "name": "dns_server_admin_password", "type": "secret", "title": "Admin Password", "required": false, "description": "Initial admin password for the DNS web console.", "config": { "autogenerated": { "length": 32 } } }, { "name": "dns_server_recursion", "type": "enum", "title": "Recursion", "required": true, "default": "AllowOnlyForPrivateNetworks", "config": { "options": [ "Allow", "Deny", "AllowOnlyForPrivateNetworks", "UseSpecifiedNetworkACL" ] }, "description": "DNS recursion policy." }, { "name": "dns_server_forwarders", "type": "str", "title": "Forwarders", "required": false, "default": "1.1.1.1,9.9.9.9", "config": { "placeholder": "1.1.1.1,9.9.9.9" }, "description": "Comma-separated upstream DNS forwarders. Leave empty to use recursive resolution." }, { "name": "dns_server_forwarder_protocol", "type": "enum", "title": "Forwarder Protocol", "required": true, "default": "Udp", "config": { "options": [ "Udp", "Tcp", "Tls", "Https", "HttpsJson" ] }, "needs": [ "dns_server_forwarders" ] }, { "name": "dns_server_enable_blocking", "type": "bool", "title": "Enable Blocking", "required": false, "default": false }, { "name": "dns_server_optional_protocol_dns_over_http", "type": "bool", "title": "Enable DNS-over-HTTP", "required": false, "default": false, "description": "Enable Technitium's DNS-over-HTTP listener on port 80. This is required when running behind a TLS-terminating reverse proxy like Traefik and you want DNS-over-HTTPS on /dns-query." }, { "name": "dns_server_log_using_local_time", "type": "bool", "title": "Use Local Time For Logs", "required": false, "default": true } ] }, { "title": "Ports", "name": "ports", "items": [ { "name": "ports_web_http", "type": "int", "title": "Web Console Port", "required": false, "default": 5380, "config": { "placeholder": "5380" }, "description": "Host port exposed for the Technitium web console when Traefik is disabled." }, { "name": "ports_dns_over_http", "type": "int", "title": "DNS-over-HTTP Port", "required": false, "default": 80, "config": { "placeholder": "80" }, "description": "Host port exposed for Technitium DNS-over-HTTP when Traefik is disabled. Behind Traefik, /dns-query is routed to container port 80 instead.", "needs": [ "dns_server_optional_protocol_dns_over_http=true" ] }, { "name": "ports_dns_over_https", "type": "int", "title": "DNS-over-HTTPS Port", "required": false, "default": 443, "config": { "placeholder": "443" }, "description": "Host port exposed for native Technitium DNS-over-HTTPS when Traefik is disabled." }, { "name": "ports_dns", "type": "int", "title": "DNS Port", "required": true, "default": 53, "config": { "placeholder": "53" } } ] }, { "title": "Traefik", "name": "traefik", "toggle": "traefik_enabled", "items": [ { "name": "traefik_enabled", "type": "bool", "title": "Traefik", "required": false, "default": false }, { "name": "traefik_host", "type": "str", "title": "Host", "required": true, "config": { "placeholder": "technitium" } }, { "name": "traefik_domain", "type": "str", "title": "Domain", "required": true, "config": { "placeholder": "home.arpa" } }, { "name": "traefik_entrypoint", "type": "str", "title": "Entrypoint", "required": true, "default": "web", "config": { "placeholder": "web" } }, { "name": "traefik_network", "type": "str", "title": "Network", "required": true, "default": "traefik", "config": { "placeholder": "traefik" } }, { "name": "traefik_tls_enabled", "type": "bool", "title": "TLS", "required": false, "default": false }, { "name": "traefik_tls_entrypoint", "type": "str", "title": "TLS Entrypoint", "required": true, "default": "websecure", "config": { "placeholder": "websecure" }, "needs": [ "traefik_tls_enabled=true" ] }, { "name": "traefik_tls_certresolver", "type": "str", "title": "Cert Resolver", "required": true, "default": "cloudflare", "config": { "placeholder": "cloudflare" }, "needs": [ "traefik_tls_enabled=true" ] } ] }, { "title": "Network", "name": "network", "items": [ { "name": "network_mode", "type": "str", "title": "Network Mode", "required": false, "description": "Network mode. Use bridge for normal Docker networking, macvlan for a dedicated LAN IP, or host for DHCP-style deployments." }, { "name": "network_name", "type": "str", "title": "Network Name", "required": false, "default": "technitium_network", "config": { "placeholder": "technitium_network" } }, { "name": "network_macvlan_ipv4_address", "type": "str", "title": "IPv4 Address", "required": true, "default": "IP_ADDRESS", "needs": [ "network_mode=macvlan" ], "config": { "placeholder": "IP_ADDRESS" }, "description": "Static IPv4 address for the macvlan network." }, { "name": "network_macvlan_parent_interface", "type": "str", "title": "Parent Interface", "required": true, "default": "eth0", "needs": [ "network_mode=macvlan" ], "config": { "placeholder": "eth0" }, "description": "Parent interface for the macvlan network." }, { "name": "network_macvlan_subnet", "type": "str", "title": "Subnet", "required": true, "default": "IP_RANGE", "needs": [ "network_mode=macvlan" ], "config": { "placeholder": "IP_RANGE" }, "description": "Subnet for the macvlan network." }, { "name": "network_macvlan_gateway", "type": "str", "title": "Gateway", "required": true, "default": "GATEWAY", "needs": [ "network_mode=macvlan" ], "config": { "placeholder": "GATEWAY" }, "description": "Gateway for the macvlan network." }, { "name": "network_external", "type": "bool", "title": "External Network", "required": false, "default": false } ] }, { "title": "Volume", "name": "volume", "items": [ { "name": "volume_mode", "type": "enum", "title": "Volume Mode", "required": true, "default": "local", "config": { "options": [ "local", "mount", "nfs" ] } }, { "name": "volume_mount_path", "type": "str", "title": "Volume Mount Path", "required": true, "default": "/data", "needs": [ "volume_mode=mount" ], "config": { "placeholder": "/data" } }, { "name": "volume_nfs_server", "type": "str", "title": "Volume Nfs Server", "required": true, "default": "NFS_SERVER", "needs": [ "volume_mode=nfs" ], "config": { "placeholder": "NFS_SERVER" } }, { "name": "volume_nfs_path", "type": "str", "title": "Volume Nfs Path", "required": true, "default": "/export", "needs": [ "volume_mode=nfs" ], "config": { "placeholder": "/export" } }, { "name": "volume_nfs_options", "type": "str", "title": "Volume Nfs Options", "required": true, "default": "rw,nolock,soft", "needs": [ "volume_mode=nfs" ], "config": { "placeholder": "rw,nolock,soft" } } ] } ] }