Crea una API REST segura con Rust, Actix y Diesel

Crea una API REST segura con Rust, Actix y Diesel

Guía práctica: Construye una API REST de producción en Rust con Actix y Diesel

En esta guía paso a paso crearás una API REST lista para producción con Rust, Actix Web y Diesel sobre PostgreSQL. El enfoque es práctico, con comandos reproducibles, código completo, autenticación JWT, observabilidad con Prometheus y contenedorización con Docker.

Diagrama general del flujo de una petición:

1) Requisitos previos e instalación

Resumen: instalarás Rust estable, herramientas opcionales (diesel_cli, cargo-make), Docker/Compose y utilidades como psql y httpie/curl.

Pasos:

  • Instala Rust y cargo con rustup.
  • Instala diesel_cli si usarás migraciones Diesel.
  • Verifica Docker y Docker Compose.
  • Asegúrate de tener psql y curl/httpie.

Comandos:

Explicación: rustup instala Rust y cargo. diesel_cli requiere libpq para enlazar con PostgreSQL. Docker/Compose permiten orquestar la base de datos y la API localmente.

Checklist:

  • [ ] rustc y cargo instalados
  • [ ] diesel_cli funciona (opcional)
  • [ ] Docker y Compose operativos
  • [ ] psql y httpie/curl disponibles

Resolución de problemas:

  • Si diesel_cli falla, verifica libpq-dev y pkg-config. En macOS: brew install libpq pkg-config y exporta PATH si es necesario.

2) Estructura del proyecto y configuración (API Rust con Actix y Diesel)

Resumen: crea el proyecto con cargo y define un layout mantenible con módulos claros.

Pasos:

Sugerencia de layout:

Explicación: separar configuración, DB, modelos, handlers y middleware mejora mantenibilidad y testeo.

Checklist:

  • [ ] Proyecto inicializado
  • [ ] Carpetas creadas
  • [ ] .env y .env.example planificados por entorno

Resolución de problemas:

  • Usa .env.example para documentar variables y evitar subir secretos reales al repositorio.

3) Esquema y migraciones (Migraciones Diesel PostgreSQL)

Resumen: definirás tablas users, products, orders y order_items con índices y soft-delete opcional.

Pasos con Diesel:

Edita las migraciones generadas (ver sección 15 para SQL completo) y ejecútalas:

Alternativa sin diesel_cli: usa Refinery en build-time o en un binario de migraciones.

Explicación: Diesel genera y aplica migraciones en orden. Los índices y constraints garantizan integridad y rendimiento.

Checklist:

  • [ ] DATABASE_URL configurada
  • [ ] Migraciones creadas y ejecutadas
  • [ ] Tablas visibles con psql

Resolución de problemas:

  • Si diesel setup falla, revisa conexión a Postgres y credenciales.

4) Modelos, acceso a datos y pool (r2d2)

Resumen: mapea tablas a structs, configura el pool de conexiones y ejecuta queries sin bloquear Actix usando web::block.

Pasos:

  • Genera schema.rs con diesel print-schema.
  • Crea structs con #[derive(Identifiable, Queryable, Insertable)].
  • Configura r2d2 y helpers para offload de consultas.

Código breve (detalles completos en sección 15):

Explicación: se crea un pool r2d2 con conexiones PostgreSQL; max_size debe calibrarse.

Checklist:

  • [ ] schema.rs generado
  • [ ] Modelos creados
  • [ ] Pool inicializado

Resolución de problemas:

  • Error de bloqueo: siempre usa web::block para Diesel (sincrónico) o migra a SQLx async en escenarios de alto throughput.

5) Servidor HTTP con Actix Web: rutas y middlewares

Resumen: inicializa Actix, registra middlewares de logging/tracing, CORS, compresión, rate limit y rutas básicas.

Pasos:

Código breve (ver completo en sección 15):

Explicación: se compone el pipeline HTTP con middlewares y scopes, aislando rutas protegidas con el middleware JWT.

