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

890 lines
23 KiB
Markdown

# 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*