ExyonQ Servidor HTTP modular y reverse proxy en Rust

CLI

Referencia de exyonq (producto) y exyonqctl (control). El texto de uso está tomado de la salida real de --help del binario 0.9.0; no hay opciones imaginarias.

exyonq

Usage: exyonq <COMMAND>

Commands:
  serve           Run the HTTP server from native IR (TOML) or Serverfile (.exy)
  validate        Validate native IR (TOML)
  compile         Compile Serverfile (.exy) to IR TOML
  migrate-config  Migrate IR v1 TOML to v2
  fmt             Format a Serverfile
  explain         Explain a Serverfile directive
  export-schema   Export JSON Schema for IR
  spike           Run the Fase 0 HTTP reverse-proxy spike
  help            Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

exyonq --version imprime la identidad del artefacto: exyonq 0.9.0, más product_version, artifact_version, source_revision, target, profile y allocator.

ComandoUso
serveexyonq serve --config <CONFIG>
validateexyonq validate --config <CONFIG>
compileexyonq compile [OPTIONS] <INPUT>
migrate-configexyonq migrate-config --config <CONFIG> --output <OUTPUT>
fmtexyonq fmt [OPTIONS] <INPUT>
explainexyonq explain <DIRECTIVE>
export-schemaexyonq export-schema --output <OUTPUT>
spikeexyonq spike [--listen <LISTEN>] [--upstream <UPSTREAM>]

serve

Arranca el servidor desde IR nativo (TOML) o desde un Serverfile (.exy), que compila al vuelo. Es el comando que ejecuta systemd. Sin --config (-c) no hace nada: no hay ruta por defecto.

exyonq serve -c /etc/exyonq/https.toml

validate

Parsea y valida el IR. Código 0 con config OK: <ruta>; código 1 con un diagnóstico error[EXY-CONFIG-…]. No compila el plan de ejecución ni abre sockets.

compile

Traduce un Serverfile .exy a IR TOML. Opciones: -o/--output (escribe fichero e informa wrote …), --check (valida sin escribir) y --profile <dev|edge|lb>. Sin -o, el TOML sale por la salida estándar.

exyonq compile site.exy -o site.toml
exyonq migrate-config -c site.toml -o site.v2.toml

fmt

Reformatea un Serverfile: sangría de cuatro espacios, una directiva por línea y normalización de valores (ratelimit 100 burst 200 pasa a ratelimit 100r/s burst 200). Sin -w imprime; con -w/--write reescribe el fichero.

explain

Explica un término público del lenguaje: significado, superficie, tabla del IR, obligatoriedad, valores admitidos y códigos de diagnóstico. Términos disponibles: listener, site, route, upstream, module, backend, http3_listen, pools_fcgi, htaccess, config_version, policy, proxy, root, index, metrics, compression, ratelimit, timeout.

$ exyonq explain upstream
public_term = upstream
meaning = Named HTTP/1.1 upstream target for reverse proxy.
surface = .exy proxy directive or [[upstream]]
ir_mapping = [[upstream]]
required = false
default = timeout_ms=30000
allowed_values = ["http:// URI"]
related_codes = ["EXY-CONFIG-0004"]
documentation = ["docs/architecture/p1.4-config-defaults-matrix.md"]

migrate-config

Migra IR v1 a v2: añade config_version = 2 y materializa los valores que la v1 dejaba implícitos (timeout_ms = 30000 en un upstream sin timeout). Responde migrated v1.toml -> v2.toml y no toca la entrada.

export-schema

Escribe el JSON Schema del IR. Útil para autocompletar en el editor y para validar TOML generado por herramientas.

exyonq export-schema -o exyonq-ir.schema.json

spike

Banco de pruebas del proxy inverso de la fase 0, con --listen (por defecto 127.0.0.1:8080) y --upstream (por defecto http://127.0.0.1:9000). No lee configuración y no se usa en producción.

validate, compile, fmt y explain avisan de que son comandos transitorios y recomiendan exyonqctl config lint, config test, config format y config explain. Siguen funcionando, pero la superficie recomendada es la de exyonqctl.

exyonqctl

Usage: exyonqctl [COMMAND]

Commands:
  reload    Reload config from disk into a running server
  status    Show live generation and config fingerprint
  drain     Stop accepting new connections; let in-flight requests finish
  shutdown  Drain and request graceful process shutdown
  purge     Authenticated FPC cache purge (dedicated purge socket — WC3)
  server    AP-01: balancer member table (list/set without reload)
  cache     FPC observability (Q-04 / ADR-057): stats + explain
  config    Offline configuration utilities
ComandoUso y efecto
reloadreload -c <config> -s <socket>: publica la configuración del fichero en el proceso vivo
statusstatus [-s <socket>] [--format human o json]: process_state, generation, fingerprint, uptime_s, active_connections, draining, reload_in_progress
draindrain [-s <socket>] [--format human o json]: deja de aceptar conexiones nuevas y espera a las vivas
shutdownshutdown [-s <socket>]: drena y pide la parada ordenada
purgepurga autenticada de una entrada por URL, sitio, generación o etiqueta; socket y token por -s/--token o por entorno
cachecache stats, cache explain: contadores y explicación offline de hit/miss/bypass
serverTabla de miembros del balanceador: listar y cambiar sin recargar

purge url pide la identidad completa: <SITE_ID> <SCHEME> <HOST> <PATH> y, opcionalmente, --query.

exyonqctl purge url -s /run/exyonq/purge.sock --token "$TOKEN" exyonq https exyonq.dev /
exyonqctl purge site -s /run/exyonq/purge.sock --token "$TOKEN" exyonq

exyonqctl config

SubcomandoEfecto
lint / checkParsea y valida; no compila el plan
dump-irImprime el IR canónico en TOML o JSON
testValida y compila el plan en memoria, sin abrir listeners
explainLéxico público o procedencia de un valor efectivo
formatFormatea un Serverfile (solo .exy)
profilePerfiles de producto: static, proxy, php, wordpress, websocket, sse, tls-h2
reloadPreflight, diff y recarga estructural en vivo
status / generationGeneración viva, huella y banderas de recarga
migrate-nginxImporta configuración de NGINX al IR (offline)
htaccessUtilidades de la capa .htaccess

lint, check y test aceptan la ruta como posicional o con --config <ruta>, igual que exyonq validate.

config reload <PATH> acepta --check (preflight), --diff (clasifica contra la huella viva, sin publicar), --baseline <IR> y --format human|json. Sin banderas, publica en el proceso indicado por --socket.