# Linux - Proxmox

# Proxmox VE 9 auf verschlüsseltem Debian 13 mit Dropbear-Remote-Unlock installieren

Diese Anleitung beschreibt die Installation von Proxmox VE 9 auf einem bereits installierten Debian 13 System mit verschlüsseltem Root-Dateisystem via LUKS. Das System wird vor dem Boot per `dropbear-initramfs` über SSH entsperrt. Zusätzlich wird ein zweiter verschlüsselter lokaler Storage für VM-Disks und ISO-Dateien eingerichtet.

**Ausgangslage in diesem Beispiel:**

<div class="callout info" id="bkmrk-debian-13-trixie-ist">- Debian 13 Trixie ist bereits installiert.
- Root liegt auf LUKS + LVM.
- `/boot` und `/boot/efi` sind unverschlüsselt.
- `dropbear-initramfs` funktioniert bereits.
- Der Server wird als `root` administriert.
- Hostname: `byte-me`
- Management-IP: `10.100.3.13`

</div>---

## 1. Bestehende Partitionierung prüfen

```
lsblk
df -h
uname -r
```

Beispielhafte Zielstruktur für das Systemlaufwerk:

```
nvme0n1
├─nvme0n1p1        /boot/efi
├─nvme0n1p2        /boot
└─nvme0n1p3        crypto_LUKS
  └─nvme0n1p3_crypt
    ├─broken--vg-root   /
    └─broken--vg-swap_1 [SWAP]
```

**Wichtig:** `/boot` ist bei verschlüsselten Debian-Installationen oft klein. Proxmox-Kernel und Initramfs-Dateien können sehr groß werden. Vor der Installation sollte ausreichend Platz geschaffen werden.

---

## 2. Alten Debian-Kernel bereinigen

Aktuell laufenden Kernel prüfen:

```
uname -r
```

Installierte Kerneldateien prüfen:

```
ls -lh /boot
dpkg -l 'linux-image*' 'linux-headers*' | awk '/^ii|^rc/ {print $1, $2, $3}'
```

Wenn mehrere alte Kernel vorhanden sind, zuerst in den neuesten Debian-Kernel booten und danach alte Kernel entfernen.

Beispiel:

```
apt purge linux-image-6.12.85+deb13-amd64
apt autoremove
update-grub
df -h /boot
```

Falls das Paket anders heißt, den Besitzer der Kerneldatei ermitteln:

```
dpkg -S /boot/vmlinuz-6.12.85+deb13-amd64
```

Dann das exakt passende Paket entfernen, zum Beispiel:

```
apt purge linux-image-6.12.85+deb13-amd64-unsigned
```

---

## 3. Proxmox Repository einrichten

Benötigte Werkzeuge installieren:

```
apt install -y wget ca-certificates
```

Proxmox-Keyring für Debian 13 / Trixie herunterladen:

```
wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg -O /usr/share/keyrings/proxmox-archive-keyring.gpg
```

Hash prüfen:

```
sha256sum /usr/share/keyrings/proxmox-archive-keyring.gpg
```

Erwarteter Hash:

```
136673be77aba35dcce385b28737689ad64fd785a797e57897589aed08db6e45  /usr/share/keyrings/proxmox-archive-keyring.gpg
```

Repository-Datei anlegen:

```
cat > /etc/apt/sources.list.d/proxmox.sources <<'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
```

Paketlisten aktualisieren:

```
apt update
```

---

## 4. Proxmox-Kernel installieren

Zuerst nur den Proxmox-Kernel installieren, noch nicht das komplette Proxmox-Paket:

```
apt install proxmox-default-kernel
```

Danach GRUB prüfen:

```
update-grub
```

Erwartet wird ein Eintrag ähnlich zu:

```
Found linux image: /boot/vmlinuz-7.0.2-2-pve
Found initrd image: /boot/initrd.img-7.0.2-2-pve
```

---

## 5. Initramfs-Größe bei kleinem /boot reduzieren

Bei kleinem `/boot` kann der Proxmox-Initramfs zu groß werden. In diesem Setup wurde die Kompression von `zstd` auf `xz` geändert.

Datei öffnen:

```
nano /etc/initramfs-tools/initramfs.conf
```

Diese Zeile ändern:

```
COMPRESS=zstd
```

zu:

```
COMPRESS=xz
```

`MODULES=most` wurde bewusst beibehalten, damit Netzwerk- und Storage-Treiber für Dropbear/LUKS möglichst robust im Initramfs enthalten bleiben.

Proxmox-Initramfs neu bauen:

```
update-initramfs -c -k 7.0.2-2-pve
```

Prüfen:

```
df -h /boot
ls -lh /boot/initrd.img-7.0.2-2-pve
```

---

## 6. In den Proxmox-Kernel booten

```
reboot
```

Nach dem Reboot wie gewohnt per Dropbear entsperren.

Danach prüfen:

```
uname -r
```

Erwartet:

```
7.0.2-2-pve
```

---

## 7. Debian-Kernel entfernen

Nachdem der Proxmox-Kernel erfolgreich gebootet wurde, können die Debian-Kernel entfernt werden. Das schafft Platz in `/boot` und verhindert spätere Initramfs-Probleme.

Paketnamen ermitteln:

```
dpkg -S /boot/vmlinuz-6.12.86+deb13-amd64
```

Falls Debian-Headers den Kernel wieder installieren wollen, Kernel und Headers zusammen entfernen:

```
apt purge linux-image-6.12.86+deb13-amd64-unsigned linux-headers-6.12.86+deb13-amd64 linux-headers-6.12.86+deb13-common linux-headers-amd64
```

Danach Proxmox-Initramfs erneut bauen:

```
update-initramfs -c -k 7.0.2-2-pve
update-grub
df -h /boot
```

---

## 8. ZFS-DKMS entfernen und Proxmox-ZFS verwenden

Falls Debian-ZFS bereits installiert war, insbesondere `zfs-dkms`, sollte `zfs-dkms` entfernt werden. Proxmox nutzt eigene Kernel und passende ZFS-Pakete.

ZFS-Pakete prüfen:

```
dpkg -l 'zfs*' 'spl*' | awk '/^ii|^rc/ {print $1, $2, $3}'
```

`zfs-dkms` entfernen:

```
apt purge zfs-dkms
```

Falls dabei `zfsutils-linux` und `zfs-zed` entfernt wurden, diese aus dem Proxmox-Repository wieder installieren:

```
apt install zfsutils-linux zfs-zed
```

Prüfen:

```
dpkg -l 'zfs*' 'proxmox*' 'pve*' | awk '/^ii|^rc/ {print $1, $2, $3}'
```

Gewünscht:

```
ii proxmox-default-kernel ...
ii proxmox-kernel-7.0 ...
ii pve-firmware ...
ii zfs-zed ...
ii zfsutils-linux ...
```

Nicht gewünscht:

```
ii zfs-dkms ...
```

---

## 9. Proxmox VE installieren

```
apt install proxmox-ve postfix open-iscsi chrony
```

Bei der Postfix-Abfrage kann für einen normalen Proxmox-Host gewählt werden:

```
Local only
```

Entfernungen während der Installation sind normal:

- `exim4-*` wird durch `postfix` ersetzt.
- `ifupdown` wird durch `ifupdown2` ersetzt.
- `systemd-timesyncd` wird durch `chrony` ersetzt.

---

## 10. Hostname-Auflösung für Proxmox korrigieren

Proxmox benötigt, dass der Hostname auf eine echte Nicht-Loopback-IP zeigt. Wenn `pve-cluster` nicht startet und im Journal steht:

```
Unable to resolve node name 'byte-me' to a non-loopback IP address
```

dann muss `/etc/hosts` angepasst werden.

Datei öffnen:

```
nano /etc/hosts
```

Beispiel:

```
127.0.0.1       localhost
10.100.3.13     byte-me.localdomain byte-me

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```

**Wichtig:** Der Hostname `byte-me` darf nicht auf `127.0.0.1` oder `127.0.1.1` zeigen.

Prüfen:

```
hostname
hostname -f
getent hosts byte-me
```

Erwartung:

```
byte-me
byte-me.localdomain
10.100.3.13 byte-me.localdomain byte-me
```

Proxmox-Dienste neu starten:

```
systemctl reset-failed pve-cluster
systemctl restart pve-cluster
systemctl restart pvedaemon pveproxy pvestatd
```

Status prüfen:

```
systemctl status pve-cluster pvedaemon pveproxy pvestatd --no-pager
```

Erwartung:

```
pve-cluster   active
pvedaemon     active
pveproxy      active
pvestatd      active
```

Weboberfläche:

```
https://10.100.3.13:8006/
```

---

# Verschlüsselten lokalen VM-Storage einrichten

Zusätzlich wurde eine zweite NVMe als verschlüsselter Storage für VMs und ISO-Dateien eingerichtet. In diesem Beispiel:

```
/dev/nvme1n1
```

**Achtung:** Die folgenden Schritte löschen die Zielplatte. Nicht auf dem Systemlaufwerk ausführen.

---

## 11. Zielplatte prüfen

```
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL
wipefs -n /dev/nvme1n1
```

Beispiel:

```
nvme1n1 953,9G disk SKHynix_HFS001TEJ9X162N
```

---

## 12. Partition erstellen

```
fdisk /dev/nvme1n1
```

In `fdisk`:

```
g
n
1


y
w
```

Danach prüfen:

```
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL /dev/nvme1n1
```

Erwartung:

```
nvme1n1       953,9G disk
└─nvme1n1p1   953,9G part
```

---

## 13. LUKS2 sicher formatieren

```
cryptsetup luksFormat \
  --type luks2 \
  --label crypt-vmstore \
  --cipher aes-xts-plain64 \
  --key-size 512 \
  --hash sha512 \
  --pbkdf argon2id \
  --iter-time 5000 \
  --verify-passphrase \
  /dev/nvme1n1p1
```

Eine lange Passphrase verwenden. Keine kurzen Passwörter, keine Projektnamen, keine Tastaturmuster.

---

## 14. LUKS öffnen

In diesem Beispiel wurde der Mapper `exploding_disk` genannt.

```
cryptsetup open /dev/nvme1n1p1 exploding_disk
```

Prüfen:

```
lsblk /dev/nvme1n1p1
```

Erwartung:

```
nvme1n1p1
└─exploding_disk
```

---

## 15. LUKS-Header sichern

Ein LUKS-Header-Backup ist wichtig. Wenn der Header beschädigt wird, sind die Daten sonst praktisch verloren.

```
mkdir -p /root/luks-header-backups
chmod 700 /root/luks-header-backups

cryptsetup luksHeaderBackup /dev/nvme1n1p1 \
  --header-backup-file /root/luks-header-backups/nvme1n1p1-crypt-vmstore-header.img

chmod 400 /root/luks-header-backups/nvme1n1p1-crypt-vmstore-header.img
```

Dieses Header-Backup sollte zusätzlich extern und sicher verschlüsselt gesichert werden. Ohne passenden Header und ohne Passphrase sind die Daten nicht wiederherstellbar.

---

## 16. LVM auf dem entschlüsselten Device erstellen

```
pvcreate /dev/mapper/exploding_disk
vgcreate vg_vmstore /dev/mapper/exploding_disk
```

Prüfen:

```
vgs
pvs
```

Erwartung:

```
VG           VSize    VFree
vg_vmstore   953,85g  953,85g
```

---

## 17. LVM-thin für VM-Disks erstellen

```
lvcreate -L 850G -T vg_vmstore/vmdata
```

Prüfen:

```
lvs
```

Beispiel:

```
LV       VG          Attr       LSize
vmdata   vg_vmstore  twi-a-tz-- 850,00g
```

---

## 18. ISO-Storage erstellen

```
lvcreate -L 60G -n iso vg_vmstore
mkfs.ext4 -L pve-iso /dev/vg_vmstore/iso
mkdir -p /mnt/pve/iso-store
```

UUID anzeigen:

```
blkid /dev/vg_vmstore/iso
```

Beispiel:

```
/dev/vg_vmstore/iso: LABEL="pve-iso" UUID="0f1496f7-d7ad-4e97-9243-cff799d44e5e" BLOCK_SIZE="4096" TYPE="ext4"
```

---

## 19. ISO-Storage in /etc/fstab eintragen

```
nano /etc/fstab
```

Eintrag ergänzen:

```
UUID=0f1496f7-d7ad-4e97-9243-cff799d44e5e /mnt/pve/iso-store ext4 defaults,noatime 0 2
```

Systemd neu laden und Mount testen:

```
systemctl daemon-reload
mount -a
df -h /mnt/pve/iso-store
```

---

## 20. Storage in Proxmox eintragen

LVM-thin für VM- und Container-Disks:

```
pvesm add lvmthin vmstore \
  --vgname vg_vmstore \
  --thinpool vmdata \
  --content images,rootdir
```

Directory-Storage für ISOs und Container-Templates:

```
pvesm add dir iso-store \
  --path /mnt/pve/iso-store \
  --content iso,vztmpl
```

Status prüfen:

```
pvesm status
```

Beispiel:

```
Name             Type     Status     Total (KiB)      Used (KiB) Available (KiB)        %
iso-store         dir     active        61611820            2084        58447624    0.00%
local             dir     active       477545328       154494456       298719404   32.35%
vmstore       lvmthin     active       891289600               0       891289600    0.00%
```

