Raspberry Pi Node.js API¶
1. System-Informationen¶
| Parameter | Wert | Beschreibung |
|---|---|---|
| Server-IP | 10.27.160.12 |
Die IP-Adresse des Raspberry Pi im Netzwerk. |
| Benutzer | m295 |
Der SSH-Benutzer für den Zugriff. |
| Arbeitsverzeichnis | /home/m295/class/joel |
Der Pfad, in dem die Projektdateien liegen. |
| Host-Port | 4011 |
Der externe Port, über den die API erreichbar ist. |
| Interner Docker-Port | 3000 |
Der Port, auf dem die Node.js App im Container läuft. |
| Port-Mapping | 4011:3000 |
Umleitung von extern (4011) auf intern (3000). |
2. Projektdateien & Code¶
Hier sind die Inhalte der im Projekt verwendeten Dateien.
meineZiele.txt¶
Enthält die persönlichen Lernziele, die von der API ausgelesen werden.
server.js¶
Der eigentliche Node.js Server. Er liest die meineZiele.txt ein und gibt sie als JSON zurück.
const http = require('http');
const fs = require('fs');
const path = require('path');
const port = 3000;
const server = http.createServer((req, res) => {
// Setzen der Header für JSON-Antwort und CORS
res.setHeader('Content-Type', 'application/json');
res.setHeader('Access-Control-Allow-Origin', '*');
const filePath = path.join(__dirname, 'meineZiele.txt');
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
res.writeHead(500);
res.end(JSON.stringify({ error: 'Fehler beim Lesen der Datei' }));
return;
}
// Leerzeilen filtern und Array erstellen
const zieleArray = data.split('\n').filter(line => line.trim() !== '');
const responseData = {
schueler: "Joel",
projekt: "M295 Node.js Server",
meineZiele: zieleArray
};
res.writeHead(200);
res.end(JSON.stringify(responseData, null, 2));
});
});
server.listen(port, () => {
console.log(`Server läuft auf Port ${port}`);
});
Dockerfile¶
Definition des Docker-Images.
FROM node:18-alpine
# Arbeitsverzeichnis im Container erstellen
WORKDIR /app
# Abhängigkeiten kopieren (falls package.json existiert)
COPY package*.json ./
# Source-Code kopieren
COPY . .
# Port freigeben
EXPOSE 3000
# Server starten
CMD ["node", "server.js"]
compose.yml¶
Docker Compose Konfiguration für einfaches Starten mit Port-Mapping.
version: '3.8'
services:
api-server:
build: .
container_name: joel-api
ports:
- "4011:3000"
restart: always
volumes:
- ./meineZiele.txt:/app/meineZiele.txt # Optional: Live-Updates der Datei
start.sh¶
Hilfsskript zum Starten des Containers.
stop.sh¶
Hilfsskript zum Stoppen des Containers.
3. Workflow¶
Schritt 1: Datei-Transfer¶
Zuerst wird die Datei meineZiele.txt vom lokalen Rechner auf den Raspberry Pi kopiert.
Schritt 2: SSH-Verbindung¶
Verbinden mit dem Server, um die weiteren Schritte auszuführen.
Schritt 3: Entwicklung & Start¶
Nachdem die Dateien (server.js, compose.yml, etc.) angelegt wurden (z.B. mit nano), muss den Skripten Ausführungsrecht gegeben werden:
Dann wird der Server gestartet:
Schritt 4: Test & Zugriff¶
Öffne einen Browser und rufe die URL auf:
http://10.27.160.12:4011
Erwartetes Ergebnis (JSON):
{
"schueler": "Joel",
"projekt": "M295 Node.js Server",
"meineZiele": [
"Meine Ziele:\r",
"Node.js lernen\r",
"Server konfigurieren\r",
"Einsame Spitze in M295 werden"
]
}
4. Troubleshooting¶
Port-Konflikte ('EADDRINUSE')¶
Falls der Docker-Container oder der Port blockiert ist, helfen folgende Befehle.
Alle Node-Prozesse beenden (Vorsicht!):
Spezifischen Container stoppen:
Überprüfen, was auf Port 4011 läuft:
5. Ergebnis¶
Das Projekt wurde erfolgreich deployed und die API ist im Netzwerk erreichbar.