Docker lässt sich in wenigen Schritten installieren. Dafür gehen wir hier den Weg über die repository und erstellen uns ein Installationscript:
# nano docker_install.sh
kopiere nun den Installationscode in das File. Für Debian ist sudo nicht notwendig und wurde im Beispiel entfernt: # Add Docker's official GPG key:
apt-get update
apt-get install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
#
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
speichere das Script ab, mache es ausführbar und starte es:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Portainer
Zur Verwaltung der Container ist Portainer eine gute Wahlt. Damit könne mittels grafischer Oberfläche im Browser die Container gesteuert werden. Docker läuft bei mir hier auf einem Raspberry Pi 5. Das geniale an Docker ist die schnelle Verfügbarkeit von Entwicklungsumgebungen. So kann innert Sekunden eine Umgebung mit Drupal gestartet werden. Ist man damit fertig, werden die Containers gestoppt. Da wir uns hier im lokalen Netzwerk bewegen, ist eine https-Verbindung absolut nicht notwendig. WordPress, Drupal und Joomla laufen auf Docker im lokalen Netzwerk problemlos auch ohne https.
In diesem Beispiel erstellen wir eine Partition mit dem Dateisystem ext4 auf der Festplatte und hängen anschliessend die Festplatte permanent unter /mnt/Volume ein.
01. fdisk -l zeigt uns alle verfügbaren Laufwerke an. Die Disk unter /dev/sda hat noch keine Partition.
# fdisk -l
# fdisk -l
Disk /dev/sda: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: WDC WD10EZEX-60M
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xc64dfc2f
02. Starte fdisk mittels Angabe der Disk. Dabei gilt:
# fdisk /dev/sda
(o) = erstellt ein neues Disklabel (create a new empty MBR (DOS) partition table)
(n) = erstellt eine neue Partition
(p) = primäre Partition
(w) = schreibt die Änderungen final auf die Disk
# fdisk /dev/sda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): o
Created a new DOS (MBR) disklabel with disk identifier 0x7ad53c78.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): ENTER
First sector (2048-1953525167, default 2048): ENTER
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525167, default 1953525167):
Created a new partition 1 of type 'Linux' and of size 931.5 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
03. fdisk -l zeigt uns die neu erstellte Partition an:
# fdisk -l
# fdisk -l
(...)
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 1953525167 1953523120 931.5G 83 Linux
04. erstelle ein Dateisystem (hier ext4) für die soeben neue Partition /dev/sda1:
07. falls nötig, ändere den Benutzer. Aktuell hat hier nur root die Berechtigung:
# chown -cR BENUTZER:BENUTZER /mnt/Volume
# chown -cR BENUTZER:BENUTZER /mnt/Volume/
der Eigentümer von '/mnt/Volume/lost+found' wurde von root:root in BENUTZER:BENUTZER geändert
der Eigentümer von '/mnt/Volume/' wurde von root:root in BENUTZER:BENUTZER geändert
Nach stundenlanger Fehlersuche war die Lösung ernüchternd: der ssh-Key benötigt auf dem Server chmod = 600. Besitzer (owner) und Gruppe ist der normale Benutzer.
Um viele Bilder auf einen Rutsch von *.png nach *.jpeg umzuwandeln, benötigen wir das Paket imagemagick:
# apt install imagemagick
Navigiere nun in den Ordner, in welchem sich deine Bilder befinden:
$ cd ~/Bilder
Die Bilder landen alle im selben Verzeichnis, in welchem du dich befindest. Einzelne Bilder werden direkt mit dem Dateinamen angegeben. Die Wildcard als Platzhalter (*) berücksichtig alle Dateien mit der entsprechenden Endung. Die Option -format weist darauf hin, die Datei in ein anderes Bildformat zu wechseln:
crontab kann per Bash-Script ausgeführt werden. In diesem Beispiel erstellen wir uns einen crontab, der jeweils um 23:30 Uhr auf unserem Rocket.Chat Server ein Backup erstellt.
# Starte Backup um 23:30 Uhr
30 23 * * * root bash /root/backup_chat.sh
# lösche Backups > 3 Tage. Überprüfe jeweils um 23:45 Uhr.
45 23 * * * root find /var/snap/rocketchat-server/common/backup/*.* -mtime +3 -exec rm {} \;
#
dieser crontab ruft somit um 23:30 Uhr das backup-Script backup_chat.sh auf. Das Script liegt hier unter /root/backup_chat.sh #!/bin/bash
service snap.rocketchat-server.rocketchat-server stop
snap run rocketchat-server.backupdb
service snap.rocketchat-server.rocketchat-server start
das Script kann im Voraus noch geprüft werden:
# bash /root/backup_chat.sh
[*] Creating backup file...
[+] A backup of your data can be found at /var/snap/rocketchat-server/common/backup/rocketchat_backup_20231113.0944.tar.gz
grep und find sind ideale Werkzeuge um nach einer Datei oder einem bestimmten Muster zu suchen. Typo3 schreibt z. B. folgende Konfiguration für die php.ini vor:
falls wir jetzt keinen Plan haben, wo wir diese Einstellungen finden, hilft uns grep und find. Mittels grep finden wir das Suchmuster in der Datei. find findet uns die Datei php.ini, falls wir nicht wissen, wo diese abgelegt ist.
# grep -r memory_limit * /etc
/etc/php/8.2/cli/php.ini:memory_limit = -1
/etc/php/8.2/apache2/php.ini:memory_limit = 512M
oder
Mit testdisk kannst du bereits gelöschte Dateien wiederherstellen. Testdisk ist ein Kommando-Zeilenprogramm und wird mit den Pfeiltasten und ENTER gesteuert.
# apt install testdisk
# testdisk
01. Starte testdisk. Beim ersten Start wird ein log-File angelegt.
02. Wähle das betroffene Laufwerk:
03. wähle den Partitionstyp aus. In der Regel wählt testdisk automatisch den korrekten Eintrag. Falls du keine exotischen Partitionstypen auf der Platte hast, wähle Intel/PC Partition (für ntfs, ext4, fat32 u. v. m)
04. gehe zu den erweiterten Einstellungen (Advanced)
05. da in diesem Beispiel nur eine Partition vorhanden ist, fällt die Auswahl leicht und wähle UNDELETE:
06. wähle SHIFT + : die einzelnen Dateien, welche du wiederherstellen möchtest und bestätige mit SHIFT + C
Gesteuert wird mit den Pfeiltasten oder pg up bzw. pg down
07. wähle hier den Zielordner. Der Zielordner muss natürlich genügend freien Speicher haben:
08. starte die Wiederherstellung mittels SHIFT + C
Da wir hier mittels root arbeiten, sind die wiederhergestellten Dateien auch root zugeteilt. Nach der Wiederherstellung kannst du die Berechtigung mittels chown ändern:
Normalerweise erstellt der Befehl ssh-keygen einen Schlüssel id_rsa unter dem Home Verzeichnis. Was aber, wenn wir mehrere SSH-Keys verwenden wollen? Den SSH-Key erstellen wir hier für einen normalen Benutzer und niemals für root!
Server IP: 123.45.678.90 Benutzer: USER SSH-Key: id_rsa_local
auf dem Server (hier die IP 123.45.678.90)
Erstelle mittels ssh-keygen den Schlüssel (hier id_rsa_local) und kopiere diesen mittels cat nach ~/.ssh/authorized_keys
$ ssh-keygen -m PEM -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/USER/.ssh/id_rsa): /home/USER/.ssh/id_rsa_local
(...)
(...)
(...)
$ cat ~/.ssh/id_rsa_local.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
The authenticity of host '123.45.678.90 (123.45.678.90)' can't be established.
ED25519 key fingerprint is SHA256:bL8trr2HdSSw777CXIanpYeXvo1826v1Kj78UMa5NtE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '123.45.678.90' (ED25519) to the list of known hosts.
USER@123.45.678.90's password: DEIN USER PASSWORT
Nun lassen wir uns den SSH-Key anzeigen und kopieren diesen Schlüssel auf unseren Client-PC:
$ less ~/id_rsa_local
Client PC
auf dem Client PC benötigen wir den ssh-key und ein config-File. Der ssh-key (hier id_rsa_local) muss die Berechtigung 600 haben. Diese Berechtigung ist per root zu setzen:
# chmod 600 /home/BENUTZER/.ssh/id_rsa_local
Erstelle unter ~.ssh ein config File mit:
$ nano ~/.ssh/config
# ssh configuration file
# BEISPIEL / EXAMPLE
# HostName = IP Adresse des Servers, z.B. 123.45.67.890
Host local
HostName 123.45.678.90
Port 123456
User USER
IdentityFile ~/.ssh/id_rsa
Host mailserver
HostName 25.10.200.4
Port 22
User dana
IdentityFile ~/.ssh/id_rsa_mailserver
Host backupserver
HostName 9.12.200.5
Port 22
User annalena
IdentityFile ~/.ssh/id_rsa_backupserver
Nun reicht die Übergabe des Host nach ssh:
$ ssh local
root-Login und Passwort verbieten
Vorsicht! Mach dies nur, wenn mit der Anmeldung SSH-Key wirklich alles klappt. An sonst kannst du dich vom System aussperren. Editiere dazu die /etc/ssh/sshd_config
# nano /etc/ssh/sshd_config
Setze nun PasswordAuthentication und PermitRootLogin auf den Wert no PermitRootLogin no
PasswordAuthentication no
starte den Dienst neu:
# systemctl restart sshd
weitere Verschlüsselungen
Erstellen wir den Schlüssel mittels ED25519 oder ECDSA ist das Vorgehen analog! Der öffentliche Schlüssel (z.B. id_ecdsa.pub) muss nach ~/.ssh/known_hosts kopiert werden, während der geheime Schlüssel (z.B. id_ecdsa) auf dem Client-PC landen muss.
Nun übertragen/kopieren wir den privaten Schlüssel id_rsa nach: C:\Users\BENUTZER\.ssh
Achte darauf, bei Windows die Dateierweiterung .txt zu entfernen. Die Datei heisst hier id_rsa und nicht id_rsa.txt
Bei einem Login wird nun der private Schlüssel auf Deinem PC mit dem Schlüssel auf dem Server abgeglichen. Passen die zusammen, wird die Verbindung akzeptiert.
Linux
Hier muss zwingend die Berechtigung vom id_rsa Schlüssel unter ~/.ssh/id_rsa auf 600 gesetzt werden. Ansonst kommt es zu diesem Vorfall:
$ ssh yuna@192.168.0.81 -p 22
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0770 for '/home/BENUTZER/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/BENUTZER/.ssh/id_rsa": bad permissions
yuna@192.168.0.81's password:
(...)
Mittels crontab lassen sich auf deinem Server Prozesse automatisieren. Angenommen, ich möchte jeden Tag um 00:10 Uhr die gesamte Datenbank sichern.
Starte crontab:
$ crontab -e
Im Editorfenster geben wir nun den gewünschten crontab ein: # sichere die Datenbank alle Tage um 00:10. Überschreibe das aktuelle File jeweils:
10 0 * * * /usr/bin/mysqldump --all-databases --single-transaction --quick --lock-tables=false -r /opt/dbfull.sql
crontab sorgt dafür, dass die jeweiligen Files zum angegebenen Zeitpunkt auf dem Server liegen.
root darf alles, wirklich alles!
Dabei spielt es eine wesentliche Rolle, ob wir crontab als normalen Benutzer oder als root ausführen. root darf alles! Editiere in diesem Fall die /etc/crontab – hier kannst du den Benutzer, welcher den Befehl ausführen soll auch gleich mitgeben. Doch Vorsicht! root kann wirklich alles. Du kannst hier auf Kommando auch dein gesamtes System zerstören!
# crontab -e
Zeitstempel
Geben wir der Zielatei keinen Zeitstempel mit, überschreibt crontab das jeweilige File. Einen Zeitstempel geben wir mittels date an:
example_$(date +"\%Y-\%m-\%d_\%H-\%M").sql
wird z. B. zu: example_2004-03-05_09-58.sql
In diesem Beispiel entspricht dies dem 05. März 2004 um 09:58 Uhr. (YYYY/mm/DD/HH/MM)
Zeit bestimmen (Beispiele)
# Zeitbeispiele
.---------------- Minuten (0 - 59)
| .------------- Stunden (0 - 23)
| | .---------- Tag im Monat (1 - 31)
| | | .------- Monat (1 - 12) oder jan,feb,mar,apr ...
| | | | .---- Tag der Woche (0 - 6) (Sonntag=0 oder 7) oder mon,tue,wed,thu,fri,sat
| | | | |
* * * * *
# sendet jeden Tag um 12:00 Uhr einen ping an example.com
0 12 * * * ping -c1 example.com
# sendet jeden Montag, Mittwoch und Freitag um 04:05 Uhr einen ping an example.com
5 4 * * mon,wed,fri ping -c1 example.com
# sendet alle 20 Minuten einen ping an example.com
*/20 * * * * ping -c1 example.com