---

# Optional: Automatisches Entsperren des zweiten LUKS-Storage

Ein Keyfile auf dem verschlüsselten Root-Dateisystem ist komfortabel, reduziert aber die Trennung der Sicherheitsstufen. Ohne Keyfile braucht ein Angreifer bei Diebstahl beider Platten Root-Passphrase und Storage-Passphrase. Mit Keyfile reicht die Root-Passphrase, weil danach das Keyfile verfügbar ist.

## Variante A: Maximale Trennung

Kein Keyfile verwenden. Nach jedem Boot manuell entsperren:

```
cryptsetup open /dev/nvme1n1p1 exploding_disk
vgchange -ay vg_vmstore
mount -a
```

VM-Autostart für VMs auf diesem Storage sollte dann deaktiviert werden, weil der Storage nach dem Boot zunächst fehlt.

## Variante B: Komfortabler Auto-Unlock nach Root-Unlock

Keyfile auf verschlüsseltem Root-Dateisystem erstellen:

```
mkdir -p /root/luks-keys
chmod 700 /root/luks-keys

dd if=/dev/random of=/root/luks-keys/exploding_disk.key bs=64 count=1
chmod 400 /root/luks-keys/exploding_disk.key
```

Keyfile zu LUKS hinzufügen:

```
cryptsetup luksAddKey /dev/nvme1n1p1 /root/luks-keys/exploding_disk.key
```

LUKS-UUID anzeigen:

```
blkid /dev/nvme1n1p1
```

`/etc/crypttab` bearbeiten:

```
nano /etc/crypttab
```

Eintrag ergänzen:

```
exploding_disk UUID=DEINE-LUKS-UUID-HIER /root/luks-keys/exploding_disk.key luks
```

Systemd neu laden:

```
systemctl daemon-reload
```

---

# Ceph-Zukunftsplanung

Für später geplante drei Proxmox-Nodes mit Ceph gilt:

- Die aktuell lokal genutzte NVMe muss später für Ceph gelöscht werden.
- VMs müssen vorher vom lokalen Storage auf Ceph migriert werden.
- Ceph-OSDs sollten später direkt über Proxmox/Ceph mit Encryption erstellt werden.
- Nicht vorher manuell LUKS + LVM bauen und dann Ceph darüberlegen.

Geplanter späterer Ablauf:

```
1. PVE 2 und PVE 3 installieren
2. Cluster erstellen
3. Dediziertes 10G-Netz für Ceph konfigurieren
4. Ceph installieren
5. Auf allen Nodes freie NVMe als verschlüsselte Ceph-OSD einrichten
6. Ceph-Pool erstellen
7. VM-Storage auf Ceph RBD anlegen
8. VMs vom lokalen vmstore auf Ceph migrieren
9. Lokalen LUKS/LVM-Storage auf nvme1n1 entfernen
10. nvme1n1 als Ceph-OSD neu verwenden
```

Mit nur einem Node ist Ceph nicht sinnvoll redundant. Für produktive Ceph-Nutzung sollten mindestens drei Proxmox-Nodes vorhanden sein.

---

# Wichtige Checks nach der Einrichtung

```
dpkg --audit
df -h /boot
uname -r
pvesm status
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
vgs
lvs
systemctl status pve-cluster pvedaemon pveproxy pvestatd --no-pager
```

Erwartung:

```
Kernel: 7.0.2-2-pve
/boot nicht voll
pve-cluster active
pvedaemon active
pveproxy active
pvestatd active
vmstore active
iso-store active
```

---

# Zusammenfassung

- Debian 13 mit LUKS-Root und Dropbear-Remote-Unlock wurde als Basis verwendet.
- Proxmox VE 9 wurde auf Debian installiert.
- Der Proxmox-Kernel wurde zuerst einzeln installiert und getestet.
- `/boot`-Probleme wurden durch Entfernen alter Debian-Kernel und `COMPRESS=xz` behoben.
- `zfs-dkms` wurde entfernt und Proxmox-ZFS verwendet.
- Hostname-Auflösung wurde für `pve-cluster` korrigiert.
- Eine zweite NVMe wurde mit LUKS2 verschlüsselt.
- Darauf wurde LVM-thin für VM-Disks eingerichtet.
- Ein ext4-LV wurde als ISO-/Template-Storage eingebunden.
- Späterer Ceph-Betrieb ist möglich, erfordert aber Migration und Neuanlage der Disk als Ceph-OSD.

