Tutorial: Matrix mit Element-Web und Synapse-Admin in Docker installieren

 

Leider musste ich feststellen, dass die Anleitungen, die mir die Suchmaschine meines Vertrauens ausgespuckt haben, um für Matrix mit Element-Web und Synapse-Admin unter Verwendung von Apache als Reverse Proxy eine Dockerumgebung einzurichten, entweder nicht funktionieren (veraltet / fehlerhaft), oder der ein oder andere Hinweis fehlt, um das Projekt auch mit weniger tiefgreifendem Wissen erfolgreich realisieren zu können. Mit einiger Unterstützung konnte ich nun eine funktionierende Installation umsetzen und stelle hier meine Dokumentation als Tutorial zur Verfügung,

Wenn man sich exakt an alle Schritte und Konfigurationen hält, sollte das bei jedem auf einem Debian-basierten Server, auf dem Apache läuft, ebenfalls zu einer funktionierenden Umgebung führen. Sollte es trotz des extrem kleinschrittigen Vorgehens Fragen oder Probleme geben, dürft ihr euch selbstverständlich gerne bei mir melden. Meine Kontaktmöglichkeiten findet ihr oben rechts auf dieser Webseite.

 

Voraussetzungen

 
  • folgende (Sub)Domains zeigen auf den Server:
    • mydomain.de
    • matrix.mydomain.de
    • synapseadmin.mydomain.de
    • element.mydomain.de
  • Apache-Webserver ist installiert und eingerichtet.
  • VirtualHost für den Ordner /var/www/public_html ist angelegt und aktiviert.
  • folgender Apache-Module sind aktiviert:
    •  Module anzeigen

      rewrite
      headers
      proxy
      proxy_http
      connect
      proxy_wstunnel
      ssl
      proxy_fcgi
      setenvif
      expires
      deflate
      mod_php

  • Docker und Docker-Compose sind installiert und eingerichtet.

 

Installation und Konfiguration

 

