Zum Hauptinhalt springen Skip to page footer

Seatsurfing Installation mit Docker unter Ubuntu 22.04: Flexibles Buchungssystem für Unternehmen und Organisationen

| Tutorial | Seatsurfing Docker Ubuntu Linux

Seatsurfing ist eine Lösung für Unternehmen und Organisationen. Mit Seatsurfing können Mitarbeiter selbstständig Räume und Sitzplätze buchen. Seatsurfing ermöglicht es Organisationen, den Wandel hin zu flexiblen Arbeitszeiten und freien Sitzplätzen voranzutreiben.

Was ist Seatsurfing

Seatsurfing verwendet ein abstraktes Modell für buchbare Sitzplätze. Daher kann Seatsurfing für verschiedene Zwecke eingesetzt werden:

  • Buchung einzelner Plätze in Co-Working Spaces (freie Plätze, flexible Plätze)
  • Buchung von ganzen Räumen (z.B. Konferenzräume)
  • Buchung von Parkplätzen
  • ...und vieles mehr…

Die Anwendung beinhaltet derzeit kein Abrechnungsmodell. Das bedeutet, dass Sie kommerziell vermietete Räume (z.B. Schreibtische in einem Coworking Space) nicht abrechnen können. Seatsurfing richtet sich an Organisationen, die ihren Mitarbeitern freie Plätze zur Verfügung stellen.

Seatsurfing besteht aus einem Server-Backend, das eine REST-API zur Verfügung stellt einer webbasierten Administrationsoberfläche zur Verwaltung von Plätzen und Nutzern (zusammen mit dem Server-Backend) einer mobilen Progressive Web Application (PWA), die von den Mitarbeitern einer Organisation genutzt werden kann, um Sitzplätze zu buchen (auch als Confluence-Anwendung verfügbar, gebündelt mit dem Server-Backend).

Die Hauptfunktionen von Seatsurfing sind

  • Schnelles und flexibles Buchen von Sitzplätzen über eine mobile Web-Applikation
  • Login über Passwort oder OAuth2
  • Hochladen von Saalplänen als JPEG, PNG oder GIF
  • Platzierung von Räumen/Plätzen per Drag & Drop
  • Konfigurierbare Buchungseinstellungen (z.B. max. Buchungsdauer, Kündigungsfrist und Anzahl)
  • Anzeige von Buchungs- und Nutzungsstatistiken

Voraussetzungen

Schritt 1: System aktualisieren

Aktualisieren Sie den apt-Paketindex und bringen Sie alle Pakete auf den neuesten Stand:
sudo apt update && sudo apt upgrade -y

Schritt 2: Kontrollieren der Firewall

Kontrollieren Sie, ob in der Firewall http- (Port 80) und https- (Port 443) Verbindungen erlaubt sind
sudo ufw status
Ausgabe:
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
Sollten die Verbindungen zu den Ports 80 und 443 nicht freigegeben sein, können Sie sie mit folgenden Befehlen freigeben:
sudo ufw allow http
sudo ufw allow https

Schritt 4: Nginx installieren

Ubuntu 22.04 wird mit einer älteren Version von Nginx ausgeliefert. Um die neueste Version zu installieren, müssen Sie das offizielle Nginx-Repository herunterladen.

Importieren Sie den Nginx-Signierschlüssel:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Ausgabe:
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1561  100  1561    0     0  17079      0 --:--:-- --:--:-- --:--:-- 17153
Fügen Sie das Repository für die stabile Version von Nginx hinzu:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Ausgabe:
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] http://nginx.org/packages/ubuntu jammy nginx
Aktualisieren Sie erneut der Repositories:
sudo apt update
Installieren Sie Nginx:
sudo apt install nginx
Prüfen Sie die Installation:
nginx -v
Ausgabe:
nginx version: nginx/1.24.0

Schritt 5: Certbot und SSL installieren

Siehe “Certbot unter Ubuntu 22.04 installieren

Wenn Sie Certbot installiert haben führen Sie den folgenden Befehl aus, um ein SSL-Zertifikat zu erzeugen:
sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m youralias@yourdomain.com -d book.yourdomain.com
Ausgabe:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account registered.
Requesting a certificate for book.yourdomain.com

Successfully received certificate.
Certificat book.yourdomain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/book.yourdomain.com/privkey.pem
This certificate expires on 2023-10-11.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Wenn Sie Certbot installiert haben führen Sie den folgenden Befehl aus, um ein SSL-Zertifikat zu erzeugen:
sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m youralias@yourdomain.com -d book.yourdomain.com
Ausgabe:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for book.yourdomain.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/book.yourdomain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/book.yourdomain.com/privkey.pem
This certificate expires on 2023-10-11.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Der obige Befehl erzeugt ein Zertifikat und legt dieses im Verzeichnis /etc/letsencrypt/live/comments.yourdomain.com  ab.

