8.4    Systemadministration

Als Entwickler oder Entwicklerin sind Sie natürlich in erster Linie für das Coding zuständig. In der Praxis verwischt sich die klare Trennung zwischen Administration und Software Development aber mitunter. Sie müssen Docker-Container, Netzwerk-Setups, virtuelle Maschinen oder Datenbank-Server einrichten (und sei es nur als Testumgebung). Wie die folgenden Beispiele zeigen, können KI-Tools Sie dabei mit klaren Anleitungen unterstützen.

Wir wollten diesen Abschnitt nicht »Linux-Systemadministration« nennen, aber wir müssen doch zugeben, dass die folgenden Seiten Linux-lastig sind. Das hat nicht (nur) mit persönlichen Vorlieben zu tun, sondern vor allem damit, dass die Linux-Systemadministration im Textmodus erfolgt. Sie führen Kommandos im Terminal aus, ändern Konfigurationsdateien etc. Ein Sprachmodell kann dabei gut helfen.

Im Gegensatz dazu erfolgt die Windows-Administration häufig in grafischen Benutzeroberflächen. Das kommt der Natur von Sprachmodellen nicht entgegen. Zudem sind ChatGPT & Co. noch nicht in der Lage (Stand: September 2024), Erläuterungen mit Screenshots von Dialogen oder Setup-Assistenten zu unterfüttern.

SSH-Authentifizierung per Schlüssel

Im ersten Beispiel geht es darum, automatisiert per scp Dateien auf einen Linux-Server zu kopieren. Um die Passworteingabe bei jeder Script-Ausführung zu vermeiden, müssen SSH-Schlüssel eingesetzt werden.

Prompt: I want to use scp to backup files to a Linux server. The script should run without interaction. What’s a safe way to accomplish this?

To use scp for backing up files to a Linux server without requiring interaction, you can use key-based authentication. Here’s a step-by-step guide to set this up.

  • First, generate an SSH key pair on your local machine:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    Follow the prompts. When asked for a passphrase, you can choose to leave it empty for automated processes, but it’s recommended to use a passphrase for added security. The key pair is typically saved in ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub.

  • Use ssh-copy-id to copy your public key to the remote server:

    ssh-copy-id username@remote_server_ip

    This command will prompt for your password on the remote server. After successful execution, your public key will be added to the ~/.ssh/authorized_keys file on the remote server.

  • Verify that you can connect to the remote server without being prompted for a password:

    ssh username@remote_server_ip

ChatGPT gibt jetzt gleich noch ein Beispiel für ein einfaches Backup-Script und dessen Automatisierung per Cron. Diesen Teil der Ausgabe haben wir hier gestrichen.

Grundsätzlich funktioniert die SSH-Key-Authentifizierung auch dann, wenn das Script unter Windows laufen soll. Allerdings ist das Set-up ein wenig komplizierter. ChatGPT erklärt, wie Sie den öffentlichen Teil des Schlüssels manuell auf dem Server einrichten.

Prompt: My backup script should run on Windows. However, ssh-copy-id is not available. Can I work around this problem?

Yes, you can work around this issue on Windows by manually copying your SSH public key to the remote server. First, generate an SSH key pair using the built-in OpenSSH client in Windows 10/11.

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Follow the prompts to save the key (by default, it will be saved to C:\Users\your_username\.ssh\id_rsa and C:\Users\your_username\.ssh\id_rsa.pub).

Since ssh-copy-id is not available on Windows, you need to manually copy the contents of the public key file (id_rsa.pub) to the ~/.ssh/authorized_keys file on the remote server. Open the id_rsa.pub file in a text editor and copy its contents. Connect to your remote server using an SSH client. Once logged in, open or create the ~/.ssh/authorized_keys file on the remote server:

nano ~/.ssh/authorized_keys

Paste the copied public key into the authorized_keys file and save it.

Docker-Setup

Um einen Datenbank-Client zu testen, brauchen Sie einen lokalen MySQL-Server. Sie wollen keine »echte« Installation durchführen, sondern Docker verwenden. Aber wie geht das?

Prompt: I have a local program which needs access to a MySQL database. How can I setup a Docker container accordingly?

ChatGPT liefert eine ausführliche Sieben-Punkte-Beschreibung, beginnend mit der Docker-Installation und endend mit einem Python-Anwendungsbeispiel. Wir haben hier nur die drei zentralen Docker-Kommandos herausgenommen:

docker network create my_network
docker pull mysql:latest
docker run --name my_mysql_container --network my_network \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-e MYSQL_DATABASE=mydatabase \
-e MYSQL_USER=myuser \
-e MYSQL_PASSWORD=mypassword \
-p 3306:3306 -d mysql:latest