# Proxmox VE ohne Subscription: kostenlose Repositories nutzen und Subscription-Hinweis ausblenden

Diese Anleitung beschreibt, wie ein Proxmox VE 9 System unter Debian 13 Trixie sauber auf kostenlose Repositories umgestellt wird. Zusätzlich wird erklärt, wie die Popup-Meldung **„No valid subscription - You do not have a valid subscription for this server“** in der Proxmox-Weboberfläche ausgeblendet wird.

**Wichtig:** Das Verwenden von `pve-no-subscription` und `ceph no-subscription` ist für Homelab- und Testsysteme normal. Proxmox zeigt dafür aber weiterhin Warnungen in der Repository-Ansicht an, weil diese Repositories nicht für produktive Systeme mit Support-Anspruch empfohlen werden.

**Nicht verwechseln:** Die gelben Repository-Warnungen unter `Updates → Repositories` sind nicht dieselbe Meldung wie das Popup „No valid subscription“. Der JavaScript-Patch entfernt nur das Popup, nicht die Repository-Warnungen.

---

## 1. Zielzustand

Am Ende sollen nur noch die wirklich benötigten Paketquellen aktiv sein.

Für ein normales Proxmox VE 9 Homelab ohne Subscription:

```
/etc/apt/sources.list.d/debian.sources
/etc/apt/sources.list.d/proxmox.sources
```

Optional, wenn Ceph verwendet werden soll:

```
/etc/apt/sources.list.d/ceph.sources
```

Nicht aktiv ohne Subscription:

```
/etc/apt/sources.list.d/pve-enterprise.sources
/etc/apt/sources.list.d/ceph-enterprise.sources
```

Die Datei `/etc/apt/sources.list` sollte auf einem aufgeräumten Proxmox VE 9 System idealerweise leer sein oder nur Kommentare enthalten. Die eigentlichen Debian-Repos liegen dann sauber im Deb822-Format in `/etc/apt/sources.list.d/debian.sources`.

---

## 2. Aktuelle Version prüfen

```
pveversion
cat /etc/os-release
uname -r
```

Bei Proxmox VE 9 sollte Debian 13 Trixie verwendet werden:

```
VERSION_CODENAME=trixie
```

---

## 3. Vor Änderungen Backups erstellen

Vor dem Aufräumen der Repositories werden die vorhandenen APT-Dateien gesichert. Das ist langweilig, aber deutlich besser als später aus Terminal-Asche rekonstruieren zu müssen, was man vor fünf Minuten zerstört hat.

```
mkdir -p /root/apt-repo-backup

cp -a /etc/apt/sources.list /root/apt-repo-backup/sources.list.bak 2>/dev/null || true
cp -a /etc/apt/sources.list.d /root/apt-repo-backup/sources.list.d.bak
```

---

## 4. Repository-Dateien ansehen

Alle vorhandenen Repository-Dateien anzeigen:

```
ls -la /etc/apt/
ls -la /etc/apt/sources.list.d/
```

Typische Dateien:

```
/etc/apt/sources.list
/etc/apt/sources.list.d/debian.sources
/etc/apt/sources.list.d/proxmox.sources
/etc/apt/sources.list.d/pve-enterprise.sources
/etc/apt/sources.list.d/ceph.sources
```

---

## 5. Problem aus der Proxmox-Repository-Ansicht erklären

In der Proxmox-GUI unter `Updates → Repositories` können mehrere Dinge sichtbar sein:

- `/etc/apt/sources.list` enthält alte oder doppelte Debian-Einträge.
- `/etc/apt/sources.list.d/debian.sources` enthält ebenfalls Debian-Einträge.
- Dadurch sind Debian-Repositories teilweise doppelt vorhanden.
- `pve-no-subscription` ist aktiv. Das ist für Homelab okay, erzeugt aber eine Proxmox-Warnung.
- `ceph no-subscription` ist aktiv. Auch das erzeugt eine Proxmox-Warnung.
- `pve-enterprise` ist deaktiviert. Das ist ohne Subscription korrekt.

Die Warnungen **„The no-subscription repository is not recommended for production use“** und **„The Ceph no-subscription/main repository is not recommended for production use“** sind bei kostenloser Repo-Nutzung normal. Sie bedeuten nicht automatisch, dass `apt update` kaputt ist.

---

## 6. /etc/apt/sources.list aufräumen