Schritt 6: Seatsurfing installieren

Das folgende Beispiel zeigt die Einrichtung des Seatsurfing-Backends mit Docker Compose. Wir starten die benötigte PostgreSQL-Datenbank als Teil der Compose-Datei.

Der Einfachheit halber und nur zu Demonstrationszwecken wird der Container-Port 8082 direkt auf dem Host veröffentlicht. Für den produktiven Einsatz von Seatsurfing sollte ein Reverse-Proxy vor das Seatsurfing-Backend geschaltet werden, der auch die TLS-Terminierung übernimmt.

Erstellen Sie ein Verzeichnis searsurfing und wechseln Sie in das Verzeichnis (in diesem Tutorial im Verzeichnis /var/web/)
mkdir /var/web/setsurfing
cd /var/web/seatsurfing
Erstellen Sie die Datei docker-compose.yml
nano docker-compose.yml
Kopieren Sie folgenden Inhalt in die Datei docker-compose.yml:
version: '3.7'

services:
  server:
    image: seatsurfing/backend
    restart: always
    networks:
      sql:
      http:
    ports:
      - 8080:8080
    environment:
      POSTGRES_URL: 'postgres://seatsurfing:DB_PASSWORD@db/seatsurfing?sslmode=disable'
      JWT_SIGNING_KEY: 'some_random_string'
      BOOKING_UI_BACKEND: 'booking-ui:3001'
      ADMIN_UI_BACKEND: 'admin-ui:3000'
  booking-ui:
    image: seatsurfing/booking-ui
    restart: always
    networks:
      http:
  admin-ui:
    image: seatsurfing/admin-ui
    restart: always
    networks:
      http:
  db:
    image: postgres:12
    restart: always
    networks:
      sql:
    volumes:
      - db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: DB_PASSWORD
      POSTGRES_USER: seatsurfing
      POSTGRES_DB: seatsurfing

volumes:
  db:

networks:
  sql:
  http:

Speichern Sie die Datei.

Die Konfiguration wird später

  • eine PostgreSQL Datenbank mit Daten, die auf dem Docker Volume "db" gespeichert sind
  • eine Seatsurfing Backend Instanz auf Port 8082 und
  • eine Seatsurfing Booking UI Instanz, die über die Backend Instanz erreichbar ist unter: :8082/ui/
  • eine Seatsurfing Admin UI Instanz, die über die Backend Instanz erreichbar ist unter: :8082/admin/

starten

Schritt 7 – Nginx konfigurieren

sudo nano /etc/nginx/conf.d/book.yourdomain.conf
Fügen Sie den folgenden Code ein:
server {
    listen      443;
    server_name book.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/book.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/book.yourdomain.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/book.yourdomain.com/chain.pem;
    ssl_session_timeout 1d;

    # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
    ssl_protocols TLSv1.2 TLSv1.3;

    # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
    # prevent replay attacks.
    #
    # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
    ssl_early_data on;

    location / {
         proxy_redirect          off;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header        Host $http_host;
         proxy_pass              http://127.0.0.1:8082/;
    }

    access_log   /var/log/nginx/book.yourdomain.com.log;

}

server {
  listen 80;
  server_name book.yourdomain.com;
  return      301 https://book.yourdomain.com$request_uri;
}

Speichern Sie die Datei.

Prüfen Sie zuerst Ihre Nginx-Konfiguration:
sudo nginx -t
Starten Sie den Nginx-Server neu:
sudo systemctl restart nginx

Schritt 8: Seatsurfing ausführen

