Follow FREE product releases now. If you later buy a PRO product using the same email, the licence will appear in this account automatically.
sokobanMAX
FREESokoban puzzle widget for Zabbix dashboards A Sokoban puzzle widget that embeds the classic Sokoban game into Zabbix dashboards and provides 50 solvable levels. The widget uses standard Zabbix name and refresh settings with no additional game options; progress, move history, personal bests and personal unlock codes are stored in the Zabbix database and the server verifies moves and completions. It is intended for Zabbix users and administrators who want a lightweight, on-board playable game with keyboard and on-screen controls and progress preserved across browsers.
Video and 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-sokobanmax
rpm -Uvh https://repo.initmax.com/zabbix/release/initmax-release-latest.noarch.rpm
dnf clean all && dnf install -y zabbix-module-sokobanmax
rpm -Uvh https://repo.initmax.com/zabbix/release/initmax-release-latest.noarch.rpm
zypper --gpg-auto-import-keys refresh && zypper install -y zabbix-module-sokobanmax
Step 4 · Edit your Dockerfile
Paste the block after FROM in the final Zabbix frontend stage.
# initMAX sokobanmax - 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-sokobanmax \
&& 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-sokobanmax=2.2.0_p1-r3
Step 5 · Build your image
Run the command in a terminal in the Dockerfile directory.
# initMAX sokobanmax - 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-sokobanmax \
&& 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-sokobanmax \
&& 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/sokobanmax"
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 sokobanmax 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/sokobanmax"; then
BACKUP=$(mktemp -d)
docker cp "$ZABBIX_WEB_CONTAINER:$ZABBIX_FRONTEND/modules/sokobanmax" "$BACKUP/"
echo "Backup: $BACKUP/sokobanmax"
docker exec -u root "$ZABBIX_WEB_CONTAINER" rm -rf "$ZABBIX_FRONTEND/modules/sokobanmax"
fi
docker exec -u root "$ZABBIX_WEB_CONTAINER" mkdir -p "$ZABBIX_FRONTEND/modules/sokobanmax"
docker cp "$PAYLOAD/." "$ZABBIX_WEB_CONTAINER:$ZABBIX_FRONTEND/modules/sokobanmax/"
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/sokobanmax"
'
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
52.2.0 Latest 2026-11-06
-
Publish the Alpine (apk) package for Docker based Zabbix frontends (repo.initmax.com Alpine channel).
2.1.0 2026-10-15
-
Add support for Zabbix 8.0 and update documentation accordingly.
2.0.2 2026-09-20
-
Catalog pictures are now the same on every release: exact level times and a sample unlock code instead of values that differed from one capture to the next.
Older versions (2)
2.0.1 2026-09-20
-
The catalog summary ended in the middle of the level author's name ("... Microban by David W."). The package description now ends its first sentence before the credit, and the credit follows in full.
2.0.0 2026-09-20
-
Renamed to sokobanMAX and moved onto the v3 release pipeline: one signed package from the initMAX repository covers Zabbix 6.0 - 7.4. Widgets of the older Sokoban module are taken over automatically - same dashboard, same position.
-
50 levels from Microban by David W. Skinner: small boards built around one idea each, exactly as the author published them, from gentle to demanding, credited in the game. Every level carries a solution the test suite replays, so a level nobody can finish cannot reach a release.
-
A new look in the style of tetrisMAX and chessMAX: navy and violet surfaces, crates with the initMAX emblem, smooth walls, targets and player, matching dialogs and controls, in every Zabbix theme. The board adapts to portrait, landscape and compact widgets.
-
Your game is saved to your Zabbix profile, separately for each widget: close the page and continue in another browser, undo history included. Restart the level, or reset your own progress back to level 1.
-
A real Hall of Fame: your best result on every level (fewest moves, then fastest time) is kept in the Zabbix database per user and per widget, so it survives a reload, another browser and a failover to another frontend node.
-
Two level switches on the bar: step back into any level you have already solved, or forward as far as you have earned.
-
On-screen arrow buttons for wall-mounted and touch dashboards, keyboard help and a save indicator.
-
Every text is translated into all 27 Zabbix display languages. The widget used to be English only.
-
Fair play: a level "solved" faster than a person can press keys gets a "Please don't cheat" notice and no record; a restart is a clean attempt.
-
The server is the referee. A finished level counts only after the server has replayed every move, levels you have not reached return no map, and time is measured by the server.
-
Unlock codes are signed with the installation's own secret key, belong to the signed-in user, and guessing is throttled. They used to be derived from the database host, name and user, so every default installation shared one set of codes that anyone could compute.
-
Every change needs a POST with a valid session and widget token, so a link on another page cannot file a score for a signed-in player.
-
The previous level set could not be finished: 23 of its 50 levels had no solution (level 8 was the first). They are gone.
-
The arrow keys drive only the board you clicked. They used to move every Sokoban widget on the dashboard at once, and scroll the page while doing it.
-
A refresh of the dashboard no longer throws you back to level 1 in the middle of a game.