Auf einem sauberen Proxmox VE 9 System sollten Debian-Repositories im Deb822-Format in `/etc/apt/sources.list.d/debian.sources` stehen. Die alte Datei `/etc/apt/sources.list` sollte deshalb keine aktiven Debian-Repos mehr enthalten.

Datei öffnen:

```
nano /etc/apt/sources.list
```

Empfohlener Inhalt:

```
# Debian repositories are managed in:
# /etc/apt/sources.list.d/debian.sources
#
# This file is intentionally left without active repository entries.
```

Dadurch werden doppelte Einträge zwischen `/etc/apt/sources.list` und `/etc/apt/sources.list.d/debian.sources` vermieden.

---

## 7. Debian-Repositories sauber setzen

Datei öffnen:

```
nano /etc/apt/sources.list.d/debian.sources
```

Empfohlener Inhalt für Debian 13 Trixie:

```
Types: deb
URIs: http://deb.debian.org/debian/
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://security.debian.org/debian-security/
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
```

`contrib`, `non-free` und `non-free-firmware` sind sinnvoll, wenn Firmware, NVIDIA-Komponenten oder andere nicht vollständig freie Pakete benötigt werden.

Keine Debian-Repositories entfernen, nur weil Proxmox installiert ist. Proxmox basiert weiterhin auf Debian und braucht Debian-Pakete.

---

## 8. Debian Backports optional setzen

Backports sind optional. Wenn sie verwendet werden, sollten sie bewusst und nicht als wilde Paket-Fundgrube genutzt werden.

Falls Backports gewünscht sind, kann eine separate Datei genutzt werden:

```
nano /etc/apt/sources.list.d/debian-backports.sources
```

Inhalt:

```
Types: deb
URIs: http://deb.debian.org/debian/
Suites: trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
```

Wenn Backports nicht benötigt werden, Datei weglassen. Weniger Repos bedeutet weniger Möglichkeiten für APT, sich wie ein überforderter Einkaufswagen zu benehmen.

---

## 9. Proxmox Enterprise Repository deaktivieren

Ohne Subscription darf das Enterprise-Repository nicht aktiv sein.

Datei öffnen:

```
nano /etc/apt/sources.list.d/pve-enterprise.sources
```

Empfohlener Inhalt:

```
Types: deb
URIs: https://enterprise.proxmox.com/debian/pve
Suites: trixie
Components: pve-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Enabled: no
```

Wichtig ist:

```
Enabled: no
```

Wenn die Datei nicht existiert, ist das ebenfalls okay. Dann ist das Enterprise-Repository nicht konfiguriert.

---

## 10. Kostenloses Proxmox Repository aktivieren

Datei öffnen oder erstellen:

```
nano /etc/apt/sources.list.d/proxmox.sources
```

Inhalt:

```
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Architectures: amd64
```

Die Zeile `Architectures: amd64` verhindert Warnungen, wenn auf dem System zusätzlich die Architektur `i386` aktiviert ist. Proxmox stellt keine i386-Pakete bereit.

---

## 11. Proxmox Keyring prüfen

Falls der Proxmox-Keyring noch nicht vorhanden ist:

```
apt install -y wget ca-certificates

wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg -O /usr/share/keyrings/proxmox-archive-keyring.gpg
```

Hash prüfen:

```
sha256sum /usr/share/keyrings/proxmox-archive-keyring.gpg
```

Erwarteter Hash:

```
136673be77aba35dcce385b28737689ad64fd785a797e57897589aed08db6e45  /usr/share/keyrings/proxmox-archive-keyring.gpg
```

---

## 12. Ceph Repository aufräumen

Ceph wird nur benötigt, wenn auf dem Proxmox-Cluster wirklich Ceph verwendet werden soll. Wenn Ceph noch nicht genutzt wird, kann das Ceph-Repository deaktiviert werden.

### Variante A: Ceph wird aktuell nicht genutzt

Datei öffnen:

```
nano /etc/apt/sources.list.d/ceph.sources
```

Inhalt zum Deaktivieren:

```
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Architectures: amd64
Enabled: no
```

Damit verschwindet auch die Ceph-no-subscription-Warnung, weil das Ceph-Repository nicht mehr aktiv ist.

### Variante B: Ceph wird genutzt oder vorbereitet

Datei öffnen:

```
nano /etc/apt/sources.list.d/ceph.sources
```

Inhalt:

```
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Architectures: amd64
```

Wenn das Ceph-no-subscription-Repository aktiv ist, zeigt Proxmox in der Repository-Ansicht eine Warnung an. Das ist bei kostenloser Nutzung normal.

### Ceph Enterprise Repository deaktivieren

