Günstiges Webhosting in der EU mit Node.js, Python und PHP 8.5

Ein praktischer Rundgang durch unser Hosting in Rumänien: ein rootless Podman-Container pro Website, Apache oder nginx pro Site, Node.js 22/24 und Python 3.12 ab Standard, automatisches Cloudflare-DNS und die ehrlichen Grenzen, die du kennen solltest.

Was das löst

Wenn du schon einmal nach günstigem webhosting günstig gesucht hast und dann gemerkt hast, wie schnell alles auseinanderfällt, sobald du eine zweite App brauchst, kennst du den Kompromiss: niedriger Preis, aber alles teilt sich eine Laufzeitumgebung, eine PHP-Version, einen Webserver und einen gemeinsamen Fehlerradius. Ein kaputtes Update auf einer Website reißt die anderen mit runter.

Unser Webhosting ist andersherum aufgebaut. Es läuft auf unserem eigenen Server in Rumänien, nicht auf weitervermietetem Speicher. Jeder Kunde bekommt ein eigenes Linux-Konto mit eigenen Limits für CPU, Arbeitsspeicher, Prozesse und Speicherplatz, und jede Website läuft in eigenen rootless Podman-Containern, ohne Zugriff auf das lokale Netzwerk des Servers oder auf die Konten anderer Kunden. Ein Problem auf einer Website erreicht deine anderen Websites oder andere Kunden nicht.

Dieses Tutorial führt durch Bestellung, das Anlegen einer Website, das Verbinden einer Domain, das Deployen einer Node.js- oder Python-App und die ehrlichen Grenzen des Setups, damit du mit vollständigen Informationen entscheiden kannst.

Voraussetzungen

  • Eine Domain, die du bei einem Registrar kontrollierst, wenn du deinen eigenen Namen auf der Website willst. Ohne Domain funktioniert jede Website auf einer Vorschauadresse.
  • Dein Anwendungscode oder der Plan, mit der Startseite zu beginnen.
  • Für Node.js und Python brauchst du den Tarif Standard oder höher; Start deckt nur PHP und statische Websites ab.
  • Eine Karte für den Stripe-Checkout. Die Preise sind in EUR, die Mehrwertsteuer wird beim Checkout anhand deines Landes berechnet.

Schritt 1: Tarif bestellen

  1. Öffne die Hosting-Seite und wähle einen Tarif und einen Abrechnungszeitraum (monatlich oder jährlich). Jährliche Abrechnung kostet das Zehnfache des Monatspreises, und der Preis bleibt bei der Verlängerung gleich: Es gibt keinen Einstiegspreis, der später steigt.
  2. Füge bei Bedarf Optionen hinzu: +10 GB NVMe, +1 vCPU, +1 GB RAM oder erweitertes Backup. Du kannst sie später ändern.
  3. Gib deine E-Mail-Adresse ein, akzeptiere die AGB, die Nutzungsrichtlinie und den Auftragsverarbeitungsvertrag und bezahle mit Stripe.

Dein Hosting-Konto wird nach der Zahlung automatisch erstellt, in der Regel innerhalb weniger Minuten, und du erhältst eine E-Mail. Die 30-Tage-Geld-zurück-Garantie beginnt mit deiner ersten Zahlung.

Eine kurze Orientierung zu den Tarifen: Start ist 1 vCPU / 1 GB RAM / 10 GB NVMe mit PHP und statischen Websites. Standard ist 2 / 2 GB / 25 GB und fügt Node.js und Python, SSH mit Schlüsseln und Git hinzu. Pro fügt Redis hinzu. Business fügt eigene Container-Images hinzu. Die aktuellen Tarife und Optionen findest du auf der Hosting-Seite.

Schritt 2: Website anlegen

Gehe in Account → Hosting zu Websites → Add a website.

  • Name: Kleinbuchstaben, Ziffern und Bindestriche. Er wird zum Ordner www-data/<name> in deinem Home-Verzeichnis.
  • Technology: PHP 8.1–8.5, Node.js 22 oder 24, Python 3.12 oder statisch.
  • Web server (nur PHP): Apache liest .htaccess-Dateien und ist die sichere Wahl für WordPress und die meisten PHP-Apps, die Rewrite-Regeln dort mitbringen. nginx ist leichter und schneller für statische Dateien, ignoriert aber .htaccess. Du wählst pro Website und kannst beides in einem Konto mischen.
  • Domain (optional): deine eigene Domain oder eine Subdomain einer Domain in deinem Konto; der DNS-Eintrag der Subdomain wird automatisch erstellt. Ohne Domain funktioniert die Website sofort auf ihrer Vorschauadresse <site>-<user>.hosting.medialab.works (nur HTTP, bis du die Domain umziehst).
  • Web root (PHP und statisch): der Ordner innerhalb von www-data/<site>, der Besuchern ausgeliefert wird, standardmäßig public; . bedeutet der Website-Ordner selbst.

