Wie stellt man eine Express.js-Anwendung bereit?

Die Wahl der richtigen Deployment-Option ist entscheidend dafür, dass Ihre Anwendung problemlos skaliert werden kann, wenn sie wächst.

Dieser Artikel befasst sich mit verschiedenen Bereitstellungsoptionen für Express.js-Anwendungen. Insbesondere geht es darum, wie man Express.js-Anwendungen in einem Back4app-Container bereitstellt.

Was ist Express.js?

Express.js ist ein leichtgewichtiges Framework, das auf Node.js aufbaut und die Erstellung komplexer Web- und mobiler APIs vereinfacht.

Es bietet ein einfaches Routing-System, mit dem Sie auf einfache Weise Endpunkte für API-Routen definieren und sie Handler-Funktionen zuordnen können.

Außerdem bietet es Middleware-Unterstützung, mit der Sie Funktionen wie Protokollierung, Authentifizierung und Fehlerbehandlung in den Anfrage-Antwort-Zyklus integrieren können.

Vorteile der Verwendung von Express.js

Einige der Vorteile der Verwendung von Express sind:

  • Minimalistisch und einfach zu bedienen: Express.js abstrahiert die Komplexität einiger Node.js-Funktionen wie Routing. Es bietet eine einfache Möglichkeit, API-Anfragen und -Antworten zu verarbeiten.
  • Hochgradig erweiterbar: Express.js hat eine große Community, die ein umfangreiches Ökosystem von NPM-Paketen und Erweiterungen hervorgebracht hat, die Sie leicht in Ihre Anwendungen integrieren können.
  • Sehr performant: Aufgrund seines minimalen Designs und der Nutzung der nicht-blockierenden, ereignisgesteuerten Architektur von Node ist Express sehr performant.
  • Starke Unterstützung durch die Community: Express.js gibt es seit 2010. In dieser Zeit haben viele Entwickler die Software übernommen. Daher gibt es eine große Community, die sich mit Express beschäftigt und Ihnen helfen kann, wenn Sie nicht weiterkommen. Außerdem gibt es viele Artikel, Tutorials und gut geschriebene Dokumentationen, die erklären, wie Express funktioniert.

Nachteile von Express.js

Im Folgenden sind einige der Nachteile von Express.js aufgeführt:

  • Rechthaberisch: Im Vergleich zu Frameworks wie Nest.js ist Express.js sehr rechthaberisch. Dieser Mangel an Meinungen bedeutet, dass Sie Entscheidungen über die Projektstruktur und -organisation treffen müssen, was mühsam sein kann, besonders wenn Sie mehrere Möglichkeiten haben, Dinge zu tun.
  • Fehlende integrierte Funktionen: Express.js wird nicht vorkonfiguriert geliefert und für die meisten fortgeschrittenen Funktionen wie Logging müssen Sie zusätzliche Abhängigkeiten installieren.

Express.js-Bereitstellungsoptionen

Infrastructure as a Service (IaaS)

Infrastructure as a Service (IaaS) ist ein Cloud-Computing-Dienst, der Rechen-, Netzwerk- und Speicherressourcen über das Internet auf Abruf bereitstellt.

Bei IaaS sind Sie für die Bereitstellung und Konfiguration der Ressourcen für Ihre Anwendung verantwortlich, während der IaaS-Anbieter die zugrunde liegende physische Infrastruktur verwaltet.

Wenn Sie beispielsweise eine Express-Anwendung bereitstellen möchten, können Sie eine virtuelle Maschine bei einem IaaS-Anbieter Ihrer Wahl erstellen und konfigurieren.

Auf der VM müssen Sie die erforderlichen Abhängigkeiten wie Node und npm installieren und dann den Express-Code zur VM hinzufügen.

Anschließend können Sie Ihre Express-Anwendung auf der VM starten und sie ist über das Internet zugänglich.

Einer der Hauptvorteile von IaaS ist der Grad der Kontrolle, den es bietet. Sie können die CPU-, Arbeitsspeicher- und Speicherressourcen der VM an die Anforderungen Ihrer Anwendung anpassen.

Allerdings sind bei diesem Ansatz auch einige Nachteile zu beachten.

Die Verwaltung der Infrastruktur und der Ressourcen, wenn Ihre Anwendungen skaliert werden und sich die Anforderungen ändern, kann komplex und zeitaufwändig sein.

Zu den beliebten IaaS-Anbietern gehören:

  • Microsoft Azure
  • Amazon Webdienste (AWS)
  • Google Cloud-Plattform (GCP)

Container as a Service (CaaS)

Container as a Service (CaaS) ist ein Cloud-Service-Modul, das die zugrunde liegende Infrastruktur abstrahiert und es Ihnen ermöglicht, containerisierte Anwendungen schnell bereitzustellen und auszuführen.

Um die Express-Anwendung bei einem CaaS-Anbieter bereitzustellen, verpacken Sie den Code, die Abhängigkeiten und die Laufzeit, die für die Ausführung der Anwendung in einem Container erforderlich sind, mit einem Containerisierungstool wie Docker.

Sobald Sie den Container erstellt haben, stellen Sie ihn bereit. Der CaaS-Anbieter stellt die für die Ausführung des Containers erforderliche Infrastruktur bereit und verwaltet sie für Sie.

Der Hauptvorteil von CaaS besteht darin, dass die hohe Abstraktionsebene die Bereitstellung vereinfacht, da Sie sich nicht um die Konfiguration der Low-Level-Infrastruktur kümmern müssen. Sie können sich stattdessen auf die Entwicklung der Anwendungslogik konzentrieren.

Außerdem stellt die Containerisierung sicher, dass Ihre Anwendung in verschiedenen Umgebungen konsistent läuft.

Einige der beliebtesten CaaS-Anbieter sind:

  • Back4app-Container
  • Amazon Elastic Container Dienst (ECS)
  • Google Kubernetes Engine (GKE)

So stellen Sie eine Express-Anwendung in einem Back4app-Container bereit

Voraussetzungen

Um diesem Tutorial folgen zu können, müssen Sie die folgenden Voraussetzungen erfüllen:

  • Node.js ist auf Ihrem Rechner installiert.
  • Sie haben ein GitHub-Konto.
  • Docker ist auf Ihrem Rechner installiert. Falls nicht, besuchen Sie die Docker-Website und installieren Sie Docker Desktop.
  • Gute Kenntnisse von Express.js.

Überblick über Back4app Containers

Back4app containers ist eine Plattform, die die Bereitstellung automatisiert, indem sie die serverseitige Infrastruktur für Sie verwaltet.

Einige der Funktionen von Back4app Containers sind die folgenden:

  • GitHub-Integration: Sie können Ihre GitHub-Repositories mit Back4app verbinden und so automatische Bereitstellungen Ihrer Anwendung ermöglichen, wenn sich die Codebasis ändert.
  • Docker-Bereitstellung: Sie können Docker, ein beliebtes Tool zur Containerisierung, verwenden, um Ihren Anwendungscode in einem Container zu verpacken. Dadurch wird sichergestellt, dass Ihre Anwendung in verschiedenen Umgebungen auf vorhersehbare Weise funktioniert.
  • Automatische Bereitstellungen: Sobald Sie das GitHub-Repository mit Back4app verbunden haben, löst jeder Code-Push in den Standardzweig die Bereitstellung aus.
  • Verfolgung der Bereitstellung in Echtzeit: Sie können den Status und den Fortschritt Ihrer Deployments einsehen.
  • Anwendungsüberwachung in Echtzeit
  • Updates ohne Ausfallzeiten

Projekt-Einführung

In dieser Anleitung werden wir den Prozess der Bereitstellung einer Express-Anwendung auf Back4app durchlaufen.

Zunächst erstellen wir eine einfache Express-REST-API mit einem einzigen Endpunkt, docken sie mit Docker an und stellen sie auf GitHub bereit. Anschließend stellen wir sie in einem Back4app-Container bereit.

Eine einfache Express-API erstellen

Führen Sie die folgenden Schritte aus, um eine Express-Anwendung zu erstellen:

  1. Führen Sie den folgenden Befehl in Ihrem Terminal aus, um ein neues Node.js-Projekt zu initialisieren.
npm init

Mit diesem Befehl werden Sie aufgefordert, Details zu Ihrer Anwendung einzugeben, wie Paketname, Version, Beschreibung, Einstiegspunkt, Autor und Lizenz. Sobald Sie antworten, wird eine package.json-Datei mit diesen Konfigurationen erstellt.

Um die Standardkonfigurationen zu verwenden, verwenden Sie das Flag -y wie unten gezeigt:

npm init -y
  • Installieren Sie Express als eine Abhängigkeit, indem Sie diesen Befehl ausführen.
npm install express
  • Erstellen Sie im Stammverzeichnis Ihres Projekts eine index.js-Datei. Wenn Sie einen anderen Namen für Ihre Einstiegsdatei angegeben haben, verwenden Sie diesen.
  • Öffnen Sie die Datei index.js und erstellen Sie eine Instanz der Express-Anwendung.
const express = require('express');
const app = express();
  • Fügen Sie einen Route-Handler hinzu, um GET-Anfragen an den Endpunkt „/“ zu bearbeiten.
app.get("/", (req, res) => {
  res.json({
    message: "Success",
  });
});

Dieser Endpunkt sendet eine JSON-Nachricht als Antwort.

  • Definieren Sie die Portnummer und warten Sie auf eingehende Anfragen am angegebenen Port.
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`App listening at <http://localhost>:${port}`);
});

Beachten Sie, dass process.env.PORT sich auf eine Umgebungsvariable namens PORT bezieht. Wenn dieser Wert nicht in der .env-Datei definiert ist, verwendet die Anwendung den Wert 3000.

  • Führen Sie den folgenden Befehl aus, um den Express-Server zu starten.
node index.js

Wenn Sie http://localhost:3000/api in Ihrem Browser aufrufen, sollten Sie die folgende Antwort erhalten.

{
  "message": "Success!"
}

Dies ist ein sehr einfaches Beispiel für eine Express-API. Eine echte Anwendung wäre komplexer mit mehr Endpunkten, externen Daten, Middleware usw.

Für die Zwecke dieses Artikels ist dies ausreichend, um zu demonstrieren, wie Sie eine gedockte Express-Anwendung bereitstellen können.

Dockerisierung der Express-Anwendung

Die Dockerisierung einer Express.js-Anwendung bezieht sich auf die Erstellung eines Docker-Containers für die Anwendung, um die Ausführung der Anwendung in verschiedenen Umgebungen zu erleichtern.

Was ist Docker?

Docker ist ein Open-Source-Tool, mit dem Sie Ihre Anwendung, ihre Laufzeit, Bibliotheken und Abhängigkeiten in einer isolierten und portablen Containerumgebung verpacken können.

Durch die Kapselung der Anwendung innerhalb dieses Containers bietet Docker eine konsistente Umgebung, in der die Anwendung unabhängig vom zugrunde liegenden Hostsystem ausgeführt werden kann.

Damit entfällt das Problem, dass die Anwendung nur auf meinem Rechner funktioniert. Sie können an Ihrer Express-Anwendung in Ihrer lokalen Umgebung arbeiten, sie containerisieren und in mehreren Umgebungen einsetzen, ohne sich Gedanken über Kompatibilitätsprobleme zu machen.

Docker installieren

Docker kann auf mehreren Plattformen ausgeführt werden, darunter macOS, Windows und Linux. Sie können Docker für Ihr Betriebssystem von der offiziellen Website herunterladen und installieren.

Wie man eine Express.js-Anwendung dockerisiert

Sobald Sie Docker installiert haben, müssen Sie Ihre Anwendung dockerisieren, d. h. in einen Docker-Container packen.