Checklist:

  • [ ] Servidor arranca en puerto configurado
  • [ ] CORS, compresión y logging activos

Resolución de problemas:

  • Si CORS bloquea peticiones, ajusta los orígenes permitidos.

6) Autenticación y autorización (Autenticación JWT en Rust)

Resumen: implementa registro y login con contraseñas Argon2 y emisión/validación de JWT (HS256). Añade roles básicos.

Pasos:

  • Hash con Argon2 al registrar
  • Verifica con Argon2 al login
  • Emite JWT con claims {sub, role, exp, iss}
  • Middleware valida y adjunta claims

Prueba rápida:

Explicación: el middleware extrae Authorization: Bearer, valida el token y añade Claims a la request.

Checklist:

  • [ ] Hash seguro Argon2
  • [ ] JWT firmado y verificado
  • [ ] Rutas protegidas funcionan

Resolución de problemas:

  • “Invalid token”: revisa clocks (exp), issuer y secret correcto.

7) Manejo de errores y respuestas JSON estandarizadas

Resumen: thiserror para errores de dominio y ResponseError para mapear a HTTP con una forma JSON uniforme.

Código breve:

Explicación: centralizar errores facilita logs, métricas y clientes predecibles.

Checklist:

  • [ ] Respuestas con códigos correctos
  • [ ] Mensajes no filtran detalles sensibles

Resolución de problemas:

  • Envía IDs de correlación en errores para rastrear en logs.

8) Serialización y validación (serde + validator)

Resumen: valida payloads con validator y serializa con serde.

Código breve:

Explicación: valida al inicio del handler y retorna 422 si falla.

Checklist:

  • [ ] DTOs con derives serde/validator
  • [ ] 422 para errores de validación

Resolución de problemas:

  • Añade mensajes claros por campo para DX de clientes.

9) Tests unitarios e integración

Resumen: cubre lógica de dominio y endpoints. Para integración, usa una BD de prueba y aplica migraciones en el setup.

Comandos:

Explicación: los tests pueden invocar “diesel migration run” durante el setup y revertir al final; ver sección 15.

Checklist:

  • [ ] Tests unitarios de hashing/JWT
  • [ ] Tests de integración para /auth y /healthz

Resolución de problemas:

  • Aísla la BD de test en otro puerto y esquema para evitar colisiones.

10) Observabilidad y métricas (Observabilidad Rust Prometheus)

Resumen: integra tracing y un endpoint /metrics para Prometheus. Opcional: exportador OTLP para OpenTelemetry.

Pasos:

  • Inicializa tracing_subscriber con EnvFilter
  • Crea un Registry de Prometheus y expón /metrics
  • (Opcional) Inicia un tracer OTLP via OTELEXPORTEROTLP_ENDPOINT

Explicación: logs estructurados + métricas + trazas facilitan debugar y operar en producción.

Checklist:

  • [ ] Logs JSON o texto con niveles adecuados
  • [ ] /metrics expone métricas
  • [ ] Healthz y readiness disponibles

Resolución de problemas:

  • Si Prometheus no scrapea, revisa red y path /metrics configurado.

11) Contenedorización y orquestación local (Docker Actix Rust)

Resumen: usa un Dockerfile multi-stage y docker-compose con servicios api, postgres y opcional prometheus.

Comandos:

Explicación: multi-stage reduce tamaño y runtime incluye libpq. Healthchecks automatizan dependencias.

Checklist:

  • [ ] Imagen pequeña y no-root user
  • [ ] Variables de entorno sin secretos en git

Resolución de problemas:

  • Si el binario falla por libpq, añade libpq5 en la imagen final.

12) Seguridad en producción

Resumen: endurece tu API con TLS en el edge, headers seguros, límites de payload, CORS restringido y rotación de JWT keys.

Pasos:

  • Termina TLS en LB/ingress (Nginx, Envoy, ALB)
  • Headers: HSTS, X-Frame-Options, X-Content-Type-Options
  • Limita tamaño de payload y tiempo de request
  • CORS sólo a orígenes confiables
  • Rota secretos JWT y usa RS256 si gestionas llaves públicas/privadas

Checklist:

  • [ ] TLS sólido y red segura
  • [ ] CORS restringido
  • [ ] Rotación de secretos documentada

Resolución de problemas:

  • Automatiza la renovación de claves y configúralo como rolling deploy.

13) Rendimiento y buenas prácticas

Resumen: evita bloquear el executor, calibra pools, usa compresión y benchmarkea con hey/wrk.

Pasos:

  • Offload Diesel con web::block o usa SQLx async
  • Ajusta pool DB (max_size) y timeouts
  • Añade índices a columnas de filtrado
  • Habilita gzip y keep-alive
  • Benchmarks: wrk -t4 -c64 -d30s http://localhost:8080/healthz

Checklist:

  • [ ] Sin bloqueos en el hilo de Actix
  • [ ] Índices verificados
  • [ ] Límites de payload y timeouts configurados

Resolución de problemas:

  • Usa pgbouncer si necesitas más conexiones concurrentes.

14) CI/CD y despliegue (GitHub Actions)

Resumen: pipeline con fmt/clippy/test, build/push Docker y despliegue con migraciones.

Comandos locales:

Explicación: automatiza calidad y despliegue seguro; migra antes de levantar la nueva versión o en job de pre-deploy.

Checklist:

  • [ ] Cache de dependencias
  • [ ] Secretos del registry seguros
  • [ ] Paso de migraciones atómico/seguro

Resolución de problemas:

  • Usa estrategias blue/green o rolling para evitar downtime durante migraciones.

15) Archivos y ejemplos clave (copiar/pegar)

A continuación, el código esencial completo. Después de cada bloque hay una explicación breve.

Cargo.toml

Explicación: dependencias para HTTP, seguridad, DB, observabilidad y validación.

src/main.rs

Explicación: servidor Actix con middlewares, métricas Prometheus, rutas de auth y ruta protegida /api/me.

src/config/mod.rs

Explicación: lectura de configuración desde archivo y variables de entorno.

src/db/mod.rs y src/db/pool.rs

Explicación: pool de conexiones r2d2 para PostgreSQL.

migrations/ iniciales

Explicación: esquema básico con relaciones, índices y soft-delete en users/products.

Nota: activa la extensión pgcrypto o uuid-ossp para genrandomuuid() si tu Postgres no la tiene:

src/models y src/schema.rs

Explicación: mapeo Diesel para usuarios; extiende con products/orders si lo necesitas.

src/handlers/auth.rs

Explicación: registro, login y endpoint /me protegido. Password hashing Argon2 y emisión de JWT HS256.

src/middleware/jwt_middleware.rs

Explicación: middleware de validación JWT que inyecta Claims en las extensions de la request y extractor para handers.

Dockerfile (docker/Dockerfile)

Explicación: compilación en builder y runtime mínimo con libpq.

docker-compose.yml

Explicación: orquesta DB, API y Prometheus para observabilidad.

Ejemplo de docker/prometheus.yml:

.env.example

Explicación: variables de entorno por defecto para desarrollo local.

README (comandos esenciales)

Explicación: secuencia mínima para levantar DB, migrar y correr la API.

tests/integration_tests.rs

Explicación: ejemplo de test de healthz y esqueleto para flujo de auth con migraciones en setup/teardown.

.github/workflows/ci.yml

Explicación: pipeline con verificación estática, migraciones y tests; luego construye y publica la imagen.

Conclusión y siguientes pasos

Has construido una API REST de producción en Rust con Actix Web y Diesel: autenticación JWT, validación, observabilidad, contenedorización y CI. Para continuar:

  • Añade endpoints de productos y pedidos, con transacciones Diesel.
  • Implementa refresh tokens y roles avanzados.
  • Integra OpenTelemetry OTLP hacia tu backend de trazas.
  • Automatiza despliegues en Fly.io, ECS o GKE y configura TLS en tu gateway.