Follow FREE product releases now. If you later buy a PRO product using the same email, the licence will appear in this account automatically.
Structured Dashboard
FREEModule to group dashboards into collapsible nested sections Zabbix frontend module that converts dashboard names containing '/' into nested, collapsible groups on the Dashboards page instead of a single flat list. There are no configurable options; grouping is derived from the '/' separators in dashboard names and the module stores each user's collapsed state and View/Edit preference in their Zabbix profile. It supports drag-and-drop reorganisation (renaming dashboards or creating groups as needed) and per-group selection, and is intended for Zabbix installations and users who need to manage large numbers of dashboards.
Screenshots
How to install
Install via your OS package manager. Using the initMAX repository (apt / dnf / zypper) is the recommended way - you get GPG-signed updates automatically.
wget https://repo.initmax.com/zabbix/release/initmax-release-latest_all.deb
dpkg -i initmax-release-latest_all.deb
apt update && apt install zabbix-module-structured-dashboard
rpm -Uvh https://repo.initmax.com/zabbix/release/initmax-release-latest.noarch.rpm
dnf clean all && dnf install -y zabbix-module-structured-dashboard
rpm -Uvh https://repo.initmax.com/zabbix/release/initmax-release-latest.noarch.rpm
zypper --gpg-auto-import-keys refresh && zypper install -y zabbix-module-structured-dashboard
Step 4 · Edit your Dockerfile
Paste the block after FROM in the final Zabbix frontend stage.
# initMAX structured-dashboard - Alpine (apk) package install
USER root
RUN apk add --no-cache ca-certificates curl \
&& curl -fsSL https://repo.initmax.com/zabbix/release/setup-alpine.sh -o /tmp/initmax-repo.sh \
&& sh /tmp/initmax-repo.sh --edition free \
-- apk add --no-cache zabbix-module-structured-dashboard \
&& rm -f /tmp/initmax-repo.sh
USER 1997
On the last line, keep the USER from your original image.
The block installs the newest available version when the installation step runs. Docker may reuse a cached layer. To keep a fixed version, use zabbix-module-structured-dashboard=2.5.0_p1-r3
Step 5 · Build your image
Run the command in a terminal in the Dockerfile directory.
# initMAX structured-dashboard - Alpine (apk) package install
docker build -t zabbix-web-custom .
In Compose, use image zabbix-web-custom and recreate the frontend. In Zabbix, open Administration / General / Modules, Scan directory and enable the module.
More options
No manual APK downloads or file copying.
Buying another product later? Add its install block to the same Dockerfile; keep the existing blocks and products.
Step 4 · Edit your Dockerfile
For Ubuntu / Debian frontend images. Add after FROM. Keep installed modules in the image; a volume over modules/ would hide package updates.
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl \
&& curl -fsSL https://repo.initmax.com/zabbix/release/initmax-release-latest_all.deb -o /tmp/initmax-release.deb \
&& dpkg -i /tmp/initmax-release.deb \
&& apt-get update \
&& apt-get install -y --no-install-recommends zabbix-module-structured-dashboard \
&& rm -f /tmp/initmax-release.deb \
&& rm -rf /var/lib/apt/lists/*
USER 1997
On the last line, keep the USER from your original image.
Step 5 · Build your image
Run the command in a terminal in the Dockerfile directory.
docker build -t zabbix-web-custom .
In Compose, use image zabbix-web-custom and recreate the frontend. In Zabbix, open Administration / General / Modules, Scan directory and enable the module.
Step 4 · Edit your Dockerfile
For CentOS Stream / Oracle Linux frontend images. Add after FROM. DNF installs the RPM package; keep installed modules in the image, not a volume over modules/.
USER root
RUN if ! command -v dnf >/dev/null; then microdnf install -y dnf; fi \
&& { rpm -q initmax-release >/dev/null 2>&1 || rpm -Uvh https://repo.initmax.com/zabbix/release/initmax-release-latest.noarch.rpm; } \
&& dnf install -y zabbix-module-structured-dashboard \
&& dnf clean all
USER 1997
On the last line, keep the USER from your original image.
Step 5 · Build your image
Run the command in a terminal in the Dockerfile directory.
docker build -t zabbix-web-custom .
In Compose, use image zabbix-web-custom and recreate the frontend. In Zabbix, open Administration / General / Modules, Scan directory and enable the module.
ZIP modules in a persistent volume. You manage updates manually.
1 · Download and extract the ZIP
Save the ZIP for your version and edition as module.zip on the Docker host. Unzip it into a new directory as shown below, then read the included INSTALL.md.
WORKDIR=$(mktemp -d)
unzip module.zip -d "$WORKDIR" && cd "$WORKDIR/structured-dashboard"
2 · Mount the modules volume
Keep your existing modules volume. For a new one, merge this Zabbix 8.0 example into Compose and recreate the frontend. Preserve other settings and transfer existing modules before switching. For images with a ui/ directory, mount /usr/share/zabbix/ui/modules. Do not share a volume between different Zabbix versions.
services:
zabbix-web:
volumes:
- zabbix-web-modules-8.0:/usr/share/zabbix/modules
volumes:
zabbix-web-modules-8.0:
docker compose up -d --no-deps zabbix-web
3 · Copy the module into the volume
Replace zabbix-web with your actual frontend container name. Select legacy/ for Zabbix 6.0–6.2, otherwise modern/.
When updating, back up this module and its settings first. Only its own directory is replaced, never the whole modules/ directory.
Show copy commands
(
set -eu
ZABBIX_WEB_CONTAINER=zabbix-web
ZABBIX_FRONTEND=$(docker exec "$ZABBIX_WEB_CONTAINER" sh -c '
for root in /usr/share/zabbix/ui /usr/share/zabbix /usr/share/zabbix/php; do
[ -f "$root/include/defines.inc.php" ] && echo "$root" && break
done')
test -n "$ZABBIX_FRONTEND" || { echo "Zabbix frontend not found in container" >&2; exit 1; }
ZBXVER=$(docker exec "$ZABBIX_WEB_CONTAINER" grep -m1 ZABBIX_VERSION "$ZABBIX_FRONTEND/include/defines.inc.php" | grep -oE "[0-9]+\.[0-9]+" | head -1)
case "$ZBXVER" in
6.0|6.2) PAYLOAD=legacy ;;
6.4|7.0|7.2|7.4|8.0) PAYLOAD=modern ;;
*) echo "Unsupported Zabbix frontend: $ZBXVER" >&2; exit 1 ;;
esac
test -f "$PAYLOAD/manifest.json" || { echo "Run from the extracted structured-dashboard ZIP directory" >&2; exit 1; }
if grep -q '"supported_versions"[[:space:]]*:' "$PAYLOAD/manifest.json"; then
SUPPORTED=$(awk 'BEGIN { RS="]" } /"supported_versions"[[:space:]]*:/ {
sub(/^.*"supported_versions"[[:space:]]*:[[:space:]]*\[/, ""); print; exit
}' "$PAYLOAD/manifest.json")
printf '%s\n' "$SUPPORTED" | grep -Fq "\"$ZBXVER\"" \
|| { echo "Module does not support Zabbix $ZBXVER" >&2; exit 1; }
fi
ZABBIX_MODULES_VOLUME=$(docker inspect --format '{{range .Mounts}}{{println .Type .Destination .RW .Name}}{{end}}' "$ZABBIX_WEB_CONTAINER" \
| awk -v target="$ZABBIX_FRONTEND/modules" '$1 == "volume" && $2 == target && $3 == "true" { print $4 }')
test -n "$ZABBIX_MODULES_VOLUME" || { echo "Mount a writable modules volume in Compose first" >&2; exit 1; }
echo "Zabbix $ZBXVER · $PAYLOAD · $ZABBIX_MODULES_VOLUME"
if docker exec "$ZABBIX_WEB_CONTAINER" test -d "$ZABBIX_FRONTEND/modules/structured-dashboard"; then
BACKUP=$(mktemp -d)
docker cp "$ZABBIX_WEB_CONTAINER:$ZABBIX_FRONTEND/modules/structured-dashboard" "$BACKUP/"
echo "Backup: $BACKUP/structured-dashboard"
docker exec -u root "$ZABBIX_WEB_CONTAINER" rm -rf "$ZABBIX_FRONTEND/modules/structured-dashboard"
fi
docker exec -u root "$ZABBIX_WEB_CONTAINER" mkdir -p "$ZABBIX_FRONTEND/modules/structured-dashboard"
docker cp "$PAYLOAD/." "$ZABBIX_WEB_CONTAINER:$ZABBIX_FRONTEND/modules/structured-dashboard/"
docker exec -u root -e ZABBIX_FRONTEND="$ZABBIX_FRONTEND" "$ZABBIX_WEB_CONTAINER" sh -c '
chown -R "$(stat -c "%u:%g" "$ZABBIX_FRONTEND/include/defines.inc.php")" "$ZABBIX_FRONTEND/modules/structured-dashboard"
'
docker restart "$ZABBIX_WEB_CONTAINER"
)
4 · Enable the module in Zabbix
Administration / General / Modules / Scan directory. Enable the single entry for this product. For an earlier or renamed copy, follow Earlier copies in the included INSTALL.md before scanning to retain its settings.
Manual copying does not run package pre/post-install or upgrade scripts. If required, follow INSTALL.md. After changing the Zabbix version, use a separate volume with compatible modules and scan again.
These are displayed instructions only. Nothing is executed against your Docker environment.
Releases
142.5.0 Latest 2026-11-05
-
Publish the Alpine (apk) package for Docker based Zabbix frontends (repo.initmax.com Alpine channel).
2.4.1 2026-10-20
-
Survive the frontend's own navigation to the dashboard list right after login in the e2e suite.
2.3.0 2026-10-14
-
Add support for Zabbix 8.0 features and updates.
Older versions (11)
2.2.4 2026-09-02
-
Fix Structured Dashboard catalog type
2.2.3 2026-08-22
-
survive Zabbix navigating to the list underneath us
2.2.2 2026-08-21
-
frame the two edit-mode shots so they differ from each other
2.2.1 2026-08-21
-
frame 02-collapsed for the box it actually has to survive
2.1.2 2026-08-18
-
Row spacing on the modern tree, tint only group rows, showcase header in frame
2.1.1 2026-08-18
-
Showcase screenshots for drag & drop, Create group and edit mode
2.1.0 2026-08-18
-
Drag & drop between groups, Create group, native collapse toggles
2.0.3 2026-08-16
-
Catalog showcase spec: the tree, two folded branches, a group ticked
2.0.2 2026-08-16
-
README on the combo skeleton: portal installer, feature table, same sections everywhere
2.0.1 2026-08-10
-
Declare this module free-only so no phantom PRO is published
2.0.0 2026-08-09
-
Migrate Structured Dashboard onto the v3 pipeline (Zabbix 6.2, 7.0 - 7.4)