jitsi: home schooling in corona-zeiten (2/2)

[ geschrieben am 02.05.2020 in blog: der maschinist | tags: #, #, #, #, #, # ]

diese anleitung ist leider noch nicht komplett. ich werde sie bis zum verschwinden dieses hinweises noch weiter bearbeiten.


die mit der corona-krise verbundenen ausgangsbeschränkungen zwingt viele menschen dazu, ihre arbeit neu zu organisieren. um sicherzustellen, dass sich kolleg*innen nicht unnötig begegnen und wohlmöglich anstecken, wird die arbeit in die heimischen vier wände verlegt. das wort “home office” ist in aller munde – videokonferenzdienste haben hochkonjunktur, um die soziale interaktion von teams aufrecht zu erhalten.

das problem mit vielen kommerziellen videokonferenz-lösungen ist, dass sie nicht eindeutig lokalisierbare serverinfrastrukturen nutzen. die einhaltung von datenschutzstandards kann aber nur sichergestellt werden, wenn eu-normen eingehalten werden. ob das in jedem falle möglich ist, wenn sich die genutzten ressourcen der dienstleister z.b. in den vereinigten staaten befinden…? die spionageskandale der nsa und die enthüllungen von chelsea manning und edward snowden sollten eine mahnung sein.

in bbb: home schooling in corona-zeiten (1/2) habe ich beschrieben, wie man eine videokonferenzlösung auf basis von “big blue button” (kurz: “bbb”) aufsetzt. etwas ressourcensparender, wenngleich aber auch weniger komfortabel ist “jitsi-meet”. der einfachste ansatz ist, das ganze als docker-container umzusetzen.

zunächst installieren wir, wenn nicht bereits passiert, die docker-umgebung. auf einem debianesken system sind folgende schritte notwendig:

# apt update
 # apt upgrade -y
 # apt install docker.io -y
 # systemctl start docker
 # systemctl enable docker

 
für die grafische verwaltung von docker-containern lohnt es, zunächst “portainer” einzubinden…

# docker pull portainer/portainer
 # docker run – name portainer -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

 
portainer kann anschließend per webbrowser via http://IP-ADRESSE-DES-SERVERS:9000 aufgerufen werden.

kommen wir zum eigentlichen vorhaben, der inbetriebnahme von jitsi-meet.

# mkdir /opt/docker
 # cd /opt/docker
 # git clone https://github.com/jitsi/docker-jitsi-meet
 # cd docker-jitsi-meet
 # cp env.example .env
 # ./gen-passwords.sh
 # mkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb,jigasi,jibri}

 
nun wird die konfigurationsdatei .env angepasst. die einstellungen sollten wie folgt aussehen…

# grep CONFIG= .env
 CONFIG=.jitsi-meet-cfg
 # grep HTTP_PORT= .env
 HTTP_PORT=127.0.0.1:8080
 # grep HTTPS_PORT= .env
 HTTPS_PORT=127.0.0.1:8443
 # grep TZ= .env
 TZ=Europe/Berlin
 # grep PUBLIC_URL= .env
 PUBLIC_URL=https://meet.domain.de
 # grep DISABLE_HTTPS= .env
 DISABLE_HTTPS=1

 
solltet ihr den jitsi-meet-server im hinter einem dsl-router betreiben, so ist es notwendig, in unter dem punkt DOCKER_HOST_ADDRESS= die ip-adresse des servers zu hinterlegen.

jitsi-meet kann nun mit dem befehl docker-compose up -d gestartet werden. über die eingangs installierte portainer-instanz oder mittels des befehls docker ps -a lässt sich überprüfen, ob die vier jitsi-meet-komponenten “up”, also korrekt gestartet, sind.

anschließend konfigurieren wir den reverse-proxy. ich bevorzuge dafür den ressourcensparenden webserver “nginx”. die installation selbst ist simpel…

# apt update
 # apt install nginx -y

 
die nginx-konfigurationsdatei könnte so aussehen:

# cat /etc/nginx/sites-enabled/meet.domain.de.conf
 server {
  listen 80;
  listen [::]:80;
  server_name meet.domain.de;
  location /.well-known/acme-challenge {
   root /var/www/letsencrypt;
   default_type "text/plain";
   try_files $uri =404;
  }
  location / {
   return 301 https://$host$request_uri;
  }
 }
 server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name meet.domain.de;
  access_log off;
  error_log /var/log/nginx/meet.domain.de.error.log;
  ssl_certificate /etc/letsencrypt/live/meet.domain.de/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/meet.domain.de/privkey.pem;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
  ssl_buffer_size 1400;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_protocols TLSv1.2;
  #TLSv1.3;
  #ssl_early_data on;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers on;
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_ecdh_curve X25519:P-384:P-256:P-521;
  resolver 176.9.93.198 176.9.1.117 valid=300s;
  resolver_timeout 5s;
  add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'";
  add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
  add_header X-Xss-Protection "1; mode=block";
  add_header X-Content-Type-Options nosniff;
  add_header Referrer-Policy same-origin;
  proxy_cookie_path / "/; HTTPOnly; Secure";
  add_header Expect-CT "enforce, max-age=21600";
  add_header Feature-Policy "payment none";
  keepalive_timeout 70;
  sendfile on;
  client_max_body_size 0;
  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  location / {
   expires max;
   log_not_found off;
   proxy_cache_valid 200 120m;
   proxy_set_header Host $http_host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Scheme $scheme;
   proxy_pass http://127.0.0.1:8080/;
  }
 }

 