Wenn die Website erstellt wird, bekommt ihr Ordner eine Startseite, die zeigt, dass die Domain den Server erreicht, wo die Website gehostet wird und welche PHP-Version läuft. Ersetze sie durch deine eigenen Dateien.

Wohin die Dateien gehören:

Technologie Ordner
PHP, statisch www-data/<site>/public (oder dein gewählter Web-Root)
Node.js, Python www-data/<site>/app

Schritt 3: Domain verbinden und DNS und Mail gratis erhalten

Wenn du eine Domain hinzufügst, erstellen wir drei Dinge für dich: eine DNS-Zone in Cloudflare in unserem Konto mit den Web-Einträgen und den Mail-Einträgen (MX, SPF, DKIM, DMARC, autoconfig), die Mail-Domain auf unserem Mailserver mit ihrem DKIM-Schlüssel und die Website auf dem Server mit einem SSL-Zertifikat, sobald die Domain auf uns zeigt.

Was du tust: Ersetze bei deinem Registrar die Nameserver durch die beiden, die unter Account → Hosting → Domains angezeigt werden. Die Änderung dauert meist von wenigen Minuten bis zu einigen Stunden, manchmal bis zu 48 Stunden. Die Domain-Seite zeigt jeden Schritt; sobald die Nameserver erkannt werden, wird die Zone aktiv und das Zertifikat automatisch ausgestellt. Mit Check DNS und Issue certificate kannst du sofort erneut versuchen.

Du willst deinen aktuellen DNS-Anbieter behalten? Richte stattdessen einen A-Record auf die im Konto angezeigte IP-Adresse ein und füge die Mail-Einträge selbst hinzu, wenn du E-Mail auf der Domain willst; die Tabelle der DNS-Einträge im Konto listet sie auf. Ohne unsere Nameserver liegen die DNS-Einträge in deiner Verantwortung.

Schritt 4: Node.js- oder Python-App deployen

Lade deine App in www-data/<site>/app hoch. Zwei Regeln entscheiden, ob es funktioniert:

  • Sie muss auf dem Port in der Umgebungsvariable PORT lauschen (8080 im Container) und zwar auf allen Interfaces (0.0.0.0), nicht nur auf localhost. Der Webserver und das Zertifikat sitzen davor; du öffnest selbst keinen Port.
  • Die Startreihenfolge zählt. Für Node.js: ein ausführbares start.sh in app/, sonst npm start aus package.json (Abhängigkeiten werden mit npm ci --omit=dev installiert, wenn node_modules fehlt), sonst server.js, index.js, app.js oder main.js. Für Python: ein ausführbares start.sh, sonst asgi.py (ausgeliefert von uvicorn-Workern in gunicorn), sonst app.py mit einem app-Objekt oder wsgi.py mit application (gunicorn). requirements.txt wird in eine virtuelle Umgebung installiert und beim Start neu installiert, wenn sich die Datei geändert hat.

Nach dem Hochladen einer neuen Version drücke Restart neben der Website. Bis eine App gefunden wird, zeigt die Website eine Platzhalterseite, die sagt, was fehlt.

