logo elektroda
logo elektroda
X
logo elektroda

Hosting OpenBeken Webapp Locally with Docker on Various Operating Systems

taktlos  23 4773 Cool? (+3)
📢 Listen (AI):

TL;DR

  • A Docker image hosts the OpenBeken IoT Web App locally on Linux or Windows, letting an OpenBeken device redirect to a LAN-based file repository.
  • The app loads startup.js, which starts VueJS and then myComponent.vue, with each page implemented as a separate VueJS Single File Component.
  • Container setups expose port 7231 and come in four flavours, from node:18-alpine at 73 MB to alpine at 9 MB, with amd64, arm32, and arm64 support.
  • The result is local hosting with OTA updates, device filesystem management, configuration, and logging, while some variants need internet at container start or lack the standalone web app.
Generated by the language model.
Docker Image for OpenBeken IoT Web App Hosting

source code: OpenBekenIOT Web App

Designed for hosting an IoT web application, this Docker image initiates from a simple webpage at http://(IP):PORT/ on the device. The device redirects to a default repository, but with device configuration, local hosting on your LAN is possible for enhanced security.

Key Components:

Web App Structure:
The app root page loads startup.js, initiating VueJS.
startup.js further loads myComponent.vue, the core of the web app.
Each page of the app is a separate VueJS Single File Component (SFC).

Versatility in Hosting:
Redirects to a default repository, configurable for local hosting on LAN or from the device filesystem.

Rich Features:
Over-The-Air (OTA) updates for seamless enhancements.
Device filesystem management for efficient file handling.
Device configuration for personalized settings.
Logging capabilities for effective monitoring.

This Docker image streamlines the deployment of an OpenBeken IoT web application, offering flexibility in hosting options and a robust feature set for an enriched user experience.


Easy Local Web App Hosting with Docker!

Ready to effortlessly share files locally? This Docker image, crafted with Alpine, Node, and OpenBeken magic, makes it a breeze! Whether you're on Linux or Windows, turn your computer/server into a 24/7 host.

Simple Steps:


1. Get Ready:
Make sure Docker is installed on your system.

2. Run Docker Magic:
Log in with Docker execution privileges.

Run this command:
Code: Bash
Log in, to see the code


This downloads the image and launches the container, exposing port 7231. Adjust the port according to your preference, ensuring alignment with application settings.

Screenshot showing HTTP server configuration.

3. Change URI address of hosted files(In my case files are hosted on computer with hostname: server):
Please visit the specified page, and following that, proceed to adjust the settings on your device at the provided address (in this instance, it is the hostname of my IoT OpenBeken device).
Code: Bash
Log in, to see the code


Here, the address of our local server, which stores files for us, is entered.

OpenBeken IoT web application configuration page with a URL input box.

4. Check the results

With those steps completed, the configuration process should now be finished.



Upon successful execution of the plan, the following is expected in the web browser:
Screenshot of the OpenBeken IoT configuration interface highlighting the web app URL.

On the server side within the Docker/container environment:
Screenshot showing http server logs running in a Docker environment for the OpenBeken IoT application.

If there are significant updates to the web app, the Docker image will be promptly refreshed to ensure users can benefit from the latest features and improvements. If you have any further questions or need assistance in the future, feel free to reach out.

[EDIT]

Different flavours of images available:

Code: Bash
Log in, to see the code

Based on image: node:18-alpine
Based on npm http-server: YES
Image approx. size(compressed): 73 MB
Architecture available: amd64, arm32, arm64
Stand-alone version with Web App included: YES
Update of Web App by pulling new image: YES
Required Internet connection during container starts: NO

Code: Bash
Log in, to see the code

Based on image: alpine:3.15
Based on npm http-server: YES
Image approx. size(compressed): 29 MB
Architecture available: amd64, arm32, arm64
Stand-alone version with Web App included: YES
Update of Web App by pulling new image: YES
Required Internet connection during container starts: NO

Code: Bash
Log in, to see the code

Based on image: node:alpine
Based on npm http-server: YES
Image approx. size(compressed): 53 MB
Architecture available: amd64, arm32, arm64
Stand-alone version with Web App included: NO
Update of Web App by restart of container: YES
Required Internet connection during container starts: YES

Code: Bash
Log in, to see the code

Based on image: alpine
Based on Apache Web Server: YES
Image approx. size(compressed): 9 MB
Architecture available: amd64, arm32, arm64
Stand-alone version with Web App included: NO
Update of Web App by restart of container: YES
Required Internet connection during container starts: YES

