Basis Installation Ubuntu 24.04

1. Hetzner

Server in den Rescue-Modus schalten via https://robot.hetzner.com/server

SSH-Verbindung zum Server herstellen und installimage ausführen.

ssh root@<ip-adresse>

installimage

Linux Distribution auswählen: Ubuntu 24.04.

Konfigurationsdatei anpassen.

  • HOSTNAME <subdomain> (Damit später <subdomain>.locr.com als Domain funktioniert, kann aber nachträglich via hostnamectl set-hostname <hostname> geändert werden).

  • SWRAID 0 ("RAID aus", optional).

  • SW_RAID_LEVEL 0 (nur mit SWRAID 1: Festplattenkapazität addiert sich, optional).

  • Reihenfolge der Platten ändern, so dass /dev/sda an 1. Stelle steht (optional).

installimage ausführen und danach Rechner neu starten.

reboot

SSH-Verbindung zum Server herstellen.

ssh root@<ip-adresse>

User serverconnect anlegen

adduser serverconnect
usermod -aG sudo serverconnect

Abmelden und mit serverconnect anmelden.

Schlüssel auf dem Server für serverconnect anlegen.

ssh-keygen -t ed25519

Optional den Client-Schlüssel auf dem Server hinterlegen.

# Linux-Client:
# ssh-keygen -t ed25519 # Wenn noch nicht vorhanden
ssh-copy-id serverconnect@<ip-adresse>

# Windows-Client Powershell:
# ssh-keygen # Wenn noch nicht vorhanden
# type $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 12622 serverconnect@locroffice.dyndns.org "cat >> .ssh/authorized_keys"

root Zugang deaktivieren (/etc/ssh/sshd_config bearbeiten).

PermitRootLogin no

SSH Service neustarten.

sudo service ssh restart

2. Pakete installieren und andere Grundeinstellungen

sudo apt update
sudo apt upgrade -y
sudo apt install -y apache2-utils cockpit cockpit-podman gnupg2 nginx pass php php-fpm phppgadmin pinentry-tty podman postgis postgresql ssl-cert zfsutils-linux
sudo apt purge apache2
sudo apt autoremove

serverconnect die Rechte geben, Services zu starten und zu stoppen. Sorgt dafür, dass Dienste weiterlaufen, wenn serverconnect sich ausloggt.

loginctl enable-linger serverconnect

Neue .htpasswd Datei für serverconnect erstellen (für Passwortschutz von Webseiten).

sudo htpasswd -c /etc/nginx/.htpasswd serverconnect

2.1. /etc/containers/registries.conf anpassen

# Zeile einblenden und docker.io eintragen
unqualified-search-registries = ["docker.io"]

3. ZFS einbinden

3.1. Bei vorhandenem ZFS Pool

# welche pools sind nicht eingebunden?
sudo zpool import

# wenn poolname nicht 'zfs_pool' heißt, dann
sudo zpool import -f <poolname> zfs_pool
# ansonsten
sudo zpool import -f zfs_pool

3.2. ZFS Pool erstellen

Partitionen ermitteln. - ls /dev zeigt alle devices an. - cfdisk /dev/sda, cfdisk /dev/nvme0n1 zeigt Partitionierungen an.

# um ein neuen zfs pool zu erstellen
sudo zpool create -o ashift=12 zfs_pool /dev/sda1
# Optional: um eine Datei für zfs_pool vorzubereiten
sudo dd if=/dev/zero of=/media/zfs/simulate.disk1 bs=1G count=500
# um weitere Partitionen hinzuzufügen
sudo zpool add zfs_pool /dev/sdb1

# Status des Pools abfragen
sudo zpool status
sudo zpool list

# weitere Optionen
sudo zfs set compression=lz4 zfs_pool # Komprimierung aktivieren
sudo zfs set checksum=off zfs_pool # schreiben von Checksummen deaktivieren, wenn Datenintegrität nicht sehr hohe Priorität hat!
sudo zfs set atime=off zfs_pool # Zugriffszeit auf Dateien wird nicht mehr von ZFS geschrieben.

4. nginx Konfiguration anpassen

4.1. /etc/nginx/nginx.conf

PHP-Version ermitteln.

php_version=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
echo "Gefundene PHP-Version: $php_version"
sudo nano /etc/nginx/nginx.conf
...
http {
...
    upstream php {
        server unix:/run/php/php<php_version>-fpm.sock; # `<php_version>` anpassen!
    }
...
}
...

Socket kontrollieren ob er existiert

ls -l /run/php/php${php_version}-fpm.sock

4.2. /etc/nginx/conf.d/php

sudo tee /etc/nginx/conf.d/php > /dev/null <<'EOF'
location ~ \.php$ {
    fastcgi_pass php;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 86400;

    include fastcgi_params;
}
EOF

4.3. /etc/nginx/sites-enabled/default

sudo nano /etc/nginx/sites-enabled/default
server {
...
    # Kommentare entfernen
    listen 443 ssl default_server http2;
    listen [::]:443 ssl default_server http2;

    # Kommentar entfernen oder echtes Let's Encrypt Zertifikat hinzufügen!
    include snippets/snakeoil.conf;

    # Hinzufügen: Let's Encrypt darf sofort auf das .well-known Verzeichnis zugreifen.
    location /.well-known {
        try_files $uri $uri/ =404;
    }

    # Weiterleitung von HTTP zu HTTPS
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }

    # Anpassen: für späteren Zugriff auf die Subdomain
    server_name <domain_name>; # "<domain_name>" anpassen, z.B. "services1.locr.com".

    # Anpassen: für späteren Let's Encrypt Zugriff
    root /var/www;

    # Anpassen: für phpmyadmin/phppgadmin
    index index.php index.html index.htm index.nginx-debian.html;

    # Hinzufügen für PHP
    location ~ ^/phppgadmin {
        root /usr/share;

        include conf.d/php; # Die Datei von oben einbinden!
    }
...
}

4.4. nginx Server neustarten

sudo service nginx restart

5. postgresql Konfiguration anpassen

5.1. ZFS Unterordner anlegen

sudo zfs create zfs_pool/dbs
sudo zfs create zfs_pool/dbs/postgresql

5.2. Berechtigungen des Datenverzeichnisses sicherstellen

sudo chown -R postgres:postgres /zfs_pool/dbs/postgresql

5.3. /etc/postgresql/16/main/postgresql.conf

...
data_directory = '/zfs_pool/dbs/postgresql/16/main'
...

5.4. PostgreSQL Dienst stoppen

sudo service postgresql stop

5.5. PostgreSQL Daten auf ZFS kopieren

sudo cp -r /var/lib/postgresql/* /zfs_pool/dbs/postgresql/

5.6. PostgreSQL Dienst starten

sudo service postgresql start

5.7. Datei /etc/postgresql/16/main/postgresql.conf anpassen

sudo nano /etc/postgresql/16/main/postgresql.conf

Einstellungen wie unter PGTune empfohlen durchführen!

5.7.1. PostgreSQL Server neustarten

sudo service postgresql restart

5.7.2. Passwort für postgres user setzen

sudo -u postgres psql
ALTER USER postgres PASSWORD '<my_secret_password>';

5.8. /usr/share/phppgadmin/conf/config.inc.php

Damit sich auch der "postgres" user über die admin Oberfläche anmelden kann!

sudo nano /usr/share/phppgadmin/conf/config.inc.php
$conf['extra_login_security'] = false;

5.8.1. Zugriff überprüfen: https://<subdomain>.locr.com/phppgadmin

  • Benutzer: postgres

6. /etc/hosts (nur bei internen Rechnern)

...
192.168.100.130 maps2.locr.com
192.168.100.131 maps3.locr.com
...

7. Cockpit UI

Um auf die Cockpit Oberfläche zuzugreifen, im Browser <ip-adresse>:9090 eingeben!
Dort kann man sich dann die Podman Images und laufenden Container ansehen/verwalten.

8. Sicheren Passwort Store mit GnuPG2 einrichten

gpg2 --full-generate-key # defaults akzeptieren. Real name: locr. Email address: support@locr.com
sudo update-alternatives --config pinentry # Den Eintrag mit '/usr/bin/pinentry-tty' auswählen!
pass init support@locr.com

Passwörter hinzufügen, bearbeiten und anzeigen (Allgemeine Befehle)

# pass insert <password-name>
# pass edit <password-name>
# pass <password-name>

9. Let’s Encrypt Zertifikat installieren

9.1. Zertifikat anfordern (neues Verfahren)

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx

9.2. Zertifikat anfordern (altes Verfahren)

sudo apt install certbot
sudo certbot certonly --email entwicklung@locr.com --webroot -w /var/www -d <subdomain>.locr.com

9.2.1. Zertifikat in nginx einbinden: /etc/nginx/sites-enabled/default

server {
...
    ssl_certificate     /etc/letsencrypt/live/osmbuilder2.locr.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/osmbuilder2.locr.com/privkey.pem;
    # include snippets/snakeoil.conf; # auskommentieren
...
}

9.3. /usr/lib/systemd/system/certbot.service anpassen (Evtl. bei neuem Verfahren nicht mehr nötig?)

...
ExecStart=/usr/bin/certbot -q renew --deploy-hook "systemctl reload nginx" --no-random-sleep-on-renew
...
sudo systemctl daemon-reload
sudo systemctl restart certbot

9.4. nginx Server neustarten

sudo service nginx restart

10. 2-Faktor-Authentifizierung für ssh einrichten

10.1. eigene Anleitung für Ubuntu 24.04

sudo apt install libpam-google-authenticator

10.2. Zeile in /etc/pam.d/sshd hinzufügen

sudo nano /etc/pam.d/sshd
auth required pam_google_authenticator.so nullok

10.3. SSH Dienst neustarten

sudo systemctl restart ssh

10.4. /etc/ssh/sshd_config anpassen

sudo nano /etc/ssh/sshd_config
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
KbdInteractiveAuthentication yes

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication yes

10.5. google-authenticator ausführen

google-authenticator -t -d -f -r 3 -R 30
  • -t – time-based (TOTP) codes

  • -d – disallow token reuse

  • -f – write the file without confirmation

  • -r 3 – max 3 attempts …

  • -R 30 – …in a 30 s window (rate-limit)

10.6. SSH Dienst neustarten

sudo systemctl restart ssh
  • 2FA testen