#!/usr/bin/env bash set -Eeuo pipefail dhv2_project="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" dhv2_label="${1:-manual}" dhv2_stamp="$(date +%Y%m%d_%H%M%S)" if [[ ! "$dhv2_label" =~ ^[a-zA-Z0-9_-]{1,40}$ ]]; then echo "Etiqueta de backup inválida" >&2 exit 1 fi dhv2_backup="/var/www/dh-backup/dhv2-${dhv2_label}-${dhv2_stamp}" install -d -m 700 "$dhv2_backup" cd "$dhv2_project" test -f .env || { echo "No se encontró $dhv2_project/.env" >&2; exit 1; } docker compose ps --status running >/dev/null tar \ --exclude='*.zip' \ --exclude='.env' \ --exclude='*/node_modules' \ --exclude='*/dist' \ --exclude='*.tsbuildinfo' \ -czf "$dhv2_backup/source.tar.gz" . install -m 600 .env "$dhv2_backup/.env" docker compose exec -T db sh -lc \ 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' \ > "$dhv2_backup/database.dump" dhv2_media_file="" if docker volume inspect dhv2_asset_media >/dev/null 2>&1; then dhv2_media_file="asset-media.tar.gz" docker compose exec -T api sh -lc \ 'test -d "$ASSET_MEDIA_ROOT" && tar -czf - -C "$ASSET_MEDIA_ROOT" .' \ > "$dhv2_backup/$dhv2_media_file" chmod 600 "$dhv2_backup/$dhv2_media_file" fi dhv2_nginx_file="" for dhv2_candidate in \ /etc/nginx/sites-available/dhv2.korexlabs.com \ /etc/nginx/sites-available/dhv2.korexlabs.com.conf \ /etc/nginx/sites-enabled/dhv2.korexlabs.com \ /etc/nginx/sites-enabled/dhv2.korexlabs.com.conf; do if [ -f "$dhv2_candidate" ]; then dhv2_nginx_file="nginx-site.conf" install -m 600 "$dhv2_candidate" "$dhv2_backup/$dhv2_nginx_file" break fi done if [ -z "$dhv2_nginx_file" ]; then dhv2_nginx_file="NGINX_CONFIG_NOT_FOUND.txt" printf '%s\n' 'No se encontró una configuración Nginx en las rutas conocidas.' > "$dhv2_backup/$dhv2_nginx_file" chmod 600 "$dhv2_backup/$dhv2_nginx_file" fi { echo "Proyecto: DH Inspección V2" echo "Fase: D5.2" echo "Versión: 0.19.2" echo "Fecha UTC: $(date -u +%Y-%m-%dT%H:%M:%SZ)" echo "Origen: $dhv2_project" echo "Base: dump PostgreSQL custom format" if [ -n "$dhv2_media_file" ]; then echo "Archivos protegidos de activos e inspecciones: $dhv2_media_file" else echo "Archivos protegidos: volumen todavía inexistente" fi echo echo "Contenedores al generar el backup:" docker compose ps } > "$dhv2_backup/MANIFEST.txt" chmod 600 "$dhv2_backup/MANIFEST.txt" ( cd "$dhv2_backup" dhv2_checksum_files=(source.tar.gz database.dump .env "$dhv2_nginx_file" MANIFEST.txt) if [ -n "$dhv2_media_file" ]; then dhv2_checksum_files+=("$dhv2_media_file") fi sha256sum "${dhv2_checksum_files[@]}" > SHA256SUMS ) chmod 600 "$dhv2_backup/SHA256SUMS" echo "$dhv2_backup"