Inhaltsverzeichnis

,

MRBS Raumbuchung in Version > 1.11.x in docker

Docker Image+Theme von Dorian

Vorbemerkung

Hier: https://ask.linuxmuster.net/t/modernes-mrbs-template/6918 stellt @dorian vor, dass er einen Dockercontainer bereitgestellt hat, der seinen Source-code hier: https://github.com/dorianim/mrbs-docker hat und sehr einfach über docker-compose zu starten ist, wenn man bereits die Infrastruktur eines Docker-hosts und der SSL-Termination dazu hat.

Zusätzlich zur neueren Version von mrbs (und php) ist darin auch ein von ihm erstelltes neueres Theme eingebaut, source code: https://github.com/dorianim/modern-mrbs-theme . Einziger Nachteil ist, dass MRBS keine theme-engine hat und eventuell neuere Versionen von mrbs immer auch mit dem im modernere Theme passen müssen. Man eventuell also irgendwann auf das Theme verzichten muss, wenn man sich selbst ein noch neueres MRBS baut, als es dorian zur Verfügung stellt.

Diskussion

Konfiguration

Siehe https://github.com/dorianim/mrbs-docker wie man vorzugehen hat. Nach laufendem Dockercontainer wurde die Datei config/www/config.inc.php erstellt, die es anzupassen gilt.

LDAP Konfiguration für linuxmuster

Das ist der Teil für LDAP, der in config.inc.php sollte.

/**********************
* LDAP configuration *
*********************/

$auth["type"] = "ldap";

$ldap_host = "10.0.0.1";
$ldap_port = 636;
$ldap_v3 = false;
$ldap_tls = false;
ldap_set_option(null, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);

$ldap_base_dn = "OU=SCHOOLS,DC=linuxmuster,DC=lan";
$ldap_user_attrib = "sAMAccountName";
$ldap_dn_search_attrib = "sAMAccountName";

// Binduser, angelegt nach https://docs.linuxmuster.net/de/latest/external-services/moodle/index.html#bind-einstellungen, oder eben (nicht so gut: global-binduser)
$ldap_dn_search_dn = "CN=mrbs-binduser,OU=Management,OU=GLOBAL,DC=linuxmuster,DC=lan"; 
$ldap_dn_search_password = "<Dein LDAP binduser Passwort>";

// nur Lehrer dürfen zugreifen:
$ldap_filter = "(memberof=CN=role-teacher,OU=Groups,OU=GLOBAL,DC=linuxmuster,DC=lan)";
// Schüler oder Lehrer dürfen zugreifen:
//$ldap_filter = "|(memberof=CN=role-student,OU=Groups,OU=GLOBAL,DC=linuxmuster,DC=lan)(memberof=CN=role-teacher,OU=Groups,OU=GLOBAL,DC=linuxmuster,DC=lan)";

// Set to true to tell MRBS to look up a user's email address in LDAP.
// Utilises $ldap_email_attrib below
$ldap_get_user_email = true;
$ldap_email_attrib = 'mail';
$ldap_name_attrib = 'displayName';

// Hier wären alle Lehrer auch Admins:
//$ldap_admin_group_dn = 'CN=role-teacher,OU=Groups,OU=GLOBAL,DC=linuxmuster,DC=lan';
$ldap_group_member_attrib = 'memberof';
$ldap_unbind_between_attempts = false;
$ldap_suppress_invalid_credentials = true;
$ldap_debug = false;

Debugging

Wer Probleme hat, herauszubekommen, warum etwas nicht funktioniert, hier ein paar Tipps:

ini_set('display_errors', 'On');                                                                                                                                                  
ini_set('html_errors', 0);                                                                                                                                                        
error_reporting(-1);     

in der config.inc.php wirft ordentlich Fehler aus. Ebenso kann man das Theme von Dorian deaktivieren, in dem man

$theme = "default";

setzt. Hat allerdings bei mir nur Nachteile gehabt.

Zusätzlich gibt es noch die Problematik mit LDAPs (SSL) und selbst-signierten Zertifikaten des LDAP-Servers. Die obige Zeile ldap_set_option(null, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER); sollte das beheben, tut bei mir aber nicht, weswegen ich ldap.conf in den Container mounte.

Die Zeile oben $ldap_debug = true hat nur in Kombination mit den obigen display_errors etc. für PHP angezeigt, wenn der LDAP-Server nicht erreichbar war (z.B. wegen des SSL-Zertifikats).

Weitere Anpassungen: Aussehen und Funktionalität

$override_locale = "de-de";

// Bezeichnungen anpassen
$vocab_override['de']['mrbs'] = "Mein-Gymnasium Buchung Testserver";
$vocab_override['de']['areas'] = "Bereiche";
$vocab_override['de']['rooms'] = "Objekte";
$vocab_override['de']['period'] = "Stunde";
$vocab_override['de']['periods'] = "Stunden";

unset($booking_types);
$booking_types[] = "E";
$booking_types[] = "F";
$booking_types[] = "G";
$vocab_override["de"]["type.E"] = "spontan";
$vocab_override["de"]["type.F"] = "planmäßig";
$vocab_override["de"]["type.G"] = "Wartung";

// Default type for new bookings 
$default_type = "E";

$mrbs_company = "Mein-Gymnasium"; 
$mrbs_company_logo = "meingymnasiumlogo.png";

