Virtuelle Web-Server in der Google Cloud

Dieser Artikel soll zeigen, wie man eine virtuelle Maschine in der Google-Cloud mit next.js- Webservern (fast) kostenlos einrichten und dauerhaft betreiben kann. Im ersten Schritt wird in der Google-Cloud eine virtuelle Debian-Maschine erstellt, dann der notwendige Workflow und zum Schluss Domänen mit entsprechendem Zugang eingerichtet. Das Ergebnis sind kleine Web-Server, wie ich sie hier betreibe. Auch die Website, die Sie gerade lesen, wird auf der gleichen virtuellen Maschine gehostet.

Je nach Vorkenntnissen kann es ein etwas steiniger Weg bis zu einem funktionsfähigen Servern werden. Sie sollten mindestens Grundkenntnisse in JavaScript , JSX und UNIX haben. Ich werde mich bemühen, alles ausführlich zu beschreiben und zu bebildern, so dass das Vorgehen verständlich und nachvollziehbar bleiben sollte.

Folgendes Vorgehen ist geplant:

  1. Konto für die Google-Cloud registrieren
  2. Google-Cloud-Projekt einrichten
  3. Debian-Server in der Google-Cloud erstellen
  4. SWAP-File, Node.js, statische IP-Adresse, Firewall und Hello-World-Server
  5. Visual Studio Code einrichten
  6. Next.js - Server, Bootstrap und Sass
  7. Domain registrieren, DNS konfigurieren
  8. NGINX (engine X) einrichten
  9. Zertifikat erzeugen und installieren

Nach spätestens 90 Tagen in der Google-Cloud müssen Sie für die Abrechnung kostenpflichtiger Leistungen eine Kreditkarte zur Verfügung stellen. Sie machen dies auf eigene Verantwortung und Rechnung. Ich übernehme keinerlei Haftung für die Richtigkeit der hier veröffentlichten Angaben und Anleitungen.

Konto für die Goolge-Cloud registrieren

  1. Im ersten Schritt müssen Sie Ihr Google-Konto für die Nutzung derCloud-Diensteregistrieren. Falls Sie noch kein Google-Konto haben, können Siehier ein neues einrichten.
    Gehen Sie dann zu cloud.google.com,klicken auf Anmelden oder Jetzt kostenlos starten und melden Sie sich mit Ihrem Google-Konto an.
  2. Stimmen Sie den Nutzungsbedingungen zu und klicken Sie auf weiter.
  3. Auf der nächsten Seite wählen Sie den Kontotyp Privatperson. Hier müssen sie Ihre Kreditkarteninformationen eingeben. Google verspricht, die Kreditkarte erst dann zu belasten, wenn Sie ein Upgrade auf ein kostenpflichtiges Konto vornehmen. Dieses Upgrade wird nach 90 Tagen fällig, wenn der Testzeitraum mit dem Guthaben von 300 $ abgelaufen ist. Für den Server, wie ich ihn hier vorstelle, werden bei mir derzeit ca. 0,01 € bis etwa 0,02 € pro Monat fällig, vermutlich für das Internet (Amerika nach China?) oder die feste IP-Adresse. Ist auch egal.
  4. Zum Abschluss klicken Sie auf Kostenlose Testversion starten.

Das Goolge-Cloud (GC) Projekt

Die Google-Cloud (GC) Konsole, die sich nach der Registrierung öffnet, ist Ihr Arbeitsraum in der Google-Cloud. Google verwaltet alle Ressourcen, Benutzerrechte, Anmeldedaten, Abrechnungen auf Projektebene. Den Projekten kann eine Organisation (z.B. ein Unternehmen, das den Google Workspace benutzt) übergeordnet sein.

Ein GC Projekt hat einen Projektnamen, eine automatisch generierte Projektnummer und eine weltweit einmalige Projekt-ID. Den Projektnamen und die Projekt-ID können Sie wählen. Die Projekt-ID kann man nicht mehr ändern.

