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/
|
/PORTAINER/
|
||||||
/VAULTWARDEN/
|
/VAULTWARDEN/
|
||||||
/FLATNOTES/.*
|
/FLATNOTES/.*
|
||||||
|
/SESSIONS/
|
||||||
@@ -102,3 +102,8 @@ DEFAULT_TRUST_MODEL = committer
|
|||||||
|
|
||||||
[oauth2]
|
[oauth2]
|
||||||
JWT_SECRET = 3kXf3QovlO0hgPifm0lJF9wJhiYWqHqF6d4FBczKirc
|
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
|
port 587
|
||||||
from bruno.eckhardt07@gmail.com
|
from bruno.eckhardt07@gmail.com
|
||||||
user bruno.eckhardt07@gmail.com
|
user bruno.eckhardt07@gmail.com
|
||||||
password qrwj rnqp qoks qzpy
|
password PASSWORT
|
||||||
|
|
||||||
account default : gmail
|
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`
|
3. `sudo chown worker:worker /home/worker/.msmtprc`
|
||||||
4. `chmod 600 /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`
|
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`
|
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`
|
6. `apt update`
|
||||||
7. `apt full-upgrade`
|
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
|
acl valid_method method PUT DELETE GET POST HEAD PATCH
|
||||||
http-request deny if !valid_method
|
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)
|
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_portainer hdr(host) -i portainer.mrhossa.de
|
||||||
acl is_homarr hdr(host) -i homarr.mrhossa.de
|
acl is_homarr hdr(host) -i homarr.mrhossa.de
|
||||||
acl is_vaultwarden hdr(host) -i vaultwarden.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_jenkins !is_trusted
|
||||||
http-request deny if is_portainer !is_trusted
|
http-request deny if is_portainer !is_trusted
|
||||||
http-request deny if is_homarr !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_public if is_public
|
||||||
use_backend web_backend if is_backend
|
use_backend web_backend if is_backend
|
||||||
@@ -67,6 +69,7 @@ frontend https
|
|||||||
use_backend web_vaultwarden if is_vaultwarden
|
use_backend web_vaultwarden if is_vaultwarden
|
||||||
use_backend web_portainer if is_portainer
|
use_backend web_portainer if is_portainer
|
||||||
use_backend web_homarr if is_homarr
|
use_backend web_homarr if is_homarr
|
||||||
|
use_backend web_wireguard if is_wireguard
|
||||||
use_backend stats if is_stats
|
use_backend stats if is_stats
|
||||||
|
|
||||||
default_backend web_public
|
default_backend web_public
|
||||||
@@ -97,6 +100,9 @@ backend web_portainer
|
|||||||
backend web_homarr
|
backend web_homarr
|
||||||
server homarr 152.53.159.169:8006 check
|
server homarr 152.53.159.169:8006 check
|
||||||
|
|
||||||
|
backend web_wireguard
|
||||||
|
server wireguard 152.53.159.169:51821 check
|
||||||
|
|
||||||
backend stats
|
backend stats
|
||||||
stats enable
|
stats enable
|
||||||
stats uri /
|
stats uri /
|
||||||
|
|||||||
+35
-35
@@ -1,48 +1,48 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
-----BEGIN PRIVATE KEY-----
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgDH/Ks87uNjxXt4xZ
|
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg7UV7nbTUPTKMza98
|
||||||
oiOxXVlVd/xgIany+FBj5736gU+hRANCAATZCAnKEYIuO55E+G+2Tf4NtcTQjeSs
|
RXKECiFKmc6zBq5pLyz6dL4QdkihRANCAATqEjXI+cLpJYw8k9SGC+9EA5HcEgnV
|
||||||
+eUUooWrjxYH0KEgPGrLdATuLJiQtYIKXP4Ui1+6NcH8qmb+8uKGbgsC
|
HTZiQpS4J0zpTn+c8edGd/4yfYwwiRQJP8EbU2O7bLkibU5k9lyiTjYU
|
||||||
-----END PRIVATE KEY-----
|
-----END PRIVATE KEY-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIEOTCCA7+gAwIBAgISBa2nt6Xx+ZJFRNgl3KEn/qbyMAoGCCqGSM49BAMDMDMx
|
MIIEPzCCA8WgAwIBAgISBiOdY6XpvmNrnR0bjiH5fSAYMAoGCCqGSM49BAMDMDMx
|
||||||
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZ
|
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZ
|
||||||
RTEwHhcNMjYwODAyMDg1OTAwWhcNMjYxMDMxMDg1ODU5WjAVMRMwEQYDVQQDEwpt
|
RTIwHhcNMjYxMDA1MTc0NzEwWhcNMjcwMTAzMTc0NzA5WjAVMRMwEQYDVQQDEwpt
|
||||||
cmhvc3NhLmRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2QgJyhGCLjueRPhv
|
cmhvc3NhLmRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6hI1yPnC6SWMPJPU
|
||||||
tk3+DbXE0I3krPnlFKKFq48WB9ChIDxqy3QE7iyYkLWCClz+FItfujXB/Kpm/vLi
|
hgvvRAOR3BIJ1R02YkKUuCdM6U5/nPHnRnf+Mn2MMIkUCT/BG1Nju2y5Im1OZPZc
|
||||||
hm4LAqOCAs8wggLLMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD
|
ok42FKOCAtUwggLRMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD
|
||||||
ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSbmNhAO/hNo5DO9vqqT7sUwfN8zjAf
|
ATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQhY3x6BwIrFq2LdMg7vh2yh612YDAf
|
||||||
BgNVHSMEGDAWgBS7IMpHC/7X5Zz5jwkqo4w3RbG82DAzBggrBgEFBQcBAQQnMCUw
|
BgNVHSMEGDAWgBS5WfKOzyLwhtM3SP92FBi6gthVhzAzBggrBgEFBQcBAQQnMCUw
|
||||||
IwYIKwYBBQUHMAKGF2h0dHA6Ly95ZTEuaS5sZW5jci5vcmcvMIHKBgNVHREEgcIw
|
IwYIKwYBBQUHMAKGF2h0dHA6Ly95ZTIuaS5sZW5jci5vcmcvMIHQBgNVHREEgcgw
|
||||||
gb+CEmJhY2tlbmQubXJob3NzYS5kZYIOZG5zLm1yaG9zc2EuZGWCFGZsYXRub3Rl
|
gcWCEmJhY2tlbmQubXJob3NzYS5kZYIUZmxhdG5vdGVzLm1yaG9zc2EuZGWCEGdp
|
||||||
cy5tcmhvc3NhLmRlghBnaXRlYS5tcmhvc3NhLmRlghFob21hcnIubXJob3NzYS5k
|
dGVhLm1yaG9zc2EuZGWCEWhvbWFyci5tcmhvc3NhLmRlghJqZW5raW5zLm1yaG9z
|
||||||
ZYISamVua2lucy5tcmhvc3NhLmRlggptcmhvc3NhLmRlghRwb3J0YWluZXIubXJo
|
c2EuZGWCCm1yaG9zc2EuZGWCFHBvcnRhaW5lci5tcmhvc3NhLmRlghBzdGF0cy5t
|
||||||
b3NzYS5kZYIQc3RhdHMubXJob3NzYS5kZYIWdmF1bHR3YXJkZW4ubXJob3NzYS5k
|
cmhvc3NhLmRlghZ2YXVsdHdhcmRlbi5tcmhvc3NhLmRlghR3aXJlZ3VhcmQubXJo
|
||||||
ZTATBgNVHSAEDDAKMAgGBmeBDAECATAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8v
|
b3NzYS5kZTATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
|
||||||
eWUxLmMubGVuY3Iub3JnLzExNS5jcmwwggEMBgorBgEEAdZ5AgQCBIH9BIH6APgA
|
dHRwOi8veWUyLmMubGVuY3Iub3JnLzI1LmNybDCCAQ0GCisGAQQB1nkCBAIEgf4E
|
||||||
dgCvZ4g7V7BO3Y+m2X72LqjrgQrHcWDwJF5V1gwv54WHOgAAAZ/B6ECfAAAEAwBH
|
gfsA+QB2AGBMmq96f3dfAdQG/JINyJnrCxx9+MlSG/r6F3c7l4vJAAABoQ1izPoA
|
||||||
MEUCIBvQl6ZDFMUUuUQ5GE89pXNFkzf7GKNNERWPXdq3/040AiEAtl0FCFsitqi3
|
AAQDAEcwRQIhAN20nTZhRCkj2Wg/MdK6Ue0L3+W92YDcEfAFXYa4qrCVAiANeJZk
|
||||||
Wdl94uMT/AJ77U9KiR2RJ6lJ0VeglzsAfgCoJsvjCsY1EkZTP+Bl8U8Z2W4ZCBPE
|
V1OS94rSKOqQHHBrEzzUrCKnHf7abPxc0rEtTwB/AKKBABhzThduHUfglUDzgbpU
|
||||||
HdlteQCzEjxVJwAAAZ/B6EL9AAgAAAUAF9sOcQQDAEcwRQIgfVxAhiEbdPNTkN73
|
ZpfNY6hDUHFuuAlO2vENAAABoQ1izpcACAAABQAdEpG9BAMASDBGAiEAs5FjS+jS
|
||||||
FRNdo1op6NqzoPrpvhUw/grKq88CIQCV6OgtwVYeukARaxY4RfWoGiPN5E2RYg7j
|
ZQdCNZ0jqggaKk+qbxjYmKNBnTkA5X65T/QCIQD/ge0oKSuhk3MuVOKcRQrEODBn
|
||||||
Uc+kPY9xqDAKBggqhkjOPQQDAwNoADBlAjEA0iYLFsbBNJ7egV1DLtscelMMFKXV
|
O9Hp0pnAZXHoFpkc2jAKBggqhkjOPQQDAwNoADBlAjEA8mYRaKbcjiFHwxRJtSrs
|
||||||
NpoD101x0DnRfM0UXCFPlB2ZS/1A+rrkfbeeAjB9HBU9ZHM+emGs0vJoh5IHxBUp
|
PYVdHbPejW0/az5E6MgtWcOwaVu2AjB7LhADjXP5wlBAAjBVoHoU2AvSTPgCgpEk
|
||||||
L+kFJKqu2yDd+xuAATp87ai0Mhrl72i2VxZWduc=
|
BA9DkuzIKQPdBcvAMz2Duo4QaeEvXuT2rLr20itVV2QUMus=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIICizCCAhGgAwIBAgIQXd1w3TH4AchcGGp6BLgK/jAKBggqhkjOPQQDAzAuMQsw
|
MIICjDCCAhGgAwIBAgIQTfOxXdbAeExQfNN7WObxFTAKBggqhkjOPQQDAzAuMQsw
|
||||||
CQYDVQQGEwJVUzENMAsGA1UEChMESVNSRzEQMA4GA1UEAxMHUm9vdCBZRTAeFw0y
|
CQYDVQQGEwJVUzENMAsGA1UEChMESVNSRzEQMA4GA1UEAxMHUm9vdCBZRTAeFw0y
|
||||||
NTA5MDMwMDAwMDBaFw0yODA5MDIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYD
|
NTA5MDMwMDAwMDBaFw0yODA5MDIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYD
|
||||||
VQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZRTEwdjAQBgcqhkjOPQIBBgUr
|
VQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQDEwNZRTIwdjAQBgcqhkjOPQIBBgUr
|
||||||
gQQAIgNiAAQHZVB1/mimla2hfSurylScjPMZaOJXLz/NnAc2sylm8WDyhU9Ccp+z
|
gQQAIgNiAARxmrQzkdbEEL3MqXt3dJQttYc47axkdDTHud5TPqM2z5uSD5cmk0Wr
|
||||||
ASQi5vSwGGJjSGklkD9fdPR8GpyDIOIjCEfrnbt/v+ZSEPLLEGbaM6EccDbN7p9x
|
HlWXvnlvqBLqiB34kluxIbmMyAiq3/YD6e80/vV259K8XQIdjFXloYOa0mIU71f7
|
||||||
teIm2Avf+ryjge4wgeswDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
|
HQ09PvYDlw+jge4wgeswDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
|
||||||
BwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLsgykcL/tflnPmPCSqj
|
BwMBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLlZ8o7PIvCG0zdI/3YU
|
||||||
jDdFsbzYMB8GA1UdIwQYMBaAFKPIJlqOoUzQNWP8myPIOq5W809WMDIGCCsGAQUF
|
GLqC2FWHMB8GA1UdIwQYMBaAFKPIJlqOoUzQNWP8myPIOq5W809WMDIGCCsGAQUF
|
||||||
BwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3llLmkubGVuY3Iub3JnLzATBgNV
|
BwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3llLmkubGVuY3Iub3JnLzATBgNV
|
||||||
HSAEDDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veWUuYy5s
|
HSAEDDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veWUuYy5s
|
||||||
ZW5jci5vcmcvMAoGCCqGSM49BAMDA2gAMGUCMQDgjUEahFT/h3DRakqiPZpLvPgf
|
ZW5jci5vcmcvMAoGCCqGSM49BAMDA2kAMGYCMQDIcnw5dcZLN9ffynXnnkLD/itS
|
||||||
Zwkt6K2EOMmh1nvEzl83eMLYcod4GCl3b0J1Nn0CMBNYmEQJb4CEG5WoOe7aRn/L
|
JEycJPb3sRkzeqBowup7vOsAwaqoCnNn/jh9wycCMQCJM6CPlaOC4pQYYbJtVPYb
|
||||||
VKu6saHmHEynI7ysIPd8zQsK1HdmhlHKlw9Z5GpGvA==
|
DKrIb2EKk5NpOpE6/XttQYZV/3gilB9l+Cc/DOVwmyg=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIICpjCCAiugAwIBAgIRAIchZfw0tuX7qK3Vs3BftTowCgYIKoZIzj0EAwMwTzEL
|
MIICpjCCAiugAwIBAgIRAIchZfw0tuX7qK3Vs3BftTowCgYIKoZIzj0EAwMwTzEL
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
<string>webserver_backend</string>
|
<string>webserver_backend</string>
|
||||||
<string>gitea</string>
|
<string>gitea</string>
|
||||||
<string>mariadb</string>
|
<string>mariadb</string>
|
||||||
|
<string>wireguard</string>
|
||||||
<string>haproxy</string>
|
<string>haproxy</string>
|
||||||
<string>all</string>
|
<string>all</string>
|
||||||
</choices>
|
</choices>
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
'webserver_backend',
|
'webserver_backend',
|
||||||
'gitea',
|
'gitea',
|
||||||
'mariadb',
|
'mariadb',
|
||||||
|
'wireguard',
|
||||||
'haproxy',
|
'haproxy',
|
||||||
'all'
|
'all'
|
||||||
],
|
],
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ export_database() {
|
|||||||
log_info "Exportiere DEV"
|
log_info "Exportiere DEV"
|
||||||
cp /data/TEMP/Database.sql /data/TEMP/Database-$(date +%Y-%m-%d_%H-%M-%S).sql
|
cp /data/TEMP/Database.sql /data/TEMP/Database-$(date +%Y-%m-%d_%H-%M-%S).sql
|
||||||
echo "Letzten 5 Dateien gelistet:"
|
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
|
mariadb-dump -h 127.0.0.1 -u worker -pbBHofurUJWKzPE8Z --all-databases > /data/TEMP/Database.sql
|
||||||
log_info "DEV wurde nach DEV.sql exportiert"
|
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/^ *//')
|
CPU_LOAD=$(uptime | awk -F 'load average:' '{ print $2 }' | sed 's/^ *//')
|
||||||
MEMORY_USAGE=$(free -h | awk '/Mem:/ {print $3 " used / " $2 " total"}')
|
MEMORY_USAGE=$(free -h | awk '/Mem:/ {print $3 " used / " $2 " total"}')
|
||||||
DISK_USAGE=$(df -h /)
|
DISK_USAGE=$(df -h /)
|
||||||
NFS_USAGE=$(df -h /data)
|
|
||||||
|
|
||||||
# -------------------------------
|
# -------------------------------
|
||||||
# Docker Status
|
# 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
|
then
|
||||||
DOCKER_CONTAINERS=$(docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}")
|
SPEEDTEST=$(speedtest-cli --simple 2>/dev/null)
|
||||||
DOCKER_STATS=$(docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}")
|
|
||||||
else
|
else
|
||||||
DOCKER_CONTAINERS="Docker ist nicht installiert oder der Docker-Daemon läuft nicht."
|
SPEEDTEST="speedtest-cli nicht installiert (apt install speedtest-cli)"
|
||||||
DOCKER_STATS="Docker ist nicht installiert oder der Docker-Daemon läuft nicht."
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# -------------------------------
|
# -------------------------------
|
||||||
# Ausgabe auf Konsole
|
# Ausgabe auf Konsole
|
||||||
# -------------------------------
|
# -------------------------------
|
||||||
|
|
||||||
|
DOCKER_STATS=$(docker_list)
|
||||||
|
|
||||||
echo "Server Status Report"
|
echo "Server Status Report"
|
||||||
echo =====================================================
|
echo =====================================================
|
||||||
echo
|
echo
|
||||||
@@ -39,16 +96,13 @@ echo "Hostname : $(hostname)"
|
|||||||
echo "Datum : $DATE"
|
echo "Datum : $DATE"
|
||||||
echo "CPU Load : $CPU_LOAD"
|
echo "CPU Load : $CPU_LOAD"
|
||||||
echo "RAM : $MEMORY_USAGE"
|
echo "RAM : $MEMORY_USAGE"
|
||||||
|
echo
|
||||||
|
echo "Internet-Geschwindigkeit:"
|
||||||
|
echo "$SPEEDTEST"
|
||||||
echo
|
echo
|
||||||
echo "System Festplatten:"
|
echo "System Festplatten:"
|
||||||
echo "$DISK_USAGE"
|
echo "$DISK_USAGE"
|
||||||
echo
|
echo
|
||||||
echo "NFS Festplatten:"
|
|
||||||
echo "$NFS_USAGE"
|
|
||||||
echo
|
|
||||||
echo "Docker Container:"
|
|
||||||
echo "$DOCKER_CONTAINERS"
|
|
||||||
echo
|
|
||||||
echo "Docker Stats:"
|
echo "Docker Stats:"
|
||||||
echo "$DOCKER_STATS"
|
echo "$DOCKER_STATS"
|
||||||
echo
|
echo
|
||||||
|
|||||||
@@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
echo "SYNC DATA"
|
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/
|
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"
|
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
|
# CLI
|
||||||
########################################
|
########################################
|
||||||
@@ -148,6 +210,14 @@ case "$ACTION" in
|
|||||||
docker_recreate "$TARGET"
|
docker_recreate "$TARGET"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
list)
|
||||||
|
docker_list
|
||||||
|
;;
|
||||||
|
|
||||||
|
stats)
|
||||||
|
docker_stats
|
||||||
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo "Usage:"
|
echo "Usage:"
|
||||||
echo " $0 up <container|all>"
|
echo " $0 up <container|all>"
|
||||||
@@ -156,6 +226,8 @@ case "$ACTION" in
|
|||||||
echo " $0 remove <container|all>"
|
echo " $0 remove <container|all>"
|
||||||
echo " $0 restart <container|all>"
|
echo " $0 restart <container|all>"
|
||||||
echo " $0 recreate <container|all>"
|
echo " $0 recreate <container|all>"
|
||||||
|
echo " $0 list"
|
||||||
|
echo " $0 stats"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
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
|
10 0 */1 * * /data/SCRIPTS/Database.sh update
|
||||||
0 1 */1 * * sudo /data/SCRIPTS/archive-encrypt.sh
|
0 1 */1 * * sudo /data/SCRIPTS/archive-encrypt.sh
|
||||||
15 1 */1 * * sudo /data/SCRIPTS/archive-sync.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 */12 * * * /data/SCRIPTS/MONITOR.sh
|
||||||
0 0 10 * * sudo /data/SCRIPTS/certs-renew.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
|
*/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 * * 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"
|
- "50000:50000"
|
||||||
restart: always
|
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:
|
networks:
|
||||||
docker-net:
|
docker-net:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
Reference in new issue
Block a user