Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added new Tutorial for an soketi-server (WebSocket-Server) behind a Reverse Proxy (nginx) #894

Merged
merged 7 commits into from
Aug 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
365 changes: 365 additions & 0 deletions tutorials/setup-soketi-websocket-server-behind-reverse-proxy/01.de.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,365 @@
---
SPDX-License-Identifier: MIT
path: "/tutorials/setup-soketi-websocket-server-behind-reverse-proxy/de"
slug: "setup-soketi-websocket-server-behind-reverse-proxy"
date: "2024-08-18"
title: "Installation eines Soketi WebSocket-Servers hinter einem Reverse-Proxy-Server (NGINX)"
short_description: "Dieses Tutorial erklärt, wie man einen Soketi WebSocket-Server hinter einem Reverse-Proxy-Server, auf der Basis eines NGINX-Servers, einrichtet und betreibt."
tags: ["WebSockets", "NGINX"]
author: "crocodile2024"
author_link: "https://github.com/crocodile2024"
author_img: "https://avatars.githubusercontent.com/u/171804404"
author_description: ""
language: "de"
available_languages: ["en", "de"]
header_img: "header-5"
cta: "cloud"
---

## Einleitung

Dieses Tutorial erklärt, wie man einen Soketi WebSocket-Server hinter einem NGINX Reverse-Proxy-Server betreiben kann. Dieser ist dann durch den NGINX Reverse-Proxy-Server mit einer SSL-Verschlüsselung geschützt. Das SSL-Zertifikat wird mit Let's Encrypt erstellt und ist somit kostenlos. Die Erneuerung dieses Zertifikats erfolgt automatisch mit der Hilfe von dem Komandozeilenprogramm acme.sh.

