v0.1 — TLS · ACME · audit HIPAA · hot reload

un reverse proxy que
no expande tu
superficie de ataque.

nginx arrastra OpenSSL; Envoy pide un control plane; el resto suma C, GC y CVEs. Condor es un proxy HTTP inverso en Rust puro: un binario estático de ~7 MB, cero dependencias C (TLS con rustls + ring, sin OpenSSL), con HTTPS automático vía ACME, audit log append-only para HIPAA y hot reload sin cortar conexiones. Hecho para entornos regulados donde la residencia de datos y una superficie mínima no se negocian.

// De un vistazo

~7 MB
binario estático musl, stripped
0
dependencias C · sin OpenSSL
HTTP/2
y HTTP/1.1, downstream y upstream
38
tests · clippy limpio

// Por qué Condor

Cero OpenSSL

TLS con rustls + ring; los JWT con RustCrypto puro. Sin libssl, sin C linkeado: toda la clase de CVEs de OpenSSL desaparece de la superficie.

Un binario, sin sorpresas

~7 MB estáticos para x86_64-unknown-linux-musl, sin dependencias dinámicas. Se copia a la VM y corre. Imagen Docker scratch opcional del mismo tamaño.

HTTPS automático (ACME)

Emisión y renovación de certificados Let's Encrypt vía desafío HTTP-01, con instant-acme sobre ring. SNI multi-dominio con resolver dinámico — los certs se insertan sin reiniciar.

Audit log para cumplimiento

JSONL append-only, una línea por petición (request_id, IP, método, host, status, upstream, latencia, user_id). Rotación diaria, compatible WORM. Pensado para HIPAA / ISO-27001.

Hot reload sin drop

SIGHUP o POST /reload recargan rutas, upstreams y middleware en caliente con un swap atómico del routing — sin cortar conexiones en curso.

Resiliencia incluida

Circuit breaker por upstream (Closed → Open → HalfOpen) y health checks activos por target. Un backend caído deja de recibir tráfico solo.

Gateway, no solo proxy

Auth JWT validada contra un JWKS remoto y API key, rate limiting token-bucket por IP, y manipulación de headers — por ruta, declarados en YAML.

Observabilidad nativa

Métricas Prometheus (condor_*: requests, latencia, salud de upstreams, estado del circuito, handshakes TLS) y logs JSON estructurados con tracing.

Sin control plane

Toda la config en un YAML legible que un equipo de ops puede versionar y operar. Sin xDS, sin sidecars de configuración, sin daemon aparte.

// Config en un archivo

Un condor.yaml describe listeners, rutas, upstreams con su estrategia de balanceo, middleware por ruta y auditoría. Validá sin arrancar con condor check.

listeners:
  - addr: "0.0.0.0:443"
    tls:
      mode: acme                 # file | acme | self_signed
      acme_email: ops@falp.cl
      acme_domains: ["api.falp.cl"]

routes:
  - name: hercules
    match_host: api.falp.cl
    match_path: /hercules/*
    upstream: hercules-pool
    middleware:
      - type: auth
        mode: jwt
        jwks_url: "https://auth.falp.cl/.well-known/jwks.json"
      - type: ratelimit
        requests_per_second: 500
      - type: audit

upstreams:
  - name: hercules-pool
    strategy: round_robin     # round_robin | least_conn | random | ip_hash
    targets:
      - addr: "10.0.1.10:8080"
      - addr: "10.0.1.11:8080"
    health_check: { path: /health, interval_secs: 5 }
    circuit_breaker: { failure_threshold: 50, recovery_secs: 30 }

// vs otros proxies

CaracterísticanginxEnvoyCaddyCondor
Lenguaje / runtimeCC++Go (GC)Rust (sin GC)
Sin OpenSSL/BoringSSL✗ OpenSSL✗ BoringSSL✓ rustls
Binario único estático✓ ~7 MB
HTTPS automático (ACME)~ certbot✓ nativo
Audit append-only WORM/HIPAA~ access log~ access log~ access log✓ JSONL
Circuit breaker integrado~ Plus~ plugin
Sin control plane✗ xDS
ConfigDSL propioYAML + xDSCaddyfileYAML

Comparación de arquitectura, no de benchmarks. Las cifras de throughput/latencia de Condor son objetivos de diseño y se publicarán cuando estén medidas.

// Compilar y desplegar

Compilar (estático, musl)

$ cargo zigbuild --release \
      --target x86_64-unknown-linux-musl --bin condor
# → target/x86_64-unknown-linux-musl/release/condor (~7 MB)

Correr

$ condor check  -c condor.yaml   # valida sin arrancar
$ condor start  -c condor.yaml   # inicia el proxy
$ condor reload -c condor.yaml   # hot reload

systemd (recomendado)

$ sudo install -m755 condor /usr/local/bin/condor
$ sudo install -m644 deploy/condor.service /etc/systemd/system/
$ sudo systemctl enable --now condor
$ sudo systemctl reload condor   # SIGHUP → hot reload

Endpoints de gestión

$ curl :9090/health    # estado + salud de upstreams (JSON)
$ curl :9090/metrics   # formato Prometheus (condor_*)
$ curl :9091/config    # config actual sin secretos (solo local)

// Parte del Dune stack

Condor es la capa de ingress/sidecar del Dune stack: corre delante de los microservicios y gateways del resto del stack. Este mismo sitio se construye y sirve con stil.

$ cd site/
$ stil install        # resuelve vite + three + binarios nativos
$ stil run build      # vite build → dist/ listo para deploy
✓ built