Digital Signage Deployment with PiSignage
Build the PiSignage server and player Docker images, push them to the Sixfab Registry, and deploy a full digital-signage system on ALPON X5 AI and ALPON X4.
Digital Signage with PiSignage on ALPON
PiSignage is a robust digital-signage solution that runs well on ALPON edge computers. This guide builds the server and player Docker images, pushes them to the Sixfab Container Registry, and deploys a complete signage system on your ALPON X5 AI or ALPON X4.
Build the PiSignage server and Player2 images for linux/arm64,
push them to the Sixfab Container Registry, then deploy MongoDB, the server, and Player2
through ALPON Cloud. Player2 needs X11 access: grant the container's local user a scoped X11 rule,
set DISPLAY=:0, and mount the X11 authorization and audio paths. Do not disable X11 access
control globally.
Prerequisites
- Docker and buildx installed on your personal computer.
- X11 installed on your ALPON — see Running GUI Apps with X11 in Containers.
To run PiSignage on ALPON, you build both the server and player images. Sixfab has containerized these applications to run on ALPON devices; the Dockerfiles are included below.
Player images can be large. Inspect the built manifest with docker buildx imagetools inspect and choose a deployment connection appropriate for the transfer; pull time depends on the actual image and network.
-
Run these steps on your personal computer, where Docker and buildx are installed. Create a directory for the server:
bash · create directorymkdir pisignage-server cd pisignage-server
Create a
Dockerfilewith a maintained Node.js base and require a reviewed PiSignage server tag or commit:Dockerfile · serverFROM node:22-alpine3.21 ARG PISIGNAGE_SERVER_REF RUN test -n "$PISIGNAGE_SERVER_REF" \ && apk add --no-cache bash git ffmpeg imagemagick ENV NODE_ENV=production WORKDIR /pisignage-server RUN git clone https://github.com/colloqi/pisignage-server.git . \ && git checkout "$PISIGNAGE_SERVER_REF" \ && npm ci --omit=dev \ && chmod +x ./wait-for-it.sh CMD ["./wait-for-it.sh", "127.0.0.1:27017", "--", "node", "server.js"]
Build the server image:
bash · build serverdocker buildx build --load --platform linux/arm64 --build-arg PISIGNAGE_SERVER_REF=<reviewed-tag-or-commit> -t pisignage-server:<version> .
-
Create a directory for the player:
bash · create directorymkdir pisignage-player cd pisignage-player
Create a
Dockerfilethat verifies the Player2 archive before installation and runs Chromium as a non-root user. Obtain the current ARM64 archive URL and SHA-256 from PiSignage; do not reuse an unverified download.Dockerfile · playerFROM debian:bookworm-slim ARG PLAYER_URL ARG PLAYER_SHA256 RUN test -n "$PLAYER_URL" && test -n "$PLAYER_SHA256" \ && apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl unzip chromium nodejs npm sudo \ && rm -rf /var/lib/apt/lists/* WORKDIR /opt/pisignage RUN curl -fL "$PLAYER_URL" -o /tmp/player.zip \ && echo "$PLAYER_SHA256 /tmp/player.zip" | sha256sum -c - \ && unzip /tmp/player.zip \ && rm /tmp/player.zip \ && cp player2/build-scripts/install-pisignage.sh . \ && chmod +x install-pisignage.sh player2/build-scripts/* player2/shell-scripts/* \ && ./install-pisignage.sh \ && useradd --create-home --uid 1000 pisignage \ && chown -R pisignage:pisignage /opt/pisignage USER pisignage CMD ["./start.sh"]
Build the player image:
bash · build playerdocker buildx build --load --platform linux/arm64 --build-arg PLAYER_URL=<official-arm64-archive-url> --build-arg PLAYER_SHA256=<published-sha256> -t pisignage-player:<version> .
-
Upload both images so they're available to the device:
- Open the Sixfab Container Registry page.
- Click + Add Container and follow the prompts for each image.
-
Deploy three containers from the Applications tab of your asset, in order.
1 · MongoDB- Click + Deploy, enter a container name, and check “I would like to use my own container path”.
- Select a currently supported ARM64 MongoDB image that meets PiSignage's documented database compatibility. Do not use the retired MongoDB 4.4 image from older revisions of this guide.
- Enable Host Network, then click Deploy.
2 · PiSignage server- Click + Deploy, enter a container name, and select the server image and tag.
- Enable Host Network, then click Deploy.
3 · PiSignage Player2Grant the container's local root identity access to the graphical session. Do not use
xhost +, which disables X11 access control globally. See Running GUI Apps with X11 in Containers for the persistent service and revocation steps.bash · grant scoped X11 accessDISPLAY=:0 XAUTHORITY=/root/.Xauthority xhost +SI:localuser:root
Then click + Deploy, enter a container name, and select the Player2 image and tag. Add this environment variable:
DISPLAY:0Add the X11 socket and authorization file as read-only bind mounts. Audio remains read/write:
X11 socket (read-only)/tmp/.X11-unix→/tmp/.X11-unix.Xauthority (read-only)/root/.Xauthority→/root/.XauthorityAudio (read/write)/dev/snd→/dev/sndEnable Host Network. Leave Privileged disabled unless Player2 cannot access the required hardware through the configured paths; if enabled, treat the container as host-trusted. Then click Deploy.
-
- Check the device's main screen to confirm Player2 is running in fullscreen.
- In a browser, open ports
3000and8000at the device's IP to confirm the server and player are up. - To use the local server, update the server address in the Player2 interface (port
8000) to127.0.0.1:3000— otherwise the device keeps talking to the default main server.
Troubleshooting
Make sure a display is physically connected. Without one, xhost + fails to open the display:
xhost: unable to open display ""
If a display is connected, export the variable and retry:
export DISPLAY=:0
A black screen after the Xorg service starts is expected. These display errors usually mean no physical display is connected or the X11 setup is misconfigured.
Production image policy: Replace floating
:latestreferences with a reviewed immutable tag or digest, then record the selected version for rollback.
Updated 2 days ago