Folgen Sie den folgenden Schritten:

  • Erstellen Sie im Stammverzeichnis Ihres Projekts eine Datei namens Dockerfile . Diese Datei enthält die Anweisungen zum Erstellen des Docker-Images für die Express-Anwendung.
  • Bei der Erstellung der Dockerdatei geben Sie in der Regel als erstes ein Basis-Image an. Ein Basis-Image ist ein vorgefertigtes Image, das als Ausgangspunkt für das Image Ihrer Anwendung dient und in der Regel minimale Anweisungen für die Ausführung der Anwendung enthält.
  • In der Dockerdatei können Sie dann Anweisungen und Konfigurationen angeben, die auf diesem Abbild ausgeführt werden sollen. Sie können Ihr eigenes Basis-Image erstellen, aber Docker verfügt über offizielle Images, die in den meisten Fällen ausreichend sind.
  • In diesem Leitfaden werden wir das Node-Basis-Image verwenden, insbesondere die alpine Variante, die eine geringe Größe hat. Geben wir dieses Basis-Image im Dockerfile an, indem wir Folgendes hinzufügen.
FROM node:20-alpine

Hier wird node:20-alpine mit Node.js Version 20 vorinstalliert.

  • Fügen Sie die folgende Zeile hinzu, um das Arbeitsverzeichnis innerhalb des Containers festzulegen.
WORKDIR /usr/src/app
  • Kopieren Sie package.json und package-lock.json in das Arbeitsverzeichnis. Hier werden alle Abhängigkeiten aufgelistet, die Docker installieren soll.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • Fügen Sie den Befehl zum Installieren der Abhängigkeiten hinzu.
RUN npm install
  • Kopieren Sie den Rest des Codes in das Arbeitsverzeichnis des Containers.
COPY . .
  • Geben Sie die Portnummer an, auf die die Express-Anwendung hört. In diesem Fall ist es Port 3000.
expose 3000
  • Fügen Sie den Befehl zum Starten der Anwendung hinzu.
CMD["node", "index.js"]

Insgesamt sollte Ihre Docker-Datei wie folgt aussehen:

FROM node:20-alpine

WORKDIR /usr/src/app

COPY package*.json  ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "node", "index.js" ]

Hinzufügen einer .dockerignore-Datei

Eine .dockerignore-Datei gibt die Dateien an, die Docker ignorieren soll. Sie hilft Ihnen, die Größe des Docker-Abbilds zu reduzieren, indem Sie unnötige Dateien ignorieren können. Außerdem hilft sie Ihnen, sensible Dateien aus dem Image auszublenden.

Um sie zu Ihrem Projekt hinzuzufügen, erstellen Sie eine Datei an der Basis Ihres Projekts und nennen Sie sie .dockerignore . Fügen Sie ihr den folgenden Inhalt hinzu.

.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*

Die obige Datei verhindert, dass die Git-Dateien, Knotenmodule, Protokolle und Umgebungsvariablen in das Docker-Abbild kopiert werden.

Lokales Erstellen des Docker- Images

Führen Sie in Ihrem Projektverzeichnis den folgenden Befehl aus, um das Docker-Abbild zu erstellen.

docker build -t docker-express-api .

Das Flag -t steht für tag und ermöglicht es Ihnen, dem Docker-Abbild einen aussagekräftigen Namen zu geben.

Der Punkt (.) am Ende weist Docker an, im aktuellen Verzeichnis nach der Dockerdatei zu suchen und die darin enthaltenen Anweisungen auszuführen.

Lokales Ausführen des Docker-Images

Sobald Sie das Docker-Image erstellt haben, verwenden Sie es, um die Express-Anwendung mit dem folgenden Befehl auszuführen:

docker run -p 3000:3000 docker-express-api

Dabei ordnet -p 3000:3000 den Port 3000 des lokalen Hosts dem Port 3000 im Container zu. Sie sollten in der Lage sein, auf die Anwendung zuzugreifen, indem Sie http://localhost:3000 im Browser aufrufen.

Um die laufende Docker-Instanz anzuzeigen, verwenden Sie den folgenden Befehl:

docker ps

Um die Instanz zu stoppen, führen Sie Folgendes aus:

docker stop docker-express-api

Bereitstellen einer mit Docker erstellten Express-Anwendung in einem Back4app-Container