Auch hier: meingymnasiumlogo.png ist die Anpassung, die ich noch zusätzlich in den Container mounten muss, dass sie dort gefunden wird

Weitere Anpassungen: Dorians Modern Theme spezifisch

$kiosk_mode_enabled = true;
$kiosk_QR_code = true;
$style_weekends = true;

sprechen für sich (man darf halt Sa+So nicht ausblenden, dann sieht man auch, was $style_weekends macht).

Weitere Anpassungen (optional)

Beispielhaft von meiner Schule:

// Wochenstart Montags                                                                                                                                                              
$weekstarts = 1;
// Samstag und Sonntag verstecken                                                                                                                                                   
$hidden_days = array("6","0");

// should areas be shown as a list or a drop-down select box?                                                                                                                       
$area_list_format = "list";
//$area_list_format = "select";                                                                                                                                                     

// Define default starting view (month, week or day)                                                                                                                                
// Default is day                                                                                                                                                                   
$default_view = "week";

// Damit die Stundeneinteilung verwendet wird, muss in der                                                                                                                          
// Weboberfläche der Modus für den entsprechenden Raumbereich auf                                                                                                                   
// "series" gestellt werden.                                                                                                                                                        
unset($periods);
$periods[] = "[1]  08:00-08:45";
$periods[] = "[2]  08:50-09:35";
$periods[] = "[P]  Grosse Pause";
$periods[] = "[3]  09:55-10:40";
$periods[] = "[4]  10:45-11:30";
$periods[] = "[P]  2. grosse Pause";
$periods[] = "[5]  11:45-12:30";
$periods[] = "[6]  12:35-13:20";
$periods[] = "[P]  Mittagspause";
$periods[] = "[7]  13:25-14:10";
$periods[] = "[8+9]  14:15-15:50";
$periods[] = "[10+11] 15:55-17:30";

Docker compose Anpassungen

Neben der Dokumentation von Dorian zum Image hier: https://github.com/dorianim/mrbs-docker?tab=readme-ov-file#installation habe ich noch folgende Anpassungen gemacht:

  mrbs-devel-db:
    ...
    image: mariadb:10.11 # weil ich "latest" nicht mag
    ...
  mrbs-devel:
    ...
    image: dorianim/mrbs
    ...
    environment:
        ...
    volumes:
      ...
      - ./config:/config
      - ./ldap.conf:/etc/ldap/ldap.conf:ro
      - ./meingymnasiumlogo.png:/var/www/html/meingymnasiumlogo.png

mit dem Inhalt von ldap.conf:

TLS_CACERT      /etc/ssl/certs/ca-certificates.crt
PORT            636
TLS_REQCERT     never

SAML Konfiguration für linuxmuster + keycloak

??

Docker Image von MRBS

https://github.com/meeting-room-booking-system/mrbs-code

cd /srv/docker
mkdir -p mrbs-devel/mariadb-data
touch mrbs-devel/Dockerfile

git clone https://github.com/meeting-room-booking-system/mrbs-code
touch mrbs-code/ldap.conf mrbs-code/locale.gen

Folgendes Dockerfile hilft, einen MRBS-Container zu bekommen, der LDAP-selbst-signierte Zertifikate ignoriert und das standard-theme nutzt.

FROM php:8.2-apache

RUN a2enmod rewrite
RUN apt-get update && apt-get install -y libicu72 libicu-dev locales-all libldap2-dev \
    && docker-php-ext-install mysqli pdo pdo_mysql intl \
    && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu \
    && docker-php-ext-install ldap \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

COPY web/ /var/www/html/
COPY locale.gen /etc/locale.gen
COPY ldap.conf /etc/ldap/ldap.conf
COPY docker-config.inc.php /var/www/html/config.inc.php

Fehlt natürlich noch komplett die LDAP-Konfiguration etc. Die kann man oben abschauen. Zugehöriges docker-compose.yml könnte so aussehen:

service... etc.

  mrbs-devel-db:
    container_name: mrbs-devel-db
    restart: always
    image: mariadb:10.11
    environment:
      MYSQL_DATABASE: mrbs_raumbuchung
      MYSQL_USER: mrbsdbuser
      MYSQL_PASSWORD: XXXXXXXXXXXXx
      MYSQL_ROOT_PASSWORD: YYYYYYYYYYYYYYy
      MARIADB_AUTO_UPGRADE: 1
    volumes:
      - ./mrbs-devel/mariadb-data:/var/lib/mysql
  mrbs-devel:
    depends_on:
      - mrbs-devel-db
    container_name: raumbuchung-devel
    image: linuxmuster/mrbs-1.11.5:latest
    build:
      dockerfile: Dockerfile
      context: ./mrbs-code/
    restart: always
    environment:
        MRBS_DB_HOST: mrbs-devel-db
        MRBS_DB_PORT: 3306
        MRBS_DB_DATABASE: mrbs_raumbuchung
        MRBS_DB_USER: mrbsdbuser
        MRBS_DB_PASSWORD: XXXXXXXXXXXX
        MRBS_DB_NAME: mrbs_raumbuchung
        MRBS_TIMEZONE: Europe/Berlin
        MYSQL_ROOT_PASSWORD: YYYYYYYYYYYYYYYYy
        

dazu dann ein 'docker compose build mrbs-devel' etc…