About Author
taktlos wrote 21 posts with rating 9 , helped 4 times. Been with us since 2008 year.

Comments

p.kaczmarek2 20 Dec 2023 08:08

That's a very useful guide for people who want to have Web App working on the closed network without access to the internet. Still, I think it's important to add, that if you just want to make your own... [Read more]

taktlos 20 Dec 2023 09:20

I completely agree. The premise of creating this image was to have devices based on OpenBeken firmware completely offline. OpenBeken frees us from the Tuya cloud, and a locally hosted container ultimately... [Read more]

p.kaczmarek2 20 Dec 2023 09:27

It should be fully possible to host that web app on the OBK device itself, but it would make updates problematic. Futhermore, I haven't tested the size of web app files in a long time, so they might have... [Read more]

taktlos 20 Dec 2023 10:44

I see which means this leads us to a small walkaround: Image: closed0beta/openbeken_webapp_http-server Contains all necessary files and depends on my updates Command to run: docker run -p... [Read more]

Angel0fDeath 06 Jan 2024 20:25

@taktlos It looks like this could be run on linux/amd only. Probably is good idea to be able to run on linux/arm also... [Read more]

taktlos 07 Jan 2024 10:26

Great suggestion! I've created an extra image for arm64, expanding platform support to two options: amd64 and arm64. [EDIT] Additional image for arm32 aka arm v7 due to Alpine version 3.15 Command... [Read more]

Angel0fDeath 07 Jan 2024 16:43

@taktlos As far as I know, Alpine 3.15 was outdated - I think at some point in November last year (2023). Nevertheless, the web page is not so complicated to require more. Works perfect, so everything... [Read more]

taktlos 07 Jan 2024 17:16

Ok then. ARMv6 and ARMv7 build(32-bit) based on: Alpine Linux version: 3.19.0 Nodejs version: v12.22.9 Node version: v21.4.0 Npm version: 10.2.5 Command to run: docker run -p 7231:80... [Read more]

Angel0fDeath 07 Jan 2024 18:30

@taktlos Something wrong with port publishing in the last version. https://obrazki.elektroda.pl/1913623100_1704648523_thumb.jpg without restart=always container stops after few seconds. With... [Read more]

taktlos 07 Jan 2024 19:38

All right, so the earlier obsolete version of Alpine Linux back in business. Alpine Linux version: 3.15 Nodejs version: 16.20.2-r0 Npm version: 8.1.3-r0 [Read more]

Angel0fDeath 07 Jan 2024 20:24

https://obrazki.elektroda.pl/5066074700_1704655680_thumb.jpg Yep. With outdated Alpine - everything is ok. I think the problem is with my docker - v 20.10.15 for wdmycoudex4100 dated May 2022....... [Read more]

jkwim 22 Jan 2024 19:12

Hi, Finally I am getting at incorporating the Webapp in a private network with no internet access. To go one step further, I want to know whether the "Logs" option can be implemented via the device... [Read more]

taktlos 23 Jan 2024 09:15

Hi, You have to ask person responsible for a web app development. Ie. github? This topic is about containeerized version only. [Read more]

jkwim 23 Jan 2024 17:22

I tried creating the files in LittleFS. https://obrazki.elektroda.pl/7881742300_1705998279_thumb.jpg I edited the paths so that everything gets referenced from / (no sub directories). As... [Read more]

Angel0fDeath 23 Jan 2024 19:37

@jkwim You most probably would like to check LittleFS size rather than firmware flash size. In web app -> logs run command lfs_size it will return size in bytes (hex). By me this returns 0x8000, which... [Read more]

p.kaczmarek2 23 Jan 2024 20:17

@jkwim please open another topic and we can look into that together, but long story short, LittleFS could have even 500kB or so, but it would need to be shifted to the OTA space, and then OTA would wipe... [Read more]

jkwim 25 Jan 2024 15:21

Opened a new topic as suggested: Hosting OpenBekenIOT Web App's 'Logs' function in the LittleFS of the Device (BK7231T) [Read more]

taktlos 28 Jan 2024 14:41

Different flavours of images available: closed0beta/openbeken_webapp_http-server:latest Based on image: node:18-alpine Based on npm http-server: YES Image approx. size(compressed): 73 MB Architecture... [Read more]

Angel0fDeath 28 Jan 2024 17:01

