docs: Add DNS tuning guide #1601

Merged
Jade merged 11 commits from stratself/continuwuity:stratself/docs-dns into main 2026-04-13 17:44:01 +00:00
Contributor

This pull request adds a DNS tuning guide page for Continuwuity, targetting Unbound. It recommends best practices.

You can see a preview of it here:

TODOS:

  • Rewrite the troubleshooting page section to simplify wording and reflink to this new page.
  • Link other pages (e.g. Docker next steps, performance tuning) to this page (in other PRs)

Pull request checklist:

  • This pull request targets the main branch, and the branch is named something other than
    main.
  • I have written an appropriate pull request title and my description is clear.
  • I understand I am responsible for the contents of this pull request.
  • I have followed the contributing guidelines:
This pull request adds a DNS tuning guide page for Continuwuity, targetting Unbound. It recommends best practices. You can see a preview of it here: - https://muc.muoi.me/advanced/dns.html - https://muc.muoi.me/troubleshooting.html#dns-issues TODOS: - [x] Rewrite the [troubleshooting page section](https://continuwuity.org/troubleshooting#dns-issues) to simplify wording and reflink to this new page. - [ ] Link other pages (e.g. Docker next steps, performance tuning) to this page (in other PRs) <!-- Example: This pull request allows us to warp through time and space ten times faster than before by double-inverting the warp drive with hyperheated jump fluid, both making the drive faster and more efficient. This resolves the common issue where we have to wait more than 10 milliseconds to engage, use, and disengage the warp drive when travelling between galaxies. --> <!-- Closes: #... --> <!-- Fixes: #... --> <!-- Uncomment the above line(s) if your pull request fixes an issue or closes another pull request by superseding it. Replace `#...` with the issue/pr number, such as `#123`. --> **Pull request checklist:** <!-- You need to complete these before your PR can be considered. If you aren't sure about some, feel free to ask for clarification in #dev:continuwuity.org. --> - [x] This pull request targets the `main` branch, and the branch is named something other than `main`. - [x] I have written an appropriate pull request title and my description is clear. - [x] I understand I am responsible for the contents of this pull request. - I have followed the [contributing guidelines][c1]: - [x] My contribution follows the [code style][c2], if applicable. - [x] I ran [pre-commit checks][c1pc] before opening/drafting this pull request. - [x] I have [tested my contribution][c1t] (or proof-read it for documentation-only changes) myself, if applicable. This includes ensuring code compiles. - [x] My commit messages follow the [commit message format][c1cm] and are descriptive. - [x] I have written a [news fragment][n1] for this PR, if applicable<!--(can be done after hitting open!)-->. <!-- Notes on these requirements: - While not required, we encourage you to sign your commits with GPG or SSH to attest the authenticity of your changes. - While we allow LLM-assisted contributions, we do not appreciate contributions that are low quality, which is typical of machine-generated contributions that have not had a lot of love and care from a human. Please do not open a PR if all you have done is asked ChatGPT to tidy up the codebase with a +-100,000 diff. - In the case of code style violations, reviewers may leave review comments/change requests indicating what the ideal change would look like. For example, a reviewer may suggest you lower a log level, or use `match` instead of `if/else` etc. - In the case of code style violations, pre-commit check failures, minor things like typos/spelling errors, and in some cases commit format violations, reviewers may modify your branch directly, typically by making changes and adding a commit. Particularly in the latter case, a reviewer may rebase your commits to squash "spammy" ones (like "fix", "fix", "actually fix"), and reword commit messages that don't satisfy the format. - Pull requests MUST pass the `Checks` CI workflows to be capable of being merged. This can only be bypassed in exceptional circumstances. If your CI flakes, let us know in matrix:r/dev:continuwuity.org. - Pull requests have to be based on the latest `main` commit before being merged. If the main branch changes while you're making your changes, you should make sure you rebase on main before opening a PR. Your branch will be rebased on main before it is merged if it has fallen behind. - We typically only do fast-forward merges, so your entire commit log will be included. Once in main, it's difficult to get out cleanly, so put on your best dress, smile for the cameras! --> [c1]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md [c2]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/docs/development/code_style.mdx [c1pc]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md#pre-commit-checks [c1t]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md#running-tests-locally [c1cm]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md#commit-messages [n1]: https://towncrier.readthedocs.io/en/stable/tutorial.html#creating-news-fragments
theSuess left a comment

