Self-Hosting Xibo CMS with Docker Compose
What Is Xibo?
Xibo is an enterprise digital signage CMS that manages content across hundreds of remote displays from a central server. It supports Android, ChromeOS, Linux, webOS, Windows, and Tizen player devices. The drag-and-drop layout editor gives you 40+ content widgets — video, weather, RSS, calendars, HLS streams, embedded HTML, data connectors — with advanced scheduling, dayparting, and proof-of-play reporting. If you’re running signage for a business, school, or public venue, Xibo is the open-source standard. Official site
Prerequisites
- A Linux server (Ubuntu 22.04+ recommended, x86-64 only — no ARM support for the CMS)
- Docker and Docker Compose installed (guide)
- 4 GB of free RAM (2.5 GB minimum)
- 20 GB of free disk space (more for video content)
- A domain name (recommended for remote display management)
Docker Compose Configuration
Xibo runs five containers: the CMS web application, MySQL database, XMR push messaging relay, Memcached, and QuickChart for report rendering. Create a project directory:
mkdir xibo && cd xibo
Create a config.env file with your database password:
# config.env — Xibo CMS configuration
MYSQL_PASSWORD=change-me-to-a-strong-password # CHANGE THIS (alphanumeric, 16+ chars)
# SMTP settings (optional — for email alerts)
# CMS_SMTP_SERVER=smtp.example.com:587
# [email protected]
# CMS_SMTP_PASSWORD=your-smtp-password
# CMS_SMTP_USE_TLS=YES
# CMS_SMTP_USE_STARTTLS=YES
# CMS_SERVER_NAME=signage.example.com
Create a docker-compose.yml:
services:
cms-web:
image: ghcr.io/xibosignage/xibo-cms:release-4.4.0
container_name: xibo-cms
restart: unless-stopped
ports:
- "8080:80"
environment:
MYSQL_HOST: cms-db
XMR_HOST: cms-xmr
CMS_USE_MEMCACHED: "true"
MEMCACHED_HOST: cms-memcached
env_file: config.env
volumes:
- ./shared/cms/library:/var/www/cms/library # Media library
- ./shared/cms/custom:/var/www/cms/custom # Custom modules
- ./shared/cms/web/theme/custom:/var/www/cms/web/theme/custom # Themes
- ./shared/cms/web/userscripts:/var/www/cms/web/userscripts
- ./shared/cms/ca-certs:/var/www/cms/ca-certs
- ./shared/backup:/var/www/backup # Daily backups
depends_on:
- cms-db
- cms-xmr
- cms-memcached
mem_limit: 1g
networks:
- xibo
cms-db:
image: mysql:8.4
container_name: xibo-db
restart: unless-stopped
environment:
MYSQL_DATABASE: cms
MYSQL_USER: cms
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
env_file: config.env
volumes:
- ./shared/db:/var/lib/mysql
mem_limit: 1g
networks:
- xibo
cms-xmr:
image: ghcr.io/xibosignage/xibo-xmr:1.0
container_name: xibo-xmr
restart: unless-stopped
ports:
- "9505:9505" # XMR push messaging port
mem_limit: 256m
env_file: config.env
networks:
- xibo
cms-memcached:
image: memcached:alpine
container_name: xibo-memcached
restart: unless-stopped
command: memcached -m 15 # 15 MB cache allocation
mem_limit: 100m
networks:
- xibo
cms-quickchart:
image: ianw/quickchart
container_name: xibo-quickchart
restart: unless-stopped
networks:
- xibo
networks:
xibo:
Start the stack:
docker compose up -d
First startup takes 2–3 minutes while MySQL initializes the schema.
Initial Setup
- Open
http://your-server:8080in your browser - Log in with the default credentials: username
xibo_admin, passwordpassword - Change the admin password immediately under Admin → Users → xibo_admin
- Go to Displays to see registered players (none yet)
- Go to Library → Add Media to upload images, videos, or other content
- Create your first Layout using the drag-and-drop editor
Connecting a Player
Xibo players connect to the CMS via HTTP/HTTPS. Each player device needs:
- The CMS URL (e.g.,
http://your-server:8080) - A CMS key (found under Admin → Settings → Configuration → CMS Secret Key)
- Install the Xibo player application on the display device
Supported player platforms: Android (4.0+), ChromeOS, Linux, webOS (LG), Tizen (Samsung), Windows (7+).
Configuration
Layout Editor
The layout editor is where Xibo shines. Create regions on a canvas, assign content widgets to each region, and set timing and transitions:
- Regions: Define zones on the screen (header, main content, ticker bar, sidebar)
- Widgets: 40+ types — video, image, weather, clock, RSS, calendar, embedded HTML, HLS streams, PDF, PowerPoint
- Transitions: Fade, fly, shuffle between items in a region
- Templates: Save and reuse layouts across displays
Scheduling
| Schedule Type | Description |
|---|---|
| Always | Content runs 24/7 |
| Scheduled | Date/time range with recurrence (daily, weekly) |
| Dayparting | Different content for morning, afternoon, evening |
| Campaign | Ordered sequence of layouts with play counts |
| Geo-fencing | Content based on display location |
User Management
Xibo supports multi-user access with granular permissions:
- Super Admin: Full access to everything
- Group Admin: Manage users within a group
- Editor: Create and edit layouts and media
- Viewer: View-only access to reports
- SAML/CAS SSO: Enterprise single sign-on integration
- Two-factor authentication: Built-in 2FA support
Reverse Proxy
Proxy to port 80 (CMS) and expose port 9505 (XMR) for player communication:
signage.example.com {
reverse_proxy xibo-cms:80
}
The XMR port (9505) must be accessible to player devices. If displays are on the same network as the server, internal access suffices. For remote displays, open port 9505 or tunnel it. See Reverse Proxy Setup.
Backup
Xibo includes automated daily backups written to the ./shared/backup/ directory. These include the database dump and CMS configuration.
For media files, back up ./shared/cms/library/:
tar czf xibo-backup-$(date +%Y%m%d).tar.gz shared/
See Backup Strategy for automated scheduling.
Troubleshooting
CMS Web UI Shows 502/503
Symptom: Browser shows a gateway error or blank page after docker compose up.
Fix: MySQL is still initializing. First startup takes 2–3 minutes. Check with docker logs xibo-db --tail 20 — wait for “ready for connections” before accessing the UI.
Displays Show “Waiting for CMS”
Symptom: Player devices can’t connect to the CMS.
Fix: Verify the CMS URL is reachable from the player device’s network. If behind a firewall, ensure port 80 (or your mapped port) and port 9505 (XMR) are open. Check that the CMS Secret Key on the player matches the one in Admin → Settings.
Media Upload Fails
Symptom: Large video files fail to upload or timeout.
Fix: The default CMS_PHP_UPLOAD_MAX_FILESIZE is 2 GB, which is usually sufficient. If behind a reverse proxy, increase the proxy’s upload limit (Nginx: client_max_body_size 2G;). For very large files, upload via the API or directly to the library volume.
High Memory Usage
Symptom: Server runs out of memory with the full stack.
Fix: The compose file sets mem_limit on each service (1 GB CMS, 1 GB MySQL, 256 MB XMR, 100 MB Memcached). If your server has less than 4 GB, reduce MySQL to mem_limit: 512m and the CMS to mem_limit: 512m. Performance may degrade with many concurrent displays.
Resource Requirements
| Resource | Minimum | Recommended |
|---|---|---|
| RAM | 2.5 GB | 4 GB+ |
| CPU | 2 cores (x86-64 only) | 4 cores |
| Disk | 10 GB (base) | 20 GB+ (with video content) |
| Containers | 5 | 5 |
| Architecture | x86-64/AMD64 only | No ARM support |
Verdict
Xibo is the clear choice when you need to manage more than one or two displays. The centralized CMS with multi-user access, drag-and-drop layout editor, and scheduling features put it in a different class than single-device solutions like Anthias. The 5-container stack and 2.5 GB RAM minimum are justified by the feature set — this is enterprise-grade software.
For a single Raspberry Pi display showing a rotating slideshow, Xibo is overkill. Use Anthias instead. For anything beyond one screen — a restaurant menu board, an office lobby display, a school announcement system — Xibo is the right tool.
Frequently Asked Questions
Is Xibo free for self-hosting?
The Xibo CMS is open source (AGPLv3) and free to self-host with unlimited displays. Xibo Signage Ltd offers paid cloud hosting and commercial support contracts, but the self-hosted Docker deployment in this guide is fully functional without paying anything.
Does Xibo support Raspberry Pi displays?
Not directly as a CMS server (x86-64 only), but Raspberry Pi can run the Xibo Linux player client to display content managed by your Xibo CMS. This is a common setup for cost-effective digital signage — a powerful server running the CMS with cheap Pi devices as display endpoints.
How does Xibo compare to Anthias?
Xibo is a multi-display enterprise CMS with centralized management, scheduling, and 40+ widgets. Anthias is a single-device solution for Raspberry Pi that displays rotating content on one screen. Choose Xibo for managing multiple displays; Anthias for a single Pi-powered signage screen. See our Anthias vs Xibo comparison.
Can Xibo play video content?
Yes. Xibo supports video playback including MP4, WebM, and HLS live streams. Upload videos to the media library and add them to layouts. The player device handles decoding — performance depends on the display hardware (Android, Windows, or Linux players).
Does Xibo work without internet access?
Yes. Players cache content locally and can operate offline once they’ve downloaded their scheduled layouts. The CMS only needs to be reachable when pushing content updates or collecting proof-of-play reports. Air-gapped setups work if you push content via a local network.
How many displays can one Xibo server manage?
There’s no hard limit in the software. A CPX21-class server (4 GB RAM) comfortably manages 50-100 displays. For larger deployments (hundreds of screens), increase MySQL resources and consider separating the XMR relay to its own server. Enterprise deployments run thousands of displays.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments