Compare commits
18
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c33809d22 | ||
|
|
b5e8b11c91 | ||
|
|
30fcc20dce | ||
|
|
4d58d30b25 | ||
|
|
46bcd9d2c7 | ||
|
|
829811acd7 | ||
|
|
0db950db0a | ||
|
|
0cd44488e5 | ||
|
|
70688bcf55 | ||
|
|
8a63ca48a8 | ||
|
|
7eeebe8065 | ||
|
|
7bf3a0df0b | ||
|
|
a045544f88 | ||
|
|
e1ce11bd57 | ||
|
|
908fa5d422 | ||
|
|
a48aab3d90 | ||
|
|
3e1c4aa541 | ||
|
|
0c2f80ae48 |
No files matched your search
@@ -15,3 +15,4 @@
|
||||
/PORTAINER/
|
||||
/VAULTWARDEN/
|
||||
/FLATNOTES/.*
|
||||
/SESSIONS/
|
||||
@@ -102,3 +102,8 @@ DEFAULT_TRUST_MODEL = committer
|
||||
|
||||
[oauth2]
|
||||
JWT_SECRET = 3kXf3QovlO0hgPifm0lJF9wJhiYWqHqF6d4FBczKirc
|
||||
|
||||
[mirror]
|
||||
ENABLED = true
|
||||
DEFAULT_INTERVAL = 8h
|
||||
MIN_INTERVAL = 10m
|
||||
@@ -1,37 +0,0 @@
|
||||
- Node 1:
|
||||
```
|
||||
MAILTO="bruno.eckhardt07@gmail.com"
|
||||
TERM=xterm
|
||||
SHELL=/bin/bash
|
||||
0 */8 * * * sudo /data/SCRIPTS/GEN-SITEMAP.sh all
|
||||
0 */12 * * * /data/SCRIPTS/MONITOR.sh
|
||||
*/15 * * * * docker exec WEBSERVER-BACKEND php /var/www/html/Commands/WeatherLog.php
|
||||
5 */2 * * * /data/SCRIPTS/DB-backup.sh
|
||||
0 0 10 * * /data/SCRIPTS/certs-renew.sh
|
||||
```
|
||||
|
||||
- Node 2:
|
||||
```
|
||||
MAILTO="bruno.eckhardt07@gmail.com"
|
||||
TERM=xterm
|
||||
SHELL=/bin/bash
|
||||
0 */12 * * * /data/SCRIPTS/MONITOR.sh
|
||||
```
|
||||
|
||||
- Node 3
|
||||
```
|
||||
MAILTO="bruno.eckhardt07@gmail.com"
|
||||
TERM=xterm
|
||||
SHELL=/bin/bash
|
||||
0 */12 * * * /data/SCRIPTS/MONITOR.sh
|
||||
5 */2 * * * /data/SCRIPTS/DB-import.sh
|
||||
```
|
||||
|
||||
- Node 4
|
||||
```
|
||||
MAILTO="bruno.eckhardt07@gmail.com"
|
||||
TERM=xterm
|
||||
SHELL=/bin/bash
|
||||
0 */2 * * * /data/SCRIPTS/DB-export.sh
|
||||
0 */12 * * * /data/SCRIPTS/MONITOR.sh
|
||||
```
|
||||
@@ -1,96 +0,0 @@
|
||||
# Mitschrift: Subnetting, VLSM, IP-Grundlagen & Binär-Berechnung
|
||||
|
||||
## 1. Grundlagen: Was ist Subnetting?
|
||||
Subnetting bedeutet, ein großes IP-Netzwerk in mehrere, kleinere logische Netzwerke zu unterteilen.
|
||||
|
||||
* Zweck: Reduzierung des Broadcast-Verkehrs, Verbesserung der Sicherheit und effiziente Verwaltung von IP-Adressen.
|
||||
* Wichtige Begriffe:
|
||||
* Netzwerk-ID: Die Adresse des Netzwerks selbst (erste IP).
|
||||
* Broadcast-Adresse: Die letzte IP im Netz (für Nachrichten an alle Teilnehmer).
|
||||
* Host-Bits: Die Anzahl der Bits, die für die Geräte (Hosts) zur Verfügung stehen.
|
||||
|
||||
---
|
||||
|
||||
## 2. Berechnung der Subnetzmaske für X Hosts
|
||||
Wenn du ein Subnetz für eine bestimmte Anzahl an Hosts (X) benötigst:
|
||||
|
||||
Formel: 2^h - 2 >= X
|
||||
(h = Anzahl der Host-Bits; -2 = Abzug der Netzwerk-ID und Broadcast-Adresse)
|
||||
|
||||
### Schritt-für-Schritt-Anleitung:
|
||||
1. Formel anwenden: Suche das kleinste h, bei dem die Formel erfüllt ist.
|
||||
2. Subnetzmaske bestimmen: Praefix = 32 - h.
|
||||
3. Dezimal umrechnen: Setze die ersten (32-h) Bits auf 1 und die restlichen h Bits auf 0.
|
||||
|
||||
---
|
||||
|
||||
## 3. VLSM (Variable Length Subnet Masking)
|
||||
VLSM erlaubt es, Subnetze mit unterschiedlich großen Masken innerhalb eines übergeordneten Netzwerks zu verwenden.
|
||||
Goldene Regel: Sortiere immer vom größten zum kleinsten Subnetzbedarf.
|
||||
|
||||
---
|
||||
|
||||
## 4. IP-Berechnung (Schritt für Schritt)
|
||||
Um aus einer IP-Adresse und einer Subnetzmaske die Netzwerk-Parameter zu bestimmen:
|
||||
|
||||
* Netzwerk-Adresse: Alle Host-Bits auf 0 setzen.
|
||||
* Broadcast-Adresse: Alle Host-Bits auf 1 setzen.
|
||||
* Erste nutzbare IP: Netzwerk-Adresse + 1.
|
||||
* Letzte nutzbare IP: Broadcast-Adresse - 1.
|
||||
|
||||
---
|
||||
|
||||
## 5. Die binäre Berechnung (Die "Bit-Tabelle")
|
||||
Jedes Oktett besteht aus 8 Bit mit festen Werten. Damit kannst du jede Netzmaske berechnen:
|
||||
|
||||
| Bit-Position | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
||||
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
||||
| **Wert** | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|
||||
| **Ges Adr** | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 |
|
||||
| **Hosts** | 254 | 126 | 62 | 30 | 14 | 6 | 2 | 0 |
|
||||
|
||||
### Wie man damit rechnet:
|
||||
Die Subnetzmaske besteht immer aus einer Kette von Einsen (Netzwerk-Teil).
|
||||
Beispiel /26:
|
||||
* 26 Einsen gesamt.
|
||||
* 3 Oktette komplett voll (255.255.255.0).
|
||||
* Im 4. Oktett: 26 - 24 = 2 Einsen.
|
||||
|
||||
Berechnung des 4. Oktetts für /26:
|
||||
* Setze die ersten 2 Bits auf 1: 128 + 64 = 192.
|
||||
* Subnetzmaske: 255.255.255.192.
|
||||
|
||||
**Die "Magic Number" (Blockgröße):**
|
||||
Die Magic Number ist der Wert des letzten Bits im Netzwerk-Teil (das letzte gesetzte Bit).
|
||||
Bei /26 (192) ist die 64 (Bit-Position 2) das letzte gesetzte Bit.
|
||||
Das bedeutet: Deine Netzwerke springen immer in 64er Schritten (0, 64, 128, 192).
|
||||
|
||||
---
|
||||
|
||||
## 6. Netzklassen (Classful Addressing - Historisch)
|
||||
| Klasse | Erster Oktett-Bereich | Standard-Maske |
|
||||
| :--- | :--- | :--- |
|
||||
| A | 1 - 126 | 255.0.0.0 (/8) |
|
||||
| B | 128 - 191 | 255.255.0.0 (/16) |
|
||||
| C | 192 - 223 | 255.255.255.0 (/24) |
|
||||
|
||||
---
|
||||
|
||||
## 7. Referenz-Tabelle (bis /16)
|
||||
| CIDR | Subnetzmaske | Host-Anzahl (nutzbar) |
|
||||
| :--- | :--- | :--- |
|
||||
| /30 | 255.255.255.252 | 2 |
|
||||
| /29 | 255.255.255.248 | 6 |
|
||||
| /28 | 255.255.255.240 | 14 |
|
||||
| /27 | 255.255.255.224 | 30 |
|
||||
| /26 | 255.255.255.192 | 62 |
|
||||
| /25 | 255.255.255.128 | 126 |
|
||||
| /24 | 255.255.255.0 | 254 |
|
||||
| /23 | 255.255.254.0 | 510 |
|
||||
| /22 | 255.255.252.0 | 1.022 |
|
||||
| /21 | 255.255.248.0 | 2.046 |
|
||||
| /20 | 255.255.240.0 | 4.094 |
|
||||
| /19 | 255.255.224.0 | 8.190 |
|
||||
| /18 | 255.255.192.0 | 16.382 |
|
||||
| /17 | 255.255.128.0 | 32.766 |
|
||||
| /16 | 255.255.0.0 | 65.534 |
|
||||
@@ -1,306 +0,0 @@
|
||||
#lf5
|
||||
# Python – if-Statements & Schleifen
|
||||
|
||||
Eine kompakte Referenz zu Bedingungen und Schleifen in Python.
|
||||
|
||||
---
|
||||
|
||||
## 1. if / elif / else
|
||||
|
||||
Führt Code abhängig von einer Bedingung aus.
|
||||
|
||||
### Grundstruktur
|
||||
|
||||
```python
|
||||
if bedingung:
|
||||
# wird ausgeführt wenn True
|
||||
print("Bedingung erfüllt")
|
||||
elif andere_bedingung:
|
||||
# wird ausgeführt wenn erste False, diese True
|
||||
print("Andere Bedingung erfüllt")
|
||||
else:
|
||||
# wird ausgeführt wenn alle Bedingungen False
|
||||
print("Keine Bedingung erfüllt")
|
||||
```
|
||||
|
||||
### Vergleichs- und logische Operatoren
|
||||
|
||||
| Operator | Bedeutung |
|
||||
|----------|-----------|
|
||||
| `==` | gleich |
|
||||
| `!=` | ungleich |
|
||||
| `<`, `>`, `<=`, `>=` | kleiner/größer (gleich) |
|
||||
| `and` | logisches UND |
|
||||
| `or` | logisches ODER |
|
||||
| `not` | logisches NICHT |
|
||||
| `in` | Mitgliedschaft |
|
||||
| `not in` | keine Mitgliedschaft |
|
||||
|
||||
```python
|
||||
x = 42
|
||||
|
||||
if x > 0 and x < 100:
|
||||
print("im Bereich")
|
||||
|
||||
if x % 2 == 0:
|
||||
print("gerade")
|
||||
elif x % 2 != 0:
|
||||
print("ungerade")
|
||||
|
||||
farbe = "rot"
|
||||
if farbe in ["rot", "blau", "gelb"]:
|
||||
print("Primärfarbe")
|
||||
```
|
||||
|
||||
### Ternärer Ausdruck
|
||||
|
||||
Kurze Schreibweise für einfaches if/else:
|
||||
|
||||
```python
|
||||
ergebnis = "gerade" if x % 2 == 0 else "ungerade"
|
||||
```
|
||||
|
||||
> **Hinweis:** Python kennt kein `switch`-Statement. Stattdessen nutzt man `elif`-Ketten oder ab Python 3.10 das `match`-Statement.
|
||||
|
||||
---
|
||||
|
||||
## 2. for-Schleife
|
||||
|
||||
Iteriert über jedes Element einer Sequenz (Liste, Tuple, String, Range, …).
|
||||
|
||||
### Grundstruktur
|
||||
|
||||
```python
|
||||
for element in sequenz:
|
||||
print(element)
|
||||
```
|
||||
|
||||
### Häufige Anwendungsfälle
|
||||
|
||||
**Liste iterieren:**
|
||||
|
||||
```python
|
||||
früchte = ["Apfel", "Birne", "Kirsche"]
|
||||
for frucht in früchte:
|
||||
print(frucht)
|
||||
```
|
||||
|
||||
**Zahlenbereich mit `range()`:**
|
||||
|
||||
```python
|
||||
for i in range(5): # 0, 1, 2, 3, 4
|
||||
print(i)
|
||||
|
||||
for i in range(1, 10, 2): # 1, 3, 5, 7, 9
|
||||
print(i)
|
||||
```
|
||||
|
||||
`range(start, stop, step)` – `stop` ist **nicht** enthalten.
|
||||
|
||||
**Index + Wert mit `enumerate()`:**
|
||||
|
||||
```python
|
||||
namen = ["Anna", "Ben", "Clara"]
|
||||
for i, name in enumerate(namen):
|
||||
print(f"{i}: {name}")
|
||||
# 0: Anna
|
||||
# 1: Ben
|
||||
# 2: Clara
|
||||
```
|
||||
|
||||
**Zwei Listen parallel mit `zip()`:**
|
||||
|
||||
```python
|
||||
namen = ["Anna", "Ben"]
|
||||
noten = [1, 2]
|
||||
for name, note in zip(namen, noten):
|
||||
print(f"{name}: {note}")
|
||||
```
|
||||
|
||||
**Dictionary iterieren:**
|
||||
|
||||
```python
|
||||
person = {"name": "Max", "alter": 30}
|
||||
for key, value in person.items():
|
||||
print(f"{key} = {value}")
|
||||
```
|
||||
|
||||
**String zeichenweise:**
|
||||
|
||||
```python
|
||||
for zeichen in "Python":
|
||||
print(zeichen)
|
||||
```
|
||||
|
||||
### List Comprehension (kompakte for-Schleife)
|
||||
|
||||
```python
|
||||
quadrate = [x**2 for x in range(10)]
|
||||
gerade = [x for x in range(20) if x % 2 == 0]
|
||||
```
|
||||
|
||||
### for / else
|
||||
|
||||
Der `else`-Block wird ausgeführt, wenn die Schleife **normal endet** (kein `break`):
|
||||
|
||||
```python
|
||||
zahlen = [1, 3, 5, 7]
|
||||
for n in zahlen:
|
||||
if n < 0:
|
||||
print("Negative Zahl gefunden!")
|
||||
break
|
||||
else:
|
||||
print("Alle Zahlen sind positiv.")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. while-Schleife
|
||||
|
||||
Wiederholt Code, **solange** eine Bedingung `True` ist.
|
||||
|
||||
### Grundstruktur
|
||||
|
||||
```python
|
||||
while bedingung:
|
||||
# wird wiederholt solange True
|
||||
code_hier()
|
||||
```
|
||||
|
||||
### Beispiele
|
||||
|
||||
**Zähler:**
|
||||
|
||||
```python
|
||||
i = 0
|
||||
while i < 5:
|
||||
print(i)
|
||||
i += 1 # wichtig: ohne dies → Endlosschleife!
|
||||
```
|
||||
|
||||
**Benutzereingabe bis Abbruch:**
|
||||
|
||||
```python
|
||||
while True:
|
||||
eingabe = input("Eingabe (oder 'exit'): ")
|
||||
if eingabe == "exit":
|
||||
break
|
||||
print(f"Du hast eingegeben: {eingabe}")
|
||||
```
|
||||
|
||||
**Bedingung abhängig vom Ergebnis:**
|
||||
|
||||
```python
|
||||
zahl = 256
|
||||
while zahl > 1:
|
||||
zahl //= 2
|
||||
print(zahl)
|
||||
```
|
||||
|
||||
### while / else
|
||||
|
||||
Wie bei `for`: `else` läuft nur, wenn keine `break`-Anweisung ausgeführt wurde.
|
||||
|
||||
```python
|
||||
i = 0
|
||||
while i < 3:
|
||||
print(i)
|
||||
i += 1
|
||||
else:
|
||||
print("Schleife regulär beendet.")
|
||||
```
|
||||
|
||||
> **Achtung:** Die häufigste Fehlerquelle ist eine vergessene Variable-Aktualisierung, die zu einer **Endlosschleife** führt. Immer sicherstellen, dass die Bedingung irgendwann `False` wird!
|
||||
|
||||
---
|
||||
|
||||
## 4. do-while – Gibt es in Python nicht!
|
||||
|
||||
Python hat **kein** `do-while`-Statement wie in C, Java oder JavaScript. Das Verhalten lässt sich aber mit `while True` und `break` nachbauen:
|
||||
|
||||
**do-while Äquivalent:**
|
||||
|
||||
```python
|
||||
# Entspricht: do { ... } while (bedingung)
|
||||
while True:
|
||||
# Code wird mindestens einmal ausgeführt
|
||||
eingabe = input("Zahl eingeben: ")
|
||||
zahl = int(eingabe)
|
||||
if zahl > 0: # Schleife läuft weiter solange zahl <= 0
|
||||
break
|
||||
|
||||
print(f"Positive Zahl: {zahl}")
|
||||
```
|
||||
|
||||
**Vergleich mit anderen Sprachen:**
|
||||
|
||||
```
|
||||
// Java / C / JavaScript:
|
||||
do {
|
||||
eingabe = scanner.nextLine();
|
||||
} while (!eingabe.equals("exit"));
|
||||
|
||||
# Python-Äquivalent:
|
||||
while True:
|
||||
eingabe = input()
|
||||
if eingabe == "exit":
|
||||
break
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Steueranweisungen
|
||||
|
||||
Gelten für `for`- **und** `while`-Schleifen.
|
||||
|
||||
### break – Schleife sofort beenden
|
||||
|
||||
```python
|
||||
for i in range(10):
|
||||
if i == 5:
|
||||
break # verlässt die Schleife
|
||||
print(i) # gibt 0, 1, 2, 3, 4 aus
|
||||
```
|
||||
|
||||
### continue – aktuelle Iteration überspringen
|
||||
|
||||
```python
|
||||
for i in range(6):
|
||||
if i == 3:
|
||||
continue # überspringt i = 3
|
||||
print(i) # gibt 0, 1, 2, 4, 5 aus
|
||||
```
|
||||
|
||||
### pass – Platzhalter / nichts tun
|
||||
|
||||
```python
|
||||
for i in range(5):
|
||||
pass # leere Schleife, kein Fehler
|
||||
|
||||
if bedingung:
|
||||
pass # noch nicht implementiert
|
||||
```
|
||||
|
||||
### Verschachtelte Schleifen
|
||||
|
||||
`break` und `continue` wirken nur auf die **innerste** Schleife:
|
||||
|
||||
```python
|
||||
for i in range(3):
|
||||
for j in range(3):
|
||||
if j == 1:
|
||||
break # beendet nur die innere Schleife
|
||||
print(i, j)
|
||||
```
|
||||
|
||||
> **Tipp:** Für den Ausbruch aus mehreren verschachtelten Schleifen die Schleife in eine Funktion auslagern und `return` verwenden.
|
||||
|
||||
---
|
||||
|
||||
## Kurzübersicht
|
||||
|
||||
| Schleife | Wann verwenden | Python-Syntax |
|
||||
|----------|---------------|---------------|
|
||||
| `for` | Anzahl der Iterationen bekannt / Iteration über Sequenz | `for x in sequenz:` |
|
||||
| `while` | Anzahl unbekannt, abhängig von Bedingung | `while bedingung:` |
|
||||
| do-while | Mind. einmal ausführen (kein natives Keyword) | `while True: ... if ...: break` |
|
||||
+19
-1
@@ -14,11 +14,29 @@ host smtp.gmail.com
|
||||
port 587
|
||||
from bruno.eckhardt07@gmail.com
|
||||
user bruno.eckhardt07@gmail.com
|
||||
password qrwj rnqp qoks qzpy
|
||||
password PASSWORT
|
||||
|
||||
account default : gmail
|
||||
```
|
||||
|
||||
```
|
||||
defaults
|
||||
auth on
|
||||
tls on
|
||||
tls_trust_file /etc/ssl/certs/ca-certificates.crt
|
||||
logfile ~/.msmtp.log
|
||||
|
||||
account mrhossa
|
||||
host mail.mrhossa.de
|
||||
port 465
|
||||
tls_starttls off
|
||||
from noreply@mrhossa.de
|
||||
user noreply@mrhossa.de
|
||||
password PASSWORT
|
||||
|
||||
account default : mrhossa
|
||||
```
|
||||
|
||||
3. `sudo chown worker:worker /home/worker/.msmtprc`
|
||||
4. `chmod 600 /home/worker/.msmtprc`
|
||||
5. `echo -e "Subject: Testmail\n\nHallo, das ist eine Testmail." | msmtp bruno.eckhardt07@gmail.com`
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
# Zweiten Benutzer mit Root rechten anlegen.
|
||||
|
||||
`adduser backup`
|
||||
`gpasswd -a backup sudo`
|
||||
`pveum user add backup@pam`
|
||||
`pveum acl modiy / --roles PVEAdmin --users backup@pam`
|
||||
@@ -1,20 +0,0 @@
|
||||
### Es wird Täglich, Wöchentlich, Monatlich gebackupt
|
||||
|
||||
Täglich:
|
||||
- 21 Uhr
|
||||
- behalte die letzten 3
|
||||
- auf NFS4
|
||||
|
||||
Wöchentlich:
|
||||
- Sonntags 01:00 Uhr
|
||||
- behalte die letzten 2
|
||||
- auf NFS3
|
||||
|
||||
Monatlich:
|
||||
- erster des Monats um 00:00 Uhr
|
||||
- behalte die letzten 2
|
||||
- auf NFS3
|
||||
|
||||
Anmerkung:
|
||||
- Es kann bis zu einer halben stunde laufen und ist stand jetzt 16.03.2026 ca. 47GiB groß.
|
||||
- Es geht auch eine Status mail an bruno.eckhardt07@gmail.com
|
||||
@@ -7,4 +7,37 @@ Proxmox no subscription repo einbauen
|
||||
5. `echo "deb http://download.proxmox.com/debian/pve trixie pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list`
|
||||
6. `apt update`
|
||||
7. `apt full-upgrade`
|
||||
8. `reboot`
|
||||
8. `reboot`
|
||||
|
||||
```
|
||||
#!/usr/bin/env bash
|
||||
# Proxmox VE: Enterprise-/Ceph-Repos deaktivieren, No-Subscription-Repo setzen,
|
||||
# System aktualisieren und neu starten.
|
||||
set -euo pipefail
|
||||
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Bitte als root ausführen." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Enterprise- und Ceph-Repos deaktivieren (nur wenn vorhanden)
|
||||
for f in ceph pve-enterprise; do
|
||||
src="/etc/apt/sources.list.d/${f}.sources"
|
||||
if [[ -f "$src" ]]; then
|
||||
mv "$src" "${src}.disabled"
|
||||
echo "Deaktiviert: $src"
|
||||
fi
|
||||
done
|
||||
|
||||
# Haupt-sources.list leeren
|
||||
echo > /etc/apt/sources.list
|
||||
|
||||
# No-Subscription-Repo setzen
|
||||
echo "deb http://download.proxmox.com/debian/pve trixie pve-no-subscription" \
|
||||
> /etc/apt/sources.list.d/pve-install-repo.list
|
||||
|
||||
apt update
|
||||
apt full-upgrade
|
||||
|
||||
reboot
|
||||
```
|
||||
@@ -1,69 +0,0 @@
|
||||
Ordner:
|
||||
|
||||
- Spezifische Compose files:
|
||||
/data/COMPOSE/
|
||||
```
|
||||
-rwxrwxrwx 1 root root 2195 Feb 21 12:04 app.ini
|
||||
-rwxrwxrwx 1 root root 1252 Feb 6 08:27 docker-compose-dev.yml
|
||||
-rwxrwxrwx 1 root root 1002 Jan 10 12:16 docker-compose.yml
|
||||
-rwxrwxrwx 1 root root 431 Jan 10 12:12 Dockerfile
|
||||
-rwxrwxrwx 1 root root 339 Dec 4 11:26 gitea.yml
|
||||
-rwxrwxrwx 1 root root 226 Dec 10 09:11 haproxy.yml
|
||||
-rwxrwxrwx 1 root root 364 Feb 22 11:23 mariadb-backup.yml
|
||||
-rwxrwxrwx 1 root root 362 Feb 24 08:03 mariadb-test.yml
|
||||
-rwxrwxrwx 1 root root 349 Feb 22 11:20 mariadb.yml
|
||||
```
|
||||
|
||||
- Gitea Daten:
|
||||
/data/GITEA/
|
||||
|
||||
- Live Datenbank:
|
||||
/data/MARIADB/
|
||||
|
||||
- DEV Datenbank:
|
||||
/data/MARIADB-TEST/
|
||||
|
||||
- Backup Datenbank
|
||||
/data/MARIADB-BACKUP/
|
||||
|
||||
- Shell skripte
|
||||
/data/SCRIPTS/
|
||||
```
|
||||
-rwxrwxrwx 1 root root 294 Dec 10 09:19 certs-renew.sh
|
||||
-rwxrwxrwx 1 root root 22 Nov 27 15:39 CPU_Temp_Mess.sh
|
||||
-rwxrwxrwx 1 root root 283 Mar 2 20:15 DB-backup.sh
|
||||
-rwxrwxrwx 1 root root 69 Feb 17 13:29 DB-connect.sh
|
||||
-rwxrwxrwx 1 root root 161 Feb 17 14:09 DB-export.sh
|
||||
-rwxrwxrwx 1 root root 280 Feb 22 13:58 DB-import.sh
|
||||
-rwxrwxrwx 1 root root 5772 Feb 17 13:26 deploy.sh
|
||||
-rwxrwxrwx 1 root root 40 Nov 15 16:40 disk-mount.sh
|
||||
-rwxrwxrwx 1 root root 44 Nov 18 08:17 Docker_Build.sh
|
||||
-rwxrwxrwx 1 root root 4346 Mar 4 10:23 GEN-SITEMAP.sh
|
||||
-rwxrwxrwx 1 root root 1330 Dec 9 09:09 GIT-MGMT.sh
|
||||
-rwxrwxrwx 1 root root 1680 Feb 26 13:51 hydra.sh
|
||||
-rwxrwxrwx 1 root root 1680 Feb 26 13:51 MAIN.sh
|
||||
-rwxrwxrwx 1 root root 1379 Feb 17 13:49 MONITOR.sh
|
||||
-rwxrwxrwx 1 root root 286 Feb 26 17:17 output.txt
|
||||
-rwxrwxrwx 1 root root 139921497 Jul 23 2025 rockyou.txt
|
||||
-rwxrwxrwx 1 root root 43 Jan 22 12:45 Wake_Up.sh
|
||||
-rwxrwxrwx 1 root root 1857 Feb 20 22:37 Web_Crawler.py
|
||||
```
|
||||
|
||||
- Temporäre Daten:
|
||||
/data/TEMP/
|
||||
|
||||
- öffentliche website:
|
||||
/data/WEBSERVER/PUBLIC
|
||||
|
||||
- Backend website:
|
||||
/data/WEBSERVER/BACKEND
|
||||
|
||||
- rollback backups
|
||||
/data/WEBSERVER/BACKUP
|
||||
```
|
||||
drwxrwxrwx 1 root root 4096 Mar 1 20:15 BACKEND-20260302-115230-node1
|
||||
drwxrwxrwx 1 root root 4096 Mar 3 10:00 BACKEND-20260303-131821-node1
|
||||
drwxrwxrwx 1 root root 4096 Feb 5 15:48 PUBLIC-20260216-145443-node1
|
||||
drwxrwxrwx 1 root root 4096 Feb 16 14:54 PUBLIC-20260216-163846-node1
|
||||
|
||||
```
|
||||
@@ -1,9 +0,0 @@
|
||||
# Drives
|
||||
|
||||
| | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| Typ | SSD | SSD | HDD | SSD | SSD | SSD | SSD |
|
||||
| Size | 230GB | 230GB | 1,8TB | 230GB | 120GB | 230GB | 120GB |
|
||||
| Tasks | NFS | NFS | | NFS | | NFS | |
|
||||
| Device ID | sdb1 | sdc1 | sdd2 | sde1 | sdf1 | sdg1 | sdh1 |
|
||||
| Used For | Proxmox VMs | Proxmox LXCs | | Proxmox BK | | Proxmox BK | |
|
||||
+7
-1
@@ -37,7 +37,7 @@ frontend https
|
||||
acl valid_method method PUT DELETE GET POST HEAD PATCH
|
||||
http-request deny if !valid_method
|
||||
|
||||
acl is_trusted src 178.19.224.210 80.153.174.251 153.92.79.159
|
||||
acl is_trusted src 178.19.224.210 80.153.174.251 152.53.159.169
|
||||
|
||||
stick-table type ip size 100k expire 30s store http_req_rate(60s)
|
||||
|
||||
@@ -54,10 +54,12 @@ frontend https
|
||||
acl is_portainer hdr(host) -i portainer.mrhossa.de
|
||||
acl is_homarr hdr(host) -i homarr.mrhossa.de
|
||||
acl is_vaultwarden hdr(host) -i vaultwarden.mrhossa.de
|
||||
acl is_wireguard hdr(host) -i wireguard.mrhossa.de
|
||||
|
||||
http-request deny if is_jenkins !is_trusted
|
||||
http-request deny if is_portainer !is_trusted
|
||||
http-request deny if is_homarr !is_trusted
|
||||
http-request deny if is_wireguard !is_trusted
|
||||
|
||||
use_backend web_public if is_public
|
||||
use_backend web_backend if is_backend
|
||||
@@ -67,6 +69,7 @@ frontend https
|
||||
use_backend web_vaultwarden if is_vaultwarden
|
||||
use_backend web_portainer if is_portainer
|
||||
use_backend web_homarr if is_homarr
|
||||
use_backend web_wireguard if is_wireguard
|
||||
use_backend stats if is_stats
|
||||
|
||||
default_backend web_public
|
||||
@@ -97,6 +100,9 @@ backend web_portainer
|
||||
backend web_homarr
|
||||
server homarr 152.53.159.169:8006 check
|
||||
|
||||
backend web_wireguard
|
||||
server wireguard 152.53.159.169:51821 check
|
||||
|
||||
backend stats
|
||||
stats enable
|
||||
stats uri /
|
||||
|
||||
+35
-35
@@ -1,48 +1,48 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgDH/Ks87uNjxXt4xZ
|
||||
oiOxXVlVd/xgIany+FBj5736gU+hRANCAATZCAnKEYIuO55E+G+2Tf4NtcTQjeSs
|
||||
+eUUooWrjxYH0KEgPGrLdATuLJiQtYIKXP4Ui1+6NcH8qmb+8uKGbgsC
|
||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg7UV7nbTUPTKMza98
|
||||
RXKECiFKmc6zBq5pLyz6dL4QdkihRANCAATqEjXI+cLpJYw8k9SGC+9EA5HcEgnV
|
||||
HTZiQpS4J0zpTn+c8edGd/4yfYwwiRQJP8EbU2O7bLkibU5k9lyiTjYU
|
||||
-----END PRIVATE KEY-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEOTCCA7+gAwIBAgISBa2nt6Xx+ZJFRNgl3KEn/qbyMAoGCCqGSM49BAMDMDMx
|
||||
MIIEPzCCA8WgAwIBAgISBiOdY6XpvmNrnR0bjiH5fSAYMAoGCCqGSM49BAMDMDMx
|
||||
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZ
|
||||
RTEwHhcNMjYwODAyMDg1OTAwWhcNMjYxMDMxMDg1ODU5WjAVMRMwEQYDVQQDEwpt
|
||||
cmhvc3NhLmRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2QgJyhGCLjueRPhv
|
||||
tk3+DbXE0I3krPnlFKKFq48WB9ChIDxqy3QE7iyYkLWCClz+FItfujXB/Kpm/vLi
|
||||
hm4LAqOCAs8wggLLMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD
|
||||
ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSbmNhAO/hNo5DO9vqqT7sUwfN8zjAf
|
||||
BgNVHSMEGDAWgBS7IMpHC/7X5Zz5jwkqo4w3RbG82DAzBggrBgEFBQcBAQQnMCUw
|
||||
IwYIKwYBBQUHMAKGF2h0dHA6Ly95ZTEuaS5sZW5jci5vcmcvMIHKBgNVHREEgcIw
|
||||
gb+CEmJhY2tlbmQubXJob3NzYS5kZYIOZG5zLm1yaG9zc2EuZGWCFGZsYXRub3Rl
|
||||
cy5tcmhvc3NhLmRlghBnaXRlYS5tcmhvc3NhLmRlghFob21hcnIubXJob3NzYS5k
|
||||
ZYISamVua2lucy5tcmhvc3NhLmRlggptcmhvc3NhLmRlghRwb3J0YWluZXIubXJo
|
||||
b3NzYS5kZYIQc3RhdHMubXJob3NzYS5kZYIWdmF1bHR3YXJkZW4ubXJob3NzYS5k
|
||||
ZTATBgNVHSAEDDAKMAgGBmeBDAECATAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8v
|
||||
eWUxLmMubGVuY3Iub3JnLzExNS5jcmwwggEMBgorBgEEAdZ5AgQCBIH9BIH6APgA
|
||||
dgCvZ4g7V7BO3Y+m2X72LqjrgQrHcWDwJF5V1gwv54WHOgAAAZ/B6ECfAAAEAwBH
|
||||
MEUCIBvQl6ZDFMUUuUQ5GE89pXNFkzf7GKNNERWPXdq3/040AiEAtl0FCFsitqi3
|
||||
Wdl94uMT/AJ77U9KiR2RJ6lJ0VeglzsAfgCoJsvjCsY1EkZTP+Bl8U8Z2W4ZCBPE
|
||||
HdlteQCzEjxVJwAAAZ/B6EL9AAgAAAUAF9sOcQQDAEcwRQIgfVxAhiEbdPNTkN73
|
||||
FRNdo1op6NqzoPrpvhUw/grKq88CIQCV6OgtwVYeukARaxY4RfWoGiPN5E2RYg7j
|
||||
Uc+kPY9xqDAKBggqhkjOPQQDAwNoADBlAjEA0iYLFsbBNJ7egV1DLtscelMMFKXV
|
||||
NpoD101x0DnRfM0UXCFPlB2ZS/1A+rrkfbeeAjB9HBU9ZHM+emGs0vJoh5IHxBUp
|
||||
L+kFJKqu2yDd+xuAATp87ai0Mhrl72i2VxZWduc=
|
||||
RTIwHhcNMjYxMDA1MTc0NzEwWhcNMjcwMTAzMTc0NzA5WjAVMRMwEQYDVQQDEwpt
|
||||
cmhvc3NhLmRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6hI1yPnC6SWMPJPU
|
||||
hgvvRAOR3BIJ1R02YkKUuCdM6U5/nPHnRnf+Mn2MMIkUCT/BG1Nju2y5Im1OZPZc
|
||||
ok42FKOCAtUwggLRMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD
|
||||
ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQhY3x6BwIrFq2LdMg7vh2yh612YDAf
|
||||
BgNVHSMEGDAWgBS5WfKOzyLwhtM3SP92FBi6gthVhzAzBggrBgEFBQcBAQQnMCUw
|
||||
IwYIKwYBBQUHMAKGF2h0dHA6Ly95ZTIuaS5sZW5jci5vcmcvMIHQBgNVHREEgcgw
|
||||
gcWCEmJhY2tlbmQubXJob3NzYS5kZYIUZmxhdG5vdGVzLm1yaG9zc2EuZGWCEGdp
|
||||
dGVhLm1yaG9zc2EuZGWCEWhvbWFyci5tcmhvc3NhLmRlghJqZW5raW5zLm1yaG9z
|
||||
c2EuZGWCCm1yaG9zc2EuZGWCFHBvcnRhaW5lci5tcmhvc3NhLmRlghBzdGF0cy5t
|
||||
cmhvc3NhLmRlghZ2YXVsdHdhcmRlbi5tcmhvc3NhLmRlghR3aXJlZ3VhcmQubXJo
|
||||
b3NzYS5kZTATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
|
||||
dHRwOi8veWUyLmMubGVuY3Iub3JnLzI1LmNybDCCAQ0GCisGAQQB1nkCBAIEgf4E
|
||||
gfsA+QB2AGBMmq96f3dfAdQG/JINyJnrCxx9+MlSG/r6F3c7l4vJAAABoQ1izPoA
|
||||
AAQDAEcwRQIhAN20nTZhRCkj2Wg/MdK6Ue0L3+W92YDcEfAFXYa4qrCVAiANeJZk
|
||||
V1OS94rSKOqQHHBrEzzUrCKnHf7abPxc0rEtTwB/AKKBABhzThduHUfglUDzgbpU
|
||||
ZpfNY6hDUHFuuAlO2vENAAABoQ1izpcACAAABQAdEpG9BAMASDBGAiEAs5FjS+jS
|
||||
ZQdCNZ0jqggaKk+qbxjYmKNBnTkA5X65T/QCIQD/ge0oKSuhk3MuVOKcRQrEODBn
|
||||
O9Hp0pnAZXHoFpkc2jAKBggqhkjOPQQDAwNoADBlAjEA8mYRaKbcjiFHwxRJtSrs
|
||||
PYVdHbPejW0/az5E6MgtWcOwaVu2AjB7LhADjXP5wlBAAjBVoHoU2AvSTPgCgpEk
|
||||
BA9DkuzIKQPdBcvAMz2Duo4QaeEvXuT2rLr20itVV2QUMus=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICizCCAhGgAwIBAgIQXd1w3TH4AchcGGp6BLgK/jAKBggqhkjOPQQDAzAuMQsw
|
||||
MIICjDCCAhGgAwIBAgIQTfOxXdbAeExQfNN7WObxFTAKBggqhkjOPQQDAzAuMQsw
|
||||
CQYDVQQGEwJVUzENMAsGA1UEChMESVNSRzEQMA4GA1UEAxMHUm9vdCBZRTAeFw0y
|
||||
NTA5MDMwMDAwMDBaFw0yODA5MDIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYD
|
||||
VQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZRTEwdjAQBgcqhkjOPQIBBgUr
|
||||
gQQAIgNiAAQHZVB1/mimla2hfSurylScjPMZaOJXLz/NnAc2sylm8WDyhU9Ccp+z
|
||||
ASQi5vSwGGJjSGklkD9fdPR8GpyDIOIjCEfrnbt/v+ZSEPLLEGbaM6EccDbN7p9x
|
||||
teIm2Avf+ryjge4wgeswDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
|
||||
BwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLsgykcL/tflnPmPCSqj
|
||||
jDdFsbzYMB8GA1UdIwQYMBaAFKPIJlqOoUzQNWP8myPIOq5W809WMDIGCCsGAQUF
|
||||
VQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZRTIwdjAQBgcqhkjOPQIBBgUr
|
||||
gQQAIgNiAARxmrQzkdbEEL3MqXt3dJQttYc47axkdDTHud5TPqM2z5uSD5cmk0Wr
|
||||
HlWXvnlvqBLqiB34kluxIbmMyAiq3/YD6e80/vV259K8XQIdjFXloYOa0mIU71f7
|
||||
HQ09PvYDlw+jge4wgeswDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
|
||||
BwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLlZ8o7PIvCG0zdI/3YU
|
||||
GLqC2FWHMB8GA1UdIwQYMBaAFKPIJlqOoUzQNWP8myPIOq5W809WMDIGCCsGAQUF
|
||||
BwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3llLmkubGVuY3Iub3JnLzATBgNV
|
||||
HSAEDDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veWUuYy5s
|
||||
ZW5jci5vcmcvMAoGCCqGSM49BAMDA2gAMGUCMQDgjUEahFT/h3DRakqiPZpLvPgf
|
||||
Zwkt6K2EOMmh1nvEzl83eMLYcod4GCl3b0J1Nn0CMBNYmEQJb4CEG5WoOe7aRn/L
|
||||
VKu6saHmHEynI7ysIPd8zQsK1HdmhlHKlw9Z5GpGvA==
|
||||
ZW5jci5vcmcvMAoGCCqGSM49BAMDA2kAMGYCMQDIcnw5dcZLN9ffynXnnkLD/itS
|
||||
JEycJPb3sRkzeqBowup7vOsAwaqoCnNn/jh9wycCMQCJM6CPlaOC4pQYYbJtVPYb
|
||||
DKrIb2EKk5NpOpE6/XttQYZV/3gilB9l+Cc/DOVwmyg=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICpjCCAiugAwIBAgIRAIchZfw0tuX7qK3Vs3BftTowCgYIKoZIzj0EAwMwTzEL
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<string>webserver_backend</string>
|
||||
<string>gitea</string>
|
||||
<string>mariadb</string>
|
||||
<string>wireguard</string>
|
||||
<string>haproxy</string>
|
||||
<string>all</string>
|
||||
</choices>
|
||||
@@ -54,6 +55,7 @@
|
||||
'webserver_backend',
|
||||
'gitea',
|
||||
'mariadb',
|
||||
'wireguard',
|
||||
'haproxy',
|
||||
'all'
|
||||
],
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ export_database() {
|
||||
log_info "Exportiere DEV"
|
||||
cp /data/TEMP/Database.sql /data/TEMP/Database-$(date +%Y-%m-%d_%H-%M-%S).sql
|
||||
echo "Letzten 5 Dateien gelistet:"
|
||||
du -sh /data/TEMP/* | tail -n 5
|
||||
du -sh /data/TEMP/Database-* | tail -n 5
|
||||
mariadb-dump -h 127.0.0.1 -u worker -pbBHofurUJWKzPE8Z --all-databases > /data/TEMP/Database.sql
|
||||
log_info "DEV wurde nach DEV.sql exportiert"
|
||||
}
|
||||
|
||||
+66
-12
@@ -13,25 +13,82 @@ DATE=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
CPU_LOAD=$(uptime | awk -F 'load average:' '{ print $2 }' | sed 's/^ *//')
|
||||
MEMORY_USAGE=$(free -h | awk '/Mem:/ {print $3 " used / " $2 " total"}')
|
||||
DISK_USAGE=$(df -h /)
|
||||
NFS_USAGE=$(df -h /data)
|
||||
|
||||
# -------------------------------
|
||||
# Docker Status
|
||||
# -------------------------------
|
||||
|
||||
if command -v docker &> /dev/null
|
||||
docker_list() {
|
||||
|
||||
local name image status ports
|
||||
local short_image short_status short_ports host_ports
|
||||
|
||||
{
|
||||
printf '%s\x1f%s\x1f%s\x1f%s\n' "NAME" "IMAGE" "STATUS" "PORTS"
|
||||
|
||||
docker ps --format '{{.Names}}'$'\x1f''{{.Image}}'$'\x1f''{{.Status}}'$'\x1f''{{.Ports}}' |
|
||||
while IFS=$'\x1f' read -r name image status ports; do
|
||||
|
||||
short_image=$(sed -E 's#^.*/##' <<<"$image")
|
||||
|
||||
short_status=$(sed -E \
|
||||
-e 's/^Up //' \
|
||||
-e 's/^Exited \(([0-9]+)\)/exit \1,/' \
|
||||
-e 's/\(healthy\)/ok/' \
|
||||
-e 's/\(unhealthy\)/!!/' \
|
||||
-e 's/\(health: starting\)/../' \
|
||||
-e 's/ ago$//' <<<"$status")
|
||||
|
||||
host_ports=$( (grep -oE ':[0-9]+->' <<<"$ports" || true) | (grep -oE '[0-9]+' || true) | sort -un | paste -sd, - )
|
||||
|
||||
if [[ -n "$host_ports" ]]; then
|
||||
short_ports="$host_ports"
|
||||
elif [[ -n "$ports" ]]; then
|
||||
short_ports="(intern)"
|
||||
else
|
||||
short_ports="-"
|
||||
fi
|
||||
|
||||
printf '%s\x1f%s\x1f%s\x1f%s\n' "$name" "$short_image" "$short_status" "$short_ports"
|
||||
done
|
||||
} | awk -F'\x1f' '
|
||||
{
|
||||
for (i = 1; i <= NF; i++) {
|
||||
cell[NR, i] = $i
|
||||
if (length($i) > width[i]) width[i] = length($i)
|
||||
}
|
||||
cols = NF
|
||||
rows = NR
|
||||
}
|
||||
END {
|
||||
for (r = 1; r <= rows; r++) {
|
||||
line = ""
|
||||
for (i = 1; i <= cols; i++) {
|
||||
line = line cell[r, i]
|
||||
if (i < cols) {
|
||||
pad = width[i] - length(cell[r, i]) + 2
|
||||
for (p = 0; p < pad; p++) line = line " "
|
||||
}
|
||||
}
|
||||
print line
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
if command -v speedtest-cli &> /dev/null
|
||||
then
|
||||
DOCKER_CONTAINERS=$(docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}")
|
||||
DOCKER_STATS=$(docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}")
|
||||
SPEEDTEST=$(speedtest-cli --simple 2>/dev/null)
|
||||
else
|
||||
DOCKER_CONTAINERS="Docker ist nicht installiert oder der Docker-Daemon läuft nicht."
|
||||
DOCKER_STATS="Docker ist nicht installiert oder der Docker-Daemon läuft nicht."
|
||||
SPEEDTEST="speedtest-cli nicht installiert (apt install speedtest-cli)"
|
||||
fi
|
||||
|
||||
# -------------------------------
|
||||
# Ausgabe auf Konsole
|
||||
# -------------------------------
|
||||
|
||||
DOCKER_STATS=$(docker_list)
|
||||
|
||||
echo "Server Status Report"
|
||||
echo =====================================================
|
||||
echo
|
||||
@@ -39,16 +96,13 @@ echo "Hostname : $(hostname)"
|
||||
echo "Datum : $DATE"
|
||||
echo "CPU Load : $CPU_LOAD"
|
||||
echo "RAM : $MEMORY_USAGE"
|
||||
echo
|
||||
echo "Internet-Geschwindigkeit:"
|
||||
echo "$SPEEDTEST"
|
||||
echo
|
||||
echo "System Festplatten:"
|
||||
echo "$DISK_USAGE"
|
||||
echo
|
||||
echo "NFS Festplatten:"
|
||||
echo "$NFS_USAGE"
|
||||
echo
|
||||
echo "Docker Container:"
|
||||
echo "$DOCKER_CONTAINERS"
|
||||
echo
|
||||
echo "Docker Stats:"
|
||||
echo "$DOCKER_STATS"
|
||||
echo
|
||||
|
||||
@@ -2,4 +2,6 @@
|
||||
|
||||
echo "SYNC DATA"
|
||||
|
||||
rsync -avz -e "ssh -i /root/.ssh/nas_backup" /data/TEMP/encrypted/ admin@100.115.108.55:/volume1/SYS_DISK/DB_DUMPS
|
||||
rsync -avz -e "ssh -i /root/.ssh/nas_backup" /data/TEMP/encrypted/ admin@100.115.108.55:/volumeUSB1/usbshare/DB_DUMPS
|
||||
rsync -avz --remove-source-files -e "ssh -i ~/.ssh/rsync_key" /data/TEMP/encrypted/ worker@152.53.162.220:/data/BACKUP/
|
||||
@@ -115,6 +115,68 @@ docker_remove() {
|
||||
log_success "Loeschen abgeschlossen"
|
||||
}
|
||||
|
||||
docker_list() {
|
||||
|
||||
local name image status ports
|
||||
local short_image short_status short_ports host_ports
|
||||
|
||||
{
|
||||
printf '%s\x1f%s\x1f%s\x1f%s\n' "NAME" "IMAGE" "STATUS" "PORTS"
|
||||
|
||||
docker ps --format '{{.Names}}'$'\x1f''{{.Image}}'$'\x1f''{{.Status}}'$'\x1f''{{.Ports}}' |
|
||||
while IFS=$'\x1f' read -r name image status ports; do
|
||||
|
||||
short_image=$(sed -E 's#^.*/##' <<<"$image")
|
||||
|
||||
short_status=$(sed -E \
|
||||
-e 's/^Up //' \
|
||||
-e 's/^Exited \(([0-9]+)\)/exit \1,/' \
|
||||
-e 's/\(healthy\)/ok/' \
|
||||
-e 's/\(unhealthy\)/!!/' \
|
||||
-e 's/\(health: starting\)/../' \
|
||||
-e 's/ ago$//' <<<"$status")
|
||||
|
||||
host_ports=$( (grep -oE ':[0-9]+->' <<<"$ports" || true) | (grep -oE '[0-9]+' || true) | sort -un | paste -sd, - )
|
||||
|
||||
if [[ -n "$host_ports" ]]; then
|
||||
short_ports="$host_ports"
|
||||
elif [[ -n "$ports" ]]; then
|
||||
short_ports="(intern)"
|
||||
else
|
||||
short_ports="-"
|
||||
fi
|
||||
|
||||
printf '%s\x1f%s\x1f%s\x1f%s\n' "$name" "$short_image" "$short_status" "$short_ports"
|
||||
done
|
||||
} | awk -F'\x1f' '
|
||||
{
|
||||
for (i = 1; i <= NF; i++) {
|
||||
cell[NR, i] = $i
|
||||
if (length($i) > width[i]) width[i] = length($i)
|
||||
}
|
||||
cols = NF
|
||||
rows = NR
|
||||
}
|
||||
END {
|
||||
for (r = 1; r <= rows; r++) {
|
||||
line = ""
|
||||
for (i = 1; i <= cols; i++) {
|
||||
line = line cell[r, i]
|
||||
if (i < cols) {
|
||||
pad = width[i] - length(cell[r, i]) + 2
|
||||
for (p = 0; p < pad; p++) line = line " "
|
||||
}
|
||||
}
|
||||
print line
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
docker_stats() {
|
||||
docker stats --no-stream
|
||||
}
|
||||
|
||||
########################################
|
||||
# CLI
|
||||
########################################
|
||||
@@ -148,6 +210,14 @@ case "$ACTION" in
|
||||
docker_recreate "$TARGET"
|
||||
;;
|
||||
|
||||
list)
|
||||
docker_list
|
||||
;;
|
||||
|
||||
stats)
|
||||
docker_stats
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage:"
|
||||
echo " $0 up <container|all>"
|
||||
@@ -156,6 +226,8 @@ case "$ACTION" in
|
||||
echo " $0 remove <container|all>"
|
||||
echo " $0 restart <container|all>"
|
||||
echo " $0 recreate <container|all>"
|
||||
echo " $0 list"
|
||||
echo " $0 stats"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Binary file not shown.
@@ -0,0 +1,28 @@
|
||||
# Note: Do not edit this file directly.
|
||||
# Your changes will be overwritten!
|
||||
|
||||
# Server
|
||||
[Interface]
|
||||
PrivateKey = UMxzoOzkw6Zos+kK8/dGiuU9z8wpe26mVVFboJ27GWk=
|
||||
Address = 10.8.0.1/24, fdcc:ad94:bacf:61a4::cafe:1/112
|
||||
ListenPort = 51820
|
||||
MTU = 1420
|
||||
Table = auto
|
||||
|
||||
PreUp =
|
||||
PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -s fdcc:ad94:bacf:61a4::cafe:0/112 -o eth0 -j MASQUERADE; ip6tables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT;
|
||||
PreDown =
|
||||
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -s fdcc:ad94:bacf:61a4::cafe:0/112 -o eth0 -j MASQUERADE; ip6tables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT;
|
||||
|
||||
# Client: Tower-Home (1)
|
||||
[Peer]
|
||||
PublicKey = bW6NsTKIfrIi9CppQC7/9M6Di/zzfavQMiz5e1x5N0E=
|
||||
PresharedKey = bQrr/slLuSp8zHrMA8UtXcjRa4uQq2YbxigxZZ3DCf0=
|
||||
AllowedIPs = 10.8.0.2/32, fdcc:ad94:bacf:61a4::cafe:2/128
|
||||
|
||||
# Client: Handy-Bruno (2)
|
||||
[Peer]
|
||||
PublicKey = f+Xybpl/DTiOpCnBVUCTFYAkfxU59OnKHS3HXPua0Ro=
|
||||
PresharedKey = 2vNNYhMIC4KpDw1UbXAg08eUdTprXxAeCvxdq7MgG3k=
|
||||
AllowedIPs = 10.8.0.3/32, fdcc:ad94:bacf:61a4::cafe:3/128
|
||||
|
||||
@@ -6,10 +6,10 @@ SHELL=/bin/bash
|
||||
10 0 */1 * * /data/SCRIPTS/Database.sh update
|
||||
0 1 */1 * * sudo /data/SCRIPTS/archive-encrypt.sh
|
||||
15 1 */1 * * sudo /data/SCRIPTS/archive-sync.sh
|
||||
0 */8 * * * sudo /data/SCRIPTS/generate-sitemap.sh all
|
||||
0 */8 * * * sudo /data/SCRIPTS/generate-sitemap.sh all >/dev/null 2>&1
|
||||
0 */12 * * * /data/SCRIPTS/MONITOR.sh
|
||||
0 0 10 * * sudo /data/SCRIPTS/certs-renew.sh
|
||||
*/15 * * * * docker exec webserver_backend php /var/www/html/Commands/WeatherLog.php
|
||||
*/15 * * * * docker exec webserver_backend php /var/www/html/Commands/WeatherLog.php >/dev/null 2>&1
|
||||
*/15 * * * * docker exec webserver_backend php /var/www/html/Commands/TerminErinnerung.php
|
||||
0 4 * * 0 docker exec webserver_backend php /var/www/html/Commands/ResetEinkaufsliste.php
|
||||
0 */4 * * * sudo /data/SCRIPTS/docker.sh restart dnsmasq
|
||||
#0 */4 * * * sudo /data/SCRIPTS/docker.sh restart dnsmasq
|
||||
@@ -180,6 +180,26 @@ services:
|
||||
- "50000:50000"
|
||||
restart: always
|
||||
|
||||
wireguard:
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
container_name: wireguard
|
||||
volumes:
|
||||
- ./WIREGUARD:/etc/wireguard
|
||||
- /lib/modules:/lib/modules:ro
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_MODULE
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
networks:
|
||||
docker-net:
|
||||
ipv4_address: 172.30.0.20
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
- "51821:51821"
|
||||
restart: always
|
||||
|
||||
networks:
|
||||
docker-net:
|
||||
driver: bridge
|
||||
|
||||
Reference in new issue
Block a user