Offizielle Dokumentation: [https://docs.soketi.app/](https://docs.soketi.app/)<br>
Projekt Website: [https://soketi.app/](https://soketi.app/)

**Vorraussetzungen**

* Domain-Namen (Sub-Domain ist ausreichend)
* Entwas Erfahrung im Umgang mit NodeJS und NPM
* Einen Server (zum Beispiel in der [Hetzner Cloud](https://hetzner.cloud))
* Debian 12 oder Ubuntu 24.04 als Betriebssystem
* SSH-Key empfohlen (siehe [diesen Artikel](https://community.hetzner.com/tutorials/howto-ssh-key/de))
* Zugriff auf den root-Benutzer oder einen Benutzer mit sudo-Berechtigungen

**Beispiel-Benennungen**

* Domain: `ws.example.com`
* IPv4: `203.0.113.1`
* IPv6: `2001:db8:1234::1`

## Schritt 1 - Updates installieren und notwendige Pakete installieren

Verbinde dich über SSH und IP-Adresse mit deinem Server.

Paketlisten aktualisieren und Updates installieren:
```bash
sudo apt update && sudo apt upgrade -y
```

Starte anschließend den Server neu, um eventuell den aktualisierten Kernel zu laden.

Als nächstes installieren wir alle notwendigen Pakete:

* Installiere Voraussetzungen
```bash
sudo apt install git python3 gcc build-essential apparmor nginx
```

* Installiere nodeJS
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
source ~/.bashrc
nvm install 18 && nvm use 18
```

* Installiere die beiden NodeJS-Pakete `soketi` und `pm2`:
```bash
npm install -g @soketi/soketi
npm install -g pm2
```

## Schritt 2 - Konfiguration für Soketi erstellen

Erstelle eine neue Konfigurationsdatei:

```bash
nano ~/config.json
```

Füge folgenden Inhalt hinzu und passe es gegebenenfalls an deine Bedürfnisse an:

```json
{
"host": "127.0.0.1",
"port": 6001,
"appManager": {
"driver": "array",
"options": {
"apps": [
{
"id": "my-app-id",
"key": "my-app-key",
"secret": "my-app-secret",
"name": "My App",
"enableClientMessages": true,
"enableStatistics": true
}
]
}
}
}
```

Speichere die Datei mit der Tastenkompination `STRG`+`O`.

Wenn diese Konfigurationsdatei verwendet wird, muss keine weitere Konfiguration vor dem ersten Start gemacht werden.

## Schritt 3 - Erster Start des Soketi-Servers (noch ohne PM2)

Starte nun den Soketi-Server mit folgendem Befehl:

```bash
soketi start --config="~/config.json"
```

## Schritt 4 - Erster Test des Websocket-Servers mit Laravel 11

Laravel sollte bereits installiert sein.

<details>
<summary>Falls Laravel noch nicht installiert ist, klicke hier und installiere es jetzt</summary>
<blockquote>

```bash
sudo apt update && sudo apt install php php-{mbstring,xml,bcmath,mysql} mariadb-server
cd ~ && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
echo 'alias composer="php ~/composer.phar"' >> ~/.bashrc && source ~/.bashrc
composer create-project --prefer-dist laravel/laravel ~/example
cd ~/example
```

Und richte die Datenbank ein:

```bash
sudo mysql
MariaDB [(none)]> CREATE USER 'laravel'@'localhost' IDENTIFIED BY 'secure-password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON laravel.* TO 'laravel'@'localhost';
MariaDB [(none)]> CREATE DATABASE laravel;
MariaDB [(none)]> exit
```

Füge die Datenbank-Informationen in der `~/example/.env`-Datei ein:

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secure-password
```

Führe nun diesen Befehl aus:

```bash
cd ~/example && php artisan migrate
```

</blockquote>

-------

Fahre nun mit Laravel und Soketi fort.

</details>

<br>

Ändere die folgenden Werte in der `.env`-Datei:

> Gib bei app ID, app key und app secret dieselben Informationen an, die auch in `~/config.json` angegeben wurden.

```env
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=your-app-id
PUSHER_APP_KEY=your-app-key
PUSHER_APP_SECRET=your-app-secret
PUSHER_APP_CLUSTER=mt1
```

Überprüfe die Einstellungen in der folgenden Datei `config/brodcasting.php`:

```php
<?php

return [
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
],
],
// other connections...
],
];
```

## Schritt 5 - Erste Events auslösen

Die ersten Events können nun mit dem WebSocket-Server verschickt werden.

## Schritt 6 - Auto-Start für den Socketi Server konfigurieren

Damit der Soketi-Server auch nach einem Neustart des Cloud Servers wieder automatisch gestartet wird, müssen wir nun noch `pm2` einrichten:

Führe hierzu die folgenden Befehle aus:

```bash
pm2 start soketi --name WebSocket-Server -- start --config="~/config.json"
pm2 startup # Damit wird der autostart aktiviert. Folgen Sie den Anweisungen auf dem Bildschirm.
```

## Schritt 7 - Reverse Proxy einrichten

Nun muss der Reverse Proxy Server noch eingerichtet werden. Dieser wird die SSL-Verbindung bereitstellen und dann an den Soketi Server weitergeben. Erstelle hierfür eine neue Datei im Ordner `/etc/nginx/sites-available/`.

```bash
sudo mkdir /etc/nginx/ssl
sudo nano /etc/nginx/sites-available/soketi
```

Füge folgenden Inhalt in die Datei ein:

> Ersetze `ws.example.com` mit deiner eigenen Domain.

```nginx
server {
listen 443 ssl;
server_name ws.example.com;

ssl_certificate /etc/nginx/ssl/ws.example.com.cer;
ssl_certificate_key /etc/nginx/ssl/ws.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
proxy_pass http://localhost:6001; # Ersetze den Port, falls soketi auf einem anderen Port läuft
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

server {
listen 80;
server_name ws.example.com;

location / {
return 301 https://$host$request_uri;
}
}
```

<br>

<details>
<summary>Hier klicken, für eine Konfiguration ohne SSL</summary>
<blockquote>

*Replace `203.0.113.1` with your own IP address.*

```nginx
server {
listen 80;
server_name 203.0.113.1;

location / {
proxy_pass http://localhost:6001; # Replace the port if Soketi is running on a different port
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```

</blockquote>
</details>

<br>

```bash
sudo ln -s /etc/nginx/sites-available/soketi /etc/nginx/sites-enabled/soketi
sudo rm /etc/nginx/sites-available/default && sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx
```

## Schritt 8 - SSL-Zertifikat erstellen

Bevor du das SSL-Zertifikat erstellst, erstelle passende DNS-Einträge, mit denen die IP-Adressen des Servers auf deine Domain zeigen.

Die DNS-Konfiguration sollte dann so ausehen:

```shellsession
# Name Type Value
ws.example.com IN A 203.0.113.1
ws.example.com IN AAAA 2001:db8:1234::1
```

Wenn mit `dig ws.example.com` die korrekte IP-Adresse angezeigt wird, kannst du das Zertifikat erstellen.

Für die Erstellung des Zertifikats benutzen wir das Shell-Script `acme.sh`. Dieses kann mit dem folgenden Befehl installiert werden:

```bash
curl https://get.acme.sh | sh -s email=<Ihre E-Mail-Adresse>
```

An diese E-Mail-Adresse werden dann Erinnerungen geschickt, wenn ein Zertifikat abläuft oder wenn es Probleme bei der Verlängerung gibt.

```bash
systemctl stop nginx && acme.sh --issue -d ws.example.com --standalone --server letsencrypt
acme.sh --install-cert -d ws.example.com --cert-file /etc/nginx/ssl/ws.example.com.cer --key-file /etc/nginx/ssl/ws.example.com.key --fullchain-file /etc/nginx/ssl/fullchain.pem --reloadcmd "systemctl reload nginx"
sudo systemctl restart nginx
```

Dein WebSocket Server ist nun mit einer SSL-Verschlüsselung ausgestattet. In der Konfiguration von Laravel muss nun der Port auf `443` geändert werden.

## Ergebnis

Soketi wurde nun erfolgreich installiert und mit SSL-Zertifikat eingerichtet. Wenn du `ws.example.com` in einem Webbrowser eingibst, sollte dort "OK" erscheinen, was bedeutet, dass der WebSocket-Server erreichbar ist.

##### License: MIT

<!--

Contributor's Certificate of Origin

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I have
the right to submit it under the license indicated in the file; or

(b) The contribution is based upon previous work that, to the best of my
knowledge, is covered under an appropriate license and I have the
right under that license to submit that work with modifications,
whether created in whole or in part by me, under the same license
(unless I am permitted to submit under a different license), as
indicated in the file; or

(c) The contribution was provided directly to me by some other person
who certified (a), (b) or (c) and I have not modified it.

(d) I understand and agree that this project and the contribution are
public and that a record of the contribution (including all personal
information I submit with it, including my sign-off) is maintained
indefinitely and may be redistributed consistent with this project
or the license(s) involved.

Signed-off-by: crocodile2024 <crocodile202405@gmail.com>

-->
Loading