Das Projekt, an dem Sie gerade arbeiten, wird in der oberen, blauen Zeile angezeigt und ist dort auch auswählbar. Ausgewählt ist jetzt das Standardprojekt My First Project, das Google mit der Registrierung angelegt hat. Wir wollen, als erste Aktion in der Konsole dieses Standardprojekt löschen und ein neues unter der Bezeichnung Web-Node-Server anlegen. Diesen Namen werden wir auch an anderer Stelle benutzen.

Google-Cloud-Konsole
Google-Cloud-Konsole

Falls Sie sich nicht auf der Startseite der GC-Konsole befinden, klicken Sie auf den Hamburger (die 3 waagrechten Streifen oben in der blauen Leiste) und wählen dann die Startseite und das Dashboard aus. In der Kachel Projektinformationen klicken Sie auf Zu den Projekteinstellungen. Unterhalb der blauen Leiste erscheint jetzt der Mülleimer BEENDEN. Wenn Sie draufklicken, werden Sie im sich öffnenden Fenster zur Eingabe der Projekt-Id aufgefordert. Nachdem Sie diese eingegeben und wiederum auf BEENDEN geklickt haben, wird das Projekt beendet und zum Löschen vorgemerkt.

Zurück zum Dashboard. Dort wird jetzt in der blauen Zeile Projekt auswählen angezeigt. Wenn Sie auf den Pfeil daneben klicken wird im aufpoppenden Fenster nur die Organisation (in diesem Fall Keine Organisation ) angezeigt. Wir klicken im Dashboard auf Projekt erstellen, geben als Projektnamen Web-Node-Server, als Projekt-ID web-node-server ein und klicken auf ERSTELLEN. Jetzt wird im Dashboard das neue Projekt angezeigt.

Google-Cloud-Konsole mit neuem Projekt
Google-Cloud-Konsole mit neuem Projekt

Debian-Server erstellen

Damit der Server auch nach Ablauf des 90-tägigen Testzeitraums (fast) kostenlos bleibt, ist das "Kleingedruckte" fürProdukte der kostenlosen Stufezu beachten. Dort wird in der Kachel Compute Engine angegeben, dass eine

f1-micro-Instanz in den US-Regionen Oregon: us-west1, Iowa: us-central1 oder South Carolina: us-east1

kostenlos sei. Das heißt, wir können nur eine f1-micro-Instanz in diesen Regionen dauerhaft kostenlos nutzen.
f1-micro-Instanzen erhalten 20 % einer vCPU, dürfen aber vorübergehend auf eine volle vCPU zugreifen, haben 0.66 GB Arbeitsspeicher und 30 GB Speicher auf Magnetplatte. Das ist nicht viel, für einen kleinen next.js-Server aber mehr als ausreichend.

Zum Einrichten des Servers klicken wir in der GC Konsole auf den Menupunkt Compute Engine und gelangen unter dem Menupunkt Virtuelle Maschinen zu den VM-Instanzen.

VM-Instanz erstellen
VM-Instanz erstellen

In der Kachel VM-Instanzen geht es mit dem Button Erstellen weiter. Es öffnet sich ein neues Fenster, in das Sie die folgenden Parameter für die neue VM-Instanz eintragen sollten. Die verrechnungskritischen Parameter sind rot markiert. Zum Abschluss klicken Sie ganz unten auf den Button Erstellen. Nach einer Weile erscheint die neue VM-Instanz in der Übersicht aller VM-Instanzen.

Nameweb-node-server
Regionus-central1 (Iowa)
Zoneus-central-a
Maschinenkonfiguration/
Reihe
N1, ab 01.08.2021: E2
Maschinenkonfiguration/
Maschinentyp
f1-micro (max. 1 vCPU, 614 MB Arbeitsspeicher)
ab 01.08.2021: e2-micro, max. 2 vCPU, 1 GB Arbeitsspeicher
Maschinenkonfiguration/
Bootlaufwerk
über Ändern: Größe des Bootlaufwerks auf max. 30 GB ändern
FirewallHTTP- und HTTPS-Traffic zulassen
Übersicht der VM-Instanzen
Übersicht der VM-Instanzen

