Troubleshooting

Troubleshooting #

Is it the network? #

If Terraform or an MQTT client times out, check the network before anything else. Tenants connect over Wi-Fi only, so from your computer on DVNTM-TD:

curl -fsSLO https://raw.githubusercontent.com/deevnet/ansible-collection-deevnet.net/main/scripts/segment-check.sh
bash segment-check.sh DVNTM-TD

It checks your address and DNS, the provisioning API, the state store and the broker (each verified against the Deevnet Root CA), the internet, and that the rest of the site is correctly out of reach. Turn off any VPN or iCloud Private Relay first. All passing means the network is fine and the problem is on the Terraform or client side (below). Anything failing: send the whole output to the operator; the fix is on the substrate, not in your repo.

segment-check.sh is bash: on Windows, run it under WSL2. Natively, tenant-check.ps1 without -Offline checks the same services, but not what should be out of reach.

Can’t join DVNTM-TD at all, or lost its password? The password you were handed at admission is the only copy: nothing shows it again. Ask the operator to rotate your key. You get a new password, and the old one stops working on every device that had it. A key bound to one computer’s MAC address also refuses any other computer, including the same one with a new private Wi-Fi address.

Terraform side #

SymptomWhat it means
No API tokenDEEVNET_API_TOKEN is not exported in this shell
Failed to query available provider packages for deevnet/deevnetthe provider is not in your filesystem mirror, or not at a version your constraint allows. See Before you start
Connection timed out to api.mobile.deevnet.net or tfstate.mobile.deevnet.netyou are not on DVNTM-TD (or a trusted seat), or your laptop is also on ethernet and mobile traffic is routing out the wrong interface β€” where to sit
api.mobile.deevnet.net does not resolve on DVNTM-TDa VPN, Private Relay or hard-coded DNS is bypassing the site’s resolver 10.20.45.1
x509: certificate signed by unknown authorityDEEVNET_API_CACERT does not point at deevnet-root-ca.pem
401 on the first applythe enrollment token was for a different name, and is now spent. Ask for a new admission
401 lateryou are presenting the enrollment token (spent) instead of terraform output -raw api_token
503, OpenBao is sealed or unreachable; tenant work waits until it is openedthe factory is closed between work sessions, and nothing was changed. Ask the operator to open one, then apply again
400 on a broker accounta topic pattern breaks the rules: a leading /, $ or %, a # not at the end, or a device reaching into log/ ( rules)
400 on a DNS recordthe address is outside your own subnet
Saved plan is stalethe state moved between plan and apply. Re-plan
Permission denied (publickey) logging in to a workloadthe user is tenant, not your own; and one key your computer offers (ssh -v … 2>&1 | grep Offering) must be in the workload’s ssh_keys. Compare fingerprints, not comments ( Deploy Your App)
deevnet/deevnet not found on Windows, though install-provider.ps1 ranthe provider went into %APPDATA%\terraform.d\plugins for the CPU it saw. An amd64 Terraform on an ARM laptop wants windows_amd64; install Terraform first, then rerun the script, which asks Terraform
$'\r': command not found, missing separator, or a Makefile that fails on its first line, under WSL2 or Git Bashthe repository was checked out with Windows line endings. Clone inside WSL; or, with a .gitattributes that says eol=lf, git add --renormalize .
WSL2: api.mobile.deevnet.net does not resolve, though Windows resolves itWSL is in NAT mode: networkingMode=mirrored and dnsTunneling=true ( WSL2)
curl: (35) schannel: ... revocation on Windowsadd --ssl-revoke-best-effort: Windows’ curl refuses a chain whose revocation it cannot check
REMOTE HOST IDENTIFICATION HAS CHANGED for a workloadexpected after you replaced it: ssh-keygen -R <fqdn>. If you did not replace it, stop and ask the operator
terraform destroy times out partway throughexpected at the end of a destroy: deleting the tenant removes its Wi-Fi key and its state-store login, so Terraform cannot save its state or release its lock. Ask the operator to remove your leftover state. errored.tfstate in your directory should hold no resources; delete it once they have

Device side #

In rough order of how often each is the cause:

SymptomCheck
Never joins Wi-Fithe PSK is the one from terraform output, not an older one; the SSID is the output’s (DVNTM-IOT on the mobile kit); the board is 2.4 GHz-capable and in range
Joins, but the broker connection fails at TLSthe CA is deevnet-root-ca.pem (DER for MicroPython); you connect by name, mqtt.mobile.deevnet.net, not by IP β€” the certificate is for the name; the ESP32 has a sane clock
TLS works, CONNACK refused (not authorized)username is <tenant>-<name>; the password is from the current state β€” a -replace issued a new one
Connected, but publishes vanishthe topic must be the granted one, <tenant>/…, exactly. An unauthorized publish is dropped or disconnects the client β€” it is not an error you will see
Connected, subscribed, but nothing arrivesa refused subscription is also silent. Compare your topic with granted_subscribe
Keeps reconnectingtwo devices with the same client id β€” the broker drops the older one each time
Log lines missingthe device publishes to <tenant>/log/<its own device name> and nothing else under log/; read partition <index>-2, not the default
Page last modified: November 8, 2026