Wechseln Sie in das seatsurfing-Verzeichnis:
cd /var/web/seatsurfing
Starten Sie Seatsurfing- mit folgendem Befehl:
docker compose up -d
Ausgabe:
[+] Running 43/43
 ✔ db 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                        9.2s
   ✔ faef57eae888 Pull complete                                                                                                               2.3s
   ✔ a33c10a72186 Pull complete                                                                                                               2.3s
   ✔ d662a43776d2 Pull complete                                                                                                               2.4s
   ✔ a3ba86413420 Pull complete                                                                                                               2.5s
   ✔ a627f37e9916 Pull complete                                                                                                               3.0s
   ✔ 424bade69494 Pull complete                                                                                                               3.1s
   ✔ dd8d4fcd466b Pull complete                                                                                                               3.1s
   ✔ 03d0efeea592 Pull complete                                                                                                               3.1s
   ✔ df31170c62bb Pull complete                                                                                                               7.5s
   ✔ 61fab19441f5 Pull complete                                                                                                               7.5s
   ✔ 8b0fe1e7a217 Pull complete                                                                                                               7.5s
   ✔ a3aefabafa64 Pull complete                                                                                                               7.5s
   ✔ 7c583fcc0ca8 Pull complete                                                                                                               7.5s
 ✔ booking-ui 20 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                         9.9s
   ✔ a7ca0d9ba68f Pull complete                                                                                                               2.1s
   ✔ fe5ca62666f0 Pull complete                                                                                                               2.2s
   ✔ b02a7525f878 Pull complete                                                                                                               3.0s
   ✔ fcb6f6d2c998 Pull complete                                                                                                               3.0s
   ✔ e8c73c638ae9 Pull complete                                                                                                               3.0s
   ✔ 1e3d9b7d1452 Pull complete                                                                                                               3.0s
   ✔ 4aa0ea1413d3 Pull complete                                                                                                               3.0s
   ✔ 7c881f9ab25e Pull complete                                                                                                               3.0s
   ✔ 5627a970d25e Pull complete                                                                                                               3.1s
   ✔ 96266735468f Pull complete                                                                                                               3.5s
   ✔ 2758d0c31c8c Pull complete                                                                                                               3.5s
   ✔ 08553ba93cfe Pull complete                                                                                                               3.6s
   ✔ dfc02eb7708f Pull complete                                                                                                               3.6s
   ✔ 52907d314ddc Pull complete                                                                                                               3.7s
   ✔ 4eec690774a4 Pull complete                                                                                                               3.9s
   ✔ a22eaaf37419 Pull complete                                                                                                               6.9s
   ✔ 3fdce591854e Pull complete                                                                                                               7.0s
   ✔ c6d11754a16c Pull complete                                                                                                               7.0s
   ✔ a50703798bbe Pull complete                                                                                                               8.2s
   ✔ fdbdf48f515b Pull complete                                                                                                               8.2s
 ✔ server 3 layers [⣿⣿⣿]      0B/0B      Pulled                                                                                               7.5s
   ✔ 06bf4de3c408 Pull complete                                                                                                               5.6s
   ✔ 779ace52e56e Pull complete                                                                                                               5.7s
   ✔ 4f4fb700ef54 Pull complete                                                                                                               5.7s
 ✔ admin-ui 3 layers [⣿⣿⣿]      0B/0B      Pulled                                                                                             9.7s
   ✔ 0fc97a5639f3 Pull complete                                                                                                               6.9s
   ✔ 7de68dafc1bf Pull complete                                                                                                               7.8s
   ✔ 7eb5489c500b Pull complete                                                                                                               7.9s
[+] Running 7/7
 ✔ Network seatsurfing_sql             Created                                                                                                0.1s
 ✔ Network seatsurfing_http            Created                                                                                                0.1s
 ✔ Volume "seatsurfing_db"             Created                                                                                                0.0s
 ✔ Container seatsurfing-admin-ui-1    Started                                                                                                2.3s
 ✔ Container seatsurfing-db-1          Started                                                                                                2.1s
 ✔ Container seatsurfing-booking-ui-1  Started                                                                                                2.4s
 ✔ Container seatsurfing-server-1      Started   
Prüfen Sie den Status des Containers:
docker compose ps
Ausgabe:
NAME                       IMAGE                    COMMAND                  SERVICE             CREATED             STATUS              PORTS
seatsurfing-admin-ui-1     seatsurfing/admin-ui     "/nodejs/bin/node se…"   admin-ui            3 minutes ago       Up 3 minutes        3000/tcp
seatsurfing-booking-ui-1   seatsurfing/booking-ui   "/nodejs/bin/node se…"   booking-ui          3 minutes ago       Up 3 minutes        3001/tcp
seatsurfing-db-1           postgres:12              "docker-entrypoint.s…"   db                  3 minutes ago       Up 3 minutes        5432/tcp
seatsurfing-server-1       seatsurfing/backend      "./main"                 server              3 minutes ago       Up 2 minutes        0.0.0.0:8082->8080/tcp, :::8082->8080/tcp

Schritt 9: Seatsurfing Weboberfläche

Rufen Sie im Browser die Url book.yourdomain.com auf. Sie sollten folgende Anmeldeseite sehen:

Standardmäßig wird beim Start des Backends eine Organisation mit einem Administratorkonto erstellt, wenn noch keine Organisation in der angegebenen Datenbank existiert. Wenn nicht anders angegeben, melden Sie sich mit admin@seatsurfing.local als Benutzernamen und 12345678 als Passwort an. Sie werden dann zur folgenden Seite weitergeleitet:

Mit einem Klick auf "Administration" im Menü gelangen Sie zum Administrationsdashboard: