← Retour
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# REGISTRY.SH - Registre des services déployés
# Maintient un fichier JSON avec l'état des déploiements
#
# Structure du registre:
# {
# "services": {
# "mon-app": {
# "target": "prod-portainer",
# "strategy": "docker",
# "last_deploy": "2026-01-20T23:45:00Z",
# "commit": "abc1234",
# "version": "1.0.0",
# "domain": "mon-app.33800.nowhere84.com",
# "port": 3000,
# "status": "running"
# }
# }
# }
# ═══════════════════════════════════════════════════════════════════════════
# ───────────────────────────────────────────────────────────────────────────
# Configuration
# ───────────────────────────────────────────────────────────────────────────
# Utiliser STOCK_BASE défini par smart-deploy.sh
if [[ -z "${STOCK_BASE:-}" ]]; then
if [[ -d "/stock_8to/33800-stack" ]]; then
STOCK_BASE="/stock_8to/33800-stack"
elif [[ -d "/mnt/stock_8to/33800-stack" ]]; then
STOCK_BASE="/mnt/stock_8to/33800-stack"
fi
fi
SERVICES_REGISTRY="${STOCK_BASE}/monitoring/services-registry.json"
# ───────────────────────────────────────────────────────────────────────────
# Initialiser le registre si nécessaire
# ───────────────────────────────────────────────────────────────────────────
init_registry() {
if [[ ! -f "$SERVICES_REGISTRY" ]]; then
echo '{"services": {}, "last_updated": null}' > "$SERVICES_REGISTRY"
log_info "Registre des services initialisé: $SERVICES_REGISTRY"
fi
}
# ───────────────────────────────────────────────────────────────────────────
# Mettre à jour un service dans le registre
# ───────────────────────────────────────────────────────────────────────────
registry_update_service() {
local service_name="$1"
local target="$2"
local strategy="$3"
local commit="${4:-unknown}"
local status="${5:-deployed}"
init_registry
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
local domain="${CFG_domain:-}"
local port="${CFG_port:-}"
local version="${CFG_version:-}"
# Créer l'objet service
local service_json=$(cat <<EOF
{
"target": "$target",
"strategy": "$strategy",
"last_deploy": "$timestamp",
"commit": "$commit",
"version": "$version",
"domain": "$domain",
"port": $([[ -n "$port" ]] && echo "$port" || echo "null"),
"status": "$status",
"branch": "${BRANCH:-main}",
"env": "${DEPLOY_ENV:-prod}"
}
EOF
)
# Mettre à jour le registre avec jq
local tmp_file=$(mktemp)
jq --arg name "$service_name" \
--argjson service "$service_json" \
--arg ts "$timestamp" \
'.services[$name] = $service | .last_updated = $ts' \
"$SERVICES_REGISTRY" > "$tmp_file" && mv "$tmp_file" "$SERVICES_REGISTRY"
log_info "Registre mis à jour: $service_name ($status)"
}
# ───────────────────────────────────────────────────────────────────────────
# Marquer un service comme failed
# ───────────────────────────────────────────────────────────────────────────
registry_mark_failed() {
local service_name="$1"
local error_message="${2:-Unknown error}"
init_registry
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Mettre à jour le status et ajouter l'erreur
local tmp_file=$(mktemp)
jq --arg name "$service_name" \
--arg ts "$timestamp" \
--arg error "$error_message" \
'if .services[$name] then
.services[$name].status = "failed" |
.services[$name].last_error = $error |
.services[$name].last_error_at = $ts
else . end | .last_updated = $ts' \
"$SERVICES_REGISTRY" > "$tmp_file" && mv "$tmp_file" "$SERVICES_REGISTRY"
log_info "Service marqué failed: $service_name"
}
# ───────────────────────────────────────────────────────────────────────────
# Obtenir les infos d'un service
# ───────────────────────────────────────────────────────────────────────────
registry_get_service() {
local service_name="$1"
init_registry
jq -r --arg name "$service_name" '.services[$name] // empty' "$SERVICES_REGISTRY"
}
# ───────────────────────────────────────────────────────────────────────────
# Lister tous les services
# ───────────────────────────────────────────────────────────────────────────
registry_list_services() {
init_registry
echo "Services déployés:"
jq -r '.services | to_entries[] | " \(.key): \(.value.status) (\(.value.target), \(.value.last_deploy))"' "$SERVICES_REGISTRY"
}
# ───────────────────────────────────────────────────────────────────────────
# Supprimer un service du registre
# ───────────────────────────────────────────────────────────────────────────
registry_remove_service() {
local service_name="$1"
init_registry
local tmp_file=$(mktemp)
jq --arg name "$service_name" 'del(.services[$name])' \
"$SERVICES_REGISTRY" > "$tmp_file" && mv "$tmp_file" "$SERVICES_REGISTRY"
log_info "Service supprimé du registre: $service_name"
}
# ───────────────────────────────────────────────────────────────────────────
# Exporter le registre pour le dashboard
# ───────────────────────────────────────────────────────────────────────────
registry_export_for_dashboard() {
init_registry
# Retourne le JSON formaté pour le dashboard
jq '{
services: [.services | to_entries[] | {
name: .key,
target: .value.target,
strategy: .value.strategy,
status: .value.status,
domain: .value.domain,
port: .value.port,
last_deploy: .value.last_deploy,
commit: .value.commit,
env: .value.env
}],
last_updated: .last_updated
}' "$SERVICES_REGISTRY"
}