Nachdem wir nun sichergestellt haben, dass das Docker-Image lokal läuft, müssen wir es auf Back4app bereitstellen.

Push Express-Anwendung auf GitHub

Backapp stellt Ihre Anwendung von GitHub aus bereit. Daher müssen Sie das Anwendungs-Repository auf GitHub pushen, indem Sie die folgenden Schritte ausführen:

  • Rufen Sie die GitHub-Website auf und melden Sie sich bei Ihrem Konto an.
  • Suchen Sie nach der Anmeldung das „+“-Symbol in der oberen rechten Ecke der Seite und klicken Sie darauf. Wählen Sie aus dem Dropdown-Menü die Option „ New repository“ (Neues Repository).
  • Auf der Seite „ Create a new repository “ geben Sie Ihrem Repository einen Namen. Für diese Anleitung verwenden wir „express-api“. Klicken Sie auf die Schaltfläche „ Create repository name“. Merken Sie sich die URL des Repositorys auf der nächsten Seite, da Sie diese für das Pushen des lokalen Repositorys auf GitHub benötigen.

Navigieren Sie auf Ihrem lokalen Rechner zu Ihrem Projektordner und führen Sie den folgenden Befehl aus, um die Anwendung an das Remote-Repository auf GitHub zu übertragen.

git remote add origin <https://github.com/remigathoni/express-api.git>
git branch -M main
git push -u origin main

Sie sollten in der Lage sein, die Dateien Ihrer Anwendung im GitHub-Repository anzuzeigen.

Bereitstellen der Express-Anwendung

Führen Sie die folgenden Schritte aus, um die Anwendung auf Back4app bereitzustellen:

  • Navigieren Sie zu Back4app und melden Sie sich für ein Konto an. Wenn Sie bereits ein Konto haben, melden Sie sich an. Back4app wird Sie nach der Authentifizierung zum Dashboard weiterleiten.
  • Klicken Sie auf dem Dashboard auf die Schaltfläche Build a new app. Es werden Ihnen zwei Optionen angeboten – Backend as a Service und Container as a Service. BaaS kümmert sich in Ihrem Namen um das Backend, während CaaS es Ihnen ermöglicht, Ihre Anwendung in einer containerisierten Umgebung bereitzustellen. Da wir nur die Anwendung bereitstellen wollen, klicken Sie auf Container as a Service.
Create a new container as a service app
  • Geben Sie Back4app Zugriff auf Ihr GitHub-Konto und wählen Sie das Express-Repository.
Select the dockerized Express app
  • Geben Sie Ihrer bereitgestellten Anwendung einen Namen. In dieser Anleitung verwenden wir „Deployed Express API“. Sie können auch zusätzliche Bereitstellungsoptionen festlegen, wie z. B. die Standardverzweigung, das Stammverzeichnis, den Auto-Deploy-Status (ja oder nein) und die Umgebungsvariablen.
Deploy Express.js application to
  • Klicken Sie auf die Schaltfläche Create App, um den Bereitstellungsprozess abzuschließen.

Sie haben nun Ihre Express-Anwendung kostenlos bei Back4app bereitgestellt.

Wie man das Docker-Image optimiert

Es ist wichtig, die Größe Ihres Docker-Images aus folgenden Gründen zu optimieren:

  • Verbesserte Leistung: Ein kleines Image enthält keine unnötigen Schichten, die ausgeführt werden müssen. Dies führt zu schnellen Startzeiten.
  • Schnellere Bereitstellung: Kleinere Images werden schneller bereitgestellt.
  • Geringerer Ressourcenverbrauch: Kleinere Abbilder verbrauchen bei der Ausführung weniger Speicherplatz und Arbeitsspeicher.
  • Erhöhte Sicherheit: Durch den Verzicht auf unnötige Bibliotheken und Abhängigkeiten verringern kleinere Images die Angriffsfläche der Anwendung.

Um das Express.js-Docker-Image zu optimieren, können wir einen mehrstufigen Build verwenden.

