{
  "schema_version": 1,
  "generated_at": "2026-10-22T00:00:00.000Z",
  "canonical_url": "https://openlogs.fyi/tools/technitium-dns-server",
  "slug": "technitium-dns-server",
  "name": "Technitium DNS Server",
  "tagline": "DNS server with a web console for hosting zones and blocking domains.",
  "replaces": {
    "summary": "Paid DNS filtering services, such as NextDNS.",
    "products": [
      {
        "slug": "nextdns",
        "name": "NextDNS",
        "vendor": "NextDNS",
        "url": "https://openlogs.fyi/alternatives/nextdns"
      }
    ]
  },
  "stack": [
    {
      "kind": "language",
      "name": "C#"
    }
  ],
  "deployment_methods": [
    "docker_compose"
  ],
  "requirements": {
    "min_ram_mb": null,
    "min_cpu_cores": null,
    "source_url": null
  },
  "license": {
    "spdx": "GPL-3.0",
    "class": "osi",
    "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/LICENSE"
  },
  "business_model": {
    "value": "unknown",
    "notes": "The README at the pinned commit does not state a business model, so it stays unknown.",
    "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/README.md",
    "checked_at": "2026-10-22"
  },
  "difficulty": {
    "value": "easy",
    "reason": "1 service, 2 volume mounts, no env values to set, no elevated host access. Heuristic score 1 of 11: easy."
  },
  "repository": {
    "owner": "TechnitiumSoftware",
    "name": "DnsServer",
    "url": "https://github.com/TechnitiumSoftware/DnsServer"
  },
  "compose_check": {
    "status": "config_ok",
    "validated_at": "2026-10-22",
    "summary": "config_ok on 2026-10-22"
  },
  "recipe": {
    "version": 1,
    "source_path": "docker-compose.yml",
    "source_repo": "TechnitiumSoftware/DnsServer",
    "source_commit_sha": "0dd592aad21eced4221a9a46204cb1a299972ca0",
    "source_kind": "app_repo",
    "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml"
  },
  "install_steps": [
    {
      "order": 1,
      "kind": "prerequisite",
      "language": "text",
      "label": "Docker with the Compose plugin",
      "body": "A host with Docker and the Docker Compose plugin. This entry runs from a compose file.",
      "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 2,
      "kind": "compose",
      "language": "yaml",
      "label": "Save the compose file as docker-compose.yml",
      "body": "services:\n  dns-server:\n    container_name: dns-server\n    hostname: dns-server\n    image: docker.io/technitium/dns-server:latest\n    # For DHCP deployments, use \"host\" network mode and remove all the port mappings, including the ports array by commenting them\n    # network_mode: \"host\"\n    ports:\n      - \"5380:5380/tcp\" #DNS web console (HTTP)\n      # - \"53443:53443/tcp\" #DNS web console (HTTPS)\n      - \"53:53/udp\" #DNS service\n      - \"53:53/tcp\" #DNS service\n      # - \"853:853/udp\" #DNS-over-QUIC service\n      # - \"853:853/tcp\" #DNS-over-TLS service\n      # - \"443:443/udp\" #DNS-over-HTTPS service (HTTP/3)\n      # - \"443:443/tcp\" #DNS-over-HTTPS service (HTTP/1.1, HTTP/2)\n      # - \"80:80/tcp\" #DNS-over-HTTP service (use with reverse proxy or certbot certificate renewal)\n      # - \"8053:8053/tcp\" #DNS-over-HTTP service (use with reverse proxy)\n      # - \"67:67/udp\" #DHCP service\n    environment:\n      - DNS_SERVER_DOMAIN=dns-server #The primary fully qualified domain name used by this DNS Server to identify itself.\n      # - DNS_SERVER_ADMIN_PASSWORD=password #DNS web console admin user password.\n      # - DNS_SERVER_ADMIN_PASSWORD_FILE=password.txt #The path to a file that contains a plain text password for the DNS web console admin user.\n      # - DNS_SERVER_PREFER_IPV6=false #DNS Server will use IPv6 for querying whenever possible with this option enabled.\n      # - DNS_SERVER_WEB_SERVICE_LOCAL_ADDRESSES=172.17.0.1,127.0.0.1 #Comma separated list of network interface IP addresses that you want the web service to listen on for requests. The \"172.17.0.1\" address is the built-in Docker bridge. The \"[::]\" is the default value if not specified. Note! This must be used only with \"host\" network mode.\n      # - DNS_SERVER_WEB_SERVICE_HTTP_PORT=5380 #The TCP port number for the DNS web console over HTTP protocol.\n      # - DNS_SERVER_WEB_SERVICE_HTTPS_PORT=53443 #The TCP port number for the DNS web console over HTTPS protocol.\n      # - DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=false #Enables HTTPS for the DNS web console.\n      # - DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=false #Enables self signed TLS certificate for the DNS web console.\n      # - DNS_SERVER_WEB_SERVICE_TLS_CERTIFICATE_PATH=/etc/dns/tls/cert.pfx #The file path to the TLS certificate for the DNS web console.\n      # - DNS_SERVER_WEB_SERVICE_TLS_CERTIFICATE_PASSWORD=password #The password for the TLS certificate for the DNS web console.\n      # - DNS_SERVER_WEB_SERVICE_HTTP_TO_TLS_REDIRECT=false #Enables HTTP to HTTPS redirection for the DNS web console.\n      # - DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP=false #Enables DNS server optional protocol DNS-over-HTTP on TCP port 8053 to be used with a TLS terminating reverse proxy like nginx.\n      # - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks #Recursion options: Allow, Deny, AllowOnlyForPrivateNetworks, UseSpecifiedNetworkACL.\n      # - DNS_SERVER_RECURSION_NETWORK_ACL=192.168.10.0/24, !192.168.10.2 #Comma separated list of IP addresses or network addresses to allow access. Add ! character at the start to deny access, e.g. !192.168.10.0/24 will deny entire subnet. The ACL is processed in the same order its listed. If no networks match, the default policy is to deny all except loopback. Valid only for `UseSpecifiedNetworkACL` recursion option.\n      # - DNS_SERVER_RECURSION_DENIED_NETWORKS=1.1.1.0/24 #Comma separated list of IP addresses or network addresses to deny recursion. Valid only for `UseSpecifiedNetworkACL` recursion option. This option is obsolete and DNS_SERVER_RECURSION_NETWORK_ACL should be used instead.\n      # - DNS_SERVER_RECURSION_ALLOWED_NETWORKS=127.0.0.1, 192.168.1.0/24 #Comma separated list of IP addresses or network addresses to allow recursion. Valid only for `UseSpecifiedNetworkACL` recursion option.  This option is obsolete and DNS_SERVER_RECURSION_NETWORK_ACL should be used instead.\n      # - DNS_SERVER_ENABLE_BLOCKING=false #Sets the DNS server to block domain names using Blocked Zone and Block List Zone.\n      # - DNS_SERVER_ALLOW_TXT_BLOCKING_REPORT=false #Specifies if the DNS Server should respond with TXT records containing a blocked domain report for TXT type requests.\n      # - DNS_SERVER_BLOCK_LIST_URLS= #A comma separated list of block list URLs.\n      # - DNS_SERVER_FORWARDERS=1.1.1.1, 8.8.8.8 #Comma separated list of forwarder addresses.\n      # - DNS_SERVER_FORWARDER_PROTOCOL=Tcp #Forwarder protocol options: Udp, Tcp, Tls, Https, Quic.\n      # - DNS_SERVER_LOG_USING_LOCAL_TIME=true #Enable this option to use local time instead of UTC for logging.\n      - DNS_SERVER_LOG_FOLDER_PATH=/var/log/technitium/dns #The folder path on the server where the log files should be saved.\n      # - DNS_SERVER_LOG_MAX_LOG_FILE_DAYS=365 #Max number of days to keep the log files. Log files older than the specified number of days will be deleted automatically. Set 0 to disable auto delete.\n      # - DNS_SERVER_STATS_ENABLE_IN_MEMORY_STATS=false #This option will enable in-memory stats and only Last Hour data will be available on Dashboard. No stats data will be stored on disk.\n      # - DNS_SERVER_STATS_MAX_STAT_FILE_DAYS=365 #Max number of days to keep the dashboard stats. Stat files older than the specified number of days will be deleted automatically. Set 0 to disable auto delete.\n    volumes:\n      - config:/etc/dns\n      - logs:/var/log/technitium/dns\n    healthcheck:\n      test: [\"CMD-SHELL\", \"curl -f http://127.0.0.1:5380/api/dnsClient/healthCheck | grep '\\\"status\\\":\\\"ok\\\"'\"]\n      #test: [\"CMD\", \"dig\", \"+short\", \"+norecurse\", \"+retry=0\", \"@127.0.0.1\", \"localhost\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 10s\n    restart: unless-stopped\n    sysctls:\n      - net.ipv4.ip_local_port_range=1024 65535 #remove when using \"host\" network mode\n\nvolumes:\n    config:\n    logs:\n",
      "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml",
      "validation_status": "config_ok"
    },
    {
      "order": 3,
      "kind": "shell",
      "language": "bash",
      "label": "Start it",
      "body": "docker compose up -d",
      "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 4,
      "kind": "verify",
      "language": "text",
      "label": "Open the app",
      "body": "Open http://localhost:5380. The compose file publishes host port 5380 for the dns-server service.",
      "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml",
      "validation_status": "unvalidated"
    }
  ],
  "notes": [
    {
      "kind": "gotcha",
      "title": "Some images use the latest tag or no tag",
      "body": "Images without a pinned version: dns-server: docker.io/technitium/dns-server:latest. A later pull can get a different version.",
      "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file publishes host ports",
      "body": "Host ports: 5380 (dns-server), 53/udp (dns-server), 53 (dns-server). A port without a host address listens on all host network interfaces.",
      "source_url": "https://github.com/TechnitiumSoftware/DnsServer/blob/0dd592aad21eced4221a9a46204cb1a299972ca0/docker-compose.yml",
      "checked_at": "2026-10-22"
    }
  ],
  "signals": {
    "captured_at": "2026-10-22",
    "stars": 10195,
    "forks": 807,
    "open_issues": 160,
    "last_push": "2026-10-17",
    "days_since_push": 4,
    "latest_release": "v15.6.2",
    "latest_release_date": "2026-10-17",
    "days_since_release": 4
  },
  "links": {
    "html": "https://openlogs.fyi/tools/technitium-dns-server",
    "markdown": "https://openlogs.fyi/tools/technitium-dns-server.md",
    "json": "https://openlogs.fyi/tools/technitium-dns-server.json"
  },
  "updated_at": "2026-10-22"
}