Only checked for technical input for now since I know that drive-by reviews by external people can be annoying for maintainers 😅

One option that could also be useful for tuning (esp. on kubernetes) is ndots as having a high value here will cause lookups of external domains with the search domain appended (e.g matrix.org -> matrix.org.my.network)

If you want to, I can take a look at the wording and instruction text as well (I often do this as part of my dayjob) but I didn't want to spam this without asking first :)

Only checked for technical input for now since I know that drive-by reviews by external people can be annoying for maintainers 😅 One option that could also be useful for tuning (esp. on kubernetes) is [ndots](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html#:~:text=see%20resolver%283%29%29%2E-,ndots%3A) as having a high value here will cause lookups of external domains with the search domain appended (e.g `matrix.org` -> `matrix.org.my.network`) If you want to, I can take a look at the wording and instruction text as well (I often do this as part of my dayjob) but I didn't want to spam this without asking first :)
@ -0,0 +18,4 @@
### For Docker users
Docker bridge networks uses a non-performant resolver to intercept and respond to container hostnames, and **this should also be avoided**. Instead, mount a custom `/etc/resolv.conf` file into the container, and hardcode a resolver address to bypass Docker's.
First-time contributor

Docker supports adhoc generation of resolv.conf. This can also be done using docker compose which removes the need for a volume mount/extra file to manage:
https://docs.docker.com/reference/compose-file/services/#dns

Docker supports adhoc generation of `resolv.conf`. This can also be done using docker compose which removes the need for a volume mount/extra file to manage: https://docs.docker.com/reference/compose-file/services/#dns
Author
Contributor

This doesn't seem doable with custom bridge networks

~$ docker network create testing
<some-long-id>
~$ docker run --rm -it --net testing --dns 1.1.1.1 alpine cat /etc/resolv.conf

$ docker run --rm -it --net testing --dns 1.1.1.1 alpine cat /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
options use-vc ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [1.1.1.1]
# Overrides: [nameservers]
# Option ndots from: internal

Same behavior with Podman, though they have the --disable-dns flag. It probably relates to this longstanding issue. Hence the resolv.conf mount workaround

Do let me know if you find alternative solutions to this tho. It will also help #1594

This doesn't seem doable with custom bridge networks ``` ~$ docker network create testing <some-long-id> ~$ docker run --rm -it --net testing --dns 1.1.1.1 alpine cat /etc/resolv.conf $ docker run --rm -it --net testing --dns 1.1.1.1 alpine cat /etc/resolv.conf # Generated by Docker Engine. # This file can be edited; Docker Engine will not make further changes once it # has been modified. nameserver 127.0.0.11 options use-vc ndots:0 # Based on host file: '/etc/resolv.conf' (internal resolver) # ExtServers: [1.1.1.1] # Overrides: [nameservers] # Option ndots from: internal ``` Same behavior with Podman, though they have the `--disable-dns` flag. It probably relates to this longstanding [issue](https://github.com/moby/moby/issues/19474). Hence the resolv.conf mount workaround Do let me know if you find alternative solutions to this tho. It will also help #1594
@ -0,0 +147,4 @@
## Testing
As a rough stress test, you can issue `!admin query resolver flush-cache -a` or `!admin server clear-caches` to trigger a netburst of DNS queries. If your resolver can handle these loads without problem, then it should be ready for regular Continuwuity activity.
First-time contributor

As you already mentioned in chat, these commands would be great in the troubleshooting guide

As you already mentioned in chat, these commands would be great in the troubleshooting guide
Author
Contributor

I added them to latest commit. Here's a rendered version

Not sure if the docs structure is optimal, let me know

I added them to [latest commit](https://forgejo.ellis.link/continuwuation/continuwuity/pulls/1601/commits/928ac8d9c542b65c46aeb51aa16acdbca2c78672). Here's a [rendered version](https://muc.muoi.me/troubleshooting.html#intermittent-federation-failures-to-a-specific-server) Not sure if the docs structure is optimal, let me know
Author
Contributor

@theSuess Many thanks for looking over the PR, I'm also just another drive-by contributor who wanna help with docs, so feel free to nag me for improvements over your free time :D

@theSuess Many thanks for looking over the PR, I'm also just another drive-by contributor who wanna help with docs, so feel free to nag me for improvements over your free time :D
stratself changed title from WIP: docs: Add DNS tuning guide to docs: Add DNS tuning guide 2026-04-04 11:38:39 +00:00
Author
Contributor

There are concerns with recommending any specific forwarder over recursion. I'd like users to explore forwarder options because they're 1. Generally faster due to CDNing and less requests, 2. Supported by more software, and 3. Has encryption options. But single-provider dependency and ratelimits are the costs. Better wording is needed

There are concerns with recommending any specific forwarder over recursion. I'd like users to explore forwarder options because they're 1. Generally faster due to CDNing and less requests, 2. Supported by more software, and 3. Has encryption options. But single-provider dependency and ratelimits are the costs. Better wording is needed
Henry-Hiles requested changes 2026-04-04 14:28:50 +00:00
Dismissed
Henry-Hiles left a comment

Mostly great, just a nitpick.

Mostly great, just a nitpick.
@ -0,0 +131,4 @@
### None
If you can't install a local DNS caching resolver for some reason, you may still configure your machine to talk directly to public resolvers:
Member

I don't see why you wouldn't be able to add a resolver, and you lose caching from this, is it worth covering?

I don't see why you wouldn't be able to add a resolver, and you lose caching from this, is it worth covering?
Author
Contributor

I removed the section

I removed the section
stratself marked this conversation as resolved
stratself force-pushed stratself/docs-dns from 3e8a196cf1
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Has been skipped
Check Changelog / Check for changelog (pull_request_target) Successful in 11s
Checks / Prek / Pre-commit & Formatting (pull_request) Failing after 3m7s
Checks / Prek / Clippy and Cargo Tests (pull_request) Successful in 13m22s
to c347fe5061
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Has been skipped
Check Changelog / Check for changelog (pull_request_target) Successful in 10s
Checks / Prek / Pre-commit & Formatting (pull_request) Failing after 3m6s
Checks / Prek / Clippy and Cargo Tests (pull_request) Successful in 16m8s
2026-04-08 07:44:16 +00:00
Compare
Henry-Hiles requested changes 2026-04-08 16:48:44 +00:00
Dismissed
@ -0,0 +120,4 @@
[Dnsproxy][dnsproxy] and its sister product [AdGuard Home][adguard-home] are known to work with Continuwuity and has an official Docker image. They have support for DNS-over-HTTPS as well as DNS-over-QUIC, but not recursion.
To best utilise dnsproxy, you should enable proper caching with `--cache` and set `--cache-size` to something bigger, like `64M`.
Member

s/64M/64000000

This argument accepts a number of bytes, only an int, no unit. Otherwise, it fails to launch.

s/64M/64000000 This argument accepts a number of bytes, only an int, no unit. Otherwise, it fails to launch.
stratself marked this conversation as resolved
fix(docs,dns): Correct value for dnsproxy option, and a word
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Has been skipped
Check Changelog / Check for changelog (pull_request_target) Successful in 10s
Update flake hashes / update-flake-hashes (pull_request) Successful in 1m51s
Checks / Prek / Pre-commit & Formatting (pull_request) Failing after 2m11s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 2m0s
353d9d17a7
Henry-Hiles requested changes 2026-04-11 16:58:17 +00:00
Dismissed
Henry-Hiles left a comment

just some small grammar fixes

just some small grammar fixes
@ -0,0 +76,4 @@
### Using a forwarder (optional)
Unbound by default employs recursive resolution and contact many servers around the world. If this is not performant enough, consider forwarding your queries to public resolvers to benefit from their CDNs and get faster responses.
Member

s/contact/contacts

s/contact/contacts
stratself marked this conversation as resolved
@ -0,0 +80,4 @@
However, most popular upstreams (such as Google DNS or Quad9) employ IP ratelimiting, so a generous cache is still needed to avoid making too many queries.
DNS-over-TLS forwarders may also be used should you need on-the-wire encryption, but TLS overhead would incur some speed penalties.
Member

s/would incur some small/causes some small

s/would incur some small/causes some small
stratself marked this conversation as resolved
@ -0,0 +127,4 @@
### dnsmasq
[dnsmasq][arch-linux-dnsmasq] can possibly work with Continuwuity, though it only support forwarding rather than recursion. Increase the `cache-size` to something like `20000` for better caching performance.
Member

s/support/supports

s/support/supports
stratself marked this conversation as resolved
@ -0,0 +142,4 @@
## Testing
As a rough stress test, you can issue `!admin query resolver flush-cache -a` or `!admin server clear-caches` to trigger a netburst of DNS queries. If your resolver can handle these loads without problem, then it should be ready for regular Continuwuity activity.
Member

s/issue/run

imo it's simpler

s/issue/run imo it's simpler
stratself marked this conversation as resolved
@ -0,0 +146,4 @@
To test connectivity against a specific server, use `!admin debug ping <SERVER_NAME>` and `!admin debug resolve-true-destination <SERVER_NAME>`.
Note that it is expected that not all servers will be resolved, as some of them may be temporarily offline, has broken DNS and/or discovery configuration, or have been decommissioned.
Member

s/has/have

s/has/have
stratself marked this conversation as resolved
@ -52,2 +50,2 @@
performance issues with Docker's built-in resolver, this can cause DNS queries
to take a long time to resolve, resulting in federation issues.
- Spurious log entries with "DNS No connections available", "mismatching responding nameservers", or "error sending request"
- Excessively long room joins (30+ minutes)
Member

in my experience this can also be !779

in my experience this can also be !779
Author
Contributor

Reworded to say it's a slow S2S join as seen from server logs, as !779 relates to C2S not sending new info

Reworded to say it's a slow S2S join as seen from server logs, as !779 relates to C2S not sending new info
stratself marked this conversation as resolved
@ -114,3 +69,1 @@
If your DNS server supports it, some users have reported enabling
`query_over_tcp_only` to force only TCP querying by default has improved DNS
reliability at a slight performance cost due to TCP overhead.
You may also use `!admin server clear-caches` or `!admin query resolver flush-cache -a` to clear all server/resolver caches, in case of failures with many domains. However, note this would significantly increase your server load for a short period.
Member

s/would significantly increase/significantly increases

s/would significantly increase/significantly increases
stratself marked this conversation as resolved
stratself force-pushed stratself/docs-dns from ff838187f9
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Has been skipped
Check Changelog / Check for changelog (pull_request_target) Successful in 8s
Update flake hashes / update-flake-hashes (pull_request) Successful in 1m45s
Checks / Prek / Pre-commit & Formatting (pull_request) Failing after 2m53s
Checks / Prek / Clippy and Cargo Tests (pull_request) Has been cancelled
to 8fbfd9833f
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Has been skipped
Check Changelog / Check for changelog (pull_request_target) Successful in 8s
Update flake hashes / update-flake-hashes (pull_request) Successful in 1m38s
Checks / Prek / Pre-commit & Formatting (pull_request) Failing after 2m58s
Checks / Prek / Clippy and Cargo Tests (pull_request) Successful in 16m37s
Checks / Changelog / Check changelog is added (pull_request_target) Successful in 32s
2026-04-12 12:43:03 +00:00
Compare
Jade approved these changes 2026-04-12 14:20:58 +00:00
Jade merged commit eccdb285b8 into main 2026-04-13 17:44:01 +00:00
Jade referenced this pull request from a commit 2026-04-13 17:44:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
5 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
continuwuation/continuwuity!1601
No description provided.