Apache-Webserver

 
  • Portliste für Apache anpassen: nano /etc/apache2/ports.conf
    •  Code einblenden

      Listen 80
      <IfModule ssl_module>
      Listen 443
      </IfModule>
      <IfModule mod_gnutls.c>
      Listen 443
      </IfModule>
      Listen 8448

    i.d.R. muss man nur Listen 8448 ergänzen.
  • VirtualHost mit der Apache-Reverse-Proxy-Config für Synapse erstellen: nano /etc/apache2/sites-available/matrix.crazy-to-bike.de.conf
  • folgenden Inhalt in die Datei kopieren:
    •  Code einblenden

      <VirtualHost *:80>
      ServerAdmin admin@yourdomain.de
      ServerName matrix.yourdomain.de
      Redirect Permanent / https://matrix.yourdomain.de/
      </VirtualHost>

      <VirtualHost *:443>
      ServerAdmin admin@yourdomain.de
      ServerName matrix.yourdomain.de
      Protocols h2 h2c http/1.1
      DocumentRoot /var/www/public_html
      <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteRule ^\/.well-known/matrix/client /var/www/public_html/well-known/matrix/client [QSA,L]
      RewriteRule ^\/.well-known/matrix/server /var/www/public_html/well-known/matrix/server [QSA,L]
      </IfModule>
      includeSubDomains; preload"
      Header always set Referrer-Policy "same-origin"
      SSLEngine on
      SSLProtocol -all +TLSv1.2
      SSLHonorCipherOrder on
      SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-HA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
      AllowEncodedSlashes NoDecode
      RequestHeader set X-Forwarded-Proto "https"
      ProxyPreserveHost on
      ProxyPass / http://127.0.0.1:8008/ nocanon
      ProxyPassReverse / http://127.0.0.1:8008/
      ProxyPass /_synapse/client http://127.0.0.1:8008/_synapse/client nocanon
      ProxyPassReverse /_synapse/client http://127.0.0.1:8008/_synapse/client
      # wird von Certbot eingetragen
      SSLCertificateFile /etc/letsencrypt/live/matrix.yourdomain.de/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/matrix.yourdomain.de/privkey.pem
      Include /etc/letsencrypt/options-ssl-apache.conf
      # Ende des Eintrags durch Certbot
      </VirtualHost>

      <VirtualHost *:8448>
      SSLEngine on
      ServerName matrix.yourdomain.de
      RequestHeader set X-Forwarded-Proto "https"ProxyPreserveHost on
      AllowEncodedSlashes NoDecode
      ProxyPass / http://127.0.0.1:8008/ nocanon
      ProxyPassReverse / http://127.0.0.1:8008/
      # wird von Certbot eingetragen
      SSLCertificateFile /etc/letsencrypt/live/matrix.yourdomain.de/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/matrix.yourdomain.de/privkey.pem
      Include /etc/letsencrypt/options-ssl-apache.conf
      # Ende des Eintrags durch Certbot
      </VirtualHost>

    • yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
    • Den Abschnitt zwischen #von certbot eingetragen und # Ende des Eintrags durch Certbot weglassen, wenn Let's Encrypt mit Certbot verwendet wird.
  • VirtualHost mit der Apache-Reverse-Proxy-Config für Synapse-Admin erstellen: nano /etc/apache2/sites-available/synapseadmin.crazy-to-bike.de.conf
  • folgenden Inhalt in die Datei kopieren:
    •  Code einblenden

      <VirtualHost *:80>
      ServerAdmin admin@yourdomain.de
      ServerName synapseadmin.yourdomain.de
      Redirect Permanent / https://synapseadmin.yourdomain.de/
      RewriteEngine on
      RewriteCond %{SERVER_NAME} =element.yourdomain.de
      RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
      </VirtualHost>

      <VirtualHost *:443>
      ServerAdmin admin@yourdomain.de
      ServerName synapseadmin.yourdomain.de
      Protocols h2 h2c http/1.1
      DocumentRoot /var/www/public_html
      # auskommentiert bei Reverse-Proxy, da sonst 2 HSTS Header übermittelt werden
      #Header add Strict-Transport-Security "max-age=31536000"
      #Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
      Header always set Referrer-Policy "same-origin"
      #Header always set Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *;"
      SSLEngine on
      SSLProtocol -all +TLSv1.2SSLHonorCipherOrder on
      SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM- SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-HA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
      ProxyPreserveHost On
      # For files proxy
      RequestHeader set X-Forwarded-Proto "https"
      #RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
      AllowEncodedSlashes NoDecode
      ProxyPreserveHost on
      ProxyPass / http://127.0.0.1:8080/
      ProxyPassReverse / http://127.0.0.1:8080/
      # von Certbot eingetragen
      Include /etc/letsencrypt/options-ssl-apache.conf
      SSLCertificateFile /etc/letsencrypt/live/synapseadmin.yourdomain.de/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/synapseadmin.yourdomain.de/privkey.pem
      # Ende des Eintrags durch Certbot
      </VirtualHost>

    • yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
    • Den Abschnitt zwischen #von certbot eingetragen und # Ende des Eintrags durch Certbot weglassen, wenn Let's Encrypt mit Certbot verwendet wird.
  • VirtualHost mit der Apache-Reverse-Proxy-Config für Synapse-Admin erstellen: nano /etc/apache2/sites-available/element.crazy-to-bike.de.conf
  • folgenden Inhalt in die Datei kopieren:
    •  Code einblenden

      <VirtualHost *:80>
      ServerAdmin admin@yourdomain.de
      ServerName element.yourdomain.de
      Redirect Permanent / https://element.yourdomain.de/
      RewriteEngine on
      RewriteCond %{SERVER_NAME} =element.yourdomain.de
      RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
      </VirtualHost>

      <VirtualHost *:443>
      ServerAdmin admin@yourdomain.de
      ServerName element.yourdomain.de
      Protocols h2 h2c http/1.1
      DocumentRoot /var/www/public_html
      # auskommentiert bei Reverse-Proxy, da sonst 2 HSTS Header übermittelt werden
      #Header add Strict-Transport-Security "max-age=31536000"
      #Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
      Header always set Referrer-Policy "same-origin"
      #Header always set Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *;"
      SSLEngine on
      SSLProtocol -all +TLSv1.2SSLHonorCipherOrder on
      SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM- SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-HA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
      ProxyPreserveHost On
      # For files proxy
      RequestHeader set X-Forwarded-Proto "https"
      #RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
      AllowEncodedSlashes NoDecode
      ProxyPreserveHost on
      ProxyPass / http://127.0.0.1:8080/
      ProxyPassReverse / http://127.0.0.1:8080/
      # von Certbot eingetragen
      Include /etc/letsencrypt/options-ssl-apache.conf
      SSLCertificateFile /etc/letsencrypt/live/element.yourdomain.de/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/element.yourdomain.de/privkey.pem
      # Ende des Eintrags durch Certbot
      </VirtualHost>

    • yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
    • Den Abschnitt zwischen #von certbot eingetragen und # Ende des Eintrags durch Certbot weglassen, wenn Let's Encrypt mit Certbot verwendet wird.
  • Die Virual-Host-Configs aktivieren:
    a2ensite matrix.yourdomain.de.conf
    a2ensite synapseadmin.yourdomain.de.conf
    a2ensite element.yourdomain.de.conf
  • Apache neu starten: systemctl restart apache2
 

