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

  1. Open http://your-server:8080 in your browser
  2. Log in with the default credentials: username xibo_admin, password password
  3. Change the admin password immediately under Admin → Users → xibo_admin
  4. Go to Displays to see registered players (none yet)
  5. Go to LibraryAdd Media to upload images, videos, or other content
  6. 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:

  1. The CMS URL (e.g., http://your-server:8080)
  2. A CMS key (found under Admin → Settings → Configuration → CMS Secret Key)
  3. 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 TypeDescription
AlwaysContent runs 24/7
ScheduledDate/time range with recurrence (daily, weekly)
DaypartingDifferent content for morning, afternoon, evening
CampaignOrdered sequence of layouts with play counts
Geo-fencingContent 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

ResourceMinimumRecommended
RAM2.5 GB4 GB+
CPU2 cores (x86-64 only)4 cores
Disk10 GB (base)20 GB+ (with video content)
Containers55
Architecturex86-64/AMD64 onlyNo 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.

Comments