feat: funcion docker_compose_remote_deploy bash
Funcion bash que despliega un stack Docker Compose en un host remoto via SSH. Flujo: verificar SSH → git pull → docker-compose pull → docker-compose up -d → listar containers. Soporta compose files adicionales y retorna JSON con status, containers y duracion.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env bash
|
||||
# docker_compose_remote_deploy — Despliega un stack Docker Compose en un host remoto via SSH
|
||||
set -euo pipefail
|
||||
|
||||
docker_compose_remote_deploy() {
|
||||
local host="$1"
|
||||
local remote_dir="$2"
|
||||
local branch="${3:-main}"
|
||||
local compose_files="${4:-}"
|
||||
|
||||
if [[ -z "$host" || -z "$remote_dir" ]]; then
|
||||
echo "docker_compose_remote_deploy: se requieren host y remote_dir" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local start_ts
|
||||
start_ts=$(date +%s)
|
||||
|
||||
# 1. Verificar conectividad SSH
|
||||
echo "docker_compose_remote_deploy: verificando conectividad SSH a '$host'..." >&2
|
||||
if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$host" true 2>/dev/null; then
|
||||
echo "docker_compose_remote_deploy: no se puede conectar a '$host' via SSH" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 2. Git pull en el host remoto
|
||||
echo "docker_compose_remote_deploy: git pull origin $branch en '$remote_dir'..." >&2
|
||||
if ! ssh "$host" "cd '$remote_dir' && git pull origin '$branch'" >&2; then
|
||||
echo "docker_compose_remote_deploy: git pull falló en '$host:$remote_dir'" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 3. Construir los argumentos -f para docker-compose
|
||||
local compose_args="-f docker-compose.yml"
|
||||
if [[ -n "$compose_files" ]]; then
|
||||
local IFS=","
|
||||
local extra_file
|
||||
for extra_file in $compose_files; do
|
||||
extra_file="${extra_file// /}" # trim spaces
|
||||
if [[ -n "$extra_file" ]]; then
|
||||
compose_args="$compose_args -f $extra_file"
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
|
||||
# 4. docker-compose pull
|
||||
echo "docker_compose_remote_deploy: actualizando imagenes ($compose_args)..." >&2
|
||||
if ! ssh "$host" "cd '$remote_dir' && docker-compose $compose_args pull" >&2; then
|
||||
echo "docker_compose_remote_deploy: docker-compose pull falló en '$host:$remote_dir'" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 5. docker-compose up -d
|
||||
echo "docker_compose_remote_deploy: levantando servicios ($compose_args)..." >&2
|
||||
if ! ssh "$host" "cd '$remote_dir' && docker-compose $compose_args up -d" >&2; then
|
||||
echo "docker_compose_remote_deploy: docker-compose up -d falló en '$host:$remote_dir'" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 6. Recopilar containers corriendo tras el deploy
|
||||
local containers_json
|
||||
containers_json=$(ssh "$host" \
|
||||
"docker ps --format '{{.Names}}' 2>/dev/null | jq -R . | jq -sc ." 2>/dev/null || echo '[]')
|
||||
|
||||
local end_ts
|
||||
end_ts=$(date +%s)
|
||||
local duration_ms=$(( (end_ts - start_ts) * 1000 ))
|
||||
|
||||
# Emitir JSON a stdout
|
||||
printf '{"status":"ok","host":"%s","remote_dir":"%s","branch":"%s","containers":%s,"duration_ms":%d}\n' \
|
||||
"$host" \
|
||||
"$remote_dir" \
|
||||
"$branch" \
|
||||
"$containers_json" \
|
||||
"$duration_ms"
|
||||
}
|
||||
|
||||
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
|
||||
docker_compose_remote_deploy "$@"
|
||||
fi
|
||||
Reference in New Issue
Block a user