Let's Encrypt

 
  • Let's Encrypt-Zertifikate erstellen: certbot
    • für matrix.yourdomain.de
    • für element.yourdomain.de
    • für synapseadmin.yourdomain.de
 

Matrix-Docker-Umgebung

 
  • Docker-Verzeichnis erstellen: mkdir /opt/matrix
  • Unterverzeichnis für Matrix-Synapse erstellen: mkdir /opt/matrix/data
  • Unterverzeichnis für Medien erstellen: mkdir /opt/matrix/data/media_store
  • Unterverzeichnis für die Postgres-Datenbank erstellen: mkdir /opt/matrix/postgres_db
  • Unterverzeichnis für Redis erstellen: mkdir /opt/matrix/redis
  • Unterverzeichnis für Config-Dateien erstellen: mkdir /opt/matrix/config
  • Postgres-Konfiguration erstellen: nano /opt/matrix/config/postgres.env
    folgenden Inhalt in die Datei kopieren:
    •  Code einblenden

      POSTGRES_PASSWORD=mein_Passwort
      POSTGRES_USER=synapse
      POSTGRES_DB=synapse
      POSTGRES_INITDB_ARGS=--lc-collate C --lc-ctype C --encoding UTF8

    Passwort für die Postgres-Datenbank festlegen (mein_Passwort ersetzen).
  • Konfiguration für Matrix-Synapse erstellen:
    •  Befehl anzeigen

      docker run -it --rm \
      --mount type=bind,src=/opt/matrix/data,dst=/data \
      -e SYNAPSE_SERVER_NAME=yourdomain.de \
      -e SYNAPSE_REPORT_STATS=yes \
      matrixdotorg/synapse:latest generate

    yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
  • Datenbank-Konfiguration in der erstellten homeserver.yaml anpassen: nano /opt/matrix/data/homeserver.yaml
    •  Code einblenden

      server_name: "mydomain.de"
      pid_file: /data/homeserver.pid
      listeners:
          - port: 8008
            tls: false
            type: http
            x_forwarded: true
            resources:
          - names: [client, federation]
            compress: false
      #database:
      #name: sqlite3
      #args:
      # database: /data/homeserver.db
      database:
          name: psycopg2
          args:
            user: synapse
            password: mein_Passwort
            database: synapse
            host: matrix_db
            cp_min: 5
            cp_max: 10
      log_config: "/data/mydomain.de.log.config"
      media_store_path: /data/media_store
      registration_shared_secret:
      "sC8*enZFhQfVC8R5e9tSmpoW;RJE@xv@Eqdxa@,7mA;OBun1dt"
      report_stats: true
      macaroon_secret_key: "3h4*42i*qKt3Fx;pEH=_v;;rZVo9Sk5MLzgMlNj.I&pjOtpy#a"
      form_secret: "Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.~b9-iy.-i,uI5"
      signing_key_path: "/data/mydomain.de.signing.key"
      trusted_key_servers:
          - server_name: "matrix.org"

    • Den Abschnitt database: für sqlite3 komplett auskommentieren (# davor setzen) doder löschen.
    • Neuen Abschnitt database: für Postgres einfügen.
    • Passwort für die Postgres-Datenbank aus der postgres.env eintragen (mein_Passwort ersetzen).
  • Unterverzeichnis für die Element-Konfiguration erstellen: mkdir /opt/matrix/config
  • Element-Konfiguration erstellen: nano /opt/matrix/config/element-config.json
    folgenden Inhalt in die Datei kopieren:
    •  Code einblenden

      {
      "default_server_config": {
      "m.homeserver": {
      "base_url": "https://matrix.mydomain.de",
      "server_name": "matrix.mydomain.de"
      },
      "m.identity_server": {
      "base_url": "https://vector.im"
      }
      },
      "disable_custom_urls": false,
      "disable_guests": false,
      "disable_login_language_selector": false,
      "disable_3pid_login": false,
      "brand": "Element",
      "integrations_ui_url": "https://scalar.vector.im/",
      "integrations_rest_url": "https://scalar.vector.im/api",
      "integrations_widgets_urls": [
      "https://scalar.vector.im/_matrix/integrations/v1",
      "https://scalar.vector.im/api",
      "https://scalar-staging.vector.im/_matrix/integrations/v1",
      "https://scalar-staging.vector.im/api",
      "https://scalar-staging.riot.im/scalar/api"
      ],
      "default_country_code": "DE",
      "show_labs_settings": false,
      "features": {},
      "default_federate": true,
      "default_theme": "light",
      "room_directory": {
      "servers": ["matrix.org"]
      },
      "enable_presence_by_hs_url": {
      "https://matrix.org": false,
      "https://matrix-client.matrix.org": false
      },
      "setting_defaults": {
      "breadcrumbs": true
      },
      "jitsi": {
      "preferred_domain": "meet.element.io"
      },
      "element_call": {"url": "https://call.element.io",
      "participant_limit": 8,
      "brand": "Element Call"
      },
      "map_style_url": "https://api.maptiler.com/maps/streets/style.json?
      key=fU3vlMsMn4Jb6dnEIFsx"
      }

    yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
  • docker-compose.yml erstellen: nano /opt/matrix/docker-compose.yml
    folgenden Inhalt in die Datei kopieren:
    •  Code einblenden

      services:

          postgres:
              image: postgres:latest
              container_name: matrix_db
              restart: unless-stopped
              healthcheck:
                  test: ['CMD', 'pg_isready', '-U', 'postgres']
              env_file:
                  - ./config/postgres.env
              volumes:
                  - ./postgres_db:/var/lib/postgresql/data
              networks:
                  - internal_network

          redis:
              image: redis:latest
              container_name: matrix_redis
              restart: unless-stopped
              healthcheck:
                  test: ['CMD', 'redis-cli', 'ping']
              volumes:
                  - ./redis:/data
              networks:
                  - internal_network

          synapse:
              image: matrixdotorg/synapse:latest
              container_name: matrix_synapse
              restart: unless-stopped
              environment:
                  SYNAPSE_CONFIG_DIR: "/data"
                  SYNAPSE_CONFIG_PATH: "/data/homeserver.yaml"UID: "1000"
                  GID: "1000"
                  TZ: "Europe/Berlin"
              ports:
                  - "127.0.0.1:8008:8008"
              networks:
                  - internal_network
                  - external_network
              volumes:
                  - ./data:/data

          element:
              image: vectorim/element-web:latest
              container_name: matrix_element
              restart: unless-stopped
              volumes:
                  - ./config/element-config.json:/app/config.json:ro
                  ports:
                      - "127.0.0.1:8180:80"
                  networks:
                      - internal_network
                      - external_network

      networks:
          external_network:
               name: matrix_external_network
               external: true
           internal_network:
               name: matrix_internal_network
               internal: true

  • ID des angemeldeten sudo-Users auslesen: id benutzername
  • Verzeichnis-(Besitz-)Rechte anpassen:
    • chown -R ID:ID /opt/matrix/config
      ID durch die ID des Benutzers ersetzen, z.B. chown -R 1000:1000 /opt/matrix/config
    • chown -R ID:ID /opt/matrix/data
      ID durch die ID des Benutzers ersetzen, z.B. chown -R 1000:1000 /opt/matrix/data
    • chown -R 70:ID /opt/matrix/postgres_db
      ID durch die ID des Benutzers ersetzen, z.B. chown -R 70:1000 /opt/matrix/postgres_db
    • chown -R 999:ID /opt/matrix/redis
      ID durch die ID des Benutzers ersetzen, z.B. chown -R 999:1000 /opt/matrix/redis
  • (Besitz-)Rechte anpassen: chown ID:ID /opt/matrix/docker-compose.yml
    ID durch die ID des Benutzers ersetzen, z.B. chown -R 1000:1000 /opt/matrix/docker-compose.yml
  • well-known einrichten:
    • Verzeichnis erstellen: mkdir /var/www/public_html/well-known
    • Unterverzeichnis erstellen: mkdir /var/www/public_html/well-known/matrix
    • Datei anlegen: nano /var/www/public_html/well-known/matrix/server
      mit folgendem Inhalt: yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
    • Datei anlegen: nano /var/www/public_html/well-known/matrix/client
      mit folgendem Inhalt:
      •  Code einblenden

        {
        "m.homeserver": {
        "base_url": "https://matrix.mydomain.de/"
        }
        }

        yourdomain.de an allen Stellen durch die eigene Domain ersetzen.
  • Ins Matrix-Verzeichnis wechseln: cd /opt/matrix
  • Docker-Umgebung starten: docker-compose up -d
  • Benutzer erstellen:
    • In den Synapse-Docker wechseln: docker exec -it matrix_synapse bash
      • Admin erstellen: register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --admin
        Benutzername: admin
        Passwort: mein_Passwort
      • Normalen Benutzer erstellen: register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml
        Benutzername: mein_benutzername
        Passwort: mein_Passwort
        Frage nach Admin-Account mit no beantworten
    • Den Synapse-Docker verlassen: exit
 

Updaten

 
  • Ins Docker-Verzeichnis wechsen: cd /opt/matrix
  • Alle Docker-Container herunterfahren: docker-compose down
  • Sicherung des Docker-Verzeichnisses erstellen: cp -ar /opt/matrix /opt/matrixbackup
  • Alle Docker-Container updaten: docker-compose pull
  • Alle Docker starten: docker-compose up -d
  • Wenn alles funktioniert, Backup des Docker-Verzeichnisses löschen: rm -r /opt/matrixbackup
 

Anmeldung und Nutzung

 

Element Web

 
  • Aufruf: https://element.mydomain.de
  • Als Heimserver muss eingetragen sein / werden: matrix.mydomain.de
  • Anmeldung mit mein_benutzername und mein_Passwort
 

Synapse-Admin

 

Bike-Guiding

Geführte MTB-Touren

Hegau . Randen . Schienerberg . Bodanrück . Schwarzwald . Donautal . Schwäbische Alb . Pfalz . Engadin . Reschen . Dolomiten . Südtirol . weitere Alpenreviere . and more

  You want it? - Get it!

Nächste Events

27 Apr.
Samstagstour
Datum 27.04.2024 14:00
28 Apr.
Sonntagstour
28.04.2024 10:00
1 Mai
3 Mai
Freitagstour
03.05.2024 14:00
4 Mai
Hochrhein-Trails
04.05.2024 08:30

Nächste Events

27 Apr.
Samstagstour
27.04.2024 14:00
28 Apr.
Sonntagstour
28.04.2024 10:00
1 Mai
3 Mai
Freitagstour
03.05.2024 14:00
4 Mai
Hochrhein-Trails
04.05.2024 08:30

Kalender

Hinweis zum Einsatz von Cookies
Es findet keinerlei Tracking statt und es werden keine Daten an andere Server übertragen. Für eine fehlerfreie Darstellung der Inhalte und um alle Funktionen nutzen zu können, sind aber Cookies erforderlich. Für angenehmes Surfen solltest du deshalb der Verwendung zustimmen und Cookies in deinem Browser zulassen.