Visio-Display: Building a Self-Hosted Digital Signage Platform

Visio-Display: Building a Self-Hosted Digital Signage Platform

Visio-Display:构建一个自托管的数字标牌平台

I have been developing Visio-Display, a free and open-source digital signage platform released under the GPL-3.0 license. The project started with a simple requirement: manage content across several screens from a central interface while retaining full control over the hosting, data, and display clients. Over time, it grew beyond displaying images and videos. Visio-Display now covers a substantial part of the operational lifecycle of a signage infrastructure: content creation, scheduling, client deployment, monitoring, maintenance, backups, and updates. The source code is available on GitHub: https://github.com/woofix/visio_display

我一直在开发 Visio-Display,这是一个基于 GPL-3.0 协议发布的免费开源数字标牌平台。该项目的初衷很简单:通过一个中央界面管理多个屏幕上的内容,同时保持对托管、数据和显示终端的完全控制。随着时间的推移,它的功能已不仅仅局限于显示图片和视频。Visio-Display 现在涵盖了标牌基础设施运营生命周期中的大部分环节:内容创建、排程、终端部署、监控、维护、备份和更新。源代码可在 GitHub 上获取:https://github.com/woofix/visio_display

Architecture

架构

The server is primarily built with: Python, Flask, and Gunicorn for the web application; PostgreSQL for persistent application and account data; Redis and RQ for caching and background jobs; Docker Compose for deployment and service management. The entire platform is self-hosted. I run and validate it on my own infrastructure with real Linux display clients connected to the server.

服务器主要基于以下技术构建:使用 Python、Flask 和 Gunicorn 开发 Web 应用程序;使用 PostgreSQL 存储持久化应用和账户数据;使用 Redis 和 RQ 处理缓存及后台任务;使用 Docker Compose 进行部署和服务管理。整个平台均为自托管。我在自己的基础设施上运行并验证了该系统,并连接了真实的 Linux 显示终端。

Screen and content management

屏幕与内容管理

The web interface can manage multiple named screens, each with independent content and scheduling. The media library supports images, videos, and PDF documents. Media can be organized into playlists with a defined order and a display duration for each item. Scheduling rules can be applied by date and time. The platform also supports media groups and temporary priority campaigns. A priority campaign can temporarily replace the normal schedule and automatically return the screen to its usual playlist afterward. Visio-Display includes a built-in 16:9 announcement editor. An administrator can quickly create a visual announcement and export it directly to the media library. A QR code generator is also available for several use cases, including Wi-Fi access, URLs, contact information, map locations, messaging, and free-form text.

Web 界面可以管理多个已命名的屏幕,每个屏幕都有独立的内容和排程。媒体库支持图片、视频和 PDF 文档。媒体可以组织成播放列表,并为每个项目定义顺序和显示时长。排程规则可以按日期和时间应用。该平台还支持媒体组和临时优先级活动。优先级活动可以暂时替换正常排程,并在结束后自动恢复到平时的播放列表。Visio-Display 内置了一个 16:9 的公告编辑器。管理员可以快速创建视觉公告并直接导出到媒体库。此外,系统还提供了一个二维码生成器,适用于多种场景,包括 Wi-Fi 接入、网址、联系信息、地图位置、消息传递和自由文本。

Linux kiosk client deployment

Linux 信息亭(Kiosk)终端部署

Visio-Display can prepare and remotely deploy Linux clients configured in kiosk mode, including deployment over SSH. Each client stores its configuration and heartbeat token locally. A systemd service maintains communication with the server. The first heartbeat is sent approximately 15 seconds after startup, followed by another heartbeat every 30 seconds. If a client loses power or network connectivity, the server simply marks it as offline after five minutes without a heartbeat. No manual re-pairing is required. When the machine restarts or reconnects to the network, its service resumes communication and the server recognizes the same client. The administration interface displays client availability, system information, and screenshots. Remote maintenance operations include restart, shutdown, reinstallation, and updates.

Visio-Display 可以准备并远程部署配置为 Kiosk 模式的 Linux 终端,包括通过 SSH 进行部署。每个终端在本地存储其配置和心跳令牌。一个 systemd 服务负责维持与服务器的通信。首次心跳在启动约 15 秒后发送,随后每 30 秒发送一次。如果终端断电或断网,服务器在五分钟未收到心跳后会将其标记为离线。无需手动重新配对。当机器重启或重新连接网络时,其服务会自动恢复通信,服务器也能识别出同一个终端。管理界面会显示终端的可用性、系统信息和屏幕截图。远程维护操作包括重启、关机、重装和更新。

Administration and operations

管理与运营

The platform includes: Users, roles, and permissions; Activity logs; Separate security tokens for different operations; Manual and scheduled backups; Restoration from the web interface; Optional SMB backup copies; A controlled server update mechanism; An API used for client communication and administrative operations. The objective is not only to display media. It is to provide an operational platform that shows which screens are available, allows remote intervention, and helps restore service without manually connecting to every client.

该平台包括:用户、角色和权限管理;活动日志;针对不同操作的独立安全令牌;手动和定时备份;从 Web 界面进行恢复;可选的 SMB 备份副本;受控的服务器更新机制;以及用于终端通信和管理操作的 API。其目标不仅是显示媒体,而是提供一个运营平台,能够显示哪些屏幕可用,允许远程干预,并帮助在无需手动连接到每个终端的情况下恢复服务。

One-command installation

一键安装

To make testing and new deployments easier, Visio-Display provides a guided installer. On a Linux server with Docker, Docker Compose, and Git, the installation can be started with one command: bash <(curl -fsSL https://raw.githubusercontent.com/woofix/visio_display/main/server-install.sh). The installer is available in French and English. It checks the prerequisites, clones the repository, generates secrets, prepares the environment, creates the administrator account, builds the containers, and starts the stack. A manual Docker Compose installation is also documented for users who prefer to control every step.

为了简化测试和新部署,Visio-Display 提供了一个引导式安装程序。在安装了 Docker、Docker Compose 和 Git 的 Linux 服务器上,只需一条命令即可开始安装:bash <(curl -fsSL https://raw.githubusercontent.com/woofix/visio_display/main/server-install.sh)。该安装程序支持法语和英语。它会检查先决条件、克隆仓库、生成密钥、准备环境、创建管理员账户、构建容器并启动服务栈。对于希望控制每一步的用户,文档中也提供了手动 Docker Compose 安装指南。

Why I built it

开发初衷

Visio-Display has become a practical project combining web development, Linux, Docker, networking, automation, monitoring, and system administration. I used ChatGPT/Codex as a development assistant for some code suggestions, reviews, testing support, and documentation tasks. I remain the project maintainer: I define the architecture, deploy the releases, and validate the features against the running application. This article was also prepared with AI assistance and reviewed against both the codebase and the deployed instance before publication. I would particularly appreciate feedback from people who operate digital signage systems or interactive kiosks: Which environments and hardware platforms should I test next? Bug reports, testing, and contributions are welcome.

Visio-Display 已经成为一个结合了 Web 开发、Linux、Docker、网络、自动化、监控和系统管理的实践项目。我使用 ChatGPT/Codex 作为开发助手,用于部分代码建议、审查、测试支持和文档编写任务。我依然是该项目的维护者:我负责定义架构、部署版本,并针对运行中的应用程序验证功能。本文也是在 AI 的协助下编写的,并在发布前对照代码库和已部署的实例进行了审核。我特别欢迎数字标牌系统或交互式信息亭运营者的反馈:我接下来应该测试哪些环境和硬件平台?欢迎提交错误报告、参与测试和贡献代码。