feat: integracion de interfaz de binarios para actualizacion automatica

This commit is contained in:
2026-07-29 15:31:04 -06:00
parent a1e7dddda0
commit 68d56e06a1
32 changed files with 6923 additions and 31 deletions

View File

@@ -140,6 +140,14 @@ CREATE TABLE IF NOT EXISTS a24c.restore_job_logs (
restored_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Descartar sin borrar: las vistas de restaurados/fallidos filtran por dismissed_at IS NULL,
-- pero listRestoreJobLogSummaries sigue contando TODO. Un DELETE real bajaría los contadores de
-- /servidores-restauracion y podría retroceder la última restauración exitosa de un servidor.
ALTER TABLE a24c.restore_job_logs ADD COLUMN IF NOT EXISTS dismissed_at TIMESTAMPTZ;
ALTER TABLE a24c.restore_job_logs ADD COLUMN IF NOT EXISTS dismissed_by VARCHAR(128);
CREATE INDEX IF NOT EXISTS idx_a24c_restore_job_logs_pendientes
ON a24c.restore_job_logs (status, restored_at DESC) WHERE dismissed_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_a24c_restore_job_logs_target
ON a24c.restore_job_logs (restore_target_id);
CREATE INDEX IF NOT EXISTS idx_a24c_restore_job_logs_restored_at
@@ -164,5 +172,76 @@ CREATE TABLE IF NOT EXISTS a24c.cloudrestore_status (
reported_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Identidad del build instalado, reportada por el agente en instance-config. Es la fuente
-- autoritativa para decidir qué artefacto de CRAS le toca a cada servidor; un agente anterior
-- a 1.1.0 no las manda y quedan NULL (el panel cae a restore_targets.os).
ALTER TABLE a24c.cloudrestore_status ADD COLUMN IF NOT EXISTS processed_folder VARCHAR(500);
ALTER TABLE a24c.cloudrestore_status ADD COLUMN IF NOT EXISTS platform VARCHAR(20);
ALTER TABLE a24c.cloudrestore_status ADD COLUMN IF NOT EXISTS arch VARCHAR(20);
-- Carpeta del ejecutable (APP_DIR). Distinta de input_folder: ahí vive config/.env.
ALTER TABLE a24c.cloudrestore_status ADD COLUMN IF NOT EXISTS install_path VARCHAR(500);
COMMENT ON TABLE a24c.cloudrestore_status IS
'Carpeta de entrada vigente reportada por CloudRestoreAS. Solo lectura en el panel.';
-- ============================================================================
-- Distribución de versiones de CloudRestoreAS (migración a24c e2f3a4b5c6d7).
--
-- Los binarios NO viven aquí: se publican en el registro de paquetes genéricos de Gitea
-- (ADUANASOFT/generic/cloudrestoreas/<version>) y el panel los cachea en disco. Un artefacto
-- pesa ~270 MB, así que guardarlo como BLOB en la base no es viable.
-- ============================================================================
-- Catálogo de versiones publicadas (metadatos + el sha256 que calcula Gitea).
CREATE TABLE IF NOT EXISTS a24c.cras_releases (
id SERIAL PRIMARY KEY,
version VARCHAR(50) NOT NULL,
platform VARCHAR(20) NOT NULL,
arch VARCHAR(20) NOT NULL DEFAULT 'x86_64',
file_name VARCHAR(255) NOT NULL,
file_size BIGINT,
sha256 VARCHAR(64),
gitea_package VARCHAR(120) NOT NULL DEFAULT 'cloudrestoreas',
changelog TEXT,
is_active BOOLEAN NOT NULL DEFAULT FALSE,
published_at TIMESTAMPTZ,
discovered_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CONSTRAINT cras_releases_platform_check CHECK (platform IN ('windows', 'linux')),
CONSTRAINT cras_releases_version_platform_arch_key UNIQUE (version, platform, arch)
);
-- Una sola versión activa POR plataforma+arquitectura, garantizado en la base: así Windows y
-- Linux pueden tener cada una la suya, a diferencia de un is_active singleton global.
CREATE UNIQUE INDEX IF NOT EXISTS idx_a24c_cras_releases_active
ON a24c.cras_releases (platform, arch) WHERE is_active;
CREATE INDEX IF NOT EXISTS idx_a24c_cras_releases_version
ON a24c.cras_releases (version);
-- Bitácora de instalaciones remotas, con progreso paso a paso para que la UI lo siga.
CREATE TABLE IF NOT EXISTS a24c.cras_install_runs (
id SERIAL PRIMARY KEY,
restore_target_id INTEGER REFERENCES a24c.restore_targets (id) ON DELETE SET NULL,
release_id INTEGER REFERENCES a24c.cras_releases (id) ON DELETE SET NULL,
version VARCHAR(50),
platform VARCHAR(20),
mode VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
install_path VARCHAR(500),
steps JSONB NOT NULL DEFAULT '[]'::jsonb,
error_message TEXT,
started_by VARCHAR(128),
started_at TIMESTAMPTZ NOT NULL DEFAULT now(),
finished_at TIMESTAMPTZ,
CONSTRAINT cras_install_runs_mode_check CHECK (mode IN ('install', 'update')),
CONSTRAINT cras_install_runs_status_check CHECK (status IN ('running', 'completed', 'failed'))
);
CREATE INDEX IF NOT EXISTS idx_a24c_cras_install_runs_target
ON a24c.cras_install_runs (restore_target_id, started_at DESC);
CREATE INDEX IF NOT EXISTS idx_a24c_cras_install_runs_running
ON a24c.cras_install_runs (restore_target_id) WHERE status = 'running';
COMMENT ON TABLE a24c.cras_releases IS
'Catálogo de versiones de CloudRestoreAS publicadas en Gitea. Solo metadatos; los binarios viven en Gitea.';
COMMENT ON TABLE a24c.cras_install_runs IS
'Bitácora de instalaciones remotas de CloudRestoreAS, con progreso paso a paso en steps.';