Zum Inhalt

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.

Meine Ziele:
Node.js lernen
Server konfigurieren
Einsame Spitze in M295 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.

#!/bin/bash
echo "Starte Server..."
docker compose up -d --build
echo "Server läuft auf Port 4011"

stop.sh

Hilfsskript zum Stoppen des Containers.

#!/bin/bash
echo "Stoppe Server..."
docker compose down

3. Workflow

Schritt 1: Datei-Transfer

Zuerst wird die Datei meineZiele.txt vom lokalen Rechner auf den Raspberry Pi kopiert.

scp meineZiele.txt m295@10.27.160.12:/home/m295/class/joel/

Schritt 2: SSH-Verbindung

Verbinden mit dem Server, um die weiteren Schritte auszuführen.

ssh m295@10.27.160.12
cd /home/m295/class/joel/

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:

chmod +x start.sh stop.sh

Dann wird der Server gestartet:

./start.sh

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!):

pkill -u root node

Spezifischen Container stoppen:

docker stop joel-api
docker rm joel-api

Überprüfen, was auf Port 4011 läuft:

netstat -tulpn | grep 4011

5. Ergebnis

Das Projekt wurde erfolgreich deployed und die API ist im Netzwerk erreichbar.

JSON Output als PDF ansehen