End devices join request accepted but no downlinks being sent

Hi all,

I’m running a local instance of TTS behind an nginx. I managed to get it running but I’m not sure if its set up correctly.
I’m running a Minew MG6 Stellar LoRaWAN gateway as a basics station pointed to my server. It successfully joined the server and gets pinged occasionally.

What I’m having trouble with is my end devices. I managed to connect them to the network and after about 5 hours they stopped sending data. Now when I look at the application logs this is what I get:

I’ll be honest, I’m not sure how to fix this. I’m guessing I did not set up the stack correctly.

Is this the same device trying to repeat the join process or are there several devices in that grab? (As we cant see the DEV EUI we cant tell). What is the end node device? What firmware/LW s/w stack? There doesn’t appear (from this small snippet) to be a back off mechanism in play - just having the device banging away trying to join wont help (hello head meet wall! :wink: ) What does local log from end device show?

So the device initially joins and sends data? Then stops sending and reverts to trying to rejoin? How many messages before it drops off? Is it a consistent number before it falls over……

I have seen similar application live data recently for a home made device. It worked perfectly on the test bench powered by USB, but would not join when installed on site. I had a power supply issue and the device was restarting every time it transmitted.

Check your gateway logs to see if the join accept is being transmitted. That should verify that your stack is doing what it should. Then check the device.

Hi @Jeff-UK,

It’s the same device trying to repeat the join process in the previous grab. The end device is a Minew LSP01 LoRaWAN PIR Sensor using LoRaWAN 1.0.3. I do not know how to check the end node logs, I’m not sure it can log anything. I checked the gateway logs and it appears to not send any downlinks to that sensor. There is a second sensor that had trouble connecting and now it successfully sends data. This device has initially connected a while ago, transmited for about 5 hours, then tried to repeat the join process similar to this LSP01 device. I’m really confused. This second sensor is a Seat & Desk Occupancy Sensor | PIR Occupancy Sensor | Milesight running version 1.0.3. The odd thing about this sensor is when I look at the device overview I see the root keys provisioned on an external Join Server. I’m not sure how this is possible considering I’m running a single instance of the stack using the tutorial docker file.

Seat & Desk Occupancy Device Overview

Furthermore, I set up 2 more devices that have the same issue as the previous LSP01, they try to repeat the join process over and over again:
Cubicle & Bathroom Occupancy Sensor | Milesight with the tag mlb00000 DevEUI: 24E124617D446595 and AppEUI: 24E124C0002A0001 with the LoRaWAN version 1.0.3

Gateway logs on MLB0000

2025-09-16 13:12:02.828 [SYN:VERB] Time sync rejected: quality=283 threshold=278
2025-09-16 13:12:04.799 [RAL:DEBU] [CRC FAIL] 867.700MHz -10.00/-105.4 SF12/BW125 (mod=16/dr=12/bw=4) xtick=3a407c2a (977304618) 23 bytes: 000100EA00C024E1249565447D7124E124D24A2ADE843B
2025-09-16 13:12:04.800 [S2E:VERB] RX 868.1MHz DR0 SF12/BW125 snr=9.0 rssi=-48 xtime=0x6C00003A407C3F - jreq MHdr=00 JoinEui=24e1:24c0:2a:1 DevEui=24e1:2461:7d44:6595 DevNonce=19154 MIC=998563370

TTN Console Live data on MLB00000

TTN Stack logs on MLB00000

DEBUG Crypto Server connection is not available {“cluster_role”: “CRYPTO SERVER”, “dev_eui”: “24E124617D446595”, “error”: “error:pkg/cluster:peer_unavailable (CRYPTO SERVER cluster peer unavailable)”, “grpc.method”: “HandleJoin”, “grpc.service”: “ttn.lorawan.v3.NsJs”, “join_eui”: “24E124C0002A0001”, “namespace”: “joinserver”, “request_id”: “01K59AEQZEDRAP378RM37VDB6B”}

INFO Finished unary call {“duration”: 0.002, “grpc.method”: “HandleJoin”, “grpc.service”: “ttn.lorawan.v3.NsJs”, “namespace”: “grpc”, “peer.address”: “pipe”, “request_id”: “01K59AEQZEDRAP378RM37VDB6B”}

