#!/usr/bin/env bash set -euo pipefail ### CONFIG ### DATE=$(date +%F) # for deleting older files DRY_RUN=false KEEP_COUNT=1 #BASE_BACKUP_DIR="$HOME/backups/synapse" BASE_BACKUP_DIR="/mnt/disk/backups/synapse" BACKUP_DIR="$BASE_BACKUP_DIR/$DATE" SYNAPSE_DIR="/opt/synapse" SYNAPSE_DATA_DIR="/opt/synapse/synapse-data/_data" POSTGRES_SERVICE="pg" POSTGRES_DB="synapse" POSTGRES_USER="matrix" NGINX_DIR="/etc/nginx" LETSENCRYPT_DIR="/etc/letsencrypt" ### Startup Info ### echo "📦 Synapse backup started" echo "📅 Date: $DATE" echo "📁 Base Backups dir: $BASE_BACKUP_DIR" echo "📁 Backup dir: $BACKUP_DIR" echo ### remove old files ### cd $BASE_BACKUP_DIR echo "▶ cleanup older backup files ..." cd $BASE_BACKUP_DIR # Count the number of existing backups TOTAL_BACKUPS=$(find . -name 'full-backup-*.tar.gz' | wc -l) echo "Existing backup files ($TOTAL_BACKUPS) :" # Find all full-backup-*.tar.gz files and list them find . -name 'full-backup-*.tar.gz'| sort -k2,2 -t. -n -r | while IFS= read -r file; do echo "- $file" done echo # Find and list files that should be removed echo "Files that will be deleted:" files_to_delete=() while IFS= read -r -d $'\0' dir; do files_to_delete+=("$dir") echo "- $dir" done < <(find . -name 'full-backup-*.tar.gz' -newermt "$(( $KEEP_COUNT+1 )) days ago" ! -newermt "$KEEP_COUNT days ago" -print0) echo # Delete the files in dry-run mode or actually delete them for file in "${files_to_delete[@]}"; do if [ "$DRY_RUN" = true ]; then echo "Will be deleted (Dry-Run): $file" else rm "$file" echo "Deleted $file" fi done echo echo "Cleanup completed." ### PREP ### mkdir -p "$BACKUP_DIR" cd "$SYNAPSE_DIR" ### 1️⃣ Stop ONLY Synapse echo "⏸ Stopping ONLY Synapse service (Postgres stays running)..." docker compose stop synapse echo ### 2️⃣ PostgreSQL backup echo "🗄 Backing up PostgreSQL database..." docker compose exec -T "$POSTGRES_SERVICE" \ pg_dump -U "$POSTGRES_USER" -Fc "$POSTGRES_DB" \ > "$BACKUP_DIR/synapse-postgres.dump" echo "✅ PostgreSQL backup done" echo ### 7️⃣ Start Synapse again echo "▶ Starting Synapse service..." docker compose up -d synapse echo ### 3️⃣ Synapse data backup echo "📁 Backing up Synapse data directory..." tar -cJf "$BACKUP_DIR/synapse-data.tar.xz" \ -C "$SYNAPSE_DATA_DIR" . echo "✅ Synapse data backup done" echo ### 4️⃣ docker compose config (ONLY docker-compose.yml) echo "🐳 Backing up docker-compose.yml..." cp "$SYNAPSE_DIR/docker-compose.yml" \ "$BACKUP_DIR/docker-compose.yml" echo "✅ docker compose config backed up" echo ### 5️⃣ Nginx backup echo "🌐 Backing up Nginx config..." tar -czvf "$BACKUP_DIR/nginx.tar.gz" \ "$NGINX_DIR" echo "✅ Nginx backup done" echo ## 6️⃣ Let's Encrypt backup echo "🔐 Backing up Let's Encrypt certificates..." sudo tar -czvf "$BACKUP_DIR/letsencrypt.tar.gz" \ "$LETSENCRYPT_DIR" echo "✅ Let's Encrypt backup done" echo ### 8️⃣ Optional: Full combined archiveve (run with sudo) echo "📦 Creating full backup archive..." tar -czvf "$BASE_BACKUP_DIR/full-backup-$DATE.tar.gz" \ -C "$BASE_BACKUP_DIR" "$DATE" echo "✅ Full archive created" echo ### Remove the backup dir after full archive echo "📦 Removing the Backup directory: $DATE" sudo rm -r $BACKUP_DIR echo "Backup directory removed." echo echo "✅✅ Backup completed successfully" echo