# Zephyr MCU fails to download deployment from local docker server

**URL:** <https://hub.mender.io/t/zephyr-mcu-fails-to-download-deployment-from-local-docker-server/8379>\
**Category:** Zephyr\
**Tags:** mender-client\
**Created:** [October 27, 2026, 4:52pm UTC](https://hub.mender.io/t/zephyr-mcu-fails-to-download-deployment-from-local-docker-server/8379 "2026-10-27T16:52:07Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![matt.h](https://avatars.discourse-cdn.com/v4/letter/m/ec9cab/32.png) [@matt.h](https://hub.mender.io/u/matt.h)\
**Post date:** [October 27, 2026, 4:52pm UTC](https://hub.mender.io/t/zephyr-mcu-fails-to-download-deployment-from-local-docker-server/8379/1 "2026-10-27T16:52:08Z")

</div>

Hi Mender,

I am running Zephyr on an ESP32-C5 and connecting it to a local docker mender server running on my pc. The MCU client can connect to the server and find the deployment correctly, but when it tries to download the deployment it fails. My project is based on mcu-mender-integration, the flow is exactly the same just with some extra additions such as wifi and memory management.

device: esp32s5\_devkitc/esp32c5/hpcore  
zephyr: v4.5.0-rc1  
mender-mcu: v1.1.0  
mender-server: commit 64b9d783efd33bb5836c3316d87ebb873932276f  
Project based on mender-mcu-integration hash dac735e70b9173dc7fa7cfc20b9fa76db4ded850

I understand my zephyr version is ahead of the one in mender-mcu-integration, I was testing out the new FOTA HTTP sample they have.

Artifact size: ~1MB  
Transport: HTTPS

The mender server is running Mongo 7.0 since I am on the linux kernel version which has issues with Mongo 8.0 and 9.0.

The docker dashboard works perfectly and I was able to upload the .mender file generated by the  
project, and accept the device when it asked for authorisation on the first connection.

prj.conf

```auto
####################################
# Generic
####################################
CONFIG_SHELL=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
####################################
# MCU boot
####################################
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_IMG_MANAGER=y
CONFIG_MCUBOOT_IMG_MANAGER=y
CONFIG_MENDER_COMMIT_REQUIRE_AUTH=n
####################################
# Mender MCU
####################################
CONFIG_MENDER_MCU_CLIENT=y
# Demo polling intervals
CONFIG_MENDER_CLIENT_UPDATE_POLL_INTERVAL=30
CONFIG_MENDER_CLIENT_INVENTORY_REFRESH_INTERVAL=60
CONFIG_MENDER_RETRY_ERROR_BACKOFF=60
CONFIG_MENDER_RETRY_ERROR_MAX_BACKOFF=50

# For easier demo, use partition with storage label from Devicetree
CONFIG_MENDER_STORAGE_PARTITION_STORAGE_PARTITION=y

CONFIG_MENDER_SECONDARY_SERVER_HOST_DISABLE=y

# Disable the default update module
CONFIG_MENDER_ZEPHYR_IMAGE_UPDATE_MODULE=n
CONFIG_MENDER_APP_LOCAL_UPDATE_MODULE=y
CONFIG_MENDER_ARTIFACT_TYPE="zephyr-image"
CONFIG_MENDER_ARTIFACT_NAME="zephyr.mender"

####################################
# Mbed-TLS module configuration
#
# NOTE wrt Ciphersuite configuration for Hosted Mender:
# We use two certificates, one for API calls and one for the Artifacts download:
# -> Amazon Root CA 1 certificate with Signature Algorithm: sha256WithRSAEncryption
# -> Google Trust Services GTS Root R4 with Signature Algorithm: ecdsa-with-SHA384
####################################
CONFIG_MBEDTLS=y
CONFIG_TLS_CREDENTIALS=y

CONFIG_MBEDTLS_CIPHERSUITE_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256=y
CONFIG_MBEDTLS_CIPHERSUITE_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384=y
CONFIG_MBEDTLS_CIPHERSUITE_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256=y
CONFIG_MBEDTLS_CIPHERSUITE_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384=y

# P-256 (the device auth keypair we generate) and P-384 (Google GTS R4 cert
# chain) are only implied by the ciphersuites; request them so a config change
# cannot drop them.
CONFIG_PSA_CRYPTO=y
CONFIG_PSA_WANT_ECC_SECP_R1_256=y
CONFIG_PSA_WANT_ECC_SECP_R1_384=y

# PEM_CERTIFICATE_FORMAT split into PARSE/WRITE in 4.x (client reads + writes keys).
CONFIG_MBEDTLS_PEM_PARSE_C=y
CONFIG_MBEDTLS_PEM_WRITE_C=y
CONFIG_MBEDTLS_PK_WRITE_C=y
CONFIG_MBEDTLS_SSL_SERVER_NAME_INDICATION=y

CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384
#CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=8192

CONFIG_MBEDTLS_ENABLE_HEAP=y
#CONFIG_MBEDTLS_HEAP_SIZE=40960
#CONFIG_MBEDTLS_HEAP_SIZE=32768
CONFIG_MBEDTLS_HEAP_SIZE=98304
#CONFIG_MBEDTLS_HEAP_SIZE=10240
#CONFIG_MBEDTLS_HEAP_SIZE=5120
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
CONFIG_MBEDTLS_PSA_DRIVER_GET_ENTROPY=y
CONFIG_MBEDTLS_ENTROPY_C=y

# We need to use our own extension to the config file to limit the size of the
# TLS output buffer. See the config and/or MEN-7807 for details.
CONFIG_MBEDTLS_USER_CONFIG_FILE="config-tls-mender.h"

CONFIG_MBEDTLS_HAVE_TIME_DATE=n

####################################
# Zephyr OS general configuration
####################################
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_ZVFS_OPEN_MAX=40

CONFIG_HTTP_CLIENT_SEND_BUF_SIZE=512

####################################
# Zephyr logging
####################################
CONFIG_LOG=y
CONFIG_LOG_BACKEND_UART=y

CONFIG_LOG_BUFFER_SIZE=2048
CONFIG_LOG_MODE_DEFERRED=y
CONFIG_LOG_MODE_OVERFLOW=y
CONFIG_LOG_SPEED=y
CONFIG_POSIX_C_LANG_SUPPORT_R=y
CONFIG_LOG_OUTPUT_FORMAT_ISO8601_TIMESTAMP=y

####################################
# Networking
####################################
CONFIG_NET_HTTP_LOG_LEVEL_INF=y
# Restrict DNS prints to errors, the rest aren't useful
CONFIG_DNS_RESOLVER_LOG_LEVEL_ERR=y
# IP / DHCP
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS=y
CONFIG_POSIX_API=y
CONFIG_NET_IPV6=n
CONFIG_NET_IPV4=y
CONFIG_NET_CONNECTION_MANAGER=y
# Network event notifications
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=1024
# Enable TLS
CONFIG_NET_SOCKETS_SOCKOPT_TLS=y
# DNS configuration
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=5
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=2
CONFIG_DNS_NUM_CONCUR_QUERIES=5
# Avoid timeouts before receiving SYN-ACK from peer at default value (3000)
CONFIG_NET_SOCKETS_CONNECT_TIMEOUT=5000

# Network buffers
CONFIG_NET_PKT_RX_COUNT=32
CONFIG_NET_PKT_TX_COUNT=32
CONFIG_NET_BUF_RX_COUNT=128
CONFIG_NET_BUF_TX_COUNT=128

CONFIG_HTTP_SERVER=n
CONFIG_HTTP_SERVER_WEBSOCKET=n

# Hotspot
CONFIG_WIFI=y
CONFIG_NET_L2_WIFI_SHELL=y
CONFIG_WIFI_USAGE_MODE_STA_AP=y
CONFIG_NET_CONNECTION_MANAGER=y
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_DHCPV4=y
# Originally 4
CONFIG_ZVFS_POLL_MAX=32

CONFIG_INIT_STACKS=y
CONFIG_NET_MAX_CONTEXTS=32
CONFIG_NET_MAX_CONN=32
CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=16
CONFIG_NET_L2_WIFI_MGMT=y

# Mender Server selection - sets the Server URL and adds the certificates
# Either one of EU/US or ON_PREM
CONFIG_MENDER_SERVER_HOST_US=n
CONFIG_MENDER_SERVER_HOST_EU=n
CONFIG_MENDER_SERVER_HOST_ON_PREM=y
CONFIG_MENDER_SERVER_HOST="https://docker.mender.io"
CONFIG_MENDER_APP_SERVER_HOST_ON_PREM_CERT="mender.der"
CONFIG_MENDER_SERVER_TENANT_TOKEN=""
# Connect to the dns server described in dnsmasq.conf
CONFIG_DNS_SERVER_IP_ADDRESSES=y
CONFIG_DNS_SERVER1="10.42.0.1:15353"

####################################
# Filesystem
####################################
CONFIG_FILE_SYSTEM=y
CONFIG_FILE_SYSTEM_SHELL=y

CONFIG_FLASH=y
CONFIG_FLASH_MAP=y

CONFIG_FS_LITTLEFS_BLK_DEV=n

CONFIG_DISK_ACCESS=y
CONFIG_DISK_DRIVERS=y

####################################
# Developer zone
####################################
# Asserts
# https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_ASSERT_VERBOSE
CONFIG_ASSERT=y
# Useful logs from networking subsystem
CONFIG_NET_LOG=y

# Let's prevent surprises caused by type mismatches and other similar things
# only causing compilation warnings, but potentially leading to fatal issues.
CONFIG_COMPILER_WARNINGS_AS_ERRORS=y

# When enabled it adds ~3k overhead and causes sys_reboot to fail
# because of stricter spinlock validation in Zephyr 4.2.0
CONFIG_SPIN_VALIDATE=n

#=========================
# PSRAM for extra storage
#=========================

# Necessary to give extra space, otherwise the code will be too large
CONFIG_ESP_SPIRAM=y
CONFIG_MBEDTLS_HEAP_CUSTOM_SECTION=y

```

**Logs**

```auto
[1970-01-01T00:00:00,654000Z] <inf> mender_app: ESP32-S3 WiFi Example with Mender
[1970-01-01T00:00:00,654000Z] <inf> mender: Device type: [esp32c5_devkitc]
[1970-01-01T00:00:00,673000Z] <inf> fs_nvs: 2 Sectors of 4096 bytes
[1970-01-01T00:00:00,673000Z] <inf> fs_nvs: alloc wra: 0, fd8
[1970-01-01T00:00:00,673000Z] <inf> fs_nvs: data wra: 0, d8
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Mender client initialized
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Update Local Module 'zephyr-image' initialized
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Mender inventory callback added
I (wifi_init): rx ba win: 6
***Booting Zephyr OS build v4.5.0-rc1***
[1970-01-01T00:00:00,654000Z] <inf> mender_app: ESP32-S3 WiFi Example with Mender
[1970-01-01T00:00:00,654000Z] <dbg> mender_app.certs_add_credentials: Successfully added all certificates
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Mender client activated and running!

[1970-01-01T00:00:00,673000Z] <inf> fs_nvs: 2 Sectors of 4096 bytes
[1970-01-01T00:00:00,673000Z] <inf> fs_nvs: alloc wra: 0, fd8
[1970-01-01T00:00:00,673000Z] <inf> fs_nvs: data wra: 0, d8
[1970-01-01T00:00:00,673000Z] <dbg> mender.mender_storage_init: Initialized Mender NVS at 0x608000 with 2 sectors (4096 bytes available)
[1970-01-01T00:00:00,674000Z] <dbg> mender.mender_storage_init: Initialized deployment logs FCB at 0x60a000 with 2 sectors (8192 bytes available)1970-01-01T00:00:00,736000Z] <inf> mender: Initialization done
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_client_init: Added dormant certificate
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Mender client initialized1970-01-01T00:00:00,737000Z] <inf> mender_app: Using net interface wifi, index=1
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_zephyr_local_image_register_update_module: Successfully registered the 'zephyr-image' update module!1970-01-01T00:00:00,737000Z] <inf> mender_app: Connecting to wireless network 12345678...
[1970-01-01T00:00:00,675000Z] <dbg> mender_app.main: Successfully loaded the local update modul[1970-01-01T00:00:00,740000Z] <inf> mender_app: Waiting for network up...
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Update Local Module 'zephyr-image' initialized
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Mender inventory callback added
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_os_scheduler_work_activate: Activating mender_client_main every 30 seconds
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_os_scheduler_work_activate: Activating mender_inventory every 60 seconds
[1970-01-01T00:00:00,675000Z] <inf> mender_app: Mender client activated and running!
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_os_scheduler_work_handler: Executing mender_client_main work
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_client_work_function: Inside work function [state: MENDER_CLIENT_STATE_INITIALIZATION]
[1970-01-01T00:00:00,675000Z] <dbg> mender.mender_tls_init_authentication_keys: Retrieving user provided authentication keys
[1970-01-01T00:00:00,675000Z] <dbg> mender_app.mender_get_private_key: Returning MENDER_OK
[1970-01-01T00:00:00,736000Z] <dbg> mender.mender_storage_get_deployment_data: Deployment data not available
[1970-01-01T00:00:00,736000Z] <inf> mender: Initialization done
[1970-01-01T00:00:00,737000Z] <dbg> mender.mender_client_update_work_function: Entering state MENDER_UPDATE_STATE_DOWNLOAD
[1970-01-01T00:00:00,737000Z] <inf> mender_app: Using net interface wifi, index=1
[1970-01-01T00:00:00,737000Z] <inf> mender_app: Connecting to wireless network 12345678...
[1970-01-01T00:00:00,740000Z] <inf> mender_app: Waiting for network up...
[1970-01-01T00:00:08,064000Z] <inf> mender: Checking for deployment...
[1970-01-01T00:00:08,063000Z] <inf> net_dhcpv4: Received: 10.42.0.222
[1970-01-01T00:00:08,063000Z] <inf> mender_app: Address[1]: 10.42.0.222
[1970-01-01T00:00:08,063000Z] <inf> mender_app: Subnet[1]: 255.255.255.0
[1970-01-01T00:00:08,063000Z] <inf> mender_app: Router[1]: 10.42.0.1
[1970-01-01T00:00:08,063000Z] <inf> mender_app: Lease time[1]: 3600 seconds
Connected

[1970-01-01T00:00:08,161000Z] <inf> mender: Checking for deployment...
[1970-01-01T00:00:08,161000Z] <dbg> mender.mender_storage_get_provides: Provides not available
[1970-01-01T00:00:08,162000Z] <dbg> mender_app.mender_get_identity_cb: get_identity_cb
[1970-01-01T00:00:11,363000Z] <dbg> mender.ensure_authenticated_and_locked: Authenticated successfully
[1970-01-01T00:00:11,847000Z] <dbg> mender.mender_api_check_for_deployment: POST request to v2 version of the deployments API failed, falling back to v1 version and GET
[1970-01-01T00:00:42,315000Z] <inf> mender: Checking for deployment...
[1970-01-01T00:00:42,315000Z] <dbg> mender.mender_os_scheduler_work_handler: Executing mender_client_main work
[1970-01-01T00:00:42,315000Z] <dbg> mender.mender_client_work_function: Inside work function [state: MENDER_CLIENT_STATE_OPERATIONAL]
[1970-01-01T00:00:42,315000Z] <dbg> mender.mender_client_update_work_function: Entering state MENDER_UPDATE_STATE_DOWNLOAD
[1970-01-01T00:00:42,315000Z] <inf> mender: Checking for deployment...
[1970-01-01T00:00:42,315000Z] <dbg> mender.mender_storage_get_provides: Provides not available
[1970-01-01T00:00:43,246000Z] <inf> mender: Downloading artifact with id '5c96907...', name 'zephyr.mender', uri 'https://s3.docker.mender.io/mender/bf811441-ebe1-4fd2-867d-77c6faa10b51?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=mender%2F20261027%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20261027T152344Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22zephyr.mender.mender%22&response-content-type=application%2Fvnd.mender-artifact&x-id=GetObject&X-Amz-Signature=debb431fd3e5f24693fde365fa7fdb3ca6af1cf83c81b313e53c4114aa06a716'
[1970-01-01T00:00:12,578000Z] <inf> mender: mender_http_artifact_download
[1970-01-01T00:00:12,959000Z] <inf> mender: MENDER_HTTP_EVENT_CONNECTED
[1970-01-01T00:00:12,959000Z] <err> mender: HERE
[1970-01-01T00:00:13,013000Z] <inf> mender: artifact_response_cb (http.c)
[1970-01-01T00:00:13,013000Z] <inf> mender: MENDER_HTTP_EVENT_DATA_RECEIVED
[1970-01-01T00:01970-01-01T00:00:13,013000Z] <inf> mender: Return value from artifact_download_callback (0 == MENDER_OK): 0
[1970-01-01T00:12,5780:00:13,017000Z] <inf> mender: artifact_response_cb (http.c)
[1970-01-01T00:00:13,017000Z] <err> mender: HTTP status 400
[1970-01-01T00:00:13,017000Z] <inf> mender: MENDER_HTTP_EVENT_DISCONNECTED
[1970-01-01T00:00:13,020000Z] <err> mender: Error occurred in mender_download_artifact (artifact-download.c), logging unknown error
[1970-01-01T00:00:13,020000Z] <err> mender: [400] Bad Request: unknown error
[1970-01-01T00:00:13,020000Z] <err> mender: Unable to download artifact
000Z] <dbg> mender_app.mender_deployment_status_cb: downloading
[1970-01-01T00:00:12,578000Z] <inf> mender: mender_http_artifact_download
[1970-01-01T00:00:12,959000Z] <inf> mender: MENDER_HTTP_EVENT_CONNECTED
[1970-01-01T00:00:12,959000Z] <err> mender: HERE
[1970-01-01T00:00:13,013000Z] <inf> mender: artifact_response_cb (http.c)
[1970-01-01T00:00:13,013000Z] <inf> mender: MENDER_HTTP_EVENT_DATA_RECEIVED
[1970-01-01T00:00:13,013000Z] <dbg> mender.mender_artifact_process_data: mender_artifact_process_data (artifact.c)
[1970-01-01T00:00:13,013000Z] <dbg> mender.mender_artifact_process_data: artifact.c: start parse
[1970-01-01T00:00:13,013000Z] <dbg> mender.mender_artifact_process_data: artifact.c: header
[1970-01-01T00:00:13,013000Z] <dbg> mender.mender_artifact_process_data: artifact.c: finished
[1970-01-01T00:00:13,013000Z] <inf> mender: Return value from artifact_download_callback (0 == MENDER_OK): 0
[1970-01-01T00:00:13,017000Z] <inf> mender: artifact_response_cb (http.c)
[1970-01-01T00:00:13,017000Z] <err> mender: HTTP status 400
[1970-01-01T00:00:13,017000Z] <inf> mender: MENDER_HTTP_EVENT_DISCONNECTED
[1970-01-01T00:00:13,020000Z] <err> mender: Error occurred in mender_download_artifact (artifact-download.c), logging unknown error
[1970-01-01T00:00:13,020000Z] <err> mender: [400] Bad Request: unknown error
[1970-01-01T00:00:13,020000Z] <err> mender: Unable to download artifact
[1970-01-01T00:00:13,486000Z] <dbg> mender_app.mender_deployment_status_cb: failure
[1970-01-01T00:00:13,486000Z] <dbg> mender.mender_client_update_work_function: Entering state MENDER_UPDATE_STATE_CLEANUP
[1970-01-01T00:00:13,486000Z] <dbg> mender.mender_client_update_work_function: Entering state MENDER_UPDATE_STATE_END
[1970-01-01T00:00:13,488000Z] <dbg> mender.mender_os_scheduler_work_handler: Executing mender_inventory work
[1970-01-01T00:00:13,488000Z] <dbg> mender.mender_storage_get_provides: Provides not available
[1970-01-01T00:00:13,488000Z] <dbg> mender.collect_persistent_inventory: No persistent inventory data to collect

```

The receive buffer returned after the deployment HTTPS GET command is completely empty  
There are some of my own log messages in there to keep track of the program flow better.

I’ve debugged the HTTPS GET command and headers that are sent and they look as expected, I can’t determine what is wrong here.

I’ve tried using the artifact chunk download option as well but that has the same error.

Does anyone have more information on what might be causing this error or a better way of debugging this?

Thanks in advance.

KR,  
Matt