DEBUG Join-request accepted by cluster-local Join Server {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000 spreading_factor:12 coding_rate:\“4/5\”}”, “dev_addr”: “26000386”, “dev_eui”: “24E124617D446595”, “device_channel_index”: 0, “device_uid”: “dlorawan.mlb00000”, “frequency”: 868100000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758028324.8452337, “request_id”: “01K59AEQZDSTR4W30BTE84M32G”, “spreading_factor”: 12}

DEBUG Publish events {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000 spreading_factor:12 coding_rate:\“4/5\”}”, “dev_addr”: “26000386”, “dev_eui”: “24E124617D446595”, “device_channel_index”: 0, “device_uid”: “dlorawan.mlb00000”, “event_count”: 3, “frequency”: 868100000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758028324.8452337, “request_id”: “01K59AEQZDSTR4W30BTE84M32G”, “spreading_factor”: 12}

INFO Finished unary call {“auth.token_id”: “X57BAMGFVGE7ITA3ZIRAQEAE2O7VCCWQBWSCUEY”, “auth.token_type”: “AccessToken”, “auth.user_id”: “claudiu”, “duration”: 0.0053, “grpc.method”: “GetGatewayConnectionStats”, “grpc.request.gateway_id”: “direk-dml00002”, “grpc.service”: “ttn.lorawan.v3.Gs”, “namespace”: “grpc”, “peer.address”: “pipe”, “peer.real_ip”: “82.16.22.230”, “request_id”: “01K59AER56YWJW32K8W96B3ANB”}

INFO Request handled {“auth.token_id”: “X57BAMGFVGE7ITA3ZIRAQEAE2O7VCCWQBWSCUEY”, “auth.token_type”: “AccessToken”, “duration”: 0.0059, “http.method”: “GET”, “http.path”: “/api/v3/gs/gateways/direk-dml00002/connection/stats”, “http.status”: 200, “namespace”: “web”, “peer.address”: “172.18.0.46:54008”, “peer.real_ip”: “82.16.22.230”, “request_id”: “01K59AER56YWJW32K8W96B3ANB”}

DEBUG Merged metadata {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000 spreading_factor:12 coding_rate:\“4/5\”}”, “dev_addr”: “26000386”, “dev_eui”: “24E124617D446595”, “device_channel_index”: 0, “device_uid”: “dlorawan.mlb00000”, “frequency”: 868100000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “metadata_count”: 1, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758028324.8452337, “request_id”: “01K59AEQZDSTR4W30BTE84M32G”, “spreading_factor”: 12}

DEBUG Add downlink task {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000 spreading_factor:12 coding_rate:\“4/5\”}”, “dev_addr”: “26000386”, “dev_eui”: “24E124617D446595”, “device_channel_index”: 0, “device_uid”: “dlorawan.mlb00000”, “frequency”: 868100000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758028324.8452337, “request_id”: “01K59AEQZDSTR4W30BTE84M32G”, “spreading_factor”: 12, “start_at”: 1758028326.6452336}

DEBUG Publish events {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000 spreading_factor:12 coding_rate:\“4/5\”}”, “dev_addr”: “26000386”, “dev_eui”: “24E124617D446595”, “device_channel_index”: 0, “device_uid”: “dlorawan.mlb00000”, “event_count”: 1, “frequency”: 868100000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758028324.8452337, “request_id”: “01K59AEQZDSTR4W30BTE84M32G”, “spreading_factor”: 12}

Smart Current Transformer | Portable Current Transformer | Milesight with the tag mct00003 DevEUI: 24E124746F210592 and AppEUI: 24E124C0002A0001 with the LoRaWAN version 1.0.3

Gateway logs on MCT00003

2025-09-16 13:09:49.253 [S2E:VERB] RX 868.1MHz DR2 SF10/BW125 snr=11.0 rssi=-49 xtime=0x6C0000322C6646 - jreq MHdr=00 JoinEui=24e1:24c0:2a:1 DevEui=24e1:2474:6f21:592 DevNonce=52063 MIC=-489711732

2025-09-16 13:10:44.780 [___:INFO] WARNING: not enough space allocated, fetched 3 packet(s), 2 will be left in RX buffer
Note: remaining 2 packets in RX buffer, do not fetch sx1302 yet…
WARNING: not enough space allocated, fetched 2 packet(s), 1 will be left in RX buffer
Note: remaining 1 packets in RX buffer, do not fetch sx1302 yet…
WARNING: not enough space allocated, fetched 3 packet(s), 2 will be left in RX buffer
Note: remaining 2 packets in RX buffer, do not fetch sx1302 yet…
WARNING: not enough space allocated, fetched 2 packet(s), 1 will be left in RX buffer
Note: remaining 1 packets in RX buffer, do not fetch sx1302 yet…
WARNING: not enough space allocated, fetched 2 packet(s), 1 will be left in RX buffer
Note: remaining 1 packets in RX buffer, do not fetch sx1302 yet…
WARNING: not enough space allocated, fetched 2 packet(s), 1 will be left in RX buffer
Note: remaining 1 packets in RX buffer, do not fetch sx1302 yet…
WARNING: not enough space allocated, fetched 2 packet(s), 1 will be left in RX buffer
Note: remaining 1 packets in RX buffer, do not fetch sx1302 yet…
2025-09-16 13:10:49.253 [S2E:VERB] RX 868.3MHz DR2 SF10/BW125 snr=12.5 rssi=-50 xtime=0x6C000035BFDA77 - jreq MHdr=00 JoinEui=24e1:24c0:2a:1 DevEui=24e1:2474:6f21:592 DevNonce=46677 MIC=31700654
2025-09-16 13:10:55.613 [SYN:INFO] MCU/SX130X drift stats: min: +0.5ppm q50: +4.8ppm q80: +8.6ppm max: +20.9ppm - threshold q90: +12.9ppm
2025-09-16 13:10:55.613 [SYN:INFO] Mean MCU drift vs SX130X#0: 5.5ppm

2025-09-16 13:11:45.349 [RAL:DEBU] [CRC FAIL] 867.100MHz -23.75/-133.4 SF12/BW125 (mod=16/dr=12/bw=4) xtick=39177cfd (957840637) 17 bytes: 888CA4D882B0FF4583427A1942C70E80D3
2025-09-16 13:11:49.247 [S2E:VERB] RX 868.1MHz DR2 SF10/BW125 snr=-8.2 rssi=-48 xtime=0x6C00003953612F - jreq MHdr=00 JoinEui=24e1:24c0:2a:1 DevEui=24e1:2474:6f21:592 DevNonce=27244 MIC=-1242121964

2025-09-16 13:12:49.259 [S2E:VERB] RX 868.3MHz DR2 SF10/BW125 snr=13.8 rssi=-46 xtime=0x6C00003CE6E42D - jreq MHdr=00 JoinEui=24e1:24c0:2a:1 DevEui=24e1:2474:6f21:592 DevNonce=23149 MIC=1724374443
2025-09-16 13:12:56.388 [SYN:VERB] Time sync rejected: quality=280 threshold=268

TTN Console Live data on MCT00003

TTN STACK logs on MCT00003
DEBUG   Crypto Server connection is not available       {“cluster_role”: “CRYPTO SERVER”, “dev_eui”: “24E124746F210592”, “error”: “error:pkg/cluster:peer_unavailable (CRYPTO SERVER cluster peer unavailable)”, “grpc.method”: “HandleJoin”, “grpc.service”: “ttn.lorawan.v3.NsJs”, “join_eui”: “24E124C0002A0001”, “namespace”: “joinserver”, “request_id”: “01K5995ZPJ235RTE85GT4J1MST”}                

INFO    Finished unary call     {“duration”: 0.0027, “grpc.method”: “HandleJoin”, “grpc.service”: “ttn.lorawan.v3.NsJs”, “namespace”: “grpc”, “peer.address”: “pipe”, “request_id”: “01K5995ZPJ235RTE85GT4J1MST”}

DEBUG   Join-request accepted by cluster-local Join Server      {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000  spreading_factor:10  coding_rate:"4/5"}”, “dev_addr”: “260008D0”, “dev_eui”: “24E124746F210592”, “device_channel_index”: 1, “device_uid”: “dlorawan.mct00003”, “frequency”: 868300000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758026989.2653852, “request_id”: “01K5995ZPHX0B7Q39ASPHXQE0H”, “spreading_factor”: 10}

