Files
hst-api/docs/HST_RECONSTRUCTION_2026-01-07.md
ARCHITECT a9223a32b5 Add HST reconstruction document 2026-01-07
Complete documentation for rebuilding the HST system including:
- Database schema (tables, views, functions)
- PostgREST API configuration
- Nginx configuration
- Web interface (index.html) with D3.js graph
- Docker compose setup
- Step-by-step reconstruction guide

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 02:07:14 +00:00

23 KiB

HST - Sistema de Tags Semanticos

Documento de Reconstruccion Completa

Fecha: 2026-01-07 Version: 2.0 Servidor: 72.62.2.84 (HST) Dominio: tzrtech.org / hst.etereo.io


1. ARQUITECTURA GENERAL

1.1 Componentes

┌─────────────────────────────────────────────────────────┐
│                      NGINX (Host)                        │
│  - SSL Termination (Let's Encrypt)                      │
│  - Reverse Proxy                                         │
│  - Static Files                                          │
└───────────────┬─────────────────────────────────────────┘
                │
    ┌───────────┼───────────┬───────────┬─────────────┐
    │           │           │           │             │
    ▼           ▼           ▼           ▼             ▼
┌───────┐  ┌────────┐  ┌────────┐  ┌────────┐  ┌──────────┐
│postgrest│ │postgres│  │directus│  │hst-api │  │filebrowser│
│  :3000  │ │  :5432 │  │  :8055 │  │  :5000 │  │   :8080   │
└────┬────┘ └────┬───┘  └────────┘  └────────┘  └──────────┘
     │           │
     └───────────┘
         hst-net

1.2 Contenedores Docker

Contenedor Puerto Proposito Red
postgres_hst 5432 PostgreSQL 15 hst-net
postgrest 3000 REST API automatico hst-net
directus_hst 8055 CMS/Admin hst-net
hst-api 5000 API legacy Flask hst-net
hst-images - Servicio imagenes hst-net
filebrowser 8080 Gestor archivos hst-net

1.3 Estructura de Directorios

/opt/hst/
├── web/
│   └── index.html          # Interfaz web principal
├── assets/
│   ├── hst/               # Imagenes tags HST
│   │   └── thumb/         # Thumbnails HST
│   ├── flg/               # Imagenes flags
│   │   └── thumb/
│   ├── itm/               # Imagenes items
│   ├── loc/               # Imagenes locations
│   ├── ply/               # Imagenes players
│   └── index.html
├── nginx/
│   └── default.conf        # Configuracion nginx
├── api/                    # API Flask legacy
├── directus/              # Datos Directus
└── docker-compose.yml

2. BASE DE DATOS

2.1 Tablas Principales (5)

hst - Hashtags

CREATE TABLE hst (
    num SERIAL PRIMARY KEY,
    alias VARCHAR(255),
    ref VARCHAR(50),
    rootref VARCHAR(100),
    img_url TEXT,
    txt TEXT,
    standard_md TEXT,
    jsonb_standard JSONB,
    version VARCHAR(50),
    mrf VARCHAR(64) UNIQUE NOT NULL,  -- SHA-256 hash
    owner VARCHAR(100),
    created_at TIMESTAMPTZ DEFAULT NOW(),
    roothash VARCHAR(64),
    private_mrf VARCHAR(64),
    url TEXT,
    url_json TEXT,
    date DATE,
    name_es VARCHAR(255),
    name_en VARCHAR(255),
    name_ch VARCHAR(255),
    img_thumb_url TEXT,
    set_hst VARCHAR(64),              -- FK a grupo/tipo
    url_atc TEXT
);

flg - Flags

CREATE TABLE flg (
    -- Misma estructura que hst
    num SERIAL PRIMARY KEY,
    mrf VARCHAR(64) UNIQUE NOT NULL,
    ref VARCHAR(50),
    name_es VARCHAR(255),
    name_en VARCHAR(255),
    img_url TEXT,
    img_thumb_url TEXT,
    txt TEXT,
    set_hst VARCHAR(64),
    created_at TIMESTAMPTZ DEFAULT NOW()
);

itm, loc, ply - Items, Locations, Players

-- Misma estructura base que flg

2.2 Tablas de Relaciones (6)

tree_hst - Jerarquia

CREATE TABLE tree_hst (
    num SERIAL PRIMARY KEY,
    mrf_parent VARCHAR(64) NOT NULL,
    mrf_child VARCHAR(64) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    UNIQUE(mrf_parent, mrf_child)
);
CREATE INDEX idx_tree_hst_parent ON tree_hst(mrf_parent);
CREATE INDEX idx_tree_hst_child ON tree_hst(mrf_child);

graph_hst - Grafo de Relaciones

CREATE TABLE graph_hst (
    num SERIAL PRIMARY KEY,
    mrf_a VARCHAR(64) NOT NULL,
    mrf_b VARCHAR(64) NOT NULL,
    weight DECIMAL(3,2) DEFAULT 0.5,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    edge_type VARCHAR(50) DEFAULT 'relation',
    UNIQUE(mrf_a, mrf_b)
);
CREATE INDEX idx_graph_hst_a ON graph_hst(mrf_a);
CREATE INDEX idx_graph_hst_b ON graph_hst(mrf_b);
CREATE INDEX idx_graph_hst_type ON graph_hst(edge_type);

library_hst - Bibliotecas

CREATE TABLE library_hst (
    num SERIAL PRIMARY KEY,
    mrf_library VARCHAR(64) NOT NULL,
    mrf_tag VARCHAR(64) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    UNIQUE(mrf_library, mrf_tag)
);
CREATE INDEX idx_library_hst_lib ON library_hst(mrf_library);
CREATE INDEX idx_library_hst_tag ON library_hst(mrf_tag);

2.3 Vistas SQL (5)

api_tags - Tags unificados

CREATE OR REPLACE VIEW api_tags AS
SELECT mrf, ref, name_es, name_en, name_ch, img_url, img_thumb_url,
       txt, set_hst, 'hst' as type, created_at
FROM hst
UNION ALL
SELECT mrf, ref, name_es, name_en, name_ch, img_url, img_thumb_url,
       txt, set_hst, 'flg' as type, created_at
FROM flg
UNION ALL
SELECT mrf, ref, name_es, name_en, name_ch, img_url, img_thumb_url,
       txt, set_hst, 'itm' as type, created_at
FROM itm
UNION ALL
SELECT mrf, ref, name_es, name_en, name_ch, img_url, img_thumb_url,
       txt, set_hst, 'loc' as type, created_at
FROM loc
UNION ALL
SELECT mrf, ref, name_es, name_en, name_ch, img_url, img_thumb_url,
       txt, set_hst, 'ply' as type, created_at
FROM ply;

api_groups - Grupos/Tipos

CREATE OR REPLACE VIEW api_groups AS
SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url,
       (SELECT count(*) FROM hst WHERE set_hst = h.mrf) as count
FROM hst h
WHERE h.mrf IN (SELECT DISTINCT set_hst FROM hst WHERE set_hst IS NOT NULL);

api_library_list - Lista de bibliotecas

CREATE OR REPLACE VIEW api_library_list AS
SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url,
       (SELECT count(*) FROM library_hst WHERE mrf_library = h.mrf) as member_count
FROM hst h
WHERE h.mrf IN (SELECT DISTINCT mrf_library FROM library_hst);

api_graph_stats - Estadisticas grafo

CREATE OR REPLACE VIEW api_graph_stats AS
SELECT
    (SELECT count(*) FROM hst) as total_tags,
    (SELECT count(*) FROM graph_hst) as total_edges,
    (SELECT count(DISTINCT edge_type) FROM graph_hst) as edge_types;

api_tree_roots - Raices del arbol

CREATE OR REPLACE VIEW api_tree_roots AS
SELECT h.mrf, h.ref, h.name_es, h.img_thumb_url
FROM hst h
WHERE h.mrf IN (SELECT DISTINCT mrf_parent FROM tree_hst)
  AND h.mrf NOT IN (SELECT mrf_child FROM tree_hst);

2.4 Funciones RPC (5)

api_children - Hijos directos

CREATE OR REPLACE FUNCTION api_children(parent_mrf VARCHAR(64))
RETURNS TABLE(mrf VARCHAR, ref VARCHAR, name_es VARCHAR, name_en VARCHAR, img_thumb_url TEXT)
LANGUAGE SQL STABLE
AS $$
    SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url
    FROM hst h
    JOIN tree_hst t ON h.mrf = t.mrf_child
    WHERE t.mrf_parent = parent_mrf;
$$;
GRANT EXECUTE ON FUNCTION api_children(VARCHAR) TO anon;

api_descendants - Descendientes recursivos

CREATE OR REPLACE FUNCTION api_descendants(parent_mrf VARCHAR(64))
RETURNS TABLE(mrf VARCHAR, ref VARCHAR, name_es VARCHAR, name_en VARCHAR, img_thumb_url TEXT, depth INTEGER)
LANGUAGE SQL STABLE
AS $$
    WITH RECURSIVE tree AS (
        SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url, 1 as depth
        FROM hst h
        JOIN tree_hst t ON h.mrf = t.mrf_child
        WHERE t.mrf_parent = parent_mrf
        UNION ALL
        SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url, tr.depth + 1
        FROM hst h
        JOIN tree_hst t ON h.mrf = t.mrf_child
        JOIN tree tr ON t.mrf_parent = tr.mrf
        WHERE tr.depth < 10
    )
    SELECT * FROM tree;
$$;
GRANT EXECUTE ON FUNCTION api_descendants(VARCHAR) TO anon;

api_path - Ruta al root

CREATE OR REPLACE FUNCTION api_path(tag_mrf VARCHAR(64))
RETURNS TABLE(mrf VARCHAR, ref VARCHAR, name_es VARCHAR, img_thumb_url TEXT, depth INTEGER)
LANGUAGE SQL STABLE
AS $$
    WITH RECURSIVE path AS (
        SELECT h.mrf, h.ref, h.name_es, h.img_thumb_url, 0 as depth
        FROM hst h WHERE h.mrf = tag_mrf
        UNION ALL
        SELECT h.mrf, h.ref, h.name_es, h.img_thumb_url, p.depth + 1
        FROM hst h
        JOIN tree_hst t ON h.mrf = t.mrf_parent
        JOIN path p ON t.mrf_child = p.mrf
        WHERE p.depth < 20
    )
    SELECT * FROM path ORDER BY depth DESC;
$$;
GRANT EXECUTE ON FUNCTION api_path(VARCHAR) TO anon;
CREATE OR REPLACE FUNCTION api_related(tag_mrf VARCHAR(64))
RETURNS TABLE(mrf VARCHAR, ref VARCHAR, name_es VARCHAR, name_en VARCHAR, img_thumb_url TEXT, edge_type VARCHAR, weight DECIMAL)
LANGUAGE SQL STABLE
AS $$
    SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url, g.edge_type, g.weight
    FROM hst h
    JOIN graph_hst g ON (h.mrf = g.mrf_b AND g.mrf_a = tag_mrf)
                     OR (h.mrf = g.mrf_a AND g.mrf_b = tag_mrf)
    WHERE h.mrf != tag_mrf;
$$;
GRANT EXECUTE ON FUNCTION api_related(VARCHAR) TO anon;

api_library_tags - Tags de biblioteca

CREATE OR REPLACE FUNCTION api_library_tags(library_mrf VARCHAR(64))
RETURNS TABLE(mrf VARCHAR, ref VARCHAR, name_es VARCHAR, name_en VARCHAR, img_thumb_url TEXT)
LANGUAGE SQL STABLE
AS $$
    SELECT h.mrf, h.ref, h.name_es, h.name_en, h.img_thumb_url
    FROM hst h
    JOIN library_hst l ON h.mrf = l.mrf_tag
    WHERE l.mrf_library = library_mrf;
$$;
GRANT EXECUTE ON FUNCTION api_library_tags(VARCHAR) TO anon;

2.5 Permisos

-- Usuario anon para PostgREST
CREATE ROLE anon NOLOGIN;
GRANT USAGE ON SCHEMA public TO anon;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO anon;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO anon;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO anon;

-- Usuario autenticado
CREATE ROLE authenticated NOLOGIN;
GRANT anon TO authenticated;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO authenticated;

3. API REST (PostgREST)

3.1 Endpoints Principales

Metodo Endpoint Descripcion
GET /api/hst Lista todos los hashtags
GET /api/flg Lista todos los flags
GET /api/itm Lista todos los items
GET /api/loc Lista todas las locations
GET /api/ply Lista todos los players
GET /api/api_tags Vista unificada
GET /api/api_groups Lista grupos
GET /api/api_library_list Lista bibliotecas
GET /api/tree_hst Relaciones jerarquicas
GET /api/graph_hst Relaciones grafo

3.2 Endpoints RPC

Metodo Endpoint Body Descripcion
POST /api/rpc/api_children {"parent_mrf":"xxx"} Hijos directos
POST /api/rpc/api_descendants {"parent_mrf":"xxx"} Descendientes
POST /api/rpc/api_path {"tag_mrf":"xxx"} Ruta a root
POST /api/rpc/api_related {"tag_mrf":"xxx"} Relacionados
POST /api/rpc/api_library_tags {"library_mrf":"xxx"} Tags de lib

3.3 Filtros PostgREST

# Paginacion
?limit=50&offset=0

# Ordenacion
?order=ref.asc
?order=created_at.desc

# Filtros
?ref=eq.xxx
?mrf=eq.xxx
?set_hst=eq.xxx
?edge_type=eq.relation

# Busqueda
?name_es=ilike.*busqueda*

# Seleccion de campos
?select=mrf,ref,name_es

4. CONFIGURACION NGINX

4.1 /opt/hst/nginx/default.conf

# Redirect HTTP to HTTPS
server {
    listen 80;
    server_name tzrtech.org www.tzrtech.org *.tzrtech.org;
    return 301 https://$host$request_uri;
}

# Main site - tzrtech.org
server {
    listen 443 ssl;
    http2 on;
    server_name tzrtech.org www.tzrtech.org;

    ssl_certificate /etc/letsencrypt/live/tzrtech.org-0001/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tzrtech.org-0001/privkey.pem;

    root /opt/hst/web;
    index index.html;

    # Serve images from /hst/, /flg/, /itm/, /loc/, /ply/
    location ~ ^/(hst|flg|itm|loc|ply)/(thumb/)?(.+\.png)$ {
        alias /opt/hst/assets/$1/$2$3;
        add_header Access-Control-Allow-Origin * always;
        add_header Cache-Control "public, max-age=86400";
        try_files "" =404;
    }

    # Assets folder (fallback)
    location /assets/ {
        alias /opt/hst/assets/;
        add_header Access-Control-Allow-Origin * always;
    }

    # PostgREST API
    location /api/ {
        proxy_pass http://postgrest:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        add_header Access-Control-Allow-Origin * always;
        add_header Access-Control-Allow-Methods "GET, POST, PATCH, DELETE, OPTIONS" always;
        add_header Access-Control-Allow-Headers "Authorization, Content-Type, Prefer" always;
        add_header Access-Control-Expose-Headers "Content-Range, Range" always;
        if ($request_method = OPTIONS) { return 204; }
    }

    location / {
        try_files $uri $uri/ /index.html;
    }
}

# Directus HST Admin
server {
    listen 443 ssl;
    http2 on;
    server_name hst.tzrtech.org directus.tzrtech.org;

    ssl_certificate /etc/letsencrypt/live/tzrtech.org-0001/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tzrtech.org-0001/privkey.pem;
    client_max_body_size 100M;

    location / {
        proxy_pass http://directus_hst:8055;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# Graph subdomain (Flask legacy)
server {
    listen 443 ssl;
    http2 on;
    server_name graph.tzrtech.org;

    ssl_certificate /etc/letsencrypt/live/tzrtech.org-0001/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tzrtech.org-0001/privkey.pem;

    location / {
        proxy_pass http://hst-api:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5. INTERFAZ WEB

5.1 Constantes JavaScript

CATS - Categorias/Colores

const CATS = {
    hst: {name: "Hashtags", color: "#7c8aff"},
    spe: {name: "Specs", color: "#FF9800"},
    vue: {name: "Values", color: "#00BCD4"},
    vsn: {name: "Visions", color: "#E91E63"},
    msn: {name: "Missions", color: "#9C27B0"},
    flg: {name: "Flags", color: "#4CAF50"}
};

EDGE_COLORS - Tipos de relacion

const EDGE_COLORS = {
    relation: "#8BC34A",
    specialization: "#9C27B0",
    mirror: "#607D8B",
    dependency: "#2196F3",
    sequence: "#4CAF50",
    composition: "#FF9800",
    hierarchy: "#E91E63",
    library: "#00BCD4",
    contextual: "#FFC107",
    association: "#795548"
};

5.2 Caracteristicas de la Interfaz

  1. Vista Biblioteca (Grid)

    • Grid responsive con tarjetas
    • Imagenes con fallback a placeholder
    • Seleccion multiple con checkboxes
    • Click para ver detalle
  2. Vista Arbol (Tree)

    • Agrupacion por set_hst
    • Expandir/colapsar grupos
    • Seleccion multiple
    • Navegacion a hijos
  3. Vista Grafo (Graph)

    • D3.js force simulation
    • Nodos coloreados por categoria
    • Edges coloreados por tipo
    • Sidebar con:
      • Estadisticas (nodos, edges)
      • Filtros por categoria
      • Filtros por tipo de edge
      • Slider peso minimo
      • Controles (zoom, fit)
    • Leyenda de colores
  4. Panel Lateral (Detail)

    • Imagen grande
    • Ref y MRF (copiable)
    • Nombre localizado
    • Descripcion
    • Hijos (api_children)
    • Relacionados (api_related)
  5. Controles Globales

    • Selector de idioma (ES/EN/CH)
    • Selector de base (HST/FLG/ITM/LOC/PLY)
    • Buscador
    • Filtros por grupo (set_hst)
    • Filtros por biblioteca
    • SEL/GET para seleccion multiple

5.3 Estado de la Aplicacion

const state = {
    base: "hst",           // Base activa
    lang: "es",            // Idioma
    view: "grid",          // Vista actual
    search: "",            // Busqueda
    group: "all",          // Filtro grupo
    library: "all",        // Filtro biblioteca
    libraryMembers: Set(), // MRFs de biblioteca
    selectionMode: false,  // Modo seleccion
    selected: Set(),       // Tags seleccionados
    selectedTag: null,     // Tag en panel detalle
    tags: [],              // Tags cargados
    groups: [],            // Grupos cargados
    libraries: [],         // Bibliotecas cargadas
    graphEdges: [],        // Edges del grafo
    treeEdges: [],         // Edges del arbol
    graphFilters: {        // Filtros grafo
        cats: Set(["hst"]),
        edges: Set(Object.keys(EDGE_COLORS))
    },
    graphSettings: {       // Config grafo
        nodeSize: 18,
        textSize: 9,
        linkDist: 70,
        showImg: true,
        showLbl: true
    }
};

6. DOCKER COMPOSE

6.1 docker-compose.yml

version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    container_name: postgres_hst
    restart: always
    environment:
      POSTGRES_USER: hst
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: hst
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      - hst-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U hst -d hst"]
      interval: 10s
      timeout: 5s
      retries: 5

  postgrest:
    image: postgrest/postgrest:latest
    container_name: postgrest
    restart: always
    environment:
      PGRST_DB_URI: postgres://hst:${POSTGRES_PASSWORD}@postgres:5432/hst
      PGRST_DB_SCHEMA: public
      PGRST_DB_ANON_ROLE: anon
      PGRST_JWT_SECRET: ${JWT_SECRET}
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - hst-net

  directus:
    image: directus/directus:latest
    container_name: directus_hst
    restart: always
    environment:
      KEY: ${DIRECTUS_KEY}
      SECRET: ${DIRECTUS_SECRET}
      DB_CLIENT: pg
      DB_HOST: postgres
      DB_PORT: 5432
      DB_DATABASE: hst
      DB_USER: hst
      DB_PASSWORD: ${POSTGRES_PASSWORD}
      ADMIN_EMAIL: ${ADMIN_EMAIL}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
    volumes:
      - ./directus/uploads:/directus/uploads
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - hst-net

  hst-api:
    build: ./api
    container_name: hst-api
    restart: always
    environment:
      DATABASE_URL: postgres://hst:${POSTGRES_PASSWORD}@postgres:5432/hst
    volumes:
      - ./assets:/app/assets:ro
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - hst-net
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  filebrowser:
    image: filebrowser/filebrowser:latest
    container_name: filebrowser
    restart: always
    volumes:
      - ./assets:/srv
      - ./filebrowser.db:/database.db
    networks:
      - hst-net
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  hst-net:
    driver: bridge

7. RECONSTRUCCION PASO A PASO

7.1 Preparar Servidor

# Conectar
ssh root@72.62.2.84

# Crear estructura
mkdir -p /opt/hst/{web,assets,nginx,api,directus}
mkdir -p /opt/hst/assets/{hst,flg,itm,loc,ply}
mkdir -p /opt/hst/assets/hst/thumb
mkdir -p /opt/hst/assets/flg/thumb

# Instalar Docker (si no esta)
curl -fsSL https://get.docker.com | sh

7.2 Configurar PostgreSQL

# Iniciar contenedor
docker run -d \
    --name postgres_hst \
    --network hst-net \
    -e POSTGRES_USER=hst \
    -e POSTGRES_PASSWORD=xxx \
    -e POSTGRES_DB=hst \
    -v /opt/hst/postgres_data:/var/lib/postgresql/data \
    --restart always \
    postgres:15-alpine

# Crear esquema
docker exec -i postgres_hst psql -U hst -d hst << 'EOF'
-- Insertar SQL de seccion 2
EOF

7.3 Configurar PostgREST

docker run -d \
    --name postgrest \
    --network hst-net \
    -e PGRST_DB_URI="postgres://hst:xxx@postgres_hst:5432/hst" \
    -e PGRST_DB_SCHEMA=public \
    -e PGRST_DB_ANON_ROLE=anon \
    --restart always \
    postgrest/postgrest:latest

7.4 Configurar Nginx

# Copiar configuracion
cp default.conf /opt/hst/nginx/

# Obtener certificados SSL
certbot certonly --standalone -d tzrtech.org -d www.tzrtech.org -d hst.tzrtech.org

# Reiniciar nginx
nginx -t && systemctl reload nginx

7.5 Desplegar Interfaz Web

# Copiar index.html a /opt/hst/web/
# El archivo completo esta en la seccion 5

# Verificar
curl -s http://localhost/api/hst?limit=1 | jq

7.6 Importar Datos

# Desde backup PostgreSQL
docker exec -i postgres_hst psql -U hst -d hst < backup.sql

# O desde CSV
docker exec -i postgres_hst psql -U hst -d hst -c "\copy hst FROM '/tmp/hst.csv' CSV HEADER"

7.7 Verificacion Final

# Servicios
docker ps

# API
curl -s http://localhost/api/hst?limit=1
curl -s http://localhost/api/api_groups
curl -s -X POST http://localhost/api/rpc/api_children \
     -H "Content-Type: application/json" \
     -d '{"parent_mrf":"xxx"}'

# Web
curl -s http://localhost/ | head -20

# SSL
curl -sI https://tzrtech.org/

8. DATOS ACTUALES

8.1 Conteos

Tabla Registros
hst 963
flg 65
itm 0
loc 0
ply 0
tree_hst ~900
graph_hst ~800
library_hst variable

8.2 Grupos Principales (set_hst)

  • abeb605c... (hst - etiqueta): ~721 tags
  • d3d633ff... (spe - especificacion): ~178 tags
  • 33fa2912... (msn - mision): ~3 tags
  • 320ad174... (vue - valor): ~21 tags

8.3 Tipos de Edge (graph_hst.edge_type)

  • relation
  • specialization
  • mirror
  • dependency
  • sequence
  • composition
  • hierarchy
  • library
  • contextual
  • association

9. URLs DE ACCESO

Servicio URL
Interfaz Web https://tzrtech.org/
API REST https://tzrtech.org/api/
Directus Admin https://hst.tzrtech.org/
Graph Legacy https://graph.tzrtech.org/

10. TROUBLESHOOTING

PostgREST no responde

docker logs postgrest --tail 50
docker restart postgrest

Imagenes no cargan

# Verificar ruta
ls -la /opt/hst/assets/hst/
# Verificar nginx
nginx -t
systemctl reload nginx

Error 502 Bad Gateway

# Verificar red docker
docker network inspect hst-net
# Verificar contenedor destino
docker ps | grep postgrest

Recargar schema PostgREST

docker exec postgrest pkill -SIGUSR1 postgrest
# o
docker restart postgrest

ANEXO: ARCHIVOS COMPLETOS

A. index.html (Web Interface)

El archivo completo /opt/hst/web/index.html contiene ~47KB de HTML/CSS/JavaScript. Caracteristicas principales implementadas:

  • SPA con 3 vistas (Grid, Tree, Graph)
  • D3.js v7 para visualizacion de grafo
  • Sistema de seleccion SEL/GET
  • Panel de detalle con hijos y relacionados
  • Filtros por grupo, biblioteca, categoria
  • Multiidioma (ES/EN/CH)
  • Theme oscuro profesional

Documento generado: 2026-01-07 Sistema: HST v2.0 Servidor: 72.62.2.84