Xibo is een Open Source project die het mogelijk maakt om displays te sturen vanuit een centrale plaats. De engelse term hiervoor is een Digital Signage (Network).

Om slideshows, webpagina’s, rss feeds etc te sturen naar je display heb je 3 componenten nodig.

  • Het Xibo Content Management System, is het hart van de het platform.
  • Een Xibo Message Relay systeem, die berichten uitwisselt tussen het CMR en de aangesloten displays
  • De Xibo Player zorgt voor de omzetting naar een beeld die je via de computer stuurt naar een display. Een computer kan zijn: een miniPC, Raspberry Pi, laptop, Android….

De opstelling

Xibo CMS en XMR zullen draaien op een docker. Deze worden bereikbaar gemaakt via een router naar een Proxy Server (NGINX).

Docker basis is een QNAP TS-453e (8G).
Omdat er meerdere dockers draaien op de felbeheerde poort 80 gaan we deze exposen op poort 8090 voor het CMS. De poort 9505 is exotisch genoeg en deze laten we.

Containers

Er is een grafische interface op de QNAP, maar die gaan we uiteraard niet gebruiken, wegens teveel typewerk en nogal beperkt.
Op dit moment is versie 2.3.3 de meest recente. Zoals je ziet in onderstaande script zijn er settings voorzien voor connectie met een MySQL server en een SMTP server.
Er zijn waarschijnlijk nog meer settings mogelijk, die je kan bekijken in de dockerfile
We gaan ervan uit dat MySQL en een mailserver klaar staan en bereikbaar zijn voor de Container.

Container CMS

docker run \
        --cpus 2 \
        -m 134217728 \
        -p 8090:80 \
        --restart always \
        -v /share/Container/data/xibo/cms/custom:/var/www/cms/custom \
        -v /share/Container/data/xibo/backup:/var/www/backup \
        -v /share/Container/data/xibo/cms/web/theme/custom:/var/www/cms/web/theme/custom \
        -v /share/Container/data/xibo/cms/library:/var/www/cms/library \
        -v /share/Container/data/xibo/cms/web/userscripts:/var/www/cms/web/userscripts \
        -v /share/Container/data/xibo/cms/ca-certs:/var/www/cms/ca-certs \
        -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
        -e TERM=xterm \
        -e CMS_ALIAS=none \
        -e CMS_APACHE_MAX_CONNECTIONS_PER_CHILD=300 \
        -e CMS_APACHE_MAX_REQUEST_WORKERS=60 \
        -e CMS_APACHE_MAX_SPARE_SERVERS=10 \
        -e CMS_APACHE_MIN_SPARE_SERVERS=5 \
        -e CMS_APACHE_START_SERVERS=2 \
        -e CMS_APACHE_TIMEOUT=30 \
        -e CMS_DEV_MODE=false \
        -e CMS_PHP_MAX_EXECUTION_TIME=300 \
        -e CMS_PHP_MEMORY_LIMIT=256M \
        -e CMS_PHP_POST_MAX_SIZE=2G \
        -e CMS_PHP_SESSION_GC_MAXLIFETIME=1440 \
        -e CMS_PHP_UPLOAD_MAX_FILESIZE=2G \
        -e CMS_SERVER_NAME=xibo.reynaert.be \
        -e CMS_SMTP_FROM_LINE_OVERRIDE=YES \
        -e CMS_SMTP_HOSTNAME=reynaert.be \
        -e CMS_SMTP_PASSWORD="somepassword" \
        -e CMS_SMTP_REWRITE_DOMAIN=reynaert.be \
        -e CMS_SMTP_SERVER=zimbra.reynaert.be \
        -e CMS_SMTP_USE_STARTTLS=YES \
        -e CMS_SMTP_USE_TLS=YES \
        -e CMS_SMTP_USERNAME=xibo@management.reynaert.be \
        -e MYSQL_BACKUP_ENABLED=true \
        -e MYSQL_DATABASE=xibo \
        -e MYSQL_HOST=mysql.reynaert.be \
        -e MYSQL_PASSWORD=none \
        -e MYSQL_PORT=3306 \
        -e MYSQL_USER=xibo-cmr \
        -e XMR_HOST=xibo-mr \
        --entrypoint /entrypoint.sh \
        --name xibo-cms \
        xibosignage/xibo-cms:latest

Container XMR

Gelijkaardig de Container voor XMR