DEBUG   Publish events  {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000  spreading_factor:10  coding_rate:"4/5"}”, “dev_addr”: “260008D0”, “dev_eui”: “24E124746F210592”, “device_channel_index”: 1, “device_uid”: “dlorawan.mct00003”, “event_count”: 3, “frequency”: 868300000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758026989.2653852, “request_id”: “01K5995ZPHX0B7Q39ASPHXQE0H”, “spreading_factor”: 10}

DEBUG   Merged metadata {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000  spreading_factor:10  coding_rate:"4/5"}”, “dev_addr”: “260008D0”, “dev_eui”: “24E124746F210592”, “device_channel_index”: 1, “device_uid”: “dlorawan.mct00003”, “frequency”: 868300000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “metadata_count”: 1, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758026989.2653852, “request_id”: “01K5995ZPHX0B7Q39ASPHXQE0H”, “spreading_factor”: 10}

DEBUG   Add downlink task       {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000  spreading_factor:10  coding_rate:"4/5"}”, “dev_addr”: “260008D0”, “dev_eui”: “24E124746F210592”, “device_channel_index”: 1, “device_uid”: “dlorawan.mct00003”, “frequency”: 868300000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758026989.2653852, “request_id”: “01K5995ZPHX0B7Q39ASPHXQE0H”, “spreading_factor”: 10, “start_at”: 1758026991.065385}

DEBUG   Publish events  {“bandwidth”: 125000, “data_rate”: “lora:{bandwidth:125000  spreading_factor:10  coding_rate:"4/5"}”, “dev_addr”: “260008D0”, “dev_eui”: “24E124746F210592”, “device_channel_index”: 1, “device_uid”: “dlorawan.mct00003”, “event_count”: 1, “frequency”: 868300000, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “join_eui”: “24E124C0002A0001”, “m_type”: “JOIN_REQUEST”, “major”: “LORAWAN_R1”, “namespace”: “networkserver”, “phy_payload_len”: 23, “received_at”: 1758026989.2653852, “request_id”: “01K5995ZPHX0B7Q39ASPHXQE0H”, “spreading_factor”: 10}

INFO    Finished unary call     {“duration”: 0.2032, “grpc.method”: “HandleUplink”, “grpc.service”: “ttn.lorawan.v3.GsNs”, “namespace”: “grpc”, “peer.address”: “pipe”, “request_id”: “01K5995ZPHX0B7Q39ASPHXQE0H”}

I also noticed my Pub/Subs integration is gone for this application. Maybe it’s related to why the only working sensor shows root keys provisioned on external join server?

I changed the power cable of the gateway to a 12V DC as specified in the manual, but that didn’t seem to change anything meaningful.

At the moment, the working end device has been transmitting for 4 hours, with exactly 254 received uplinks.

That fact the issues are across different devices and from different vendors suggests as you suspect that the problem is with

My 1st step in such a case would be register the GW to TTN Community (TTS Sandbox) vs private instance then try the devices on the same - that will show if all working ok with TTS and will help eliminate any hardware or possible s/w/config issues with GW/Devices. Then you can start to look at details of config/set up of your TTS instance…… you may need to share more details then on how your private instance is set up……

If they fail under TTN come back and let us know as we will be in a better place to help debug issues on there…..

@Jeff-UK Thanks for the tips!
I registered the gateway on the TTS Sandbox and all the devices connected instantly. I set up the same gateway as a basics station similar to how I did it on my local instance. The devices were registered using the same DevEUI, AppEUI, and AppKey. So there’s definitely a problem with the method I set up my local instance.

TTS Sandbox app logs

Gateway live data for the LSP01 joining the network after being turned off

Application live data for the LSP01 joining the network after being turned off

About the local instance. The working sensor stopped successfully broadcasting data around 7 hours ago, after it sent around 380 uplinks. The logs show it got disconnected, and when trying to join again there is no NwkKey specified.

MPD00001

Console logs:

{
  "name": "ns.up.join.cluster.fail",
  "time": "2025-09-17T09:06:17.503724606Z",
  "identifiers": [
    {
      "device_ids": {
        "device_id": "mpd00001",
        "application_ids": {
          "application_id": "dlorawan"
        },
        "dev_eui": "24E124787E281238",
        "join_eui": "24E124C0002A0001",
        "dev_addr": "260002A0"
      }
    }
  ],
  "data": {
    "@type": "type.googleapis.com/ttn.lorawan.v3.ErrorDetails",
    "namespace": "pkg/joinserver",
    "name": "no_nwk_key",
    "message_format": "no NwkKey specified",
    "correlation_id": "249cd5ba2543449ab38095e6181975ca",
    "code": 9
  },
  "correlation_ids": [
    "gs:uplink:01K5BESD8X0ZRNKFHSMXA6E03R",
    "rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01K5BESD8XG2TCQB08V6RGWP25"
  ],
  "origin": "lorawan_stack_tts",
  "context": {},
  "visibility": {
    "rights": [
      "RIGHT_APPLICATION_TRAFFIC_READ"
    ]
  },
  "unique_id": "01K5BESD8ZWAZVHB52V37JY7WQ"
}

Stack Docker logs:

DEBUG   Crypto Server connection is not available       {"cluster_role": "CRYPTO SERVER", "dev_eui": "24E124787E281238", "error": "error:pkg/cluster:peer_unavailable (CRYPTO SERVER cluster peer unavailable)", "grpc.method": "HandleJoin", "grpc.service": "ttn.lorawan.v3.NsJs", "join_eui": "24E124C0002A0001", "namespace": "joinserver", "request_id": "01K5BDMSDJAY4YDS9JEREJD4NP"}

INFO    Join not accepted       {"dev_eui": "24E124787E281238", "error": "error:pkg/joinserver:no_nwk_key (no NwkKey specified)", "grpc.method": "HandleJoin", "grpc.service": "ttn.lorawan.v3.NsJs", "join_eui": "24E124C0002A0001", "namespace": "joinserver", "request_id": "01K5BDMSDJAY4YDS9JEREJD4NP"}

WARN    Finished unary call     {"duration": 0.0009, "error": "error:pkg/joinserver:no_nwk_key (no NwkKey specified)", "error_correlation_id": "5e62d7b4401d40978e7508d5449ad2bf", "error_name": "no_nwk_key", "error_namespace": "pkg/joinserver", "grpc.method": "HandleJoin", "grpc.service": "ttn.lorawan.v3.NsJs", "grpc_code": "FailedPrecondition", "namespace": "grpc", "peer.address": "pipe", "request_id": "01K5BDMSDJAY4YDS9JEREJD4NP"}

INFO    Cluster-local Join Server did not accept join-request   {"bandwidth": 125000, "data_rate": "lora:{bandwidth:125000  spreading_factor:10  coding_rate:\"4/5\"}", "dev_addr": "26000622", "dev_eui": "24E124787E281238", "device_channel_index": 1, "device_uid": "dlorawan.mpd00001", "error": "error:pkg/joinserver:no_nwk_key (no NwkKey specified)", "frequency": 868300000, "grpc.method": "HandleUplink", "grpc.service": "ttn.lorawan.v3.GsNs", "join_eui": "24E124C0002A0001", "m_type": "JOIN_REQUEST", "major": "LORAWAN_R1", "namespace": "networkserver", "phy_payload_len": 23, "received_at": 1758098777.5219033, "request_id": "01K5BDMSDHRMZQA6N7C3N6CC34", "spreading_factor": 10}

DEBUG   Publish events  {"bandwidth": 125000, "data_rate": "lora:{bandwidth:125000  spreading_factor:10  coding_rate:\"4/5\"}", "dev_addr": "26000622", "dev_eui": "24E124787E281238", "device_channel_index": 1, "device_uid": "dlorawan.mpd00001", "event_count": 4, "frequency": 868300000, "grpc.method": "HandleUplink", "grpc.service": "ttn.lorawan.v3.GsNs", "join_eui": "24E124C0002A0001", "m_type": "JOIN_REQUEST", "major": "LORAWAN_R1", "namespace": "networkserver", "phy_payload_len": 23, "received_at": 1758098777.5219033, "request_id": "01K5BDMSDHRMZQA6N7C3N6CC34", "spreading_factor": 10}

