6b8bcd0939
rsync_deploy sincroniza directorio local a remoto via SSH con exclusiones estándar (.git, node_modules, *.db, etc.). gitea_create_webhook crea webhook de push en un repo Gitea para auto-deploy en cada commit.
78 lines
2.5 KiB
Bash
78 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# rsync_deploy — Sincroniza un directorio local a un host remoto via rsync+SSH
|
|
set -euo pipefail
|
|
|
|
rsync_deploy() {
|
|
local local_dir="$1"
|
|
local ssh_alias="$2"
|
|
local remote_dir="$3"
|
|
|
|
if [[ -z "$local_dir" || -z "$ssh_alias" || -z "$remote_dir" ]]; then
|
|
echo "rsync_deploy: se requieren local_dir, ssh_alias y remote_dir" >&2
|
|
return 1
|
|
fi
|
|
|
|
if [[ ! -d "$local_dir" ]]; then
|
|
echo "rsync_deploy: directorio local '$local_dir' no existe" >&2
|
|
return 1
|
|
fi
|
|
|
|
# Crear directorio remoto si no existe
|
|
echo "rsync_deploy: verificando directorio remoto '$remote_dir' en '$ssh_alias'..." >&2
|
|
if ! ssh "$ssh_alias" "mkdir -p '$remote_dir'" 2>&1; then
|
|
echo "rsync_deploy: no se pudo crear el directorio remoto '$remote_dir' en '$ssh_alias'" >&2
|
|
return 1
|
|
fi
|
|
|
|
# Ejecutar rsync y capturar salida para parsear estadísticas
|
|
local rsync_output
|
|
rsync_output=$(rsync -avz --delete \
|
|
--exclude='.git' \
|
|
--exclude='operations.db*' \
|
|
--exclude='*.exe' \
|
|
--exclude='node_modules' \
|
|
--exclude='.venv' \
|
|
--exclude='__pycache__' \
|
|
--exclude='build/' \
|
|
--exclude='*.db-shm' \
|
|
--exclude='*.db-wal' \
|
|
-e ssh \
|
|
"$local_dir" \
|
|
"${ssh_alias}:${remote_dir}" 2>&1) || {
|
|
echo "rsync_deploy: rsync falló al sincronizar '$local_dir' → '${ssh_alias}:${remote_dir}'" >&2
|
|
echo "$rsync_output" >&2
|
|
return 1
|
|
}
|
|
|
|
echo "$rsync_output" >&2
|
|
|
|
# Parsear número de archivos transferidos
|
|
local files_transferred
|
|
files_transferred=$(echo "$rsync_output" | grep -oP 'Number of regular files transferred: \K[0-9,]+' | tr -d ',' || echo "0")
|
|
if [[ -z "$files_transferred" ]]; then
|
|
# Intentar formato alternativo de rsync
|
|
files_transferred=$(echo "$rsync_output" | grep -oP 'Number of files transferred: \K[0-9,]+' | tr -d ',' || echo "0")
|
|
fi
|
|
if [[ -z "$files_transferred" ]]; then
|
|
files_transferred="0"
|
|
fi
|
|
|
|
# Parsear tamaño total transferido
|
|
local total_size
|
|
total_size=$(echo "$rsync_output" | grep -oP 'Total transferred file size: \K[0-9,.]+ \w+' || echo "0 bytes")
|
|
if [[ -z "$total_size" ]]; then
|
|
total_size="0 bytes"
|
|
fi
|
|
|
|
# Emitir JSON a stdout
|
|
printf '{"files_transferred": %s, "total_size": "%s", "ssh_alias": "%s", "remote_dir": "%s"}\n' \
|
|
"$files_transferred" \
|
|
"$total_size" \
|
|
"$ssh_alias" \
|
|
"$remote_dir"
|
|
}
|
|
|
|
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
|
|
rsync_deploy "$@"
|
|
fi
|