A full-stack distributed system for managing a network of digital billboard installations (LED walls) across a city. Built for the Web Systems Design and Architecture course at the University of Palermo.
The system simulates a real-world smart city infrastructure: administrators manage billboard installations and advertising schedules through a web console, while each billboard autonomously cycles through animated ad creatives and reports its activity back to a central monitoring service.
The system is composed of two independent Java web services sharing a MySQL database:
gestione (Spring Boot 3.2) handles the admin side: managing billboard installations (impianti) with GPS coordinates, assigning advertising schedules (palinsesti), serving the LED wall player, and proxying external API calls (weather via Open-Meteo, news via NewsAPI, geocoding via OpenStreetMap Nominatim).
monitoraggio (Jakarta Servlet 6.0 on Tomcat 10.1) is a lightweight monitoring service: it queries the database, writes installation status to TSV files, and renders an interactive map showing which billboards are active, inactive, or offline in real time.
- LED Wall player — cycles animated HTML/CSS ad creatives with configurable durations; overlays real-time clock, Palermo weather (Open-Meteo API), and a scrolling Italian news ticker (NewsAPI/ANSA)
- 10 animated ad creatives — Tesla, Arc'teryx, Guinness, McDonald's, Omega, Phone 2a, Lidl, Pizza, Tommy Hilfiger, Arancine di Palermo
- XML-based schedule system — playlists (palinsesti) defined in XML, validated against XSD/DTD schemas; each installation is assigned a schedule
- Role-based access control — Spring Security 6 with BCrypt; ADMIN role for full management, USER role for read-only access
- Interactive monitoring map — OpenLayers 2 + OpenStreetMap; color-coded pins (green/yellow/red) based on heartbeat signal recency (2-minute threshold)
- Report generation — filterable display logs (by date range, ad name, operator COUNT/SUM); export to PDF (iText) or Excel (Apache POI)
- Geocoding autocomplete — address-to-coordinates lookup via OpenStreetMap Nominatim when placing new installations
The billboard content is built as standalone animated HTML/CSS pages. Each can be previewed directly in a browser without running the server.
All brand names, logos, and images used in the ad creatives are property of their respective owners and are used solely for educational and demonstration purposes in this non-commercial university project.
| Creative | Path |
|---|---|
| Tesla Roadster | gestione/src/main/resources/static/cartelloni/tesla/tesla.html |
| Arc'teryx | gestione/src/main/resources/static/cartelloni/arcteryx/arcteryx.html |
| Guinness | gestione/src/main/resources/static/cartelloni/guinness/guinness.html |
| McDonald's | gestione/src/main/resources/static/cartelloni/mc/mc.html |
| Omega Speedmaster | gestione/src/main/resources/static/cartelloni/omega/omega.html |
| Nothing Phone 2a | gestione/src/main/resources/static/cartelloni/phone2a/phone2a.html |
| Lidl | gestione/src/main/resources/static/cartelloni/lidl/lidl.html |
| Pizza | gestione/src/main/resources/static/cartelloni/pizza/pizza.html |
| Tommy Hilfiger | gestione/src/main/resources/static/cartelloni/tommy/tommy.html |
| Arancine | gestione/src/main/resources/static/cartelloni/arancine/arancine.html |
| Layer | Technology |
|---|---|
| Backend (gestione) | Java 17, Spring Boot 3.2.3, Spring Security 6, Spring Data JPA |
| Backend (monitoraggio) | Java 17, Jakarta Servlet 6.0, Apache Tomcat 10.1 |
| Database | MySQL 8 |
| Templating | Thymeleaf |
| Mapping | OpenLayers 2, OpenStreetMap |
| Reports | Apache POI (Excel), iText 5 (PDF) |
| External APIs | Open-Meteo (weather), NewsAPI (news ticker), OpenStreetMap Nominatim (geocoding) |
| Infrastructure | Docker, Docker Compose, Colima (macOS) |
# 1. Clone the repository
git clone https://github.com/dqvid3/digital-signage-system.git
cd digital-signage-system
# 2. Configure environment
cp .env.example .env
# Edit .env and add your NewsAPI key (free at https://newsapi.org)
# 3. Start Colima (macOS only — skip if using Docker Desktop)
colima start
# 4. Build and start all services
docker compose up -dOn first run, Docker will download base images and build the two services (~3-5 minutes).
| Service | URL |
|---|---|
| Management console | http://localhost:8080/gestione |
| LED Wall (installation 1) | http://localhost:8080/impianto?id=1 |
| Reports | http://localhost:8080/reportistica |
| Monitoring map | http://localhost:8081/resources/static/mappa/monitoraggio.html |
| Username | Password | Role |
|---|---|---|
davidebonura |
124 |
ADMIN |
gabrielebova01 |
prova |
ADMIN |
ciaosalvo |
qwerty |
USER |
docker compose down| Variable | Description | Required |
|---|---|---|
NEWS_API_KEY |
API key from newsapi.org — free tier works | No (news ticker disabled if missing) |
The NewsAPI key is never exposed to the browser. The LED wall fetches news via a server-side proxy endpoint (/news) in the gestione service.
The schema and seed data are in database/db_monitoraggio.sql. It pre-populates:
- 5 billboard installations across Palermo (Stazione Centrale, UniPA, Piazza Castelnuovo, etc.)
- 5 advertising schedules (XML playlists)
- 10 ad creatives
- 3 user accounts
- 100 randomized display log entries (
database/popola_visualizzazione.sql)