Bei mehrstufigen Builds können Sie die Build-Umgebung von der Laufzeitumgebung trennen. Sie können die Anwendung in der Build-Phase erstellen und dann nur die erforderlichen Dateien in die endgültige Produktionsphase kopieren.

Um auf die Express-Anwendung zurückzukommen, können wir zwei Phasen definieren – die Build-Phase, in der wir die Abhängigkeiten installieren, und die Produktionsseite, in der wir das Laufzeit-Image erstellen.

Erstellen der Bauphase

Folgen Sie den nachstehenden Anweisungen, um die Build-Stage zu definieren:

  • Löschen Sie den gesamten Inhalt der Dockerdatei und definieren Sie die Build-Stage aus dem Basis-Image.
FROM node:20-alpine AS build

Eine Stufe wird durch Anhängen von AS name-of-stage an die FROM-Anweisung benannt. Beachten Sie auch, dass alpine Basis-Images viel kleiner sind als node:<version>-Images.

  • Definieren Sie das Arbeitsverzeichnis.
WORKDIR /usr/src/app
  • Kopieren Sie die Dateien package.json und package-lock.json in den Container.
COPY package*.json ./
  • Installieren Sie die Entwicklungsabhängigkeiten.
RUN npm install --only=development
  • Kopieren Sie den Anwendungscode in die Build-Stufe.
COPY . .
  • Starten Sie die Anwendung.
CMD ["node", "index.js"]

Welchen Befehl Sie hier ausführen, hängt von Ihrem Projekt ab. Wenn Sie zum Beispiel TypeScript zum Erstellen Ihrer Anwendung verwendet haben, müssen Sie Ihre Anwendung möglicherweise transpilieren.

Erstellen der Produktionsphase

In der zweiten Stufe kopieren Sie nur die erstellten Anwendungsdateien aus der Build-Stufe. Führen Sie die folgenden Schritte aus:

  • Fügen Sie das Node.js-Basis-Image hinzu und nennen Sie es Production.
# Production Stage
FROM node:20-alpine AS production
  • Legen Sie das Arbeitsverzeichnis fest.
WORKDIR /usr/src/app
  • Kopieren Sie die notwendigen Dateien von der „Build Stage“, indem Sie –from=build in der COPY Anweisungangeben. Da es keinen Build-Befehl gibt, kopieren wir alles direkt.
COPY --from=build /usr/src/app .
  • Geben Sie den Port an, auf dem Ihre Express-Anwendung lauscht.
EXPOSE 3000
  • Starten Sie die Express-Anwendung.
CMD ["node", "index.js"]

Nachdem Sie das Dockerfile erstellt haben, pushen Sie Ihre Änderungen auf GitHub und Back4app wird Ihre Anwendung automatisch neu bereitstellen.

Wenn Sie den Code für diesen Artikel sehen möchten, besuchen Sie das GitHub-Repository der Anwendung.

Zusammenfassung

Express.js ist ein leichtgewichtiges, nicht rechthaberisches Node.js-Framework. Es hilft Entwicklern, schnelle und minimale APIs für Web- und mobile Anwendungen zu erstellen.

Für die Bereitstellung von Express-Anwendungen stehen verschiedene Optionen zur Verfügung, darunter Infrastructure as a Service (IaaS)- und Container as a Service (CaaS)-Plattformen.

IaaS-Plattformen sind besser geeignet, wenn Sie die maximale Kontrolle über die zugrunde liegende Serverinfrastruktur haben wollen, während CaaS eine gute Wahl ist, wenn Sie schnell von der Entwicklung zur Produktion übergehen wollen, ohne die Infrastruktur manuell verwalten zu müssen.

Einer der besten CaaS-Anbieter ist Back4app Container. Back4app verwaltet und überwacht die Anwendungsbereitstellung in Ihrem Namen, sodass Sie sich auf die eigentliche Entwicklung der Anwendungsfunktionen konzentrieren können.

In diesem Leitfaden haben Sie gelernt, wie man eine Express.js-Anwendung dockt und in einem Back4app-Container bereitstellt. Um mehr zu erfahren, besuchen Sie die Back4app-Container-Dokumentation.


Leave a reply

Your email address will not be published.