Für PHP-Apps ist der Ablauf vertraut: Lege in Databases eine MariaDB-Datenbank an (ihr vollständiger Name wird <user>_wp), lade das Projekt in www-data/<site> hoch und drücke dann in Settings neben der Website auf Detect. Wir erkennen Laravel, Symfony, WordPress, Drupal, Nextcloud, WHMCS und andere und schlagen den Web-Root vor. Dateien außerhalb des Web-Roots (vendor/, storage/, .env, die Nextcloud-Daten, WHMCS' attachments, downloads und templates_c) bleiben für die App erreichbar, aber nicht aus dem Browser. Bei WordPress ist DB_HOST gleich mlw-db:3390. Das Passwort deines Datenbankbenutzers wird einmal angezeigt, wenn du deine erste MariaDB-Datenbank erstellst: Speichere es.

Schritt 5: Mail von deiner Website über Port 587

Ausgehende Mail von deinen Websites geht über unseren Mailserver mit einem Postfach, auf Port 587. Direktes Senden auf Port 25 ist blockiert, was die Adresse des Servers von Spamlisten fernhält. Postfächer, Webmail, IMAP und SMTP sind in jedem Tarif enthalten.

Schritt 6: Backups, die du selbst wiederherstellst, und ihre ehrlichen Grenzen

Backups laufen jede Nacht mit restic, verschlüsselt, auf einer separaten Festplatte im selben Server. Du kannst Dateien und Datenbanken selbst aus deinem Konto wiederherstellen, Backups auf Abruf erstellen und eine Website oder eine Datenbank aus jedem Backup herunterladen. Die Aufbewahrung hängt vom Tarif ab: 7 Tage bei Start, 14 bei Standard, 14 täglich plus 4 wöchentlich bei Pro, 30 täglich plus 12 monatlich bei Business. Das erweiterte Backup bewahrt sie so lange auf wie im nächsthöheren Tarif. Eine Wiederherstellung durch unser Team ist ebenfalls möglich; die erste pro Monat ist kostenlos.

Hier ist der ehrliche Teil: Backups werden auf demselben Server aufbewahrt, auf einer separaten Festplatte, nicht an einem zweiten Ort. Sie schützen dich vor Fehlern, einem kaputten Update oder einer gehackten Website, aber nicht vor dem Verlust des ganzen Servers. Behalte deine eigene Kopie von allem Wichtigen; du kannst deine Dateien und Datenbanken jederzeit herunterladen. Es gibt außerdem einen Server: Die Verfügbarkeit ist durch unsere SLA abgesichert (99,9 % pro Monat, mit Gutschriften auf der nächsten Rechnung), aber es gibt kein automatisches Failover auf eine zweite Maschine. Und "unlimited" bei Business bedeutet Fair Use: Die CPU-, RAM- und Speicherlimits des Tarifs gelten weiterhin, und technische Obergrenzen existieren nur, um Missbrauch zu stoppen (siehe AGB).

Tipps und Fehlerbehebung

  • Website zeigt die Platzhalterseite: Deine App wurde nicht gefunden oder lauscht nicht richtig. Prüfe, dass sie an 0.0.0.0:$PORT bindet, und drücke dann Restart.
  • Lies zuerst die Logs: Jede Website schreibt nach logs/<site>/ (nginx/ oder apache/ mit access.log und error.log, dazu php/, node/ oder python/ für die Ausgabe der App). Dieselben Logs erscheinen unter Settings → Logs.
  • Eine WordPress-Website umziehen: Lade das Archiv hoch, entpacke es in Files, korrigiere wp-config.php und lasse dann die App per Detect erkennen. Apache ist die sicherere Voreinstellung für Rewrite-Regeln.
  • Große Uploads: Der Dateimanager akzeptiert Dateien jeder Größe, die dein Tarif erlaubt, in Chunks gesendet, und entpackt .zip, .tar.gz, .tar.bz2 oder .tar.xz. Das Herunterladen eines ganzen Ordners als .zip wird im Hintergrund vorbereitet und bleibt 24 Stunden unter Operations and downloads verfügbar.
  • Hängst du bei DNS fest: Warte auf die Propagierung und nutze dann Check DNS und Issue certificate, um es ohne Ticket erneut zu versuchen.
  • Brauchst du eine Datenbank im Browser: Adminer öffnet sich mit einem Klick für MariaDB und PostgreSQL, mit .sql-Export und -Import.

Weitere Antworten findest du in der Wissensdatenbank und den FAQ; die Schritt-für-Schritt-Anleitung von der Bestellung bis zum ersten Postfach steht im Leitfaden für den Einstieg.

Fazit

Isolation pro Website ist hier kein Marketingwort: Es ist ein separates Linux-Konto mit eigenen Limits und rootless Podman-Containern pro Website, auf Hardware, die wir selbst in Rumänien betreiben. Du bekommst Apache oder nginx pro Website, PHP 8.1–8.5, Node.js 22/24 und Python 3.12 ab Standard, automatisches Cloudflare-DNS mit Mail-Einträgen, kostenloses SSL und einen Verlängerungspreis, der nicht springt. Die Grenzen sind klar benannt: Backups liegen auf demselben Server, und es ist eine Maschine. Wenn das zu deiner Art passt, eigene Server zu betreiben, findest du die Tarife auf der Hosting-Seite, und du kannst uns bei allem, was der Leitfaden nicht abdeckt, kontaktieren.

Dieser Beitrag wurde mit KI-Unterstützung auf Grundlage unserer Produktdokumentation oder der aufgeführten Quellen verfasst und vor der Veröffentlichung automatisch geprüft.

Als Nächstes lesen

Du betreibst Emby, Jellyfin oder Nextcloud?

Unsere Plugins und Apps bringen Live-TV, Untertitel, Registrierung und Sicherheit auf deinen eigenen Server, mit kostenlosem Testzeitraum.