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
// 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ística | nginx | Envoy | Caddy | Condor |
|---|---|---|---|---|
| Lenguaje / runtime | C | C++ | 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 | ✓ | ✓ |
| Config | DSL propio | YAML + xDS | Caddyfile | YAML |
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