creación de un sistema que captura datos, los almacena, los procesa como Markdown y los transforma en un sitio web con buscador

Fase 0: El Ecosistema (Las Herramientas)

Para que todo funcione en Ubuntu sin conflictos, utilizaremos:

  • Rust (Lenguaje): El motor de lógica.
  • Docker & Docker Compose: Para encapsular la Base de Datos y la App.
  • PostgreSQL (DB): Donde vive la "verdad" de tus datos.
  • Axum (Framework Web): Para el servidor y el formulario.
  • SQLx: Para que Rust hable con Postgres de forma segura.
  • Tera & Pulldown-cmark: Para la magia de Markdown a HTML.

Fase 1: Arquitectura del Proyecto

La organización de carpetas es vital en Rust. Tu proyecto se verá así: Plaintext

mi_proyecto/
├── docker-compose.yml     # Orquestador de contenedores
├── Dockerfile             # Receta para la imagen de Rust
├── Cargo.toml             # Librerías (dependencias)
├── src/
│   └── main.rs            # Lógica principal del servidor
├── templates/             # Plantillas HTML (Zola style)
│   └── post.html
└── static/                # Archivos públicos (CSS, Imágenes)
    └── index.html         # El formulario original

Fase 2: El Modelo de Datos (PostgreSQL)

Antes de programar, definimos la tabla. En Rust, esto se traduce en un Struct.

La Tabla SQL: SQL

CREATE TABLE paginas (
    id SERIAL PRIMARY KEY,
    titulo TEXT NOT NULL,
    slug TEXT UNIQUE NOT NULL,      -- El "path" de la URL
    contenido_md TEXT NOT NULL,     -- El cuerpo del mensaje
    tags TEXT[],                   -- Taxonomías (Array de etiquetas)
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

El Struct en Rust:

Usamos serde para el formulario y sqlx para la base de datos. Rust

#[derive(serde::Deserialize, sqlx::FromRow)]
struct Pagina {
    titulo: String,
    contenido_md: String,
    tags: String, // Recibimos "etiqueta1, etiqueta2"
}

Fase 3: El Servidor y el Formulario (Axum)

Configuramos Axum para que escuche en el puerto 3000.

GET /: Sirve el index.html con tu imagen y los campos.

POST /generar:
    Recibe los datos del formulario.
    Genera un Slug (ej: de "Hola Mundo" a "hola-mundo").
    Guarda en PostgreSQL.
    Escribe un archivo .md físico en el disco (usando std::fs).

Fase 4: La Transformación (Markdown a HTML)

Aquí es donde imitamos a Zola. Creamos una función que:

  • Toma el texto Markdown de la base de datos.

  • Lo pasa por pulldown-cmark para obtener HTML puro.

  • Carga una plantilla de la carpeta templates/ usando la librería Tera.

  • Fusiona el HTML con la plantilla para crear la página final.

      Rust
    
      // Ejemplo de lógica de transformación
      let parser = Parser::new(&contenido_markdown);
      let mut html_output = String::new();
      html::push_html(&mut html_output, parser);
    

Fase 5: El Buscador

Para el buscador, añadiremos una ruta nueva en Axum: GET /buscar?q=....

  • Rust toma el parámetro q.
  • Hace una consulta a Postgres usando ILIKE o tsvector (Full Text Search).
  • Devuelve los resultados como JSON al navegador.

Fase 6: Despliegue con Docker Compose

Para ejecutar todo, solo necesitarás un comando. El archivo docker-compose.yml unirá la base de datos y tu código de Rust.

YAML

services:
db:
    image: postgres:15
    environment:
    POSTGRES_PASSWORD: password
app:
    build: .
    ports:
    - "3000:3000"
    depends_on:
    - db

Resumen de Pasos para cuando estés listo:

  • Instalar Docker en tu Ubuntu.
  • Definir tus campos: (Título, Autor, Tags, etc.).
  • Configurar el Cargo.toml con las librerías que mencionamos.
  • Escribir el main.rs siguiendo los bloques de lógica (Conexión BD -> Servidor -> Procesamiento).
  • Ejecutar docker-compose up y empezar a rellenar formularios.

Esta guía es tu cimiento. Tienes que definir los campos exactos de tu formulario, y escribir el código específico para cada uno de ellos.