Viel können wir dieser Maschine noch nicht anfangen. Sie lässt sich aber über die Externe IP-Adresse "anpingen". Öffnen Sie dazu ein Kommandofenster (Terminal, Windows Kommandozeile) ihres Betriebssystems und geben Sie den Befehl ping , gefolgt von einem Leerzeichen und der im VM-Fenster angezeigten externen IP-Adresse ihres Servers, ein. Stoppen lässt sich die Ausführung des Pings mit Strg-C.

% ping 35.192.166.139
PING 35.192.166.139 (35.192.166.139): 56 data bytes
64 bytes from 35.192.166.139: icmp_seq=0 ttl=54 time=128.299 ms
64 bytes from 35.192.166.139: icmp_seq=1 ttl=54 time=127.308 ms
64 bytes from 35.192.166.139: icmp_seq=2 ttl=54 time=123.983 ms
...

SWAP-File, Node.js, statische IP-Adresse, Firewall und Hello-World-Server

Der Server hat gerade mal 0.66 GB Arbeitsspeicher (RAM), Speicherüberläufe sind also vorprogrammiert. Deshalb soll der adressierbare Systemspeicher durch eine Auslagerungsdatei (SWAP) von 2 GiB erweitert werden. Auf die Maßeinheiten will ich nicht weiter eingehen. Falls diese unklar sind, gibt es hier Information:Elektronik Kompendium.Der dd-Befehl und die von ihm benutzten Einheiten, sind hier ausführlich erklärt:ubuntuusers dd.Lassen Sie sich hier nicht entmutigen, in dem Bereich herrscht etwas Durcheinander, die Einheiten können unterschiedlich interpretiert werden.

Zum Einrichten des SWAP klicken wir im Fenster der VM-Instanzen (siehe Bild oben) auf SSH ↓ und wählen Im Browserfenster öffnen.Nach einiger Zeit erscheint die Konsole der virtuellen Maschine.

Konsole der VM
Konsole der VM

Um Informationen über den vorhanden SWAP-Speicher zu erhalten geben Sie das Kommando free -m ein und drücken dann die Entertaste ↵. Die Antwort der Maschine zeigt: Es ist kein SWAP vorhanden.

Swap abfragen
Swap abfragen

Wir geben nun die folgende Befehlsfolge ein. Den Befehlen ist jeweils der sudo-Befehl vorangestellt. Dadurch wird der nachfolgende Befehl mit Adminstratorrechten ausgeführt.

# der Datei /swapfile Platz im Dateisystem zuweisen
sudo fallocate -l 2G /swapfile
# /swapfile mit Nullen überschreiben
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024*2
# das System meldet:
# 2048+0 records in
# 2048+0 records out
# 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 3.38243 s, 635 MB/s
# wir wechseln zur Wurzel des Dateisystems:
cd /
# und lassen uns alle Dateien auflisten:
ls -l
# u. a. wird die gerade erzeugt Datei swapfile angezeigt:
# -rw-r--r-- 1 root root 2147483648 Dec 9 15:09 swapfile
# wir ändern die Zugriffsrechte auf diese Datei:
sudo chmod 600 /swapfile
# und lassen uns wieder die Datei /swapfile anzeigen
ls -l swapfile
# man sieht, dass die Zugriffsrechte verändert wurden:
# -rw------- 1 root root 2147483648 Dec 9 15:11 swapfile
# die Datei swapfile als Auslagerungsspeicher einrichten
sudo mkswap /swapfile
# das System meldet:
# Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
# no label, UUID=xxxxx-xxx-etc.
# Das "Swappen" starten:
sudo swapon /swapfile
# den freien und belegten Speicher abfragen
free -m
# das System meldet u. a.:
# total used free shared buff/cache available
# Mem: 583 113 42 6 427 366
# Swap: 2047 0 2047