Falls vorhanden:

```
nano /etc/apt/sources.list.d/ceph-enterprise.sources
```

Inhalt:

```
Types: deb
URIs: https://enterprise.proxmox.com/debian/ceph-squid
Suites: trixie
Components: enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Enabled: no
```

---

## 13. i386-Architektur prüfen

Wenn `apt update` meldet, dass Proxmox keine `i386`-Pakete anbietet, ist das meist harmlos. Sauberer ist aber, entweder in den Proxmox- und Ceph-Repos `Architectures: amd64` zu setzen oder i386 zu entfernen.

Aktive Architekturen anzeigen:

```
dpkg --print-architecture
dpkg --print-foreign-architectures
```

Wenn `i386` nicht benötigt wird:

```
dpkg --remove-architecture i386
apt update
```

`i386` nur entfernen, wenn keine 32-bit-Pakete benötigt werden. Auf einem reinen Proxmox-Server ist das meistens der Fall.

---

## 14. Paketlisten aktualisieren

```
apt update
```

Gute Ausgabe:

- Keine `401 Unauthorized`
- Keine `403 Forbidden`
- Keine `NO_PUBKEY`
- Keine doppelten Repository-Warnungen
- Keine falschen Suites wie `bookworm` auf einem `trixie`-System

Wenn `apt update` sauber ist:

```
apt full-upgrade
```

Danach prüfen:

```
dpkg --audit
pveversion
uname -r
```

---

## 15. Repository-Warnungen in der Proxmox-GUI verstehen

Unter `Updates → Repositories` kann Proxmox weiterhin Warnungen anzeigen. Diese sind nicht immer Fehler.

<table id="bkmrk-meldung-bedeutung-wa"><thead><tr><th>Meldung</th><th>Bedeutung</th><th>Was tun?</th></tr></thead><tbody><tr><td>`The no-subscription repository is not recommended for production use`</td><td>`pve-no-subscription` ist aktiv.</td><td>Für Homelab okay. Für Produktivsystem Subscription nutzen.</td></tr><tr><td>`The Ceph no-subscription/main repository is not recommended for production use`</td><td>Ceph no-subscription ist aktiv.</td><td>Für Homelab okay. Wenn Ceph nicht genutzt wird, Ceph-Repo deaktivieren.</td></tr><tr><td>`Some suites are misconfigured`</td><td>Eine Quelle verwendet eine unerwartete Suite oder ist doppelt/falsch eingetragen.</td><td>Repository-Dateien prüfen und doppelte Einträge entfernen.</td></tr><tr><td>`pve-enterprise` aktiv ohne Subscription</td><td>Enterprise-Repository ist aktiv.</td><td>Mit `Enabled: no` deaktivieren.</td></tr></tbody></table>

---

# Subscription-Popup in der Weboberfläche deaktivieren

**Achtung:** Dieser Teil verändert eine Datei aus dem Paket `proxmox-widget-toolkit`. Das ist kein offiziell unterstützter Proxmox-Schalter. Nach Updates kann die Änderung überschrieben werden.

Betroffene Datei:

```
/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
```

---

## 16. Backup der JavaScript-Datei erstellen

```
cp -a /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak
```

---

## 17. JavaScript-Datei bearbeiten

```
nano /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
```

In Nano mit `Strg + W` nach folgendem Text suchen:

```
checked_command: function (orig_cmd)
```

Der originale Block sieht ungefähr so aus:

```
checked_command: function (orig_cmd) {
    Proxmox.Utils.API2Request({
        url: '/nodes/localhost/subscription',
        method: 'GET',
        failure: function (response, opts) {
            Ext.Msg.alert(gettext('Error'), response.htmlStatus);
        },
        success: function (response, opts) {
            let res = response.result;
            if (
                res === null ||
                res === undefined ||
                !res ||
                res.data.status.toLowerCase() !== 'active'
            ) {
                Ext.Msg.show({
                    title: gettext('No valid subscription'),
                    icon: Ext.Msg.WARNING,
                    message: Proxmox.Utils.getNoSubKeyHtml(res.data.url),
                    buttons: Ext.Msg.OK,
                    callback: function (btn) {
                        if (btn !== 'ok') {
                            return;
                        }
                        orig_cmd();
                    },
                });
            } else {
                orig_cmd(); 
            }
        },
    });
},
```

---

## 18. checked\_command-Block ersetzen

Den kompletten Block durch diesen kurzen Block ersetzen:

```
checked_command: function (orig_cmd) {
    orig_cmd();
},
```

