README.md

Relativer Pfad
This commit is contained in:
Oliver Hofmann 2025-05-12 21:35:22 +02:00
parent b47b0d31c2
commit ad0e583a83
3 changed files with 137 additions and 2 deletions

View File

@ -19,6 +19,6 @@ VOLUME ["/app/volume"]
# Port freigeben
EXPOSE 8080
# Standardbefehl (z.B. Start der App über bind mount)
# Standardbefehl
CMD ["node", "volume/server.js"]

135
README.md Normal file
View File

@ -0,0 +1,135 @@
# Node WebSocket-Server (HTTP + WS) mit Docker
Dieses Projekt bietet einen einfachen HTTP- und WebSocket-Server in Node.js, der über Docker betrieben wird. Ziel ist es, eine lauffähige, leicht erweiterbare Entwicklungsumgebung bereitzustellen
z.B. für WebSocket-basierte Anwendungen.
Der Docker-Container ist so konfiguriert, dass er statische Dateien ausliefert und WebSocket-Verbindungen unterstützt.
Es wird ein Reverse-Proxy (Apache) verwendet, um den Container über HTTPS erreichbar zu machen.
Dabei wird der Pfad `/node` verwendet, um den Container zu erreichen.
## 🔧 Projektstruktur
```
.
├── Dockerfile
├── package.json
├── volume/
│ ├── server.js # Hauptserver
│ ├── public/ # Statische Dateien
│ │ ├── index.html
│ │ └── script.js
```
## 🚀 Starten der Anwendung
### 1. Build des Docker-Images
Erfordert Admin-Rechte auf dem Host-System.
```bash
docker build -t node-ws-server .
```
### 2. Starten des Containers mit Volume-Bindung
Erfordert Admin-Rechte auf dem Host-System.
```bash
docker run -v "$PWD/volume":/app/volume node-ws-server
```
Über den Apache-Reverse-Proxy ist der Server unter
```
https://medinf.efi.th-nuernberg.de/node
```
erreichbar gemacht.
---
## 🧠 Hinweise zum Reverse Proxy
Der Apache-Webserver leitet Anfragen über `/node` an den internen Node.js-Server weiter. Damit der Reverse-Proxy funktioniert:
- Statische Dateien wie `script.js` müssen in `index.html` mit relativem Pfad eingebunden werden (z.B. `./script.js`), **nicht** mit `/node/script.js`.
- WebSocket-Verbindungen müssen den vollen Proxy-Pfad verwenden, z.B.:
```js
const ws = new WebSocket('wss://medinf.efi.th-nuernberg.de/node/ws');
```
Apache kümmert sich darum, `/node` zu entfernen und an den Container weiterzuleiten.
---
## 🧠 Funktionsweise von `server.js`
### 1. Statische Datei-Auslieferung
```js
const server = http.createServer((req, res) => { ... });
```
- Liefert Dateien aus dem Verzeichnis `volume/public/`.
- Wenn eine Anfrage ein Verzeichnis ist, wird automatisch `index.html` geladen.
- HTTP 404 wird zurückgegeben, wenn eine Datei nicht existiert.
---
### 🔌 2. WebSocket-Unterstützung
```js
const wss = new WebSocketServer({ noServer: true });
```
- WebSocket wird auf `/ws` unterstützt.
- Die `upgrade`-Verbindung wird manuell gehandhabt.
- Nur WebSocket-Verbindungen auf `/ws` werden akzeptiert; alles andere wird verworfen.
---
## 📁 Beispiel: `index.html` und `script.js`
### `volume/public/index.html`
```html
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Client</title>
</head>
<body>
<h1>WebSocket Client</h1>
<input id="message" placeholder="Type a message">
<button id="send">Send</button>
<div id="messages"></div>
<script src="./script.js"></script>
</body>
</html>
```
### `volume/public/script.js`
```js
const ws = new WebSocket('wss://medinf.efi.th-nuernberg.de/node/ws');
ws.onmessage = (e) => {
const div = document.createElement('div');
div.textContent = `Server: ${e.data}`;
document.getElementById('messages').appendChild(div);
};
document.getElementById('send').onclick = () => {
const input = document.getElementById('message');
ws.send(input.value);
input.value = '';
};
```
---

View File

@ -11,6 +11,6 @@
<button id="send">Send</button>
<div id="messages"></div>
<script src="node/script.js"></script>
<script src="./script.js"></script>
</body>
</html>