Files
dh-inspeccion-v2/scripts/backup-phase-a.sh

92 lines
2.6 KiB
Bash
Executable File

#!/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"