Das Komma am Ende muss bleiben. Wenn das Komma fehlt, kann die JavaScript-Struktur kaputtgehen und die Weboberfläche lädt nicht mehr korrekt.

---

## 19. Vollständiger Zielausschnitt

Der Bereich um `alertResponseFailure` und `checked_command` sollte danach so aussehen:

```
// can be useful for catching displaying errors from the API, e.g.:
// Proxmox.Async.api2({
//     ...
// }).catch(Proxmox.Utils.alertResponseFailure);
alertResponseFailure: (res) =>
    Ext.Msg.alert(gettext('Error'), res.htmlStatus || res.result.message),

checked_command: function (orig_cmd) {
    orig_cmd();
},
```

Alte Code-Blöcke nicht nur auskommentieren, sondern wirklich entfernen. Auskommentierter Vendor-Code ist wie ein alter Teppich im Serverraum: irgendwann stolpert jemand darüber und keiner weiß mehr, warum er da liegt.

---

## 20. Proxmox Webproxy neu starten

```
systemctl restart pveproxy
```

Danach im Browser:

- Mit `Strg + F5` hart neu laden
- oder Browser-Cache leeren
- oder privates Fenster öffnen

Wenn weiterhin gelbe Warnungen unter `Updates → Repositories` erscheinen, ist das nicht das Subscription-Popup. Diese Warnungen kommen von der Repository-Konfiguration und bleiben bei `no-subscription`-Repos teilweise normal.

---

## 21. Änderung rückgängig machen

Falls die Weboberfläche Probleme macht:

```
cp -a /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js.bak /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy
```

Alternativ Paket neu installieren:

```
apt install --reinstall proxmox-widget-toolkit
systemctl restart pveproxy
```

---

## 22. Nach Updates erneut prüfen

Wenn `proxmox-widget-toolkit` aktualisiert wird, kann der Patch überschrieben werden. Danach kann das Popup wieder erscheinen.

Prüfen:

```
apt list --upgradable
dpkg -l proxmox-widget-toolkit
```

Falls nötig, den Patch erneut setzen.

---

# Beispiel: Saubere minimale Repository-Struktur

## 23. /etc/apt/sources.list

```
# Debian repositories are managed in:
# /etc/apt/sources.list.d/debian.sources
#
# This file is intentionally left without active repository entries.
```

## 24. /etc/apt/sources.list.d/debian.sources

```
Types: deb
URIs: http://deb.debian.org/debian/
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://security.debian.org/debian-security/
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
```

## 25. /etc/apt/sources.list.d/proxmox.sources

```
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Architectures: amd64
```

## 26. /etc/apt/sources.list.d/pve-enterprise.sources

```
Types: deb
URIs: https://enterprise.proxmox.com/debian/pve
Suites: trixie
Components: pve-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Enabled: no
```

## 27. /etc/apt/sources.list.d/ceph.sources ohne aktive Ceph-Nutzung

```
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Architectures: amd64
Enabled: no
```

## 28. /etc/apt/sources.list.d/ceph.sources mit aktiver Ceph-Nutzung

```
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Architectures: amd64
```

---

# Kontrollbefehle

```
apt update
apt full-upgrade
dpkg --audit
pveversion
uname -r
systemctl status pveproxy --no-pager
systemctl status pvedaemon --no-pager
systemctl status pve-cluster --no-pager
```

Erwartung:

- `apt update` läuft ohne Enterprise-Fehler durch.
- Keine doppelten Debian-Repositories.
- Keine falschen Suites wie `bookworm` auf einem `trixie`-System.
- `dpkg --audit` gibt nichts aus.
- `pveproxy`, `pvedaemon` und `pve-cluster` laufen.
- Das Subscription-Popup erscheint nach dem Patch nicht mehr.

---

# Zusammenfassung

- Debian-Repositories wurden aus `/etc/apt/sources.list` entfernt und sauber in `debian.sources` gepflegt.
- Doppelte Debian-Einträge wurden beseitigt.
- Das Proxmox Enterprise Repository wurde deaktiviert.
- Das kostenlose `pve-no-subscription` Repository wurde aktiviert.
- Das Ceph Repository wurde je nach Nutzung aktiviert oder deaktiviert.
- Das Subscription-Popup wurde durch Ersetzen von `checked_command` in `proxmoxlib.js` deaktiviert.
- Gelbe Repository-Warnungen für `no-subscription` sind bei kostenloser Nutzung normal und nicht dasselbe wie das Subscription-Popup.