WARN    Finished unary call     {"duration": 0.0023, "error": "error:pkg/joinserver:no_nwk_key (no NwkKey specified)", "error_correlation_id": "5e62d7b4401d40978e7508d5449ad2bf", "error_name": "no_nwk_key", "error_namespace": "pkg/joinserver", "grpc.method": "HandleUplink", "grpc.service": "ttn.lorawan.v3.GsNs", "grpc_code": "FailedPrecondition", "namespace": "grpc", "peer.address": "pipe", "request_id": "01K5BDMSDHRMZQA6N7C3N6CC34"}
DEBUG   Server ping sent        {"endpoint": "/traffic/{id}", "gateway_uid": "direk-dml00002", "http.method": "GET", "http.path": "/traffic/eui-AC233FFFFEC1D37C", "namespace": "web", "peer.address": "172.18.0.46:42886", "peer.real_ip": "82.16.22.230", "remote_addr": "172.18.0.46:42886", "request_id": "01K5APFAN6QZKP3C8Z4TDK1FNM"}

Device Overview:

I’m running the stack using the following docker-compose.yml:

docker-compose.yml
services:
  redis:
    image: redis:8.2.0
    restart: unless-stopped
    container_name: lorawan_stack_redis
    hostname: lorawan_stack_redis
    command: redis-server --appendonly yes
    networks:
      - my-net
    volumes:
      - ./data/redis:/data

  stack:
    image: thethingsnetwork/lorawan-stack:3.34.2
    env_file: ./.env.vars
    entrypoint: ttn-lw-stack
    container_name: lorawan_stack_tts
    hostname: lorawan_stack_tts
    command: start
    restart: unless-stopped
    networks:
      - my-net
    # extra_hosts:
    #   - "host.docker.internal:host-gateway"
    depends_on:
      - redis
    volumes:
      - ./data/blob:/srv/ttn-lorawan/public/blob
      # Mount certificates for mTLS MQTT
      - ./config/mqtt_certs/ca-chain.cert.pem:/srv/certs/ca-chain.cert.pem
      - ./config/mqtt_certs/lorawan_stack_mqtt.cert.pem:/srv/certs/lorawan_stack_mqtt.cert.pem
      - ./config/mqtt_certs/lorawan_stack_mqtt.key.pem:/srv/certs/lorawan_stack_mqtt.key.pem
      # - ./config/stack:/config:ro
      # - ./config/certs:/run/secrets
      # If using Let's Encrypt:
      # - ./acme:/var/lib/acme

    expose:
      # Web UI and HTTP API
      - "1885"   # HTTP (cleartext) for NGINX to reverse proxy
      # - "8885"
      # gRPC
      - "1884"
      # - "8884"
      # Basic Station LNS
      # - "8887"
      - "1887"   # Basic Station LNS (WS) for stream proxy/SSL offload
      # - "1883"   # Application MQTT (cleartext) for stream proxy/SSL offload
      # - "8987"   # CUPS (mTLS) – usually terminate TLS in TTS, not NGINX
      - "1700/udp"         # UDP packet forwarder if needed (no TLS)
      # - "1881"
      # - "8881"
      # - "1882"
      # - "8882"
      # - "8883"
      # - "1886"
      # - "8886"
      # - "8889"

    # secrets:
    #    - ca.pem
    #    - cert.pem
    #    - key.pem


# secrets:
#    ca.pem:
#      file: ./config/certs/ca.pem
#    cert.pem:
#      file: ./config/certs/cert.pem
#    key.pem:
#      file: ./config/certs/key.pem

networks:
  my-net:
    external: true

I’m not using the ttn-lw-stack-docker.yml, I replaced it with the following .env.vars:

.env.vars
### Basic configuration
TTN_LW_LOG_LEVEL=DEBUG
#TTN_LW_LOG_FORMAT=JSON
# PostgreSQL
TTN_LW_IS_DATABASE_URI="postgres://user:pass@postgres_db:5432/db?sslmode=disable"
# Redis
TTN_LW_REDIS_ADDRESS="redis:6379"
# Blob Storage
TTN_LW_BLOB_LOCAL_DIRECTORY="/srv/ttn-lorawan/public/blob"
# Telemetry
## TTN_LW_TELEMETRY_ENABLE="false"
# Rate limiting
TTN_LW_RATE_LIMITING_ENABLED="true"
TTN_LW_RATE_LIMITING_PROFILE="medium"

