Variablen ausgelagert, weil sauberer
This commit is contained in:
@@ -1,2 +1,4 @@
|
|||||||
|
.gitattributes text eol=lf
|
||||||
*.sh text eol=lf
|
*.sh text eol=lf
|
||||||
*.md text eol=lf
|
*.md text eol=lf
|
||||||
|
*.conf text eol=lf
|
||||||
|
|||||||
@@ -16,20 +16,34 @@ chmod +x docker-backup-sftp-uploader.sh
|
|||||||
./docker-backup-sftp-uploader.sh
|
./docker-backup-sftp-uploader.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Die wichtigsten Einstellungen können direkt im Script angepasst oder als Umgebungsvariablen gesetzt werden:
|
Die Konfiguration liegt in `docker-backup-sftp-uploader.conf` neben dem Script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SFTP_HOST="backup.example.com"
|
||||||
|
SFTP_PORT="22"
|
||||||
|
SFTP_USER="backup-user"
|
||||||
|
SFTP_PASS="secret"
|
||||||
|
SFTP_REMOTE_DIR="/uploads"
|
||||||
|
MAIL_TO="admin@example.com"
|
||||||
|
MAIL_FROM="backup@example.com"
|
||||||
|
BACKUP_DIR="/srv/backups/docker-backup-sftp-uploader"
|
||||||
|
LOG_DIR="/srv/backups/docker-backup-sftp-uploader/logs"
|
||||||
|
KEEP_LOCAL_BACKUP="false"
|
||||||
|
MIN_FREE_MB="1024"
|
||||||
|
```
|
||||||
|
|
||||||
|
Danach reicht:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export SFTP_HOST="backup.example.com"
|
|
||||||
export SFTP_PORT="22"
|
|
||||||
export SFTP_USER="backup-user"
|
|
||||||
export SFTP_PASS="secret"
|
|
||||||
export SFTP_REMOTE_DIR="/uploads"
|
|
||||||
export MAIL_TO="admin@example.com"
|
|
||||||
export MAIL_FROM="backup@example.com"
|
|
||||||
export BACKUP_DIR="/srv/backups/docker-backup-sftp-uploader"
|
|
||||||
./docker-backup-sftp-uploader.sh
|
./docker-backup-sftp-uploader.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Falls eine andere Konfigurationsdatei genutzt werden soll:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CONFIG_FILE="/etc/docker-backup-sftp-uploader.conf" ./docker-backup-sftp-uploader.sh
|
||||||
|
```
|
||||||
|
|
||||||
## Wichtige Hinweise
|
## Wichtige Hinweise
|
||||||
|
|
||||||
- Archive und Logs werden nicht mehr in `/tmp` geschrieben. Standard ist ein Backup-Ordner neben dem Projektverzeichnis.
|
- Archive und Logs werden nicht mehr in `/tmp` geschrieben. Standard ist ein Backup-Ordner neben dem Projektverzeichnis.
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
########################################
|
||||||
|
# Docker Backup SFTP Uploader
|
||||||
|
# Konfiguration
|
||||||
|
########################################
|
||||||
|
|
||||||
|
SFTP_HOST="sftp.example.com"
|
||||||
|
SFTP_PORT="22"
|
||||||
|
SFTP_USER="user"
|
||||||
|
SFTP_PASS="Tpassw0rd"
|
||||||
|
SFTP_REMOTE_DIR="/uploads"
|
||||||
|
|
||||||
|
MAIL_TO=""
|
||||||
|
MAIL_FROM=""
|
||||||
|
|
||||||
|
# Nicht /tmp verwenden: viele Systeme mounten /tmp klein oder als tmpfs.
|
||||||
|
# Der Standard legt den Backup-Ordner neben dem Projektverzeichnis ab.
|
||||||
|
BACKUP_DIR=""
|
||||||
|
LOG_DIR=""
|
||||||
|
|
||||||
|
# true = lokales Archiv nach erfolgreichem Upload behalten
|
||||||
|
KEEP_LOCAL_BACKUP="false"
|
||||||
|
|
||||||
|
# Zusätzlicher freier Speicher in MB, der neben der Quellgröße vorhanden sein muss.
|
||||||
|
MIN_FREE_MB="1024"
|
||||||
@@ -3,25 +3,32 @@
|
|||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Konfiguration
|
# Script- und Konfigurationspfade
|
||||||
########################################
|
########################################
|
||||||
|
|
||||||
SFTP_HOST="${SFTP_HOST:-sftp.example.com}"
|
|
||||||
SFTP_PORT="${SFTP_PORT:-22}"
|
|
||||||
SFTP_USER="${SFTP_USER:-user}"
|
|
||||||
SFTP_PASS="${SFTP_PASS:-Tpassw0rd}"
|
|
||||||
SFTP_REMOTE_DIR="${SFTP_REMOTE_DIR:-/uploads}"
|
|
||||||
|
|
||||||
MAIL_TO="${MAIL_TO:-}"
|
|
||||||
MAIL_FROM="${MAIL_FROM:-}"
|
|
||||||
|
|
||||||
# Nicht /tmp verwenden: viele Systeme mounten /tmp klein oder als tmpfs.
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
DIR_NAME="$(basename "$SCRIPT_DIR")"
|
DIR_NAME="$(basename "$SCRIPT_DIR")"
|
||||||
BACKUP_DIR="${BACKUP_DIR:-$(dirname "$SCRIPT_DIR")/${DIR_NAME}_backups}"
|
CONFIG_FILE="${CONFIG_FILE:-${SCRIPT_DIR}/docker-backup-sftp-uploader.conf}"
|
||||||
LOG_DIR="${LOG_DIR:-${BACKUP_DIR}/logs}"
|
|
||||||
KEEP_LOCAL_BACKUP="${KEEP_LOCAL_BACKUP:-false}"
|
if [[ -f "$CONFIG_FILE" ]]; then
|
||||||
MIN_FREE_MB="${MIN_FREE_MB:-1024}"
|
# shellcheck source=/dev/null
|
||||||
|
source "$CONFIG_FILE"
|
||||||
|
else
|
||||||
|
echo "FEHLER: Konfigurationsdatei nicht gefunden: $CONFIG_FILE" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# Optionale Fallbacks
|
||||||
|
########################################
|
||||||
|
|
||||||
|
: "${SFTP_PORT:=22}"
|
||||||
|
: "${MAIL_TO:=}"
|
||||||
|
: "${MAIL_FROM:=}"
|
||||||
|
: "${BACKUP_DIR:=$(dirname "$SCRIPT_DIR")/${DIR_NAME}_backups}"
|
||||||
|
: "${LOG_DIR:=${BACKUP_DIR}/logs}"
|
||||||
|
: "${KEEP_LOCAL_BACKUP:=false}"
|
||||||
|
: "${MIN_FREE_MB:=1024}"
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Variablen
|
# Variablen
|
||||||
@@ -54,6 +61,7 @@ log() {
|
|||||||
log "========================================="
|
log "========================================="
|
||||||
log "Backup gestartet"
|
log "Backup gestartet"
|
||||||
log "Projekt: $DIR_NAME"
|
log "Projekt: $DIR_NAME"
|
||||||
|
log "Konfiguration: $CONFIG_FILE"
|
||||||
log "Backup-Datei: $BACKUP_PATH"
|
log "Backup-Datei: $BACKUP_PATH"
|
||||||
log "Log-Datei: $LOGFILE"
|
log "Log-Datei: $LOGFILE"
|
||||||
log "========================================="
|
log "========================================="
|
||||||
@@ -71,6 +79,15 @@ require_command() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require_config_value() {
|
||||||
|
local variable_name="$1"
|
||||||
|
|
||||||
|
if [[ -z "${!variable_name:-}" ]]; then
|
||||||
|
log "FEHLER: Pflichtwert fehlt in der Konfiguration: $variable_name"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
send_mail() {
|
send_mail() {
|
||||||
local subject="$1"
|
local subject="$1"
|
||||||
local body="$2"
|
local body="$2"
|
||||||
@@ -255,6 +272,10 @@ require_command tar
|
|||||||
require_command gzip
|
require_command gzip
|
||||||
require_command sshpass
|
require_command sshpass
|
||||||
require_command sftp
|
require_command sftp
|
||||||
|
require_config_value SFTP_HOST
|
||||||
|
require_config_value SFTP_USER
|
||||||
|
require_config_value SFTP_PASS
|
||||||
|
require_config_value SFTP_REMOTE_DIR
|
||||||
check_backup_dir_location
|
check_backup_dir_location
|
||||||
check_free_space
|
check_free_space
|
||||||
|
|
||||||
|
|||||||
+22
-15
@@ -3,27 +3,34 @@
|
|||||||
## Ablauf
|
## Ablauf
|
||||||
|
|
||||||
1. Das Script ermittelt das Projektverzeichnis.
|
1. Das Script ermittelt das Projektverzeichnis.
|
||||||
2. Es legt Backup- und Log-Verzeichnis an.
|
2. Es lädt `docker-backup-sftp-uploader.conf` aus demselben Verzeichnis.
|
||||||
3. Es prüft benötigte Kommandos und freien Speicher.
|
3. Es legt Backup- und Log-Verzeichnis an.
|
||||||
4. Es stoppt Docker mit `docker compose down`.
|
4. Es prüft benötigte Kommandos, Pflichtwerte und freien Speicher.
|
||||||
5. Es erstellt ein `tar.gz`-Archiv des Projektordners.
|
5. Es stoppt Docker mit `docker compose down`.
|
||||||
6. Es startet Docker mit `docker compose up -d`.
|
6. Es erstellt ein `tar.gz`-Archiv des Projektordners.
|
||||||
7. Es lädt das Archiv per SFTP hoch.
|
7. Es startet Docker mit `docker compose up -d`.
|
||||||
8. Es verschickt bei Erfolg oder Fehler eine Mail, sofern Mailversand konfiguriert ist.
|
8. Es lädt das Archiv per SFTP hoch.
|
||||||
9. Es löscht das lokale Archiv, außer `KEEP_LOCAL_BACKUP=true` ist gesetzt.
|
9. Es verschickt bei Erfolg oder Fehler eine Mail, sofern Mailversand konfiguriert ist.
|
||||||
|
10. Es löscht das lokale Archiv, außer `KEEP_LOCAL_BACKUP=true` ist gesetzt.
|
||||||
|
|
||||||
## Konfiguration
|
## Konfiguration
|
||||||
|
|
||||||
|
Die Konfiguration liegt standardmäßig in `docker-backup-sftp-uploader.conf` neben dem Script. Alternativ kann ein anderer Pfad über `CONFIG_FILE` angegeben werden:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CONFIG_FILE="/etc/docker-backup-sftp-uploader.conf" ./docker-backup-sftp-uploader.sh
|
||||||
|
```
|
||||||
|
|
||||||
| Variable | Standard | Beschreibung |
|
| Variable | Standard | Beschreibung |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `SFTP_HOST` | `sftp.example.com` | Hostname des SFTP-Servers |
|
| `SFTP_HOST` | Pflichtwert | Hostname des SFTP-Servers |
|
||||||
| `SFTP_PORT` | `22` | Port des SFTP-Servers |
|
| `SFTP_PORT` | `22` | Port des SFTP-Servers |
|
||||||
| `SFTP_USER` | `user` | SFTP-Benutzer |
|
| `SFTP_USER` | Pflichtwert | SFTP-Benutzer |
|
||||||
| `SFTP_PASS` | `Tpassw0rd` | SFTP-Passwort |
|
| `SFTP_PASS` | Pflichtwert | SFTP-Passwort |
|
||||||
| `SFTP_REMOTE_DIR` | `/uploads` | Zielverzeichnis auf dem SFTP-Server |
|
| `SFTP_REMOTE_DIR` | Pflichtwert | Zielverzeichnis auf dem SFTP-Server |
|
||||||
| `MAIL_TO` | leer | Empfängeradresse; leer deaktiviert Mailversand |
|
| `MAIL_TO` | leer | Empfängeradresse; leer deaktiviert Mailversand |
|
||||||
| `MAIL_FROM` | leer | Optionaler Absender für `mail -r` |
|
| `MAIL_FROM` | leer | Optionaler Absender für `mail -r` |
|
||||||
| `BACKUP_DIR` | Ordner neben dem Projekt | Lokales Ziel für Archive |
|
| `BACKUP_DIR` | leer = Ordner neben dem Projekt | Lokales Ziel für Archive |
|
||||||
| `LOG_DIR` | `${BACKUP_DIR}/logs` | Lokales Ziel für Logs |
|
| `LOG_DIR` | `${BACKUP_DIR}/logs` | Lokales Ziel für Logs |
|
||||||
| `KEEP_LOCAL_BACKUP` | `false` | Lokales Archiv nach Lauf behalten |
|
| `KEEP_LOCAL_BACKUP` | `false` | Lokales Archiv nach Lauf behalten |
|
||||||
| `MIN_FREE_MB` | `1024` | Zusätzlicher freier Speicher, der neben der Quellgröße vorhanden sein muss |
|
| `MIN_FREE_MB` | `1024` | Zusätzlicher freier Speicher, der neben der Quellgröße vorhanden sein muss |
|
||||||
@@ -56,7 +63,7 @@ Wenn keine Mail ankommt:
|
|||||||
Das Archiv wird bewusst nicht in `/tmp` erstellt, weil `/tmp` auf vielen Systemen als kleiner tmpfs-Mount eingerichtet ist. Für große Projekte sollte `BACKUP_DIR` auf ein Dateisystem mit ausreichend freiem Speicher zeigen, zum Beispiel:
|
Das Archiv wird bewusst nicht in `/tmp` erstellt, weil `/tmp` auf vielen Systemen als kleiner tmpfs-Mount eingerichtet ist. Für große Projekte sollte `BACKUP_DIR` auf ein Dateisystem mit ausreichend freiem Speicher zeigen, zum Beispiel:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
BACKUP_DIR=/srv/backups/mein-projekt ./docker-backup-sftp-uploader.sh
|
BACKUP_DIR="/srv/backups/mein-projekt"
|
||||||
```
|
```
|
||||||
|
|
||||||
Das Script prüft vor dem Docker-Stopp grob, ob genug Platz vorhanden ist. Der Mindestbedarf entspricht ungefähr der Quellgröße plus 10 Prozent Reserve plus `MIN_FREE_MB`.
|
Das Script prüft vor dem Docker-Stopp grob, ob genug Platz vorhanden ist. Der Mindestbedarf entspricht ungefähr der Quellgröße plus 10 Prozent Reserve plus `MIN_FREE_MB`.
|
||||||
@@ -66,5 +73,5 @@ Der SFTP-Upload schreibt zuerst `${BACKUP_FILE}.part` und benennt die Datei nach
|
|||||||
## Cron-Beispiel
|
## Cron-Beispiel
|
||||||
|
|
||||||
```cron
|
```cron
|
||||||
0 3 * * * SFTP_HOST=backup.example.com SFTP_USER=backup SFTP_PASS='secret' SFTP_REMOTE_DIR=/uploads MAIL_TO=admin@example.com BACKUP_DIR=/srv/backups/mein-projekt /pfad/zum/docker-backup-sftp-uploader.sh
|
0 3 * * * /pfad/zum/docker-backup-sftp-uploader.sh
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user