Compare commits

...
Author SHA1 Message Date
Tower 5c33809d22 option for gitea mirror 2026-10-22 22:18:11 +02:00
Tower b5e8b11c91 fix 2026-10-21 19:15:59 +02:00
bruno 30fcc20dce changes in doc 2026-10-19 13:17:43 +02:00
bruno 4d58d30b25 Deleting old Flatnote Files an adding new, also adding wireguard config 2026-10-12 11:10:31 +02:00
bruno 46bcd9d2c7 fix: monitoring script error cant oben running file 2026-10-06 19:47:53 +02:00
bruno 829811acd7 remove sohpias home ip and add self server ip vor vpn access 2026-10-06 19:44:39 +02:00
bruno 0db950db0a fix 2026-10-05 20:42:46 +02:00
bruno 0cd44488e5 new service wireguard 2026-10-05 20:40:29 +02:00
bruno 70688bcf55 crontab fix 2026-10-05 19:07:22 +02:00
Tower 8a63ca48a8 hotfix 2026-09-10 12:44:20 +02:00
Tower 7eeebe8065 fix 2026-09-10 12:21:30 +02:00
Tower 7bf3a0df0b new backup storages 2026-09-10 12:16:50 +02:00
Tower a045544f88 add speedtest to monitor script 2026-09-10 11:51:59 +02:00
Tower e1ce11bd57 fix: mailing container listing 2026-09-10 11:41:03 +02:00
Tower 908fa5d422 fix: Listing of Export files 2026-09-10 11:37:59 +02:00
Tower a48aab3d90 add docker stats 2026-09-06 20:06:33 +02:00
Tower 3e1c4aa541 fix 2026-09-06 20:00:16 +02:00
Tower 0c2f80ae48 add 2026-09-06 19:55:30 +02:00
22 changed files with 301 additions and 590 deletions

No files matched your search

+1
View File
@@ -15,3 +15,4 @@
/PORTAINER/
/VAULTWARDEN/
/FLATNOTES/.*
/SESSIONS/
+5
View File
@@ -102,3 +102,8 @@ DEFAULT_TRUST_MODEL = committer
[oauth2]
JWT_SECRET = 3kXf3QovlO0hgPifm0lJF9wJhiYWqHqF6d4FBczKirc
[mirror]
ENABLED = true
DEFAULT_INTERVAL = 8h
MIN_INTERVAL = 10m
-37
View File
@@ -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
```
-96
View File
@@ -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 |
-306
View File
@@ -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
View File
@@ -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`
+7
View File
@@ -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`
-20
View File
@@ -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
+33
View File
@@ -8,3 +8,36 @@ Proxmox no subscription repo einbauen
6. `apt update`
7. `apt full-upgrade`
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
```
-69
View File
@@ -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
```
-9
View File
@@ -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
View File
@@ -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
View File
@@ -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 @@
&apos;webserver_backend&apos;,
&apos;gitea&apos;,
&apos;mariadb&apos;,
&apos;wireguard&apos;,
&apos;haproxy&apos;,
&apos;all&apos;
],
+1 -1
View File
@@ -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
View File
@@ -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
@@ -40,15 +97,12 @@ 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
View File
@@ -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/
+72
View File
@@ -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.
+28
View File
@@ -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
+3 -3
View File
@@ -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
+20
View File
@@ -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