Well, that's a good work. Thank you. [Read more]

FAQ

TL;DR: With images from 9 MB to 73 MB and the goal of keeping devices fully offline, this guide shows OpenBeken users how to host the Web App on a LAN server with Docker, then repoint each device from the default repository to a local URL. As one expert put it, "completely offline." [#20869677]

Why it matters: Local hosting lets OpenBeken devices work inside closed networks, reduces outside dependencies, and gives you predictable control over updates.

Option Approx. size Web App included Update method Internet needed at container start
http-server 73 MB Yes Pull new image No
arm32 29 MB Yes Pull new image No
http-server_startup 53 MB No Restart container Yes
http-server_minimal 9 MB No Restart container Yes

Key insight: The most reliable offline setup uses a stand-alone image that already contains the Web App files. Startup-update images are smaller, but they depend on network access when the container starts.

Quick Facts

  • Default LAN example: publish port 7231:80, then point the device’s cfg_webapp setting to your local host, such as a server hostname on the same network. [#20868576]
  • Architecture support expanded from amd64 to arm64 and arm32, with a dedicated openbeken_webapp_http-server_arm32:latest tag added later. [#20895559]
  • A real ARM32 failure case showed Exit code 139 and broken port publishing on an older Docker stack; reverting the image base to Alpine 3.15 restored stability. [#20896830]
  • Stand-alone images work without internet at startup, while startup-update images fetch files on launch and therefore require internet access during container start. [#20933221]

How do I host the OpenBeken Web App locally with Docker and point my device to the LAN server instead of the default online repository?

Run the container locally, then change the device’s Web App URL to your LAN host. 1. Start Docker with docker run -p 7231:80 closed0beta/openbeken_webapp_http-server:latest. 2. Open your OpenBeken device at http://openbeken_device/cfg_webapp. 3. Enter the local server address that hosts the files, such as your server hostname, and save it. The example in the thread exposes port 7231 and serves the app from port 80 inside the container. [#20868576]

Which OpenBeken Docker image should I choose: closed0beta/openbeken_webapp_http-server, openbeken_webapp_arm32, http-server_startup, or http-server_minimal?

Choose a stand-alone image for offline reliability, or a startup-update image for smaller size. http-server is the full default at about 73 MB. arm32 is the smaller stand-alone build at about 29 MB. http-server_startup is about 53 MB and updates on restart. http-server_minimal is about 9 MB and also updates on restart. Use stand-alone images when you want no internet dependency during startup. [#20933221]

What is VueJS SFC in the OpenBeken Web App, and how do startup.js and myComponent.vue fit into the app structure?

"VueJS SFC is a component format that stores one app page in a single file, combining structure and logic for modular loading." In this app, the root page loads startup.js, which starts VueJS and then loads myComponent.vue as the core component. The thread also states that each page is a separate VueJS Single File Component, so the app is built from multiple SFC pages rather than one monolithic file. [#20868576]

What is LittleFS in OpenBeken, and how is it different from the Docker-based web app hosting discussed in this thread?

"LittleFS is a device file system that stores files directly in flash memory, with tight size limits and device-level persistence." It differs from Docker hosting because Docker serves the Web App from a separate server or NAS, while LittleFS stores files on the OpenBeken device itself. The thread’s Docker guide is about containerized hosting only, and later posts explicitly move LittleFS discussion into a separate topic. [#20924084]

Why does the openbeken_webapp container not come back after a reboot, and how do I use Docker restart policies like --restart unless-stopped correctly?

The container does not restart after reboot if you launched it without a restart policy. Use Docker with a policy such as --restart unless-stopped so the container starts again automatically after the host reboots. One user confirmed that enabling “restart unless stopped” in Portainer fixed the issue, and suggested this command: docker run -d -p 7231:80 --restart unless-stopped closed0beta/openbeken_webapp_http-server:latest. That approach keeps the service persistent for a 24/7 host. [#21048761]

What causes Exit code 139 and broken port publishing in the ARM32 OpenBeken webapp container, and why did reverting to Alpine 3.15 fix it on older Docker versions?

The failure was tied to the newer ARM32 build on an older Docker environment, not to the port mapping syntax itself. One user reported Exit code 139, repeated restarts, and a port that stayed closed on Docker 20.10.15. After the maintainer reverted the ARM32 image back to Alpine 3.15, the same user confirmed that “everything is ok.” This makes the practical root cause an old Docker stack that did not behave well with the newer base image. [#20896964]

How can I run the OpenBeken Web App container on amd64, arm64, and arm32 devices, and which image tags support each architecture?

Run the image tag that matches your platform, then publish port 7231 to container port 80. The thread first used closed0beta/openbeken_webapp_http-server:latest, then added arm64, and later added a dedicated ARM32 command: docker run -p 7231:80 closed0beta/openbeken_webapp_http-server_arm32:latest. The final image summary says the available architectures are amd64, arm32, and arm64 across the listed variants. [#20933221]

What are the trade-offs between hosting the OpenBeken Web App in Docker, on GitHub Pages, in Home Assistant HTTP hosting, or directly on the OBK device?

Docker is best for a closed LAN, GitHub Pages is best for free static hosting, Home Assistant can reuse built-in HTTP hosting, and device hosting is the most self-contained. Docker turns a PC or server into a 24/7 host and supports offline operation. GitHub Pages is free but not for isolated networks. Hosting on the OBK device is the “ideal solution” for full independence, but updates become harder and file size can become a constraint. [#20869686]

How do the stand-alone OpenBeken images differ from the startup-update images in terms of internet access, update method, and image size?

Stand-alone images bundle the Web App, while startup-update images fetch or refresh files when the container starts. In the thread, stand-alone images are http-server at about 73 MB and arm32 at about 29 MB. They update by pulling a new image and do not require internet at startup. Startup-update images are http-server_startup at about 53 MB and http-server_minimal at about 9 MB. They update on container restart and require internet during startup. [#20933221]

Why would the ideal OpenBeken setup be to host the web app files directly on the device, and what update problems does that create?

Hosting directly on the device is ideal because it removes dependence on outside servers and keeps the whole system local. The thread explicitly says the ideal solution would be to host Web App files on an OpenBeken device. The downside is updates: the maintainer noted that hosting on the device should be possible, but updates become problematic, and cloned files may miss the latest device templates stored in the Web App. [#20869686]

How can I make an offline OpenBeken installation work fully inside a private network with no internet access?

Use a stand-alone Docker image, host it on your LAN, and point each device to that local address. The thread says this guide is useful for people who want the Web App working on a closed network without internet access. The practical path is simple: run a bundled image like http-server, avoid startup-update images that need internet, and set cfg_webapp to your local server URL so the device stops using the default online repository. [#20869616]

What exactly does the cfg_webapp page do in OpenBeken, and how should I format the local server URL there?

cfg_webapp is the device page where you set the URI that tells OpenBeken where to load Web App files from. In the thread, the maintainer tells users to open http://openbeken_device/cfg_webapp and enter the address of the local server that stores the files. Use a LAN-reachable hostname or IP with the correct port, such as a server hostname serving the container on 7231. The goal is to replace the default repository with your local host. [#20868576]

If I want to host only the Logs tab from the OpenBeken Web App in the device file system, what files and paths are needed, and what URL would serve them from the device directly?

The thread does not provide a confirmed working Logs-only file layout or a final serving URL. One user proposed startup.js, httpVueLoader.js, vue.min.js, logs.vue, and edited paths under /, but the maintainer redirected the question because the topic covers only the containerized version. A later test also hit storage limits after roughly 3,708 bytes in LittleFS, so the idea remained unresolved in this thread. For a definitive Logs-only path map, the discussion moved to a separate topic. [#20924116]

How can I check and resize LittleFS space on an OpenBeken device with commands like lfs_size or lfs_format, and what are the OTA risks?

Check LittleFS with lfs_size, resize it with lfs_size newsize, or format and place it with lfs_format <size>. One user reported lfs_size returning 0x8000, which equals 32,768 bytes or 32 KB. Another reply says LittleFS can reach about 500 kB by overlapping OTA space. The risk is clear: larger LittleFS can reduce or break OTA room, and some OTA updates wipe LittleFS and shrink it back to 32 KB. [#20925206]

How do I attach the OpenBeken Web App container in QNAP Container Station to a second network adapter or IoT VLAN so it can reach devices on a different subnet?

This thread does not contain a working fix for QNAP multi-NIC or IoT VLAN attachment. The user describes a QNAP setup where Home Assistant uses two adapters, but openbeken-webapp created “virtual switch 6” and would not let the user select the existing highlighted adapters for the IoT network. No later reply in the thread answers that question, so the only safe conclusion is that the issue remains unresolved here. [#21132524]
Generated by the language model.
%}