#!/bin/bash # Container Training — Ubuntu 24.04 (Noble) Setup # Als root oder mit sudo ausführen: sudo bash setup-ubuntu2404.sh set -e RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } fail() { echo -e "${RED}[FEHLER]${NC} $*"; exit 1; } [ "$(id -u)" -eq 0 ] || fail "Bitte als root oder mit sudo ausführen." # Ubuntu 24.04 prüfen if [ -f /etc/os-release ]; then . /etc/os-release if [ "$ID" != "ubuntu" ] || [ "$VERSION_CODENAME" != "noble" ]; then warn "Dieses Script ist für Ubuntu 24.04 (Noble) geschrieben — läuft auf: $PRETTY_NAME" fi fi echo "================================================" echo " Container-Schulung — Setup (Ubuntu 24.04)" echo "================================================" echo "" # Trainingsuser ermitteln TRAINING_USER=${SUDO_USER:-""} if [ -z "$TRAINING_USER" ]; then warn "SUDO_USER nicht gesetzt — Linger wird nicht konfiguriert." warn "Ggf. manuell ausführen: loginctl enable-linger " fi # ------------------------------------------------------- echo "" echo "[1/5] Basis-Tools..." # ------------------------------------------------------- apt-get update -q apt-get install -y \ iputils-ping \ iproute2 \ net-tools \ dnsutils \ curl \ wget \ git \ vim \ jq \ bash-completion ok "Basis-Tools installiert." # ------------------------------------------------------- echo "" echo "[2/5] Podman + rootless-Abhängigkeiten..." # ------------------------------------------------------- # Ubuntu 24.04 liefert Podman >= 4.9 aus dem universe-Repo — kein Fremdrepo nötig add-apt-repository -y universe apt-get update -q apt-get install -y \ podman \ slirp4netns \ fuse-overlayfs \ uidmap \ dbus-user-session \ systemd-container PODMAN_VER=$(podman --version | awk '{print $3}') PODMAN_MINOR=$(echo "$PODMAN_VER" | cut -d. -f2) PODMAN_MAJOR=$(echo "$PODMAN_VER" | cut -d. -f1) if [ "$PODMAN_MAJOR" -gt 4 ] || { [ "$PODMAN_MAJOR" -eq 4 ] && [ "$PODMAN_MINOR" -ge 4 ]; }; then ok "Podman $PODMAN_VER — Quadlets werden unterstützt." else warn "Podman $PODMAN_VER — Quadlets brauchen >= 4.4! Tag 3 könnte Probleme machen." fi # ------------------------------------------------------- echo "" echo "[3/5] Registry-Konfiguration..." # ------------------------------------------------------- # Drop-in statt Hauptdatei überschreiben — sauber und updatefest mkdir -p /etc/containers/registries.conf.d cat > /etc/containers/registries.conf.d/10-unqualified-search.conf << 'EOF' # Kurzname-Auflösung: docker.io und quay.io werden automatisch durchsucht unqualified-search-registries = ['docker.io', 'quay.io'] EOF ok "unqualified-search-registries konfiguriert (docker.io, quay.io)." # ------------------------------------------------------- echo "" echo "[4/5] podman-compose + trivy..." # ------------------------------------------------------- apt-get install -y podman-compose 2>/dev/null \ || pip3 install --quiet podman-compose ok "podman-compose installiert." # trivy curl -fsSL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh \ | sh -s -- -b /usr/local/bin latest ok "trivy installiert: $(trivy --version | head -1)" # ------------------------------------------------------- echo "" echo "[5/5] Benutzer-Setup ($TRAINING_USER)..." # ------------------------------------------------------- if [ -n "$TRAINING_USER" ]; then loginctl enable-linger "$TRAINING_USER" ok "Linger aktiviert für $TRAINING_USER — systemctl --user überlebt Logout." # subuid/subgid für rootless Container if ! grep -q "^${TRAINING_USER}:" /etc/subuid 2>/dev/null; then usermod --add-subuids 100000-165535 "$TRAINING_USER" usermod --add-subgids 100000-165535 "$TRAINING_USER" ok "subuid/subgid konfiguriert." else ok "subuid/subgid bereits vorhanden." fi # podman socket für den User aktivieren (für podman compose) systemctl enable --now podman.socket 2>/dev/null || true su - "$TRAINING_USER" -c "systemctl --user enable --now podman.socket" 2>/dev/null || true ok "Podman socket aktiviert." else warn "Kein Trainingsuser — Linger, subuid/subgid und socket übersprungen." fi # ------------------------------------------------------- echo "" echo "================================================" echo " Zusammenfassung" echo "================================================" podman --version podman-compose --version 2>/dev/null | head -1 || true trivy --version | head -1 echo "" echo "Registry-Konfiguration:" cat /etc/containers/registries.conf.d/10-unqualified-search.conf echo "" if [ -n "$TRAINING_USER" ]; then echo "Benutzer: $TRAINING_USER" echo "Linger: $(loginctl show-user "$TRAINING_USER" --property=Linger --value 2>/dev/null || echo 'unbekannt')" fi echo "" ok "Setup abgeschlossen. Bitte einmal aus- und wieder einloggen."