Grundsätzlich funktioniert das. Das Erstellen eines eigenen Netzwerks für den Container ist hier vollkommen überflüssig, stört aber nicht. Im letzten Punkt weist ChatGPT darauf hin, dass alle in der Datenbank gespeicherten Daten verloren gehen, sobald der Container beendet wird. Um das zu verhindern, müssen Sie beim Erstellen des Containers ein sogenanntes Volume erstellen. Dieses können Sie später wiederverwenden und so die Datenbank von einem Container zum nächsten übernehmen.

If you want to persist data even after the container stops, you can mount a volume. Modify the docker run command to include a volume:

docker run ... -v my_mysql_data:/var/lib/mysql

Wie Sie bei Bedarf die Daten in einen neuen Container übernehmen, verrät Ihnen ChatGPT in einer Folgefrage. Wir haben hier nur den zentralen Satz der Antwort zitiert.

Prompt: After ending the first container, how would I create a new container re-using the volume?

When creating the new container, use the same volume (my_mysql_data) …

Proxy-Server

Moderne Webapplikationen und REST-APIs werden üblicherweise über einen Proxy-Server mit dem Internet verbunden. KI-Tools können Ihnen die Funktionsweise und das Set-up erläutern:

Prompt: I want to build a REST application using Python and Django. The application will run in a Docker container. Do I need a proxy server in this case to make my application visible to the internet?

ChatGPT erläutert zuerst die Funktionsweise und die Vorteile eines Reverse-Proxy-Servers und liefert danach eine Anleitung für ein entsprechendes Docker-Setup. Wenn Sie so etwas zum ersten Mal machen, werden Sie vermutlich nur mit ein paar Zusatzfragen ans Ziel kommen. Wenn Sie schon ein wenig Übung haben, sind die von ChatGPT zusammengestellten Dateien Dockerfile und docker-compose.yml aber ein ausgezeichneter Startpunkt.

In the context of deploying a REST application using Python and Django in a Docker container, whether you need a proxy server depends on your deployment architecture and requirements. Here’s a breakdown to help you understand when and why you might need a proxy server (more details …)

Here’s a high-level overview of setting up a Django REST application with Docker and Nginx as a reverse proxy:

  • Dockerize Your Django Application (more details …)

  • Create a Dockerfile (more details …)

  • Create a docker-compose.yml (more details …)

  • Set Up Nginx as a Reverse Proxy (more details …)

  • Run Your Application

Die Visualisierung gelingt ChatGPT aktuell nur in einer eher tristen ASCII-Darstellung. Hier wird GPT 4o den »omni«-Versprechungen noch nicht gerecht. Es kann aber gut sein, dass sich das bis zum Erscheinen dieses Buchs ändert.

Prompt: Can you visualize the setup in a diagram?

Certainly! Here’s a textual description of the diagram for the setup described:

+---------------------------+
| Client Browser |
+-----------+---------------+
|
v
+-----------+---------------+
| Nginx Reverse Proxy |
| (Handles SSL, Load |
| Balancing, etc.) |
+-----------+---------------+
|
v
+-----------+----------------+
| Docker Container Network |
| |
| +----------+ +---------+|
| | Web | | DB ||
| | Container| |Container||
| +----------+ +---------+|
| (Django) (Postgres)|
+----------------------------+

Netzwerkprobleme bei einer virtuellen Maschine mit Webserver beheben

Sie haben in einer virtuellen Maschine Linux, einen Webserver sowie diverse andere Tools installiert. Aber Sie scheitern daran, den Webserver von Ihrem Host aus anzusprechen. Kann ChatGPT weiterhelfen?

Denken Sie daran, möglichst genaue Angaben zu machen: Welches Virtualisierungsprogramm? Welche Linux-Distribution? Welcher Webserver? Welches Host-Betriebssystem? Welche Fehlermeldung? Was haben Sie schon versucht, um den Fehler einzugrenzen?

Prompt: I am using VirtualBox on my Windows notebook. I have setup a virtual machine with Fedora Linux. Within Fedora I have installed Apache.

  • systemctl status httpd says it is running fine.

  • hostname -I reveals that my IP address is 10.0.2.15.

However, on my host system I cannot access the website. Whenever I try to open http://10.0.2.15, the web browser displays ERR_CONNECTION_TIMED_OUT. What could cause this error?