Leider ist es so, dass bei einem Reboot des Servers der SWAP-Speicher nicht automatisch gestartet wird. Das können Sie leicht ausprobieren, indem Sie in der GC Konsole auf der Seite der VM-Instanzen die gerade erstellte VM mit einem Hacken in der Checkbox auswählen und dann unterhalb der blauen Zeile auf den Button Zurücksetzen (der Kreis mit einem senkrechten Strich) klicken. Nach dem Zurücksetzen zeigt die Speicherabfrage free -m an, dass kein SWAP mehr existiert.

Es ist notwendig die Datei /etc/fstab um die SWAP-Datei zu ergänzen. Die Funktion der /etc/fstab ist z.B. hier erklärt:ubuntuusers fstab.Die Ergänzung sollten Sie mit dem Editor ihrer Wahl machen. Falls Sie noch keinen Editor unter UNIX kennen, ist dies etwas heikel. Ich werde den Schritt für den vim-Editor beschreiben.

In der Datei /etc/fstab ist die folgende Zeile am Ende einzufügen:

/swapfile swap swap defaults 0 0

Wir starten den vim-Editor mit Administrationsrechten durch das folgende Kommando:

sudo vim /etc/fstab

Es öffnet sich das Editorfenster, das etwa so aussehen sollte:

# /etc/fstab: static file system information
UUID=59af2a10-b9ae-4d14-94db-29555eafcabc / ext4 rw,discard,errors=remount-ro,x-systemd.growfs 0 0
UUID=ED6A-504D /boot/efi vfat defaults 0 0

Wenn man den Editor nicht kennt, ist es nicht leicht die obige Zeile am Ende einzufügen. Bitte lesen Sie diesen Abschnitt erst vollständig, bevor Sie mit dem Editieren starten. Sie müssen wissen, dass der Editor in unterschiedlichen Modi arbeitet, nach dem Starten im Normalmodus. In diesem Modus lässt sich z. B. durch den Befehl h (einfach das h auf der Tastatur drücken) der Cursor um eine Stelle nach links bewegen, in die Datei können Sie nichts schreiben. Mit dem Befehl a (a-Taste drücken) gelangen wir in den Eingabemodus. Würden wir jetzt das h drücken, würde es in die Datei geschrieben. Der Eingabemodus wird in der untersten Zeile des Editors durch -- INSERT -- angezeigt. Mit den Pfeiltasten bewegen wir im Eingabemodus den Cursor bis zum Ende der letzten Zeile, erzeugen durch Drücken der Entertaste ↵ eine neue und schreiben in diese den oben angegebenen Inhalt. Jetzt müssen die Änderungen noch gespeichert werden. Durch Drücken der ESC-Taste gelangen wir in den Normalmodus zurück. Im Normalmodus rufen wir den Kommandozeilenmodus durch Drücken des Doppelpunktes auf. Dieser Modus wird in der untersten Zeile durch einen ":" angezeigt. Weitere Eingaben landen hinter diesem ":". Mit w (für write) und der Entertaste ↵ wird die Datei gespeichert. Wieder mit dem Doppelpunkt, jetzt aber mit anschließendem q (für quit) und der Entertaste ↵ wird der Editor verlassen.

Falls Sie das Editieren abbrechen wollen oder müssen geben Sie einfach nacheinander ESC : q ! ↵ ein.

Zum Abschluss überprüfen wir, ob die Datei /etc/fstab einwandfrei funktioniert. Geben Sie dazu in die Konsole des Browserfensters das folgende Kommando ein. Es sollte keine Fehlermeldung erscheinen.

sudo mount -a

Im nächsen Schritt wird node.js installiert. Die Installation isthier hier erklärt. Wir geben also in die Browser-Konsole der VM folgende Kommandos ein:

# aktualisieren der installierten Pakete
# liest die eingetragenen Pakete neu ein
sudo apt-get update
# bringt die installierten Pakete auf den neusten Stand (kann dauern)
sudo apt-get upgrade
# Setup-Dateien übertragen
curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -
# node.js installieren
sudo apt-get install -y nodejs
# Kontrolle
node -v
# die Antwort solle sein: v15.x.y
npm -v
# die Antwort solle sein: v7.x.yz

Der Server soll als Web-Server betrieben werden und unter einem Domainnamen erreichbar sein. Das ist, ohne dynamisches Domain Name System (DNS), nur möglich, wenn die IP-Adresse immer gleichbleibt. Neue VMs haben standartmäßig eine sitzungsspezifische IP-Adresse. Das wollen wir jetzt auf der Seite VPC-Netzwerk / Externe IP-Adressen ändern.

zum Menu VPC-Netzwerk
zum Menu VPC-Netzwerk

Auf dieser Seite reservieren wir zunächst eine statische IP-Adresse (der Button oben). Der Name der Adresse ist frei wählbar, die Netzwerkdienststufe: Premium, die IP-Version: IPv4, der Typ: Regional und die Region: us-central1 (Iowa). Mit dem Klick auf den Button RESERVIEREN wird eine zweite IP-Adresse, die jetzt den Typ Statisch hat, angezeigt. In der Zeile der neuen IP-Adresse klicken wir ganz rechts auf ÄNDERN und weisen den web-node-server (siehe Bild) der Adresse zu. Nachdem die Änderung abgespeichert wurde wird in der Liste der IP-Adressen nur noch die Neue mit der statischen IP-Adresse angezeigt (im Beispiel: 35.192.166.139). Wir merken uns diese Adresse.

statische Adresse dem Server zuordnen
statische Adresse dem Server zuordnen

Da wir (fast) an Ort und Stelle sind, können wir einen Blick auf die Seite Firewall werfen. Dort sind die ersten beiden Zeilen default-allow-http und default-allow-https interessant. Als Ziel wird für diese beiden Zeilen http-server bzw. https-server angegeben. Diese Ziele findet man der VM-Instanz als Netzwerk-Tags wieder.

Zusammenhang VM - Firewall
Zusammenhang VM - Firewall

Als Belohnung für die harte Arbeit an der VM richten wir einen Hello-World-Server auf dieser ein. Hierzu starten wir in der Übersicht der VM-Instanzen eine SSH im Browserfenster und geben dann folgende Befehle ein:

# Wechsel ins User-Home-Verzeichnis
cd
# Home-Verzeichnis anzeigen, Antwort: /home/ihr_nutzername
pwd
# neues Verzeichnis helloWorld anlegen
mkdir helloWorld
# Dateien und Verzeichnisse auflisten
ls -l
# total 4
# drwxr-xr-x 2 anton_beton anton_beton 4096 Dec 10 14:22 helloWorld
# ins Verzeichnis helloworld wechseln
cd helloWorld
# in der Eingabezeile sollte jetzt so etwas wie
~/helloWorld$
# angezeigt werden

In diesem Verzeichnis legen Sie die Datei app.js mit dem Editor ihrer Wahl (z. B. vim oder nano) und folgendem Inhalt an. Dabei ist die IP-Adresse 10.108.0.3 durch die interne IP-Adresse Ihrer VM zu ersetzen.

const http = require('http');
const hostname = '10.108.0.3';
const port = 80;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}`);
});

Danach geben Sie im Browserfenster folgendes Kommando ein (Sie befinden sich noch im Verzeichnis helloWorld):

# sudo, weil wir Port 80 verwenden
sudo node app.js

Sie können nun den neuen Web-Server unter der externen IP-Adresse in einem Browserfenster aufrufen. That is awesome, isn't it?

Vorschau

Das nächste Kapitel beginnt mit dem Erstellen eines vernünftigen Workflows. Wir werden die Dateien für den Server künftig auf einem PC erstellen und editieren und sie dann in den Server hochladen um nicht diese umständlichen Unix-Editoren verwenden zu müssen.