# Default Cluster Configuration
TTN_LW_CLUSTER_ADDRESS=localhost:1884
### Cluster configuration
TTN_LW_CLUSTER_KEYS=cluster_key
## TTN_LW_CLUSTER_JOIN=""
TTN_LW_CLUSTER_ROLES=all

# Cache configuration
## TTN_LW_CACHE_SERVICE="redis"
## TTN_LW_REDIS_CACHE_ADDRESS="redis:6379"
## TTN_LW_REDIS_CACHE_DB="1"
## TTN_LW_REDIS_EVENTS_ADDRESS="redis:6379"
## TTN_LW_REDIS_EVENTS_DB="2"

# Events configuration
## TTN_LW_EVENTS_BACKEND="redis"

# Admin and initial user
TTN_LW_IS_ADMIN_RIGHTS_ALL="true"
# TTN_LW_IS_EMAIL_PROVIDER="smtp"
# TTN_LW_IS_EMAIL_SMTP_ADDRESS="your-smtp-server:587"
# TTN_LW_IS_EMAIL_SMTP_USERNAME="smtp-username"
# TTN_LW_IS_EMAIL_SMTP_PASSWORD="smtp-password"


# Device repository
## TTN_LW_DR_SOURCE="directory"
## TTN_LW_DR_DIRECTORY="/srv/ttn-lorawan/lorawan-devices"
## TTN_LW_DR_URL="https://raw.githubusercontent.com/TheThingsNetwork/lorawan-devices/master"

### HTTP configuration
TTN_LW_HTTP_ADDRESS=":1885"
TTN_LW_HTTP_LISTEN=":1885"
TTN_LW_HTTP_PUBLIC_ADDRESS="https://lorawan.mysite.com"
TTN_LW_HTTP_TRUSTED_PROXIES="0.0.0.0/0"
TTN_LW_HTTP_COOKIE_HASH_KEY=cookie_hash_key
TTN_LW_HTTP_COOKIE_BLOCK_KEY=cookie_block_key
TTN_LW_HTTP_METRICS_PASSWORD=metrics_pss
TTN_LW_HTTP_PPROF_PASSWORD=pprof_pass

### gRPC configuration
TTN_LW_GRPC_ADDRESS=":1884"
TTN_LW_GRPC_ALLOW_INSECURE_FOR_CREDENTIALS=true
# TTN_LW_GRPC_TRUSTED_PROXIES="0.0.0.0/0"

### Identity Server configuration
# Web UI configuration
TTN_LW_IS_OAUTH_UI_BASE_URL="https://lorawan.mysite.com/oauth"
TTN_LW_IS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_IS_OAUTH_UI_IS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_IS_OAUTH_UI_CANONICAL_URL="https://lorawan.mysite.com/oauth"
TTN_LW_IS_CN="lorawan.mysite.com"

### Console configs
# Web UI configuration
TTN_LW_CONSOLE_UI_BASE_URL="https://lorawan.mysite.com/console"
TTN_LW_CONSOLE_UI_IS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_CANONICAL_URL="https://lorawan.mysite.com/console"
TTN_LW_CONSOLE_UI_ACCOUNT_URL="https://lorawan.mysite.com/oauth"
TTN_LW_CONSOLE_UI_GS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_NS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_AS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_JS_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_EDTC_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_QRG_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_GCS_BASE_URL="https://lorawan.mysite.com/api/v3"
# TTN_LW_CONSOLE_UI_QRC_BASE_URL="https://lorawan.mysite.com/api/v3"
TTN_LW_CONSOLE_UI_DCS_BASE_URL="https://lorawan.mysite.com/api/v3"
# Console OAuth configuration
TTN_LW_CONSOLE_OAUTH_AUTHORIZE_URL="https://lorawan.mysite.com/oauth/authorize"
TTN_LW_CONSOLE_OAUTH_LOGOUT_URL="https://lorawan.mysite.com/oauth/logout"
TTN_LW_CONSOLE_OAUTH_TOKEN_URL="https://lorawan.mysite.com/oauth/token"
TTN_LW_CONSOLE_OAUTH_CLIENT_ID=console
TTN_LW_CONSOLE_OAUTH_CLIENT_SECRET=console_pass

