[P2606] WebServer NGINX: plan actualizado, ficha nodo, HTTPS operativo

- P2606: Plan v1.1 EN EJECUCIÓN. Fases 1-3 completadas.
- Ficha nodo srvv-nginx-rm.md. P2606 en adn/07_proyectos.md.
- Incluye cambios acumulados de sesiones anteriores.
This commit is contained in:
Ricardo Monla
2026-03-28 12:18:42 -03:00
parent 97d9b777b4
commit 160da47f96
78 changed files with 6461 additions and 624 deletions
@@ -0,0 +1,54 @@
-- 001_create_ambitos.sql
-- Creación de tabla ambitos y modificación de nodos y entradas
DO $$
BEGIN
-- Crear tabla ambitos
CREATE TABLE IF NOT EXISTS bitacoras.ambitos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(50) NOT NULL UNIQUE,
descripcion TEXT,
parent_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE SET NULL,
activo BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Índices para ambitos
CREATE INDEX IF NOT EXISTS idx_ambitos_nombre ON bitacoras.ambitos(nombre);
CREATE INDEX IF NOT EXISTS idx_ambitos_parent ON bitacoras.ambitos(parent_id);
-- Modificar tabla nodos: añadir ambito_id
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'bitacoras' AND table_name = 'nodos' AND column_name = 'ambito_id'
) THEN
ALTER TABLE bitacoras.nodos
ADD COLUMN ambito_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE SET NULL;
CREATE INDEX IF NOT EXISTS idx_nodos_ambito ON bitacoras.nodos(ambito_id);
END IF;
-- Modificar tabla entradas: añadir ambito_id
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'bitacoras' AND table_name = 'entradas' AND column_name = 'ambito_id'
) THEN
ALTER TABLE bitacoras.entradas
ADD COLUMN ambito_id INTEGER REFERENCES bitacoras.ambitos(id) ON DELETE SET NULL;
CREATE INDEX IF NOT EXISTS idx_entradas_ambito ON bitacoras.entradas(ambito_id);
END IF;
-- Crear vista materializada o tabla resumen_ambitos
CREATE TABLE IF NOT EXISTS bitacoras.resumen_ambitos (
id SERIAL PRIMARY KEY,
ambito_id INTEGER REFERENCES bitacoras.ambitos(id),
fecha DATE,
total_entradas INTEGER DEFAULT 0,
tiempo_total INTERVAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(ambito_id, fecha)
);
END $$;
@@ -0,0 +1,64 @@
# frozen_string_literal: true
# Migration: Create table for storing metrics for the continuous improvement sensor
#
# Usage:
# ruby adn/tools/db/migrations/001_create_mejoras_metricas_table.rb
#
# This migration is designed to be run once to set up the sensor metrics table.
require_relative '../core/bitacora_db'
puts "🔧 Running migration: Create mejoras_metricas table"
BitacorasDB::BitacoraDB.with_connection do |db|
# Check if table already exists
table_exists = db.execute(<<~SQL)
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'bitacoras'
AND table_name = 'mejoras_metricas'
)
SQL
if table_exists.first['exists']
puts "✅ Table bitacoras.mejoras_metricas already exists. Skipping."
else
puts "📝 Creating table bitacoras.mejoras_metricas..."
create_table_sql = <<~SQL
CREATE TABLE bitacoras.mejoras_metricas (
id SERIAL PRIMARY KEY,
timestamp TIMESTAMPTZ DEFAULT NOW(),
subcomando VARCHAR(100) NOT NULL,
args_hash VARCHAR(64),
nodo VARCHAR(100),
estado_salida VARCHAR(10),
duracion_ms INTEGER,
es_ia BOOLEAN DEFAULT FALSE,
contexto JSONB
)
SQL
db.execute(create_table_sql)
puts "✅ Table bitacoras.mejoras_metricas created successfully."
# Create indexes for common queries
indexes = [
"CREATE INDEX idx_mejoras_metricas_timestamp ON bitacoras.mejoras_metricas (timestamp)",
"CREATE INDEX idx_mejoras_metricas_subcomando ON bitacoras.mejoras_metricas (subcomando)",
"CREATE INDEX idx_mejoras_metricas_nodo ON bitacoras.mejoras_metricas (nodo)",
"CREATE INDEX idx_mejoras_metricas_estado ON bitacoras.mejoras_metricas (estado_salida)",
"CREATE INDEX idx_mejoras_metricas_es_ia ON bitacoras.mejoras_metricas (es_ia)"
]
indexes.each do |index_sql|
db.execute(index_sql)
puts "📈 Created index: #{index_sql.split(' ')[2]}"
end
puts "🎉 Migration completed successfully."
end
end
puts "🏁 Migration finished."
@@ -0,0 +1,55 @@
-- 002_migrate_nodos_ambitos.sql
-- Seed de ámbitos iniciales y migración de nodos
DO $$
DECLARE
id_diiaa INTEGER;
id_dasuten INTEGER;
id_bitacoras INTEGER;
BEGIN
-- 1. Insertar ámbitos principales
INSERT INTO bitacoras.ambitos (nombre, descripcion, parent_id)
VALUES ('dtic-DIIAA', 'Ámbito raíz: Infraestructura y servicios propios', NULL)
ON CONFLICT (nombre) DO UPDATE SET descripcion = EXCLUDED.descripcion
RETURNING id INTO id_diiaa;
INSERT INTO bitacoras.ambitos (nombre, descripcion, parent_id)
VALUES ('dtic-DASUTEN', 'Departamento de Servicios UTN (gestionado)', id_diiaa)
ON CONFLICT (nombre) DO UPDATE SET descripcion = EXCLUDED.descripcion
RETURNING id INTO id_dasuten;
INSERT INTO bitacoras.ambitos (nombre, descripcion, parent_id)
VALUES ('dtic-BITACORAS', 'Sistema de registro ADN', id_diiaa)
ON CONFLICT (nombre) DO UPDATE SET descripcion = EXCLUDED.descripcion
RETURNING id INTO id_bitacoras;
-- 2. Migrar nodos a dtic-DASUTEN
UPDATE bitacoras.nodos
SET ambito_id = id_dasuten
WHERE nombre IN ('srv-dasu', 'dasu-srvv-dc', 'sql-dasuten', 'dc-dasuten', 'pc-dasu0')
OR nombre LIKE 'pcv-dasu%';
-- 3. Migrar nodos a dtic-BITACORAS
UPDATE bitacoras.nodos
SET ambito_id = id_bitacoras
WHERE nombre = 'dtic-BITACORAS' OR nombre = 'dtic-DIIAA';
-- 4. Migrar nodos restantes a dtic-DIIAA (Infraestructura y Servicios)
UPDATE bitacoras.nodos
SET ambito_id = id_diiaa
WHERE ambito_id IS NULL AND (
nombre LIKE 'srv-%'
OR nombre LIKE 'srvv-%'
OR nombre = 'pc-frlr'
OR nombre LIKE 'pc-%'
);
-- Nota: Los nodos que no apliquen a ninguna regla quedarán con ambito_id NULL temporalmente
-- 5. Propagar ambito_id a las entradas existentes
UPDATE bitacoras.entradas e
SET ambito_id = n.ambito_id
FROM bitacoras.nodos n
WHERE e.nodo_id = n.id AND e.ambito_id IS NULL;
END $$;