Files
Hetzner-Backup/create_full_backup.sh
Claude Project Manager 76ce1929a9 Initial commit
2025-07-05 01:07:30 +02:00

118 Zeilen
4.1 KiB
Bash

#!/bin/bash
# Full Server Backup Script for V2-Docker
# Creates comprehensive backup including configs, database, volumes, and git status
set -e # Exit on error
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Configuration
BACKUP_BASE_DIR="/opt/v2-Docker/server-backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_BASE_DIR/server_backup_$TIMESTAMP"
PROJECT_ROOT="/opt/v2-Docker"
# GitHub configuration
GITHUB_REMOTE="backup"
GITHUB_BRANCH="main"
GIT_PATH="/home/root/.local/bin"
echo -e "${GREEN}Starting V2-Docker Full Server Backup...${NC}"
echo "Backup directory: $BACKUP_DIR"
# Create backup directory structure
mkdir -p "$BACKUP_DIR"/{configs,volumes}
# 1. Backup configuration files
echo -e "${YELLOW}Backing up configuration files...${NC}"
cp "$PROJECT_ROOT/v2/docker-compose.yaml" "$BACKUP_DIR/configs/" 2>/dev/null || echo "docker-compose.yaml not found"
cp "$PROJECT_ROOT/v2/.env" "$BACKUP_DIR/configs/" 2>/dev/null || echo ".env not found"
cp "$PROJECT_ROOT/v2_nginx/nginx.conf" "$BACKUP_DIR/configs/" 2>/dev/null || echo "nginx.conf not found"
# Backup SSL certificates
if [ -d "$PROJECT_ROOT/v2_nginx/ssl" ]; then
mkdir -p "$BACKUP_DIR/configs/ssl"
cp -r "$PROJECT_ROOT/v2_nginx/ssl/"* "$BACKUP_DIR/configs/ssl/" 2>/dev/null || echo "SSL files not found"
fi
# 2. Capture Git status and recent commits
echo -e "${YELLOW}Capturing Git information...${NC}"
cd "$PROJECT_ROOT"
git status > "$BACKUP_DIR/git_status.txt" 2>&1
git log --oneline -50 > "$BACKUP_DIR/git_recent_commits.txt" 2>&1
# 3. Capture Docker status
echo -e "${YELLOW}Capturing Docker status...${NC}"
docker ps -a > "$BACKUP_DIR/docker_containers.txt" 2>&1
cd "$PROJECT_ROOT/v2" && docker-compose ps > "$BACKUP_DIR/docker_compose_status.txt" 2>&1 && cd "$PROJECT_ROOT"
# 4. Backup PostgreSQL database
echo -e "${YELLOW}Backing up PostgreSQL database...${NC}"
DB_CONTAINER="db" # Korrigierter Container-Name
DB_NAME="meinedatenbank" # Korrigierter DB-Name
DB_USER="adminuser" # Korrigierter User
# Get DB password from .env or environment
if [ -f "$PROJECT_ROOT/v2/.env" ]; then
source "$PROJECT_ROOT/v2/.env"
fi
DB_PASS="${POSTGRES_PASSWORD:-supergeheimespasswort}"
# Create database dump
docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" | gzip > "$BACKUP_DIR/database_backup.sql.gz"
# 5. Backup Docker volumes
echo -e "${YELLOW}Backing up Docker volumes...${NC}"
# PostgreSQL data volume
docker run --rm -v postgres_data:/data -v "$BACKUP_DIR/volumes":/backup alpine tar czf /backup/postgres_data.tar.gz -C /data .
# Create backup info file
cat > "$BACKUP_DIR/backup_info.txt" << EOF
V2-Docker Server Backup
Created: $(date)
Timestamp: $TIMESTAMP
Type: Full Server Backup
Contents:
- Configuration files (docker-compose, nginx, SSL)
- PostgreSQL database dump
- Docker volumes
- Git status and history
- Docker container status
EOF
# Calculate backup size
BACKUP_SIZE=$(du -sh "$BACKUP_DIR" | cut -f1)
echo -e "${GREEN}Backup created successfully!${NC}"
echo "Size: $BACKUP_SIZE"
# Push to GitHub if requested (default: yes)
if [ "${SKIP_GITHUB:-no}" != "yes" ]; then
echo -e "${YELLOW}Pushing backup to GitHub...${NC}"
# Create tar archive for GitHub
cd "$BACKUP_BASE_DIR"
TAR_FILE="server_backup_$TIMESTAMP.tar.gz"
tar czf "$TAR_FILE" "server_backup_$TIMESTAMP"
# Push to GitHub
cd "$PROJECT_ROOT"
PATH="$GIT_PATH:$PATH" git pull "$GITHUB_REMOTE" "$GITHUB_BRANCH" --rebase 2>/dev/null || true
PATH="$GIT_PATH:$PATH" git add "server-backups/$TAR_FILE"
PATH="$GIT_PATH:$PATH" git commit -m "Server backup $TIMESTAMP - Full system backup before changes"
PATH="$GIT_PATH:$PATH" git push "$GITHUB_REMOTE" "$GITHUB_BRANCH"
echo -e "${GREEN}Backup pushed to GitHub successfully!${NC}"
# Keep local copy for manual backups (for quick rollback)
# Automated backups will delete this later
echo -e "${YELLOW}Local backup kept at: $BACKUP_DIR${NC}"
else
echo -e "${YELLOW}Skipped GitHub push (SKIP_GITHUB=yes)${NC}"
fi
echo "Backup file: $BACKUP_DIR"
echo -e "${GREEN}Backup completed successfully!${NC}"