From ad0e583a83094ca70fcfe5c5d1015743e3dadd95 Mon Sep 17 00:00:00 2001 From: Oliver Hofmann Date: Mon, 12 May 2025 21:35:22 +0200 Subject: [PATCH] README.md Relativer Pfad --- Dockerfile | 2 +- README.md | 135 +++++++++++++++++++++++++++++++++++++++ volume/public/index.html | 2 +- 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 README.md diff --git a/Dockerfile b/Dockerfile index bc0dbe0..da3b5fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..0179299 --- /dev/null +++ b/README.md @@ -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 + + + + WebSocket Client + + +

WebSocket Client

+ + +
+ + + + +``` + +### `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 = ''; +}; +``` + +--- + diff --git a/volume/public/index.html b/volume/public/index.html index 1e81474..7f4f803 100644 --- a/volume/public/index.html +++ b/volume/public/index.html @@ -11,6 +11,6 @@
- +