94 lines
2.7 KiB
Bash
94 lines
2.7 KiB
Bash
#!/bin/bash
|
||
|
||
# PostgreSQL Backup Script - Best Practices 2025
|
||
# Creates manual backups of the PostgreSQL database
|
||
|
||
set -e # Exit on error
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
echo -e "${BLUE}=== PostgreSQL Backup Script ===${NC}"
|
||
echo ""
|
||
|
||
# Function to print status
|
||
print_status() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
# Check if database container is running
|
||
DB_CONTAINER=$(docker compose ps -q db 2>/dev/null)
|
||
|
||
if [ -z "$DB_CONTAINER" ] || [ -z "$(docker ps -q -f id=$DB_CONTAINER)" ]; then
|
||
print_error "Database container is not running!"
|
||
echo ""
|
||
echo -e "${YELLOW}Start the database with: ${NC}./start.sh"
|
||
echo -e "${YELLOW}Or run: ${NC}docker compose up -d db"
|
||
exit 1
|
||
fi
|
||
|
||
print_status "Database container is running"
|
||
echo ""
|
||
|
||
# Create backups directory
|
||
BACKUP_DIR="./backups"
|
||
mkdir -p "$BACKUP_DIR"
|
||
|
||
# Create timestamped backup filename
|
||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||
BACKUP_FILE="$BACKUP_DIR/postgres_backup_$TIMESTAMP.sql.gz"
|
||
|
||
echo -e "${BLUE}Creating database backup...${NC}"
|
||
echo -e "${BLUE}Target: $BACKUP_FILE${NC}"
|
||
echo ""
|
||
|
||
# Perform backup using pg_dumpall
|
||
if docker exec -t chatbot-db pg_dumpall -c -U chatbot_user | gzip > "$BACKUP_FILE"; then
|
||
print_status "Backup created successfully!"
|
||
echo ""
|
||
|
||
# Show backup details
|
||
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
||
echo -e "${GREEN}Backup details:${NC}"
|
||
echo -e " ${BLUE}→${NC} File: $(basename $BACKUP_FILE)"
|
||
echo -e " ${BLUE}→${NC} Size: $BACKUP_SIZE"
|
||
echo -e " ${BLUE}→${NC} Location: $BACKUP_FILE"
|
||
echo ""
|
||
|
||
# Count total backups
|
||
BACKUP_COUNT=$(ls -1 $BACKUP_DIR/*.sql.gz 2>/dev/null | wc -l)
|
||
print_info "Total backups: $BACKUP_COUNT"
|
||
|
||
# Calculate total backup size
|
||
TOTAL_SIZE=$(du -sh $BACKUP_DIR | cut -f1)
|
||
echo -e " ${BLUE}→${NC} Total backup size: $TOTAL_SIZE"
|
||
echo ""
|
||
|
||
# Show retention recommendation
|
||
if [ "$BACKUP_COUNT" -gt 10 ]; then
|
||
echo -e "${YELLOW}⚠ You have $BACKUP_COUNT backups. Consider cleaning old backups:${NC}"
|
||
echo -e " ${BLUE}→${NC} Keep last 7 days: ${CYAN}find $BACKUP_DIR -name '*.sql.gz' -mtime +7 -delete${NC}"
|
||
echo -e " ${BLUE}→${NC} Keep last 10: ${CYAN}ls -t $BACKUP_DIR/*.sql.gz | tail -n +11 | xargs rm -f${NC}"
|
||
fi
|
||
else
|
||
print_error "Backup failed!"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo -e "${GREEN}✓ Backup completed successfully!${NC}"
|
||
echo ""
|
||
echo -e "${BLUE}To restore this backup, run: ${NC}./start.sh ${BLUE}(and choose restore option)${NC}"
|