The issue you’re experiencing is likely due to the network configuration of your VirtualBox setup. By default, VirtualBox often uses NAT (Network Address Translation) for networking, which can cause issues with accessing the guest machine from the host. Here are a few steps to resolve this:

  • Change Network Adapter to Bridged Adapter (more details …)

  • Determine New IP Address (more details …)

  • Update Firewall Rules. Ensure that the firewall on Fedora allows HTTP traffic. First, check the status of the firewall:

    sudo firewall-cmd --state

    If the firewall is running, allow HTTP traffic:

    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload
  • Access the Web Server (more details …)

Nach unseren Erfahrungen ist die Antwort von ChatGPT perfekt. Das KI-Tool weist auf die zwei häufigsten Fehlerursachen hin: Erstens ist die Default-Netzwerkkonfiguration von VirtualBox ungeeignet. Sie müssen auf Bridged Networking umstellen. Und zweitens kann es sein, dass in der virtuellen Maschine eine Firewall aktiv ist. (Bei Fedora ist das definitiv der Fall.) Sie müssen eine Ausnahmeregel festlegen, die den Netzwerkverkehr für HTTP erlaubt.

Falls Ihnen die Ausführung der Hinweise schwerfällt, stellen Sie Folgefragen. Im Wechselspiel zwischen Hostsystem, Virtualisierungsprogramm und virtueller Maschine ist es nicht immer ganz einfach, den richtigen Ort für die einzelnen Konfigurationsschritte zu erkennen.

Prompt: Should I change the firewall settings on my Windows notebook or within the virtual machine?

To ensure that your Fedora Apache web server is accessible from your Windows host, you should primarily focus on the firewall settings within the virtual machine (Fedora). More details …

Linux-Server-Setup

Sie wollen einen Linux-Server einrichten. Dabei verwenden Sie RAID-1, verwenden also zwei SSDs, deren Inhalt gespiegelt wird. Sollte einer der beiden Datenträger kaputtgehen, haben Sie keinen Datenverlust zu befürchten.

Nun befinden sich die Boot-Dateien üblicherweise nur auf der ersten Disk. Sollte diese kaputtgehen, verlieren Sie zwar keine Daten, können Ihren Rechner aber nicht mehr booten. Abhilfe schafft die korrekte Konfiguration des Boot-Loaders GRUB auf beide Disks. Aber wie geht das?

Prompt: Linux: I want to setup a server with two disks using RAID-1. The server should be bootable no matter whether the first or the second disk fails. Can you help?

ChatGPT liefert eine detaillierte Anleitung, die mit der Partitionierung der Datenträger beginnt, dann das RAID-Setup erläutert und schließlich die Installation von GRUB behandelt. Wir haben hier nur den für die Frage entscheidenden Punkt wiedergegeben:

Ensure GRUB is installed on both disks. You can do this manually after the installation:

sudo grub-install /dev/sda
sudo grub-install /dev/sdb
sudo update-grub

Es ist also wichtig, dass der Boot-Loader GRUB auf beiden Disks installiert wird, was normalerweise nicht der Fall ist. Beachten Sie, dass Sie bei modernen Servern mit NVMe-SSDs anstelle von /dev/sda und /dev/sdb die Device-Namen dev/nvme0n1 und /dev/nvme1n1 verwenden müssen.

Weitere Prompts

Wie runden diesen Abschnitt mit einigen Prompt-Beispielen ab, ohne im Detail auf die Ergebnisse einzugehen.

Prompt: Bash, find command: Is there a way to search for files within a certain date range?

Prompt: PowerShell: How do I list files sorted by modified date?

Prompt: Linux: I want to set up a shared directory for five students to work together. By default, each student should be able to read and write files created by other students in the group. How do I do this?

Prompt: Linux: I have a LVM setup. I need to increase the size of one of my logical volumes, but the volume group is already fully used. Therefore, I plan to add a second disk. How can I add this disk in my LVM system? How do I increase the size of the logical volume and the file system on it?

Prompt: Linux Server with Postfix mail server: I can send but I cannot receive mail. Can you help me debug this?

Prompt: Linux Server with nginx web server. How can I setup a Let’s Encrypt certificate for the main domain and three subdomains (example.com, www.example.com, help.example.com and support.example.com).

Prompt: Ubuntu server: I would like to set up a firewall that blocks all incoming traffic with these exceptions: ping, SSH, HTTP and HTTPS. How should I proceed?

Prompt: MiniDLNA: Can I use MiniDLNA for radio streams (m3u)? If not, what are my options for a simple setup on the Raspberry Pi?

Prompt: Linux: I want to implement geo-blocking with a nftables firewall to protect my services against attacks from certain countries. What are my options?