nun wird die ssl-verschlüsselung per “let’s encrypt” eingerichtet:

# add-apt-repository ppa:certbot/certbot
 # apt update
 # apt install python-certbot-nginx -y
 # openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 4096
 # certbot – nginx -d meet.domain.de

 
die zuvor in der nginx-konfiguration angegebenen pfade sollten nun hinterlegt sein. wir überprüfen das nochmal mit dem befehl nginx -t. wenn keine fehler angezeigt werden, wird der nginx-server samt reverse-proxy-funktion und ssl-verschlüsselung mittels systemctl restart nginx neu gestartet.

nun sollte jitsi-meet über den webbrowser nutzbar sein. nicht jeder webbrowser funktioniert gut – erfolgreiche tests hatte ich mit mozilla firefox 68 esr (osx, w10), mozilla firefox 68 (android, im desktop-modus) sowie chromium 80 (osx, w10). wer von euch plant, den microsoft internet explorer/ edge oder auch apple safari einzusetzen – keine chance!

der nun verfügbare dienst ist zunächst erst einmal offen. wer die nutzung des dienstes auf eine bestimmte nutzergruppe eingrenzen möchte, kann dies z.b. quick&dirty per http-authentifikation tun. die notwendigen schritte sind…

# apt install apache2-utils -y
 # htpasswd -c /opt/docker/docker-jitsi-meet/.htpasswd user1
 # htpasswd /opt/docker/docker-jitsi-meet/.htpasswd user2
 # htpasswd /opt/docker/docker-jitsi-meet/.htpasswd user3
 [...]

 
anschließend wird die nginx-konfigurationsdatei am ende um die folgenden zeilen erweitert…

# cat /etc/nginx/sites-enabled/meet.domain.de.conf
 [...]
   proxy_pass http://127.0.0.1:8080/;
   auth_basic 'Mein Jitsi-Meet-Server - – Bitte melde Dich an...';
   auth_basic_user_file /opt/docker/docker-jitsi-meet/.htpasswd;
  }
 }

 
…, um die konfigurationsänderung per systemctl reload nginx zu übernehmen.

die http-authentifikation funktioniert prima mit webbrowsern, allerdings kann die jitsi-meet-mobile-app (android/f-droid, android/playstore, apple appstore) damit nicht umgehen. hierfür sind weitere anpassungen an den docker-images notwendig…


diese anleitung ist leider noch nicht komplett. ich werde sie bis zum verschwinden dieses hinweises noch weiter bearbeiten.


quellen:

One thought on “jitsi: home schooling in corona-zeiten (2/2)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.