
Hosting alter Node Projekte 👴🏼

Eine Weile zurück bat mich ein Freund, ihm bei der Erweiterung eines alten NodeJS-Projekts zu helfen. Aber als wir mit allen Änderungen fertig waren, konnten wir es nicht mehr deployen! Die Node-Version war einfach zu alt.
Google App Engine (GAE), wo es vorher gehostet wurde, weigerte sich, sich um unseren Oldtimer zu kümmern. Ja, sie hatten recht. Das Hosten von alten Sachen wird aus Sicherheitsgründen generell nicht empfohlen. Und als Unternehmen will man nicht 20 verschiedene Node-Versionen für immer pflegen.
So standen wir vor der Wahl:
Einen Tag damit verbringen, Node und alle Dependencies zu upgraden, oder einen anderen Weg finden, unser Projekt zu hosten.
Es ist die uralte Frage:
Upgraden oder nicht upgraden?

Upgraden oder nicht upgraden ist im Wesentlichen Risikomanagement. Es geht darum, einzuschätzen:
- Wie groß ist der Impact eines Sicherheitsverstoßes?
- Wie wahrscheinlich ist es, dass es passiert?
- Wie sicher bist du bei deiner Einschätzung?
Ich mache hier mal eine wilde Vermutung: Wenn du wirklich planst, ein 5 Jahre altes Node-Projekt zu hosten, ist es entweder so enterprise, dass keiner von uns Programmierern die Logik hinter dieser Entscheidung vollständig verstehen kann, oder es ist ein winziges Projekt.
Unser Projekt ist nicht mission-critical. Es speichert keine personalisierten Daten und wenn es einen Tag lang down ist, werden es wahrscheinlich 2 Leute bemerken.
Wir haben nicht upgegradet.
Also suchen wir eine andere Hosting-Lösung!
Docker zur Rettung 🐳
Zum Glück gibt es ein praktisches Tool namens Docker. Es öffnet die Türen, um ziemlich alles zu hosten, was du dir wünschst. Sei es ein Frontend, Backend, eine Datenbank oder eine 5 Jahre alte NodeJs-Anwendung.
Für diejenigen unter euch, die mit Docker noch nicht vertraut sind, hier meine Zwei-Satz-Einführung:
Docker erstellt einen Container um deinen Code herum, der alle Abhängigkeiten enthält, die für die Ausführung notwendig sind. Du definierst alles, was du brauchst, in einem Dockerfile, das etwa so aussehen kann:
FROM node:12.3.1-alpine AS builder
WORKDIR /my-app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:12.3.1-alpine AS runner
WORKDIR /my-app
COPY --from=builder /my-app/.output ./.output
EXPOSE 9000
CMD ["node", "./.output/server/index.mjs"]
Dieses Dockerfile enthält Anweisungen zum Erstellen eines Docker-Images mit installiertem Node 12, dann kopiert es unseren Code hinein, baut ihn und führt ihn aus. Ich gehe in diesem Beitrag nicht auf alle Details ein, aber ich empfehle dir, einige andere Tutorials zu Docker anzuschauen, wenn du noch nichts davon gehört hast.
Und jetzt, anstatt dich zu fragen: "Welcher Anbieter akzeptiert noch Node 12?"
Fragst du: "Wo kann ich meinen Container hosten?"
Hosting-Optionen
1. Self Hosting

Wenn du ein bisschen was über Self Hosting weißt, kannst du wahrscheinlich ziemlich schnell einen VPS aufsetzen und deinen Container darauf werfen.
Aber wenn du ein bisschen was über Self Hosting weißt, weißt du auch, dass die Betreuung des Servers viele Kopfschmerzen verursachen kann. Und selbst wenn du ihn schnell zum Laufen bringst, gibt es eine Menge Overhead bei der Lösung von Secrets-Management, Deploys, Sicherheitsupdates usw.
Wenn du trotzdem tiefer eintauchen willst, ist Dokku eine interessante Erwähnung. Sie bieten eine Open Source PaaS, die du auf deinem Server installieren kannst, um das Self Hosting von Containern zu vereinfachen.
Für unser Projekt wollen wir uns jedoch nicht mit Server-Management befassen, wir brauchen nur eine Lösung für das Hosting unseres alten kleinen Node-Projekts.
2. Große Cloud-Anbieter
Amazon, Google und Microsoft bieten eine Vielzahl von Produkten (ECS, Cloud Run, Azure Container Instances, ...) im Bereich Container-Hosting an. Sie statten dich mit den Tools aus, um einer Armee von Millionen von Nutzern standzuhalten, die von überall auf der Welt Anfragen an deinen Container schicken.

Super! Keine Sorgen mehr um Skalierung! 🥳
Aber Moment, wir haben uns von Anfang an keine Sorgen um die Skalierung gemacht. Diese Lösungen sind hochleistungsfähig, aber auch hochkomplex. In der Zeit, die wir damit verbringen würden, herauszufinden, welches Produkt für unsere Bedürfnisse das richtige ist, könnten wir unsere App komplett neu schreiben.
Und wenn wir es jemals mit einer Armee von Millionen von Nutzern zu tun haben, ist es wahrscheinlich Zeit für ein Upgrade...
Wir brauchen eine einfache Lösung.
3. Einfaches Container-Hosting
Es gibt eine Reihe anderer Cloud-Dienste, die versuchen, Einfachheit in den Vordergrund zu stellen. Dazu gehören zum Beispiel Digital Ocean, Render oder Railway. Während sie generell einen guten Service bieten, kommen ihre Einstiegspläne oft mit erheblichen Einschränkungen.
Ein fairer Kompromiss, aber wir waren nicht völlig zufrieden damit. Wenn du das Buch "The third door" gelesen hast, weißt du, dass es oft eine Option gibt, die auf den ersten Blick nicht offensichtlich ist...
Welchen Hoster haben wir gewählt?
Wir haben uns für Option Nr. 4 entschieden und anstatt unsere App in einem Tag zu upgraden, sind wir in den Kaninchenbau gefallen und haben über ein Jahr damit verbracht, selbst eine Container-Hosting-Plattform zu bauen. 🤠
Mit einem starken Fokus auf Einfachheit ermöglicht dir Sliplane, unbegrenzte Container zu einem festen Preis zu deployen - für einen Bruchteil der Kosten anderer beliebter Hosting-Optionen. Wenn du es ausprobieren möchtest, kannst du es kostenlos testen.

Zusammenfassung
- Hoste nur alte Sachen, die keinen ernsthaften Schaden anrichten können
- Nutze Docker, um deine App zu containerisieren
- Wähle zwischen: Self Hosting, großen Cloud-Anbietern oder einfachen Container-Hosting-Lösungen
Oder probier Sliplane aus, das ich mitgegründet habe.