### Basic Station LNS configuration
TTN_LW_GS_BASIC_STATION_ADDRESS=":1887"
TTN_LW_GS_BASIC_STATION_LISTEN=":1887"
TTN_LW_GS_BASIC_STATION_USE_TRAFFIC_TLS_ADDRESS="true"  # force WSS in addresses announced to gateways
TTN_LW_GS_BASIC_STATION_WS_PING_INTERVAL="30s"

### Gateway Server configuration
TTN_LW_GS_MQTT_V2_PUBLIC_ADDRESS=""
TTN_LW_GS_MQTT_PUBLIC_ADDRESS=""
TTN_LW_GS_UDP_ADDRESS=":1700"
TTN_LW_GS_FREQUENCY_PLANS_URL="https://raw.githubusercontent.com/TheThingsNetwork/lorawan-frequency-plans/master"
# TTN_LW_GS_MQTT_PUBLIC_TLS_ADDRESS=""
# TTN_LW_GS_GATEWAY_TOKEN_HASH_KEY_ID=""
TTN_LW_GS_GATEWAY_TOKEN_HASH_KEY="gateway_token_hash"

### Network Server configuration
TTN_LW_NS_DEV_ADDR_PREFIXES="26000000/20"

### Application Server configuration with external MQTT
# MQTT config
TTN_LW_AS_MQTT_ENABLED="true"
TTN_LW_AS_MQTT_SERVER="tls://mqtt.mysite.com:8883"
TTN_LW_AS_MQTT_CLIENT_ID="lorawan_stack_mqtt"
# TTN_LW_AS_MQTT_USERNAME="tts-mqtt-user"
# TTN_LW_AS_MQTT_PASSWORD="mqtt-password-change-this"
TTN_LW_AS_MQTT_TLS_CA="/srv/certs/ca-chain.cert.pem"
TTN_LW_AS_MQTT_TLS_CLIENT_CERT="/srv/certs/lorawan_stack_mqtt.cert.pem"
TTN_LW_AS_MQTT_TLS_CLIENT_KEY="/srv/certs/lorawan_stack_mqtt.key.pem"
TTN_LW_AS_MQTT_PUBLISH_QOS="1"
TTN_LW_AS_MQTT_SUBSCRIBE_QOS="1"
# Webhooks config
# TTN_LW_AS_WEBHOOKS_DOWNLINK_PUBLIC_ADDRESS="localhost/api/v3"

### TLS configuration
# Completely disable TLS in the stack since NGINX handles TLS termination
TTN_LW_TLS_SOURCE=""
TTN_LW_TLS_INSECURE="true"
TTN_LW_TLS_INSECURE_SKIP_VERIFY="true"

# Explicitly disable TLS for all internal components
TTN_LW_INTEROP_LISTEN_TLS=""
TTN_LW_COMPONENT_TLS="false"
TTN_LW_GRPC_LISTEN_TLS=""
TTN_LW_HTTP_LISTEN_TLS=""
TTN_LW_AS_MQTT_LISTEN_TLS=""
TTN_LW_GS_MQTT_LISTEN_TLS=""
TTN_LW_GS_MQTT_V2_LISTEN_TLS=""
TTN_LW_GS_BASIC_STATION_LISTEN_TLS=""
TTN_LW_GS_TTIGW_LISTEN_TLS=""
TTN_LW_CLUSTER_TLS="false"

# Disable Interop and internal MQTT listeners since using external MQTT
## TTN_LW_INTEROP_LISTEN=""
TTN_LW_AS_MQTT_LISTEN=""

### Gateway Configuration Server configs
TTN_LW_GCS_BASIC_STATION_DEFAULT_LNS_URI="wss://lorawan.mysite.com:8443"
#TTN_LW_GS_BASIC_STATION_PUBLIC_TLS_ADDRESS="lorawan.mysite.com:8443"
#TTN_LW_GS_PUBLIC_WSS_ADDRESS="wss://lorawan.mysite.com:8443"
#TTN_LW_GCS_PUBLIC_TLS_ADDRESS="lorawan.mysite.com:8443"
#TTN_LW_GCS_BASIC_STATION_LNS_URI="wss://lorawan.mysite.com:8443"