Compare commits
2 Commits
969acdbdf4
...
12cf0e092d
| Author | SHA1 | Date | |
|---|---|---|---|
| 12cf0e092d | |||
| 310e0130c2 |
8
.gitignore
vendored
8
.gitignore
vendored
@@ -14,3 +14,11 @@ docker-compose.override.yml
|
||||
|
||||
# Respaldos sintéticos para pruebas locales
|
||||
local-backups/
|
||||
|
||||
# Certificados y llaves privadas — nunca en git
|
||||
certs/
|
||||
*.key
|
||||
*.pem
|
||||
*.crt
|
||||
*.p12
|
||||
*.pfx
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
-- Migración 001 (DOWN): revierte la integración CloudRestoreAS.
|
||||
-- Se quita primero la columna de asignación y la tabla dependiente.
|
||||
|
||||
ALTER TABLE a24c.database_nodes DROP COLUMN IF EXISTS restore_target_id;
|
||||
|
||||
DROP TABLE IF EXISTS a24c.restore_job_logs;
|
||||
|
||||
DROP TABLE IF EXISTS a24c.restore_targets;
|
||||
@@ -1,49 +0,0 @@
|
||||
-- Migración 001 (UP): integración CloudRestoreAS.
|
||||
-- Servidores de restauración (Alfa/Omega/Gamma) + asignación por base de datos
|
||||
-- (database_nodes.restore_target_id) + bitácora de jobs. Idempotente.
|
||||
-- Rollback en 001_restore_targets.down.sql.
|
||||
|
||||
CREATE SCHEMA IF NOT EXISTS a24c;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS a24c.restore_targets (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(120) NOT NULL UNIQUE,
|
||||
server_ip VARCHAR(255),
|
||||
sql_username VARCHAR(128),
|
||||
sql_password_encrypted TEXT,
|
||||
data_folder VARCHAR(500),
|
||||
ssh_host VARCHAR(255),
|
||||
ssh_port INTEGER DEFAULT 22,
|
||||
ssh_username VARCHAR(128),
|
||||
ssh_password_encrypted TEXT,
|
||||
remote_inbox_path VARCHAR(500),
|
||||
notes TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
INSERT INTO a24c.restore_targets (name) VALUES ('Alfa'), ('Omega'), ('Gamma')
|
||||
ON CONFLICT (name) DO NOTHING;
|
||||
|
||||
-- Columna de asignación en database_nodes (tabla aprovisionada por el backend a24c).
|
||||
ALTER TABLE a24c.database_nodes
|
||||
ADD COLUMN IF NOT EXISTS restore_target_id INTEGER
|
||||
REFERENCES a24c.restore_targets (id) ON DELETE SET NULL;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS a24c.restore_job_logs (
|
||||
id SERIAL PRIMARY KEY,
|
||||
filename VARCHAR(500) NOT NULL,
|
||||
restore_target_id INTEGER REFERENCES a24c.restore_targets (id) ON DELETE SET NULL,
|
||||
db_name VARCHAR(255),
|
||||
status VARCHAR(20) NOT NULL CHECK (status IN ('completed', 'failed', 'forwarded')),
|
||||
duration_ms INTEGER,
|
||||
error_message TEXT,
|
||||
restored_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
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
|
||||
ON a24c.restore_job_logs (restored_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_a24c_restore_job_logs_status
|
||||
ON a24c.restore_job_logs (status);
|
||||
@@ -1,3 +0,0 @@
|
||||
SET search_path TO a24c, public;
|
||||
|
||||
DROP TABLE IF EXISTS a24c.cloudrestore_status;
|
||||
@@ -1,17 +0,0 @@
|
||||
-- Estado reportado por CloudRestoreAS (carpeta de entrada, host, versión).
|
||||
-- Solo CloudRestoreAS escribe vía POST /api/restore/instance-config; el panel solo consulta.
|
||||
-- Rollback en 002_cloudrestore_status.down.sql.
|
||||
|
||||
SET search_path TO a24c, public;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS a24c.cloudrestore_status (
|
||||
id SERIAL PRIMARY KEY,
|
||||
instance_key VARCHAR(120) NOT NULL UNIQUE DEFAULT 'default',
|
||||
input_folder VARCHAR(500) NOT NULL,
|
||||
host_name VARCHAR(255),
|
||||
app_version VARCHAR(50),
|
||||
reported_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
COMMENT ON TABLE a24c.cloudrestore_status IS
|
||||
'Carpeta de entrada vigente reportada por CloudRestoreAS. Solo lectura en el panel.';
|
||||
@@ -7,13 +7,19 @@ import { fileURLToPath } from 'url';
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
const pgPassword = process.env.DB_POSTGRES_PASS;
|
||||
if (!pgPassword) {
|
||||
console.error('❌ Falta variable de entorno DB_POSTGRES_PASS. Copia .env.example → .env y configura el valor.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Configuración de PostgreSQL (Docker local)
|
||||
const pool = new Pool({
|
||||
host: 'localhost',
|
||||
port: 5432,
|
||||
database: 'CONTROLDESK',
|
||||
user: 'postgres',
|
||||
password: 'Control.',
|
||||
host: process.env.DB_POSTGRES_HOST || 'localhost',
|
||||
port: Number(process.env.DB_POSTGRES_PORT) || 5432,
|
||||
database: process.env.DB_POSTGRES_DB || 'CONTROLDESK',
|
||||
user: process.env.DB_POSTGRES_USER || 'postgres',
|
||||
password: pgPassword,
|
||||
max: 1
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user