docker run \
        --cpus 1 \
        -m 134217728 \
        -p 9505:9505 \
        -p 50001:50001 \
        --restart always \
        -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
        -e TERM=xterm \
        -e XMR_DEBUG=false \
        -e XMR_IPV6PUBSUPPORT=false \
        -e XMR_IPV6RESPSUPPORT=false \
        -e XMR_QUEUE_POLL=5 \
        -e XMR_QUEUE_SIZE=10 \
        --entrypoint /entrypoint.sh \
        --name xibo-mr \
        xibosignage/xibo-xmr:latest

Zorg ervoor dat de namen van de hosts op elkaar zijn afgestemd.

De Proxy

We willen de website (het CMS) op https laten draaien. NGINX is voor mij de voor de hand liggende keuze aangezien ik die al heb. En CertBot is geïnstalleerd dus is het vrij eenvoudig om een Let’s Encrypt certificaat te koppelen.

Belangrijk is ook dat de players hier gaan op connecteren. Deze streamen data via tcp naar de XMR. Wanneer je een fixed IP hebt zou je dit kunnen met een firewall rule. Maar aangezien we toch een recente NGINX versie hebben kan dit via deze weg.

Virtual host

server  {
  listen  443 ssl http2;
  listen [::]:443 ssl http2;
  server_name  xibo.reynaert.be;
  expires $expires;

  client_max_body_size 2G;

  include /etc/nginx/conf.d/ssl.def;
  ssl_certificate    /etc/letsencrypt/live/xibo.reynaert.be/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/xibo.reynaert.be/privkey.pem;

  location /.well-known {
        root /var/www/html;
  }
  location  / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://intranet.reynaert.be:8090;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Accept-Encoding "";
  }
}

Uiteraard is het proxy block belangrijk, waar ik ten opzichte van andere toepassingen ook het protocol heb aan toegevoegd. Verder verwachten we redelijk wat grote bestanden en we willen die niet tegen houden, vandaar de setting ‘client_max_body_size 2G’
Ter info, in de /etc/nginx/conf.d/ssl.def startssl en bevat definities over welke protocols en ciphers er wel of niet gebruikt worden, …

ssl  on;
ssl_protocols       TLSv1.2 TLSv1.3;

ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;

#cd /etc/ssl/certs
#openssl dhparam -out dhparam.pem 4096
ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_cache shared:SSL:10m;
# 'always' requires nginx >= 1.7.5, see http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_headeradd_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;
#add_header X-Frame-Options DENY always;
#add_header X-Content-Type-Options nosniff always;
ssl_session_tickets off;
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx >= 1.3.7
#resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver_timeout 5s;

#HSTS -> only https (make sure http redirects to https)
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; ";

Stream

NGINX kan tcp streamen sinds december 2014, via de NGINX Plus Release 5 (versie 1.7.7), UDP is er later ook bij gekomen, maar dit hebben we niet nodig.
De module is ontworpen als tool voor load balancing. Maar in dit geval zullen we die gebruiken om de stream door te sluizen naar een vast punt.
Om de stream module te activeren moet je dit wel mee geven in de configuratie. Dit doe je best als één van de eerste regels in je config
Opgelet op root niveau in de config:

load_module '/usr/lib64/nginx/modules/ngx_stream_module.so';
...
stream {
  server {
    listen 9505;
    proxy_pass intranet.reynaert.be:9505;
  }
}
Opgelet

Zorg ervoor dat de weg vrij is, maak dat de benodigde poorten open staan. Dit kunnen ook firewall rules zijn op hosting niveau. Zo zal je oa voor je NGINX de poort 9505 moeten open zetten. Voor CentOS met firewalld is dit zoiets:

firewall-cmd --zone=public --permanent --add-port=9505/tcp

Router

NGINX verwijst naar intranet.reynaert.be, aldaar aangekomen op de Firewall of Router moet je de poorten forwarden naar de docker Containers.

De player

Sofware hiervoor kan je downloaden via de Xibo site: Player installation.
Na installatie kan je de opties aanpassen alwaar je een client secret kan invoeren (te verkrijgen via CMS > Displays) en de url naar waar je CMS staat.
Je zal hier waarschijnlijk invoeren https://xibo….. Hou er rekening mee dat de player (al dan niet door een bug) ook connectie zal maken met http (niet https dus). Dit kan leiden tot een enorme zoektocht. Voorzie dus op je proxy een redirect(permanent) van poort 80 naar 443.

Have fun!

Tags gerelateerd aan dit artikel: