adguardhome-sync icon indicating copy to clipboard operation
adguardhome-sync copied to clipboard

400 Bad Request(validating dns config: private upstream servers: no upstream specified

Open masterlog80 opened this issue 1 month ago • 6 comments

What happened?

Hello, I am using AdGuard Home sync with a couple of small VMs (on Proxmox) running AdGuardHome with no issues. Recently I have created a container on Docker running AdGuardHome (adguard/adguardhome:latest), I have set it up and added its configuration settings to AdGuardHome-sync (this run in a different Docker server). As result, the sync process fails with Errors, and the configuration is not synced (there are just default settings left). I am not sure if the issue with container itself (but it's just deployed on docker per its public documentation and using Network "macvlan" so all the ports are exposed) or something else. The other instances of AdGuardHome (on the VM Instances) keeps syncing.

Steps To Reproduce

  1. Create a new instance of AdGuard home on Docker: https://hub.docker.com/r/adguard/adguardhome
  2. Set the Network as "macvlan"
  3. Complete the configuration per http://IP_ADDRESS:3000
  4. Edit the configuration for AdGuard home sync by adding the details for the new AdGuard home instance
  5. Recreate the Container
  6. Manually start the sync and check the logs

Regards,

AdguardHome-Sync Version

version": "v0.8.2", "build": "2025-10-24T17:14:03Z", "os": "linux", "arch": "arm64"

AdguardHome Version

v0.107.69

OS Information

❯ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.5 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.5 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy

❯ docker --version Docker version 28.5.1, build e180ab8

Configuration

Docker Stack:

adguardhome-sync (on Docker #1)
*********************************
services:
  adguardhome-sync:
    image: ghcr.io/bakito/adguardhome-sync
    container_name: adguardhome-sync
    environment:
      - TZ=Asia/Tokyo
    command: run --config /config/adguardhome-sync.yaml
    volumes:
      - /mnt/CEPHFS/volumes/adguardsync/config/adguardhome-sync.yaml:/config/adguardhome-sync.yaml
    ports:
      - 8080:8080
    restart: unless-stopped
*********************************

adguardhome (on Docker #2)
*********************************
services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    networks:
      adguard_macvlan:
        ipv4_address: 192.168.10.5
    environment:
      - TZ=Asia/Tokyo
      # Define the default web interface port if you want it different from 3000
      - ADGUARD_HOME_DEFAULT_WEB_PORT=80
      - API_PORT=80
    volumes:
      - /mnt/.ix-apps/app_mounts/adguard-home/conf:/opt/adguardhome/conf:rw
      - /mnt/.ix-apps/app_mounts/adguard-home/work:/opt/adguardhome/work:rw
      - /etc/hosts:/etc/hosts:ro
    restart: unless-stopped

networks:
  adguard_macvlan:
    driver: macvlan
    driver_opts:
      parent: bond0 # Replace eth0 with your host's physical network interface
    ipam:
      config:
        - subnet: 192.168.10.0/24 # Replace with your network's subnet
          gateway: 192.168.10.1 # Replace with your network's gateway
          ip_range: 192.168.10.0/24 # Optional: Specify a range for IP allocation
*********************************

Current Applied Configuration

2025-11-14T08:16:42.831+0900	INFO	config	config/print-config.go:34	Printing adguardhome-sync aggregated config (THE APPLICATION WILL NOT START IN THIS MODE):
<!-- PLEASE COPY THE FOLLOWING OUTPUT AS IS INTO THE GITHUB ISSUE (Don't forget to mask your usernames, passwords, IPs and other sensitive information when using this in an issue ) -->

### Runtime

AdguardHome-Sync Version: v0.8.2
Build: 2025-10-24T17:14:03Z
OperatingSystem: linux
Architecture: arm64
OriginVersion: v0.107.69
ReplicaVersions:
- Replica 1: v0.107.69

### AdGuardHome sync aggregated config


origin:
    url: http://192.168.10.3/
    webURL: http://192.168.10.3/
    apiPath: /control
    username: *******
    password: *******
    insecureSkipVerify: false
    autoSetup: false
replicas:
    - url: http://192.168.10.5/
      webURL: http://192.168.10.5/
      apiPath: /control
      username: *******
      password: *******
      insecureSkipVerify: false
      autoSetup: false
cron: '*/30 * * * *'
runOnStart: true
printConfigOnly: true
api:
    port: 80
    username: *******
    password: *******
    darkMode: true
features:
    dns:
        accessLists: true
        serverConfig: true
        rewrites: true
    dhcp:
        serverConfig: false
        staticLeases: false
    generalSettings: true
    queryLogConfig: true
    statsConfig: true
    clientSettings: true
    services: true
    filters: true
    theme: true
    tlsConfig: false


### AdGuardHome sync unmodified config file

Config file path: /config/adguardhome-sync.yaml


# cron expression to run in daemon mode. (default; "" = runs only once)
cron: "*/30 * * * *"

origin:
  # url of the origin instance
  url: http://192.168.10.3/
  # apiPath: define an api path if other than "/control"
  # insecureSkipVerify: true # disable tls check
  username: *******
  password: *******

# replica instance (optional, if only one)
replicas:
  # url of the replica instance
#  - url: http://192.168.10.4/
#    username: *******
#    password: *******
  - url: http://192.168.10.5/
    username: *******
    password: *******
#  - url: http://192.168.0.3/
#    username: *******
#    password: *******
#  - url: http://192.168.20.3/
#    username: *******
#    password: *******
#  - url: http://192.168.20.4/
#    username: *******
#    password: *******

# Configure the sync API server, disabled if api port is 0
# Ref. https://github.com/bakito/adguardhome-sync
api:
  # Port, default 8080
  port: 80
  # if username and password are defined, basic auth is applied to the sync API 
  username: *******
  password: **************
  darkMode: true

features:
  generalSettings: true
  queryLogConfig: true
  statsConfig: true
  clientSettings: true
  services: true
  filters: true
  dhcp:
    serverConfig: false
    staticLeases: false
  dns:
    serverConfig: true
    accessLists: true
    rewrites: true



### Environment Variables


   =/opt/go/adguardhome-sync
HOME=/
HOSTNAME=adguardhome-sync
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PRINT_CONFIG_ONLY=true
TZ=Asia/Tokyo


<!-- END OF GITHUB ISSUE CONTENT -->

Relevant DEBUG log output

2025-11-14T08:02:46.952+0900	INFO	sync	sync/sync.go:41	AdGuardHome sync	{"version": "v0.8.2", "build": "2025-10-24T17:14:03Z", "os": "linux", "arch": "arm64"}
2025-11-14T08:02:46.953+0900	INFO	sync	types/features.go:61	Disabled features	{"features": ["DHCP.ServerConfig", "DHCP.StaticLeases", "TLSConfig"]}
2025-11-14T08:02:46.954+0900	INFO	sync	sync/sync.go:66	Setup cronjob	{"cron": "*/30 * * * *", "next-execution": "2025-11-14T08:30:00.000+0900"}
2025-11-14T08:02:46.954+0900	INFO	sync	sync/http.go:101	Starting API server	{"port": 80}
2025-11-14T08:02:46.955+0900	INFO	sync	sync/sync.go:88	Running sync on startup
2025-11-14T08:02:47.344+0900	INFO	sync	sync/sync.go:183	Connected to origin	{"from": "192.168.10.3", "version": "v0.107.69"}
2025-11-14T08:02:51.280+0900	INFO	sync	sync/sync.go:291	Start sync	{"from": "192.168.10.3", "to": "192.168.10.5"}
2025-11-14T08:02:51.368+0900	INFO	sync	sync/sync.go:312	Connected to replica	{"from": "192.168.10.3", "to": "192.168.10.5", "version": "v0.107.69"}
2025-11-14T08:02:51.745+0900	INFO	client	client/client.go:417	Set dns config list	{"host": "192.168.10.5"}
2025-11-14T08:02:51.824+0900	ERROR	sync	sync/sync.go:337	Error syncing DNS server config	{"from": "192.168.10.3", "to": "192.168.10.5", "error": "400 Bad Request(validating dns config: private upstream servers: no upstream specified\n)"}
github.com/bakito/adguardhome-sync/internal/sync.(*worker).syncTo
	/go/src/app/internal/sync/sync.go:337
github.com/bakito/adguardhome-sync/internal/sync.(*worker).sync
	/go/src/app/internal/sync/sync.go:279
github.com/bakito/adguardhome-sync/internal/sync.runOnStartAsync.func1
	/go/src/app/internal/sync/sync.go:89
2025-11-14T08:02:51.826+0900	ERROR	sync	sync/sync.go:299	Sync done	{"from": "192.168.10.3", "to": "192.168.10.5", "duration": "2.041e-06s"}
github.com/bakito/adguardhome-sync/internal/sync.(*worker).syncTo.func1

Anything else?

No response

masterlog80 avatar Nov 13 '25 23:11 masterlog80

Hi Either you need to define upstream dns servers in your Adguardhome origin, or disable the serverConfig feature.

bakito avatar Nov 14 '25 05:11 bakito

Thank you for getting back @bakito, As per I can see, Upstream DNS servers on the Adguardhome origin are definitely set (should be the default ones). Image To be more correct, the configuration on origin and replica are most the same as i kept the default configuation (apart DNS rewrites which is what I want so sync).

However, disabling the serverConfig settings fixed the issue, but it's very strange this occurs only with AdGuardHome running on Docker, and not the other ones. My final goal would be to sync all the settings.

Regards,

masterlog80 avatar Nov 14 '25 12:11 masterlog80

Could you provide debug logs of the error? https://github.com/bakito/adguardhome-sync/wiki/FAQ#how-do-i-get-debug-logs

bakito avatar Nov 14 '25 13:11 bakito

Sorry for the late reply. I have collected the debug logs as below (I have replaced the username with the string <USERNAME> and other details, and set serverConfig: true to replicate the Error):

2025-11-23T18:46:09.429+0900	INFO	sync	sync/sync.go:41	AdGuardHome sync	{"version": "v0.8.2", "build": "2025-10-24T17:14:03Z", "os": "linux", "arch": "arm64"}
2025-11-23T18:46:09.430+0900	DEBUG	sync	types/types.go:112	Using config	{"config": {"origin":{"url":"http://192.168.10.3/","webURL":"http://192.168.10.3/","apiPath":"/control","username":"l*****o","password":"s**********0","insecureSkipVerify":false,"autoSetup":false},"replicas":[{"url":"http://192.168.10.5/","webURL":"http://192.168.10.5/","apiPath":"/control","username":"l*****o","password":"s**********0","insecureSkipVerify":false,"autoSetup":false}],"cron":"*/30 * * * *","runOnStart":true,"api":{"port":8080,"darkMode":true,"metrics":{},"tls":{}},"features":{"dns":{"accessLists":true,"serverConfig":true,"rewrites":true},"dhcp":{"serverConfig":false,"staticLeases":false},"generalSettings":true,"queryLogConfig":true,"statsConfig":true,"clientSettings":true,"services":true,"filters":true,"theme":true,"tlsConfig":false}}}
2025-11-23T18:46:09.430+0900	INFO	sync	types/features.go:61	Disabled features	{"features": ["DHCP.ServerConfig", "DHCP.StaticLeases", "TLSConfig"]}
2025-11-23T18:46:09.431+0900	INFO	sync	sync/sync.go:66	Setup cronjob	{"cron": "*/30 * * * *", "next-execution": "2025-11-23T19:00:00.000+0900"}
2025-11-23T18:46:09.431+0900	INFO	sync	sync/http.go:101	Starting API server	{"port": 8080}
2025-11-23T18:46:09.431+0900	INFO	sync	sync/sync.go:88	Running sync on startup
2025-11-23T18:46:09.431+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:09.825+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.3\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:09.826+0900	INFO	sync	sync/sync.go:183	Connected to origin	{"from": "192.168.10.3", "version": "v0.107.69"}
2025-11-23T18:46:09.826+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/profile", "username": "<USERNAME>"}
2025-11-23T18:46:10.154+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/profile", "username": "<USERNAME>", "status": 200, "body": "{\"name\":\"<USERNAME>\",\"language\":\"en\",\"theme\":\"dark\"}\n", "content-type": ["application/json"]}
2025-11-23T18:46:10.155+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/parental/status", "username": "<USERNAME>"}
2025-11-23T18:46:10.483+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/parental/status", "username": "<USERNAME>", "status": 200, "body": "{\"enabled\":false}\n", "content-type": ["application/json"]}
2025-11-23T18:46:10.483+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/safesearch/status", "username": "<USERNAME>"}
2025-11-23T18:46:10.811+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/safesearch/status", "username": "<USERNAME>", "status": 200, "body": "{\"enabled\":false,\"bing\":true,\"duckduckgo\":true,\"ecosia\":true,\"google\":true,\"pixabay\":true,\"yandex\":true,\"youtube\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:10.812+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/safebrowsing/status", "username": "<USERNAME>"}
2025-11-23T18:46:11.138+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/safebrowsing/status", "username": "<USERNAME>", "status": 200, "body": "{\"enabled\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:11.139+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/rewrite/list", "username": "<USERNAME>"}
2025-11-23T18:46:11.467+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/rewrite/list", "username": "<USERNAME>", "status": 200, "body": "[{\"domain\":\"*.oracle.<DOMAIN>\",\"answer\":\"192.168.0.241\",\"enabled\":true},{\"domain\":\"*.italy.<DOMAIN>\",\"answer\":\"192.168.20.241\",\"enabled\":true},{\"domain\":\"dns1.japan.<DOMAIN>\",\"answer\":\"192.168.10.3\",\"enabled\":true},{\"domain\":\"dns2.japan.<DOMAIN>\",\"answer\":\"192.168.10.4\",\"enabled\":true},{\"domain\":\"dns1.italy.<DOMAIN>\",\"answer\":\"192.168.20.3\",\"enabled\":true},{\"domain\":\"myrouter.io\",\"answer\":\"192.168.19.1\",\"enabled\":true},{\"domain\":\"gateway.japan.<DOMAIN>\",\"answer\":\"192.168.10.1\",\"enabled\":true},{\"domain\":\"dns1.oracle.<DOMAIN>\",\"answer\":\"192.168.0.3\",\"enabled\":true},{\"domain\":\"time.japan.<DOMAIN>\",\"answer\":\"192.168.10.8\",\"enabled\":true},{\"domain\":\"time.italy.<DOMAIN>\",\"answer\":\"192.168.20.8\",\"enabled\":true},{\"domain\":\"*.japan.<DOMAIN>\",\"answer\":\"192.168.10.241\",\"enabled\":true},{\"domain\":\"dns2.italy.<DOMAIN>\",\"answer\":\"192.168.20.4\",\"enabled\":true},{\"domain\":\"dns3.japan.<DOMAIN>\",\"answer\":\"192.168.10.5\",\"enabled\":true},{\"domain\":\"*.wireguard.<DOMAIN>\",\"answer\":\"192.168.10.3\",\"enabled\":true}]\n", "content-type": ["application/json"]}
2025-11-23T18:46:11.467+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/blocked_services/get", "username": "<USERNAME>"}
2025-11-23T18:46:11.795+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/blocked_services/get", "username": "<USERNAME>", "status": 200, "body": "{\"schedule\":{\"time_zone\":\"Asia/Tokyo\"},\"ids\":[]}\n", "content-type": ["application/json"]}
2025-11-23T18:46:11.796+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/filtering/status", "username": "<USERNAME>"}
2025-11-23T18:46:12.126+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/filtering/status", "username": "<USERNAME>", "status": 200, "body": "{\"filters\":[{\"url\":\"https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt\",\"name\":\"AdGuard DNS filter\",\"last_updated\":\"2025-11-23T14:18:53+09:00\",\"id\":1762132082,\"rules_count\":119462,\"enabled\":true},{\"url\":\"https://adaway.org/hosts.txt\",\"name\":\"AdAway Default Blocklist\",\"last_updated\":\"2025-11-23T14:18:53+09:00\",\"id\":1762132083,\"rules_count\":6542,\"enabled\":true},{\"url\":\"https://raw.githubusercontent.com/AdguardTeam/FiltersRegistry/master/filters/filter_7_Japanese/filter.txt\",\"name\":\"Japanese filter\",\"last_updated\":\"2025-11-23T14:18:54+09:00\",\"id\":1762132084,\"rules_count\":11615,\"enabled\":true},{\"url\":\"https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-agh-online.txt\",\"name\":\"Online Malicious URL Blocklist\",\"last_updated\":\"2025-11-23T14:18:54+09:00\",\"id\":1762132085,\"rules_count\":2706,\"enabled\":true},{\"url\":\"https://someonewhocares.org/hosts/zero/hosts\",\"name\":\"Dan Pollock's List\",\"last_updated\":\"2025-11-23T14:18:54+09:00\",\"id\":1762132086,\"rules_count\":11825,\"enabled\":true},{\"url\":\"https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareAdGuardHome.txt\",\"name\":\"Dandelion Sprout's Anti-Malware List\",\"last_updated\":\"2025-11-23T14:18:55+09:00\",\"id\":1762132087,\"rules_count\":15423,\"enabled\":true},{\"url\":\"https://raw.githubusercontent.com/mitchellkrogza/The-Big-List-of-Hacked-Malware-Web-Sites/master/hosts\",\"name\":\"The Big List of Hacked Malware Web Sites\",\"last_updated\":\"2025-11-23T14:18:55+09:00\",\"id\":1762132088,\"rules_count\":13822,\"enabled\":true}],\"whitelist_filters\":null,\"user_rules\":[],\"interval\":24,\"enabled\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:12.127+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/clients", "username": "<USERNAME>"}
2025-11-23T18:46:12.460+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/clients", "username": "<USERNAME>", "status": 200, "body": "{\"clients\":null,\"auto_clients\":[{\"whois_info\":{},\"ip\":\"192.168.10.154\",\"name\":\"lwip0.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.118\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.1\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"fe00::\",\"name\":\"ip6-localnet\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"ff02::1\",\"name\":\"ip6-allnodes\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"172.18.0.3\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.109\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.125\",\"name\":\"lwip0.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.177\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"172.17.0.2\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"ff00::\",\"name\":\"ip6-mcastprefix\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"192.168.10.185\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.9\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.165\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.151\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"172.17.0.4\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.192\",\"name\":\"wlan0.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.153\",\"name\":\"iPhone.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.137\",\"name\":\"OPPO-A3-5G.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.244\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.250\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.243\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.146\",\"name\":\"lwip0.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"127.0.1.1\",\"name\":\"ADGUARD-HOME\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"192.168.10.132\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.166\",\"name\":\"Mac.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.169\",\"name\":\"Broadlink_RMMINI-e4-21-bc.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.179\",\"name\":\"<USERNAME>s-Air.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"127.0.0.1\",\"name\":\"localhost\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"::1\",\"name\":\"localhost\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"ff02::2\",\"name\":\"ip6-allrouters\",\"source\":\"etc/hosts\"},{\"whois_info\":{},\"ip\":\"172.18.0.5\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.117\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.155\",\"name\":\"wlan0\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.119\",\"name\":\"OPPO-Reno3-A.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.126\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.101\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.184\",\"name\":\"M2006C3MG-Redmi9C.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.10\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.120\",\"name\":\"p,\\\\175\\\\152U\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.160\",\"name\":\"LGwebOSTV.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.150\",\"name\":\"wlan0.<DOMAIN>\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"172.18.0.7\",\"name\":\"\",\"source\":\"ARP\"},{\"whois_info\":{},\"ip\":\"192.168.10.138\",\"name\":\"/etc/localtime\",\"source\":\"rDNS\"},{\"whois_info\":{},\"ip\":\"192.168.10.242\",\"name\":\"\",\"source\":\"ARP\"}],\"supported_tags\":[\"device_audio\",\"device_camera\",\"device_gameconsole\",\"device_laptop\",\"device_nas\",\"device_other\",\"device_pc\",\"device_phone\",\"device_printer\",\"device_securityalarm\",\"device_tablet\",\"device_tv\",\"os_android\",\"os_ios\",\"os_linux\",\"os_macos\",\"os_other\",\"os_windows\",\"user_admin\",\"user_child\",\"user_regular\"]}\n", "content-type": ["application/json"]}
2025-11-23T18:46:12.461+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/querylog/config", "username": "<USERNAME>"}
2025-11-23T18:46:12.789+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/querylog/config", "username": "<USERNAME>", "status": 200, "body": "{\"ignored\":[],\"interval\":604800000,\"enabled\":true,\"anonymize_client_ip\":false}\n", "content-type": ["application/json"]}
2025-11-23T18:46:12.790+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/stats/config", "username": "<USERNAME>"}
2025-11-23T18:46:13.119+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/stats/config", "username": "<USERNAME>", "status": 200, "body": "{\"ignored\":[],\"interval\":604800000,\"enabled\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:13.121+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/access/list", "username": "<USERNAME>"}
2025-11-23T18:46:13.449+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/access/list", "username": "<USERNAME>", "status": 200, "body": "{\"allowed_clients\":[],\"disallowed_clients\":[],\"blocked_hosts\":[\"version.bind\",\"id.server\",\"hostname.bind\"]}\n", "content-type": ["application/json"]}
2025-11-23T18:46:13.449+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "/dns_info", "username": "<USERNAME>"}
2025-11-23T18:46:13.777+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "/dns_info", "username": "<USERNAME>", "status": 200, "body": "{\"upstream_dns\":[\"https://dns10.quad9.net/dns-query\",\"https://3r1ecxbrv6.cloudflare-gateway.com/dns-query\",\"https://dns.cloudflare.com/dns-query\"],\"upstream_dns_file\":\"\",\"bootstrap_dns\":[\"9.9.9.10\",\"149.112.112.10\",\"2620:fe::10\",\"2620:fe::fe:10\"],\"fallback_dns\":[],\"protection_enabled\":true,\"ratelimit\":20,\"ratelimit_subnet_len_ipv4\":24,\"ratelimit_subnet_len_ipv6\":56,\"upstream_timeout\":10,\"ratelimit_whitelist\":[],\"blocking_mode\":\"default\",\"edns_cs_enabled\":false,\"edns_cs_use_custom\":false,\"dnssec_enabled\":false,\"disable_ipv6\":false,\"upstream_mode\":\"parallel\",\"blocked_response_ttl\":10,\"cache_size\":0,\"cache_ttl_min\":0,\"cache_ttl_max\":0,\"cache_enabled\":false,\"cache_optimistic\":true,\"resolve_clients\":true,\"use_private_ptr_resolvers\":true,\"local_ptr_upstreams\":[],\"blocking_ipv4\":\"\",\"blocking_ipv6\":\"\",\"protection_disabled_until\":null,\"edns_cs_custom_ip\":\"\",\"default_local_ptr_upstreams\":[\"8.8.8.8:53\",\"127.0.0.1:53\",\"192.168.10.1:53\"]}\n", "content-type": ["application/json"]}
2025-11-23T18:46:13.779+0900	INFO	sync	sync/sync.go:291	Start sync	{"from": "192.168.10.3", "to": "192.168.10.5"}
2025-11-23T18:46:13.779+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:13.862+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.5\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:13.862+0900	INFO	sync	sync/sync.go:312	Connected to replica	{"from": "192.168.10.3", "to": "192.168.10.5", "version": "v0.107.69"}
2025-11-23T18:46:13.863+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "/profile", "username": "<USERNAME>"}
2025-11-23T18:46:13.937+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "/profile", "username": "<USERNAME>", "status": 200, "body": "{\"name\":\"<USERNAME>\",\"language\":\"en\",\"theme\":\"dark\"}\n", "content-type": ["application/json"]}
2025-11-23T18:46:13.940+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "/parental/status", "username": "<USERNAME>"}
2025-11-23T18:46:14.022+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "/parental/status", "username": "<USERNAME>", "status": 200, "body": "{\"enabled\":false}\n", "content-type": ["application/json"]}
2025-11-23T18:46:14.023+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "/safesearch/status", "username": "<USERNAME>"}
2025-11-23T18:46:14.098+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "/safesearch/status", "username": "<USERNAME>", "status": 200, "body": "{\"enabled\":false,\"bing\":true,\"duckduckgo\":true,\"ecosia\":true,\"google\":true,\"pixabay\":true,\"yandex\":true,\"youtube\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:14.099+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "/safebrowsing/status", "username": "<USERNAME>"}
2025-11-23T18:46:14.173+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "/safebrowsing/status", "username": "<USERNAME>", "status": 200, "body": "{\"enabled\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:14.174+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "/dns_info", "username": "<USERNAME>"}
2025-11-23T18:46:14.251+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "/dns_info", "username": "<USERNAME>", "status": 200, "body": "{\"upstream_dns\":[\"https://3r1ecxbrv6.cloudflare-gateway.com/dns-query\",\"https://dns.cloudflare.com/dns-query\"],\"upstream_dns_file\":\"\",\"bootstrap_dns\":[\"9.9.9.10\",\"149.112.112.10\",\"2620:fe::10\",\"2620:fe::fe:10\"],\"fallback_dns\":[\"1.1.1.1\"],\"protection_enabled\":true,\"ratelimit\":20,\"ratelimit_subnet_len_ipv4\":24,\"ratelimit_subnet_len_ipv6\":56,\"upstream_timeout\":10,\"ratelimit_whitelist\":[],\"blocking_mode\":\"default\",\"edns_cs_enabled\":false,\"edns_cs_use_custom\":false,\"dnssec_enabled\":false,\"disable_ipv6\":false,\"upstream_mode\":\"parallel\",\"blocked_response_ttl\":10,\"cache_size\":4194304,\"cache_ttl_min\":0,\"cache_ttl_max\":0,\"cache_enabled\":true,\"cache_optimistic\":false,\"resolve_clients\":true,\"use_private_ptr_resolvers\":false,\"local_ptr_upstreams\":[],\"blocking_ipv4\":\"\",\"blocking_ipv6\":\"\",\"protection_disabled_until\":null,\"edns_cs_custom_ip\":\"\"}\n", "content-type": ["application/json"]}
2025-11-23T18:46:14.253+0900	INFO	client	client/client.go:417	Set dns config list	{"host": "192.168.10.5"}
2025-11-23T18:46:14.253+0900	DEBUG	client	client/client-methods.go:54	do post	{"host": "192.168.10.5", "method": "POST", "path": "/dns_config", "username": "<USERNAME>", "body": "{\"blocked_response_ttl\":10,\"blocking_ipv4\":\"\",\"blocking_ipv6\":\"\",\"blocking_mode\":\"default\",\"bootstrap_dns\":[\"9.9.9.10\",\"149.112.112.10\",\"2620:fe::10\",\"2620:fe::fe:10\"],\"cache_enabled\":false,\"cache_optimistic\":true,\"cache_size\":0,\"cache_ttl_max\":0,\"cache_ttl_min\":0,\"disable_ipv6\":false,\"dnssec_enabled\":false,\"edns_cs_custom_ip\":\"\",\"edns_cs_enabled\":false,\"edns_cs_use_custom\":false,\"fallback_dns\":[],\"local_ptr_upstreams\":[],\"protection_enabled\":true,\"ratelimit\":20,\"ratelimit_whitelist\":[],\"resolve_clients\":true,\"upstream_dns\":[\"https://dns10.quad9.net/dns-query\",\"https://3r1ecxbrv6.cloudflare-gateway.com/dns-query\",\"https://dns.cloudflare.com/dns-query\"],\"upstream_dns_file\":\"\",\"upstream_mode\":\"parallel\",\"upstream_timeout\":10,\"use_private_ptr_resolvers\":true}"}
2025-11-23T18:46:14.330+0900	DEBUG	client	client/client-methods.go:67	got response	{"host": "192.168.10.5", "method": "POST", "path": "/dns_config", "username": "<USERNAME>", "status": 400, "body": "validating dns config: private upstream servers: no upstream specified\n", "content-type": "text/plain; charset=utf-8"}
2025-11-23T18:46:14.331+0900	ERROR	sync	sync/sync.go:337	Error syncing DNS server config	{"from": "192.168.10.3", "to": "192.168.10.5", "error": "400 Bad Request(validating dns config: private upstream servers: no upstream specified\n)"}
github.com/bakito/adguardhome-sync/internal/sync.(*worker).syncTo
	/go/src/app/internal/sync/sync.go:337
github.com/bakito/adguardhome-sync/internal/sync.(*worker).sync
	/go/src/app/internal/sync/sync.go:279
github.com/bakito/adguardhome-sync/internal/sync.runOnStartAsync.func1
	/go/src/app/internal/sync/sync.go:89
2025-11-23T18:46:14.331+0900	ERROR	sync	sync/sync.go:299	Sync done	{"from": "192.168.10.3", "to": "192.168.10.5", "duration": "2.042e-06s"}
github.com/bakito/adguardhome-sync/internal/sync.(*worker).syncTo.func1
	/go/src/app/internal/sync/sync.go:299
github.com/bakito/adguardhome-sync/internal/sync.(*worker).syncTo
	/go/src/app/internal/sync/sync.go:340
github.com/bakito/adguardhome-sync/internal/sync.(*worker).sync
	/go/src/app/internal/sync/sync.go:279
github.com/bakito/adguardhome-sync/internal/sync.runOnStartAsync.func1
	/go/src/app/internal/sync/sync.go:89
2025-11-23T18:46:16.299+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:16.691+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.3\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:16.692+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:16.773+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.5\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:16.990+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:17.384+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.3\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:17.385+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:17.478+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.5\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:32.800+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:33.197+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.3", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.3\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}
2025-11-23T18:46:33.198+0900	DEBUG	client	client/client-methods.go:17	do get	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>"}
2025-11-23T18:46:33.280+0900	DEBUG	client	client/client-methods.go:41	got response	{"host": "192.168.10.5", "method": "GET", "path": "status", "username": "<USERNAME>", "status": 200, "body": "{\"version\":\"v0.107.69\",\"language\":\"en\",\"dns_addresses\":[\"192.168.10.5\"],\"dns_port\":53,\"http_port\":80,\"protection_disabled_duration\":0,\"protection_enabled\":true,\"dhcp_available\":true,\"running\":true}\n", "content-type": ["application/json"]}

I hope this can help! Otherwise, I may suggest to replicate this locally, as I have also shared Docker configuration.

Regards,

masterlog80 avatar Nov 23 '25 09:11 masterlog80

I am experiencing the same issue as well. my setup is an origin of a proxmox lxc adguard instance. This successfully syncs to the other LXC instance. I have one other instance it syncs with which is a docker image from adguard/adguardhome:latest. This syncs everything, but the upstream dns servers. I could disable and the error goes away, but the main thing im trying to sync is the upstream servers which is part of that config.

bleeblonks avatar Nov 26 '25 15:11 bleeblonks

Thank you for your contribute @bleeblonks. Hopefully @bakito can take a look at this asap!

masterlog80 avatar Nov 26 '25 17:11 masterlog80