#!/bin/bash # Script de backup para Matrix + Element set -e # Colores GREEN='\033[0;32m' BLUE='\033[0;34m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' # Configuración BACKUP_DIR="./backups" DATE=$(date +"%Y%m%d_%H%M%S") BACKUP_NAME="matrix_backup_$DATE" echo -e "${BLUE}💾 Iniciando backup de Matrix...${NC}" # Crear directorio de backup mkdir -p "$BACKUP_DIR" echo -e "${BLUE}📁 Creando directorio de backup: $BACKUP_NAME${NC}" mkdir -p "$BACKUP_DIR/$BACKUP_NAME" # Backup de configuraciones echo -e "${BLUE}⚙️ Respaldando configuraciones...${NC}" cp docker-compose.yml "$BACKUP_DIR/$BACKUP_NAME/" cp element-config.json "$BACKUP_DIR/$BACKUP_NAME/" cp -r configs "$BACKUP_DIR/$BACKUP_NAME/" 2>/dev/null || true # Backup de base de datos PostgreSQL echo -e "${BLUE}🗄️ Respaldando base de datos...${NC}" if docker ps | grep -q element_matrix_chat-postgres-1; then docker exec element_matrix_chat-postgres-1 pg_dump -U synapse synapse > "$BACKUP_DIR/$BACKUP_NAME/database.sql" echo -e "${GREEN}✅ Base de datos respaldada${NC}" else echo -e "${YELLOW}⚠️ PostgreSQL no está ejecutándose, saltando backup de BD${NC}" fi # Backup de datos de Synapse (excluyendo media store por tamaño) echo -e "${BLUE}📋 Respaldando configuración de Synapse...${NC}" if [ -d synapse3 ]; then mkdir -p "$BACKUP_DIR/$BACKUP_NAME/synapse_config" cp synapse3/homeserver.yaml "$BACKUP_DIR/$BACKUP_NAME/synapse_config/" 2>/dev/null || true cp synapse3/localhost.log.config "$BACKUP_DIR/$BACKUP_NAME/synapse_config/" 2>/dev/null || true cp synapse3/localhost.signing.key "$BACKUP_DIR/$BACKUP_NAME/synapse_config/" 2>/dev/null || true cp -r synapse3/appservices "$BACKUP_DIR/$BACKUP_NAME/synapse_config/" 2>/dev/null || true echo -e "${GREEN}✅ Configuración de Synapse respaldada${NC}" fi # Crear archivo de información del backup echo -e "${BLUE}📄 Creando archivo de información...${NC}" cat > "$BACKUP_DIR/$BACKUP_NAME/backup_info.txt" << EOF Matrix + Element Backup ====================== Fecha: $(date) Versión Docker Compose: $(docker-compose --version) Contenedores activos: $(docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}") Archivos incluidos: - docker-compose.yml - element-config.json - synapse_config/ (homeserver.yaml, claves, etc.) - database.sql (dump de PostgreSQL) NO incluidos (por tamaño): - media_store/ - postgresdata/ Para restaurar: 1. Restaurar archivos de configuración 2. docker-compose up -d postgres 3. docker exec -i element_matrix_chat-postgres-1 psql -U synapse synapse < database.sql 4. docker-compose up -d EOF # Comprimir backup echo -e "${BLUE}🗜️ Comprimiendo backup...${NC}" cd "$BACKUP_DIR" tar -czf "${BACKUP_NAME}.tar.gz" "$BACKUP_NAME" rm -rf "$BACKUP_NAME" cd .. # Información final BACKUP_SIZE=$(du -h "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" | cut -f1) echo echo -e "${GREEN}🎉 Backup completado exitosamente${NC}" echo -e "${BLUE}📍 Información del backup:${NC}" echo -e " • Archivo: ${GREEN}$BACKUP_DIR/${BACKUP_NAME}.tar.gz${NC}" echo -e " • Tamaño: ${GREEN}$BACKUP_SIZE${NC}" echo -e " • Fecha: ${GREEN}$(date)${NC}" echo echo -e "${BLUE}💡 Para restaurar:${NC}" echo -e " tar -xzf $BACKUP_DIR/${BACKUP_NAME}.tar.gz" echo -e " # Seguir instrucciones en backup_info.txt" # Limpiar backups antiguos (mantener últimos 5) echo -e "${BLUE}🧹 Limpiando backups antiguos...${NC}" cd "$BACKUP_DIR" ls -t matrix_backup_*.tar.gz | tail -n +6 | xargs rm -f 2>/dev/null || true REMAINING=$(ls matrix_backup_*.tar.gz 2>/dev/null | wc -l) echo -e "${GREEN}✅ Manteniendo $REMAINING backups${NC}"