Speedtest Tracker variant for ARM64 RouterOS containers with source-IP bound multi-profile testing.
1.1K
Experimental ARM64 container image based on Speedtest Tracker, tailored for low-resource ARM64 container environments such as RouterOS/MikroTik.
This variant is designed for source-bound speed tests using multiple local source IPs or interfaces. In the validated setup, the container runs on a MikroTik hAP ax3 used as core access/switch/AP, while WAN routing is handled by a TP-Link ER605 main router/firewall. ISP1/ISP2 are connected to the ER605, and static routes or routing policy on the main router direct traffic based on the container source IP.
This image is an experimental ARM64/MikroTik-focused variant of Speedtest Tracker.
Upstream project:
https://github.com/alexjustesen/speedtest-tracker
This image is maintained independently and is not an official image from the upstream Speedtest Tracker project.
Public release notes are tracked in the project repository. Some implementation and documentation work was AI-assisted, with manual testing performed on RouterOS hardware.
rvncore/speedtest-tracker:0.2.0-b1.2-mikrotik-lite-multi-isp-arm64rvncore/speedtest-tracker:0.2.0-b1.2-ceebb83-mikrotik-lite-multi-isp-arm64For repeatable deployments, prefer the pinned build tag:
rvncore/speedtest-tracker:0.2.0-b1.2-mikrotik-lite-multi-isp-arm64
For exact build traceability, use the source-SHA tag:
rvncore/speedtest-tracker:0.2.0-b1.2-ceebb83-mikrotik-lite-multi-isp-arm64
Moving tags such as latest, multi-isp-exp-arm64, and 0.2.0-mikrotik-lite-multi-isp-arm64 should point to the validated b1.2 build after promotion. For repeatable deployments, prefer a pinned build tag or source-SHA tag.
--ipThe runtime is configured through Docker/RouterOS environment values or the persistent /config/.env file.
SPEEDTEST_LITE_MODE
SPEEDTEST_LITE_BIND_OPTION
--ipSPEEDTEST_LITE_BIND_INTERFACE
veth-app-speedSPEEDTEST_LITE_ISP_PROFILES
isp1,isp2SPEEDTEST_LITE_UNIQUE_EGRESS_REQUIRED
trueSPEEDTEST_LITE_UNIQUE_EGRESS_WINDOW_MINUTES
60Existing deployments with a persistent /config/.env will not automatically inherit new image defaults. Add new runtime values to the RouterOS envlist or /config/.env, then restart the container.
SPEEDTEST_LITE_ISP1_ENABLED=true
SPEEDTEST_LITE_ISP1_NAME=CNVG
SPEEDTEST_LITE_ISP1_SOURCE_IP=192.168.99.250
SPEEDTEST_LITE_ISP1_CRON=0,30 * * * *
SPEEDTEST_LITE_ISP2_ENABLED=true
SPEEDTEST_LITE_ISP2_NAME=PLDT
SPEEDTEST_LITE_ISP2_SOURCE_IP=192.168.99.251
SPEEDTEST_LITE_ISP2_CRON=15,45 * * * *
Additional profiles can be added by extending SPEEDTEST_LITE_ISP_PROFILES and defining matching profile variables.
TZ=Asia/ManilaAPP_TIMEZONE=UTCDISPLAY_TIMEZONE=Asia/ManilaAPP_TIMEZONE=UTC for stable stored timestamps.DISPLAY_TIMEZONE to the local display timezone.TZ to the local runtime timezone.0.1.1-b1.4 - Validated MikroTik Lite baselinePrevious known-good rollback build.
Includes:
--ip0.1.1-b1.6 - Corrected upstream baselinePrevious corrected baseline.
Adds/fixes:
APP_KEY caching issue0.1.1-b1.7 - Validated runtime stabilization buildPrevious validated runtime stabilization build.
Adds/fixes:
0.1.1-b1.9 - Current validated buildValidated on RouterOS using the source-SHA image tag after approximately 36 hours of stable runtime observation.
Adds/fixes:
1.28.3-r1 to 1.28.3-r20.2.0-b1.2 - Current validated feature buildValidated on RouterOS after overnight observation with unique-egress validation active.
Adds/fixes:
This example matches the validated style but is meant to be adjusted for your network. The storage name, bridge name, IPs, profile names, cron values, and memory cap are all configurable.
The validated setup uses usb1-part1, but this is only the RouterOS storage volume name used on the test device. Replace it everywhere with your own storage name, for example usb1, disk1, or another mounted storage device shown by RouterOS.
Keep the persistent config path separate from the container root path:
apps/speedtest/app-speedtest/configapps/speedtest/app-speedtest/rootapps/speedtest/app-speedtest/root-<version-or-sha>The SQLite database and application configuration should live under the /config mount so image/root cleanup does not remove runtime data.
usb1-part1apps/speedtest/app-speedtestbridge.rvencore.lan192.168.99.249/24192.168.99.250/24, 192.168.99.251/24192.168.99.254veth-app-speedenv-app-speedmount-app-speedapp-speedCreate one VETH interface and add the management/source IPs used by the profiles.
/interface/veth/add name=veth-app-speed address=192.168.99.249/24 gateway=192.168.99.254
/ip/address/add interface=veth-app-speed address=192.168.99.250/24
/ip/address/add interface=veth-app-speed address=192.168.99.251/24
/interface/bridge/port/add bridge=bridge.rvencore.lan interface=veth-app-speed pvid=1
Create or verify persistent directories on the RouterOS storage device.
/file/make-directory usb1-part1/apps
/file/make-directory usb1-part1/apps/speedtest
/file/make-directory usb1-part1/apps/speedtest/app-speedtest
/file/make-directory usb1-part1/apps/speedtest/app-speedtest/config
Create the persistent /config mount.
/container/mounts/add name=mount-speedtest-config src=usb1-part1/apps/speedtest/app-speedtest/config dst=/config
/container/mounts/add name=mount-app-speed mounts=mount-speedtest-config
Create the environment list. Adjust profile names, source IPs, and cron values for your own WAN paths.
/container/envs/add list=env-app-speed key=TZ value="Asia/Manila"
/container/envs/add list=env-app-speed key=APP_TIMEZONE value="UTC"
/container/envs/add list=env-app-speed key=DISPLAY_TIMEZONE value="Asia/Manila"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_MODE value="multi_isp_experimental"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_BIND_OPTION value="--ip"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_BIND_INTERFACE value="veth-app-speed"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP_PROFILES value="isp1,isp2"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_UNIQUE_EGRESS_REQUIRED value="true"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_UNIQUE_EGRESS_WINDOW_MINUTES value="60"
/container/envs/add list=env-app-speed key=MIKROTIK_SCHEDULER_STARTUP_GRACE_SECONDS value="300"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP1_ENABLED value="true"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP1_NAME value="CNVG"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP1_SOURCE_IP value="192.168.99.250"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP1_CRON value="0,30 * * * *"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP2_ENABLED value="true"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP2_NAME value="PLDT"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP2_SOURCE_IP value="192.168.99.251"
/container/envs/add list=env-app-speed key=SPEEDTEST_LITE_ISP2_CRON value="15,45 * * * *"
For first validation, prefer the exact source-SHA build tag. For repeatable deployments, use the promoted pinned build tag. Use latest only if you intentionally want the current promoted build.
/container/add remote-image=rvncore/speedtest-tracker:0.2.0-b1.2-ceebb83-mikrotik-lite-multi-isp-arm64 interface=veth-app-speed root-dir=usb1-part1/apps/speedtest/app-speedtest/root mountlists=mount-app-speed envlist=env-app-speed memory-high=192M logging=yes start-on-boot=no name=app-speed
/container/start app-speed
cd /var/www/html
ip a
php artisan speedtest-lite:validate-isp-profiles
php artisan schedule:list
test -f public/build/manifest.json && echo "vite manifest ok"
wget -S -O /tmp/http-test.html http://127.0.0.1
The two source IPs must be visible inside the container before profile-bound runs can be trusted. Routing to each WAN/ISP path is handled outside the container by your router/firewall using static routes or routing policy.
Validated on:
/config mount0.2.0-b1.2-ceebb83-mikrotik-lite-multi-isp-arm64 - Exact RouterOS-tested current feature build0.2.0-b1.2-mikrotik-lite-multi-isp-arm64 - Current validated promoted b1.2 build tag0.1.1-b1.9-28d2629-mikrotik-lite-multi-isp-arm64 - Previous stable promoted build0.1.1-b1.9-mikrotik-lite-multi-isp-arm64 - Previous stable promoted b1.9 build tag0.1.1-b1.8-097ebfb-mikrotik-lite-multi-isp-arm64 - Previous upstream v1.14.3 baseline observation build0.1.1-b1.7-c7ab9c6-mikrotik-lite-multi-isp-arm64 - Previous RouterOS-tested rollback build0.1.1-b1.7-mikrotik-lite-multi-isp-arm64 - Previous validated b1.7 rollback tag0.1.1-b1.6-mikrotik-lite-multi-isp-arm64 - Historical corrected baseline0.1.1-b1.4-mikrotik-lite-multi-isp-arm64 - Historical rollback baselineAvoid older experimental tags for new deployments.
Use pinned version tags for production-like deployments. Use latest only if you intentionally want the current promoted build.
Experimental but field-tested on MikroTik hAP ax3 model C53UiG+5HPaxD2HPaxD running RouterOS 7.22.1 stable. Current validated feature build: 0.2.0-b1.2-ceebb83.
Content type
Image
Digest
sha256:be44799ae…
Size
126.1 MB
Last updated
about 1 month ago
docker pull rvncore/speedtest-tracker:0.2.0-b1.4-6f6a08f-mikrotik-lite-multi-isp-arm64