# Linuxwissen

immer genau das, was man fix mal braucht

# Proxmox, Swap optimieren

sysctl vm.swappiness=0   
swapoff -a   
swapon -a

bzw um dies rückgängig zu machen:

sysctl vm.swappiness=1   
swapoff -a   
swapon -a

(kann direkt auf der Konsole, ohne reboot, durchgeführt werden, der swapoff dauert ein wenig)

[https://www.technik22.de/d/624-proxmox-swap-optimieren](https://www.technik22.de/d/624-proxmox-swap-optimieren)

# Proxmox, Mount durchreichen

pct set 308 -mp0 /mnt/hdd1T/,mp=/mnt/

# Raspi

# Raspberry mit WLAN verbinden

[https://www.tecchannel.de/a/raspberry-pi-mit-wlan-ausstatten-so-geht-s,2076222,2](https://www.tecchannel.de/a/raspberry-pi-mit-wlan-ausstatten-so-geht-s,2076222,2)

# Meldungen zur SD-Karte ausgeben

```
dmesg | grep mmc
```

# MagicMirror script

import requests  
import os  
import time

url = 'http://10.0.1.122:8087/getPlainValue/'  
obj = 'javascript.0.Variablen.Magic\_Mirror.motion'

url2 = 'http://10.0.1.122:8087/set/'  
obj2 = 'javascript.0.Variablen.Magic\_Mirror.reset'

  
resp = requests.get(url+obj)  
\#print (resp.text)  
if (resp.text) == "true":  
 os.system('vcgencmd display\_power 1')  
elif (resp.text) == 'false':  
 os.system('vcgencmd display\_power 0')

resp = requests.get(url+obj2)  
\#print (resp.text)  
if (resp.text) == "true":  
 #print("true")  
 requests.get(url2+obj2+"?value=false")  
 os.system('sudo service kiosk.sh restart')  
elif (resp.text) == 'false':  
 #print("false")  
 None  
time.sleep(10)

resp = requests.get(url+obj)  
if (resp.text) == "true":  
 os.system('vcgencmd display\_power 1')  
elif (resp.text) == 'false':  
 os.system('vcgencmd display\_power 0')  
resp = requests.get(url+obj2)  
\#print (resp.text)  
if (resp.text) == "true":  
 #print("true")  
 os.system('sudo service kiosk.sh restart')  
elif (resp.text) == 'false':  
 #print("false")  
 None  
time.sleep(10)

resp = requests.get(url+obj)  
if (resp.text) == "true":  
 os.system('vcgencmd display\_power 1')  
elif (resp.text) == 'false':  
 os.system('vcgencmd display\_power 0')  
resp = requests.get(url+obj2)  
\#print (resp.text)  
if (resp.text) == "true":  
 #print("true")  
 os.system('sudo service kiosk.sh restart')  
elif (resp.text) == 'false':  
 #print("false")  
 None  
time.sleep(10)

resp = requests.get(url+obj)  
if (resp.text) == "true":  
 os.system('vcgencmd display\_power 1')  
elif (resp.text) == 'false':  
 os.system('vcgencmd display\_power 0')  
resp = requests.get(url+obj2)  
\#print (resp.text)  
if (resp.text) == "true":  
 #print("true")  
 os.system('sudo service kiosk.sh restart')  
elif (resp.text) == 'false':  
 #print("false")

None  
time.sleep(10)

resp = requests.get(url+obj)  
if (resp.text) == "true":  
 os.system('vcgencmd display\_power 1')  
elif (resp.text) == 'false':  
 os.system('vcgencmd display\_power 0')  
resp = requests.get(url+obj2)  
\#print (resp.text)  
if (resp.text) == "true":  
 #print("true")  
 os.system('sudo service kiosk.sh restart')  
elif (resp.text) == 'false':  
 #print("false")  
 None  
time.sleep(10)

resp = requests.get(url+obj)  
if (resp.text) == "true":  
 os.system('vcgencmd display\_power 1')  
elif (resp.text) == 'false':  
 os.system('vcgencmd display\_power 0')  
resp = requests.get(url+obj2)  
\#print (resp.text)  
if (resp.text) == "true":  
 #print("true")  
 os.system('sudo service kiosk.sh restart')  
elif (resp.text) == 'false':  
 #print("false")  
 None

# CLI

# User anlegen und zur sudogruppe hinzufügen

adduser <span style="color: rgb(224, 62, 45); background-color: rgb(0, 0, 0);">USERNAME</span>

/usr/sbin/usermod -aG sudo hubobel

usermod -aG sudo <span style="color: rgb(224, 62, 45); background-color: rgb(0, 0, 0);">USERNAME</span>

# Zeitzone im Terminal ändern

sudo dpkg-reconfigure tzdata

# Sprache im Terminal ändern

sudo dpkg-reconfigure locales

# Debian Version ermitteln

```none
cat /etc/debian_version
```

# fstab prüfen

die geänderte /etc/fstab neu einlesen:

```
systemctl daemon-reload
```

dann auf Fehler prüfen mittels:

```
findmnt --verify
```

# Debian point-Release upgraden

```
apt update
apt full-upgrade
```

# ioBroker

# npm updaten

[https://213.136.68.177/topic/22867/how-to-node-js-für-iobroker-richtig-updaten/985?lang=de](https://213.136.68.177/topic/22867/how-to-node-js-f%C3%BCr-iobroker-richtig-updaten/985?lang=de)

# States via http rufen

```
import requests<br></br><br></br>url = 'http://10.0.1.122:8087/getPlainValue/javascript.0.Variablen.Benutzer'<br></br><br></br>resp = requests.get(url)<br></br>print(resp.text)<br></br>
```

# Node.js updaten

## Vorgehensweise

### 1. Backup erstellen

Vorher immer sichern:

```
iob backup
```

<div class="relative w-full mt-4 mb-1" id="bkmrk-"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--1"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>Zusätzlich bei Proxmox oder VM:

- Snapshot erstellen
- oder komplettes Backup

Das ist alte Schule — aber genau damit rettet man sich im Fehlerfall den Abend.

---

## 2. System aktualisieren

```
sudo apt update && sudo apt upgrade -y
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--3"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--4"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>Danach prüfen:

```
node -v
npm -v
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--5"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--6"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>---

## 3. Node.js 22 installieren

Der empfohlene Weg:

```
iob nodejs-update 22
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--8"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--9"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>Das Script:

- entfernt alte Node-Versionen sauber
- installiert passende npm-Version
- korrigiert Rechte
- prüft Abhängigkeiten

Genau dafür wurde es inzwischen optimiert.

---

## 4. Danach unbedingt prüfen

```
node -v
npm -v
iob diag
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--11"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--12"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>Typisch wäre aktuell etwa:

```
node v22.x
npm 10.x oder 11.x
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--13"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--14"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>---

## 5. ioBroker neu starten

```
iob restart
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--16"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--17"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>oder komplett:

```
sudo reboot
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--18"><div class=""><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--19"><div class="cm-scroller"></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div></div>Ein kompletter Neustart ist oft die sauberere Variante.

# States via http setzen

http://10.0.1.122:8087/set/javascript.0.Variablen.Delta\_TOPVerbraucher?value=0815

# MagicMirror config.js

<span class="iob540">javascript.0.Variablen.Gewicht\_CR</span>

<span class="iob540">{ name: 'Gasverbrauch',  
 deviceStates: \[  
 { id: 'javascript.0.Variablen.Tagesverbrauch\_Gas', icon: 'fa-solid fa-fire-flame-simple', suffix: 'm³' },  
 {id: 'javascript.0.Variablen.Tagesverbrauch\_Gas\_Vortag', icon: 'fa-regular fa-calendar-days', suffix: 'm³' }  
 \]  
 },</span>

{ name: 'Gewicht',  
 deviceStates: \[  
 { id: '<span class="iob540">javascript.0.Variablen.Gewicht\_CR</span>', icon: 'fa-solid fa-scale-unbalanced-flip', suffix: 'kg' },

<span class="iob540">{id: '<span class="iob2470">javascript.0.Variablen.Gewicht\_CR\_delta</span>', icon: '<span class="iob2470">fa-solid fa-plus-minus</span>', suffix: 'kg' }</span>  
 \]  
 },

<span class="iob2470">javascript.0.Variablen.Gewicht\_CR\_delta</span>

<span class="iob2470">&lt;i class="fa-solid fa-plus-minus"&gt;&lt;/i&gt;</span>

# Paperless-ngx updaten

IP: 10.0.1.136  
User: hubobel  
Login nur noch mit sshkey möglich

```
cd /home/hubobel/paperless/paperless-ng/
```

```
docker-compose down
```

```
docker-compose pull
```

```
docker-compose up -d
```

# Wiki updaten

```
cd /var/www/bookstack/
```

```
sudo git pull origin release
```

```
sudo composer install --no-dev
```

```
sudo php artisan migrate
```

```
php artisan cache:clear
```

```
php artisan config:clear
```

```
php artisan view:clear
```

[https://www.bookstackapp.com/docs/admin/updates/](https://www.bookstackapp.com/docs/admin/updates/ "Quelle")

[PHP aktualisieren](https://wiki.hintergasse.de/link/54#bkmrk-page-title)

# hstr - Befehlshistorytool installieren

sudo apt install hstr

für root: hstr --show-configuration&gt;&gt;/root/.bashrc

für user: hstr --show-configuration&gt;&gt;~/.bashrc

# SSH Zugang & Key

sudo nano /etc/ssh/sshd\_config

- PermitRootLogin no
- PubkeyAuthentication yes
- AuthorizedKeysFile
- PasswordAuthentication no
- UsePAM no

sudo systemctl restart sshd

# Senkrechter Strich

Tastenkombination <kbd>Alt Gr</kbd> + <kbd>&lt;</kbd>

# Hostname ändern

First, run `sudo hostnamectl | grep hostname` and confirm that's the name of the PC you want to change.

Next, run `sudo hostnamectl set-hostname whatever` where *whatever* is the name you wish to use henceforth.

# Wifi-Treiber nachinstallieren

sudo apt install bcmwl-kernel-source

# Einstellung aus fstab ohne Neustart neu laden

Die einfachste Möglichkeit ist den **mount** Befehl wie folgt auszuführen.

```
$ sudo mount -a
```

Ein Nachteil davon ist jedoch, dass dabei bei den vorliegenden Sytemen nur die noch nicht eingehängten Dateisysteme eingehängt wurden. Eine weitere und zuverlässigere Lösung stellt die Erweiterung der Parameter für den **mount** Befehl dar. Dies könnte dann wie folgt aussehen.

```
$ sudo mount -o remount /
```

In diesem Beispiel wird das Root-Dateisystem mit den in der fstab angegebene Optionen neu eingehängt. Eine weitere Erleichterung brachte folgende Kombination von Befehlen. Dabei werden zunächst alle eingehängten Dateisystem aufgelistet und anschließend neu eingehängt. Es bietet sich an zunächst den letzten Teil wegzulassen und sich die auszuführenden Befehle genauer anzuschauen.

```
$ LANG=en mount | awk '{print "mount -o remount "$3}' | sudo sh
```

# unrar auf der CLI

```
unrar e tecmint.rar /home/tecmint/rarfiles
```

# große Dateien finden

sudo apt-get install ncdu

[https://www.mawa-solutions.com/faq/artikel/wie-findet-man-unter-linux-gro%C3%9Fe-verzeichnisse](https://www.mawa-solutions.com/faq/artikel/wie-findet-man-unter-linux-gro%C3%9Fe-verzeichnisse)

# PIP und Debian

Use Pip's `config` command to edit the above file:

```
python3 -m pip config set global.break-system-packages true
```

# Nginx Proxy Pfad mitgeben

```
location = /{return 301 $scheme://$http_host/weather/;}
```

/weather/ = .....

[![image.png](https://wiki.hintergasse.de/uploads/images/gallery/2025-03/scaled-1680-/image.png)](https://wiki.hintergasse.de/uploads/images/gallery/2025-03/image.png)

# NFS Mount

```
mount -t nfs -o soft 10.0.1.253:/volume3/Downloadstation /mnt/nas/Downloadstation/
```

um das mounten beim Systemstart/Boot automatisiert durchzuführen:

```
nano /etc/fstab
```

```
10.0.1.253:/volume3/Downloadstation  /mnt/nas/Downloadstation  nfs  soft,rw,nolock,_netdev  0  0
```

prüfen mittels:

```
mount -a
```

```
mount | grep Downloadstation
```

sollte ergeben:

```
10.0.1.253:/volume3/Downloadstation on /mnt/nas/Downloadstation type nfs (rw,soft,nolock,_netdev)
```

und im Pfad /mnt/nas/Downloadstation sollt verfügbar sein.

# PHP updaten

## **Für Linux (Ubuntu/Debian) mit Apache**

### 1. **Alte PHP-Version anzeigen**

```
php -v
```

### 2. **Repositories hinzufügen (z. B. Ondřej Surý PPA)**

```
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
```

### 3. **Neue PHP-Version installieren (z. B. PHP 8.3)**

```
sudo apt install php8.3
```

Optional auch die benötigten Module:

```
sudo apt install php8.3-cli php8.3-common php8.3-mbstring php8.3-xml php8.3-curl php8.3-mysql
```

### 4. **Apache oder Nginx umstellen**

<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary" id="bkmrk-"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>```
sudo a2dismod php7.4 # alte Version deaktivieren
sudo a2enmod php8.3 # neue aktivieren
sudo systemctl restart apache2
```

# Docker auf einem Raspberry Pi installieren

**per SSH Verbindung aufnehmen (Putty)**

<div class="ad-mobile-group-1" id="bkmrk-"><div class="ad ad--sticky" id="bkmrk--1"></div></div>**Docker installieren in Shell**

`curl -fsSL https://get.Docker.com -o get-Docker.sh`

`sudo sh get-Docker.sh`

`sudo usermod -aG docker $USER`

`newgrp docker`

`docker run hello-world`

`Quelle: <a href="https://www.heise.de/news/Wie-man-Docker-auf-dem-Raspberry-Pi-in-15-Minuten-einrichtet-7524692.html" target="_blank" title="Quelle:">https://www.heise.de/news/Wie-man-Docker-auf-dem-Raspberry-Pi-in-15-Minuten-einrichtet-7524692.html</a>`

# Docker Logs Befehl

```
# Alle laufenden Container anzeigen, um die Container-ID zu erhalten
$ docker container ls

# Logs eines Containers anzeigen
$ docker logs <container_id>

# Logs in Echtzeit streamen
$ docker logs -f <container_id>

# Die letzten 100 Zeilen der Logs anzeigen
$ docker logs --tail 100 <container_id>

# Logs ab einem bestimmten Zeitpunkt anzeigen
$ docker logs --since="2025-05-20T10:00:00" <container_id>

# Logs bis zu einem bestimmten Zeitpunkt anzeigen
$ docker logs --until="2025-05-20T12:00:00" <container_id>

# Logs mit Zeitstempeln anzeigen
$ docker logs --timestamps <container_id>
```

# CPU und Sensorwerte

### Temperatur und Frequenz zusammen

```
watch -n2 '
echo "=== CPU ==="
grep "cpu MHz" /proc/cpuinfo | head
echo
sensors
'
```

### Aktuelle Frequenz aller Kerne live anzeigen

```
watch -n1 "grep 'cpu MHz' /proc/cpuinfo"
```

Aktualisiert jede Sekunde.

---

### Kompakter Überblick

```
watch -n1 "grep 'cpu MHz' /proc/cpuinfo | awk '{print \$4}'"
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--3"><div><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--4"></div></div></div></div></div></div></div></div><div><div></div></div></div></div></div></div>Zeigt nur die Frequenzen an.

---

### Min/Max und aktuelle Policy

```
cpupower frequency-info
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--6"><div><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--7"></div></div></div></div></div></div></div></div><div></div></div></div></div></div>und danach einige Stunden beobachten:

```
watch -n5 sensors
```

<div class="relative w-full mt-4 mb-1" id="bkmrk--8"><div><div class="contents"><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼd ͼr" dir="ltr" id="bkmrk--9"></div></div></div></div></div></div></div></div><div></div></div></div></div></div>Oft sinken die Lastspitzen dann von 70–80 °C auf 50–60 °C, wodurch der Lüfter deutlich seltener hochdreht.

# Wiki updaten_neu

```
cd /var/www/bookstack
php artisan down
git pull --ff-only origin release
composer install --no-dev
php artisan migrate --force
sudo -u www-data php artisan cache:clear
php artisan up
sudo systemctl restart apache2
```

# Portainer updaten

# Portainer CE auf Docker aktualisieren

Diese Anleitung aktualisiert eine Portainer-CE-Installation von **2.19.4** auf **2.39.2 LTS**.

## Aktuelle Konfiguration

- Containername: `portainer`
- Image bisher: `portainer/portainer-ce:latest`
- Ziel-Image: `portainer/portainer-ce:lts`
- Portainer HTTPS: `9443`
- Edge-Agent-Tunnel: `8000`
- Datenvolume: `portainer_data`
- Docker-Socket: `/var/run/docker.sock`

Die vorhandenen Einstellungen, Benutzer, Stacks und Environments befinden sich im Volume `portainer_data`.

## 1. Aktuelle Version prüfen

```
docker exec portainer /portainer --version
```

## 2. Neues LTS-Image herunterladen

Portainer läuft während des Downloads weiter:

```
docker pull portainer/portainer-ce:lts
```

## 3. Portainer stoppen

```
docker stop portainer
```

Andere Container und Anwendungen bleiben davon unberührt.

## 4. Portainer-Daten sichern

```
sudo tar \
  -C /var/lib/docker/volumes/portainer_data/_data \
  -czf /home/hubobel/portainer-data-pre-2.39.2.tar.gz \
  .
```

### Backup kontrollieren

```
sudo ls -lh /home/hubobel/portainer-data-pre-2.39.2.tar.gz
```

Inhalt stichprobenartig anzeigen:

```
sudo tar -tzf /home/hubobel/portainer-data-pre-2.39.2.tar.gz | head
```

Die Ausgabe sollte unter anderem `portainer.db` enthalten.

Backup gegen unberechtigten Zugriff schützen:

```
sudo chmod 600 /home/hubobel/portainer-data-pre-2.39.2.tar.gz
```

Der alte Container sollte erst entfernt werden, wenn das Backup vorhanden und größer als `0` Byte ist.

## 5. Alten Portainer-Container entfernen

```
docker rm portainer
```

Dabei wird nur der Container entfernt. Das Volume `portainer_data` bleibt erhalten.

## 6. Neue LTS-Version starten

```
docker run -d \
  --name portainer \
  --restart=always \
  -p 8000:8000 \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts
```

Beim ersten Start aktualisiert Portainer seine interne Datenbank. Der Container darf währenddessen nicht neu gestartet oder gestoppt werden.

## 7. Startprotokoll kontrollieren

```
docker logs portainer --tail 100
```

Bei Bedarf kann das Protokoll fortlaufend beobachtet werden:

```
docker logs -f portainer
```

Die Anzeige wird mit `Strg+C` beendet, ohne den Container zu stoppen.

## 8. Neue Version prüfen

```
docker exec portainer /portainer --version
```

Erwartete Ausgabe:

```
2.39.2
```

## 9. Funktion prüfen

Anschließend in der Portainer-Weboberfläche kontrollieren:

- Anmeldung funktioniert
- Docker-Environment ist erreichbar
- vorhandene Stacks werden angezeigt
- Container und Volumes sind vorhanden
- Container-Konsole und Protokollanzeige funktionieren

## Backup aufbewahren

Das Backup befindet sich unter:

```
/home/hubobel/portainer-data-pre-2.39.2.tar.gz
```

Es sollte mindestens so lange aufbewahrt werden, bis die aktualisierte Portainer-Installation vollständig geprüft wurde.

## Wichtige Hinweise

- Das Volume `portainer_data` nicht löschen.
- Kein neues Volume mit einem anderen Namen verwenden.
- Nicht von `portainer/portainer-ce` zu `portainer/portainer-ee` wechseln.
- Ein Downgrade nach erfolgter Datenbankmigration sollte nicht mit dem bestehenden Volume versucht werden.
- Für eine Wiederherstellung muss das vor dem Update erzeugte Backup verwendet werden.