Seatsurfing Installation mit Docker unter Ubuntu 22.04: Flexibles Buchungssystem für Unternehmen und Organisationen
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
- ein Server mit Ubuntu 22.04.
- SSH für den Zugriff auf den Server.
- ein Nicht-Root-Benutzer mit sudo-Rechten, siehe “Wie deaktiviere ich das root login unter Ubuntu”.
- UFW ist aktiviert und läuft, siehe “Einrichtung der ufw unter Ubuntu - effektiver Schutz für deine Server”
- ein FQDN, der auf den Server verweist, z. B. book.yourdomain.com.
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 3: Docker installieren
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
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: