diff --git a/docs/HST_RECONSTRUCTION_2026-01-07.md b/docs/HST_RECONSTRUCTION_2026-01-07.md new file mode 100644 index 0000000..5ad1db9 --- /dev/null +++ b/docs/HST_RECONSTRUCTION_2026-01-07.md @@ -0,0 +1,889 @@ +# 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 +```sql +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 +```sql +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 +```sql +-- Misma estructura base que flg +``` + +### 2.2 Tablas de Relaciones (6) + +#### tree_hst - Jerarquia +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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 +```sql +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; +``` + +#### api_related - Tags relacionados +```sql +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 +```sql +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 +```sql +-- 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 +```nginx +# 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 +```javascript +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 +```javascript +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 +```javascript +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 +```yaml +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 +```bash +# 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 +```bash +# 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 +```bash +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 +```bash +# 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 +```bash +# 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 +```bash +# 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 +```bash +# 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 +```bash +docker logs postgrest --tail 50 +docker restart postgrest +``` + +### Imagenes no cargan +```bash +# Verificar ruta +ls -la /opt/hst/assets/hst/ +# Verificar nginx +nginx -t +systemctl reload nginx +``` + +### Error 502 Bad Gateway +```bash +# Verificar red docker +docker network inspect hst-net +# Verificar contenedor destino +docker ps | grep postgrest +``` + +### Recargar schema PostgREST +```bash +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*