Desarrollo
Este documento explica cómo compilar y probar el repositorio y ejecutar exchange localmente. Los procedimientos de despliegue, las tablas de campos del protocolo y la instalación en cada plataforma se describen en sus documentos específicos, enlazados al final.
Herramientas
El espacio de trabajo utiliza Rust 2021 y requiere Rust 1.88 o posterior. La versión figura en el campo rust-version del Cargo.toml de la raíz.
Espacio de trabajo y binarios
El espacio de trabajo Rust tiene nueve miembros: ocho en crates/ y el SDK de extensiones en sdk/extend/rust. Los tipos del protocolo se definen exclusivamente en crates/proto; exchange, agent y cli dependen de ese crate. No dupliques las estructuras de mensajes en un extremo.
| crate | Ruta | Resultado |
|---|---|---|
proto |
crates/proto |
Biblioteca. Centraliza mensajes de control, tramas binarias y estructuras compartidas |
exchange |
crates/exchange |
Binario exchange, con el mismo nombre que el paquete |
agent |
crates/agent |
Binario remote-agent |
cli |
crates/cli |
Binario remote-cli |
updater |
crates/updater |
Biblioteca de actualización para remote-agent y remote-cli |
telemetry |
crates/telemetry |
Biblioteca de informes de excepciones y registros compartida por los tres extremos |
tls-client |
crates/tls-client |
Política TLS rustls compartida de clientes y conexiones proxy opcionales |
worker-proto |
crates/worker-proto |
Validación de protocolo y hash de credenciales de Workers Exchange |
remote-extend-sdk |
sdk/extend/rust |
Biblioteca de tramas y contratos para proveedores de extensiones |
El punto de entrada de exchange es crates/exchange/src/main.rs. Como no tiene una tabla [[bin]] separada, cargo build -p exchange genera exchange. agent y cli especifican los nombres remote-agent y remote-cli en sus respectivos Cargo.toml.
Las tablas de conexiones se dividen por responsabilidad:
crates/exchange/src/hub.rsgestiona dispositivos conectados, sustituciones al reconectar y epoch.crates/exchange/src/hub/session_table.rstraduce identificadores entre operador y dispositivo.crates/exchange/src/hub/outbound.rsgestiona la cola de envío limitada de cada conexión.
Compilar
Ejecuta los comandos desde la raíz del repositorio.
El perfil de publicación, con opt-level = 2, thin LTO y unwind, compila el servidor, la CLI y el agente:
cargo build --release
Los binarios están en:
target/release/exchangetarget/release/remote-clitarget/release/remote-agent
release conserva unwind porque exchange es un proceso persistente con múltiples conexiones. Si una tarea de conexión entra en pánico, unwind permite a tokio detener esa tarea sin terminar las sesiones de otros dispositivos del mismo proceso.
El agente también dispone de un perfil que prioriza el tamaño: opt-level = "z", LTO, panic = "abort", strip y codegen-units = 1:
cargo build -p agent --no-default-features --profile release-small
Genera target/release-small/remote-agent. procd, systemd o una tarea programada reinician el agente tras un fallo, así que aquí se puede utilizar panic = "abort" para reducir el tamaño.
La compilación no necesita una base de datos. crates/exchange/src/db.rs utiliza consultas sqlx en tiempo de ejecución en lugar de la macro query!, por lo que cargo build funciona sin ella.
Pruebas
cargo test --workspace
Windows no ejecuta las pruebas que dependen de /bin/sh de Unix, /bin/ash en OpenWrt o PTY. El módulo de pruebas de crates/agent/src/pty.rs está protegido por #[cfg(all(test, unix))] y no se compila fuera de Unix. La implementación de PTY prueba primero /bin/ash y después /bin/sh. Las rutas de grupos de procesos y señales Unix de exec.rs también se compilan únicamente en Unix. Las pruebas de comandos de Windows utilizan PowerShell y no llaman a /bin/sh. Si modificas las rutas Unix de exec.rs o pty.rs, vuelve a ejecutar cargo test --workspace en Linux; el resultado de Windows no basta.
Puedes limitar el alcance a un crate, por ejemplo con cargo test -p proto o cargo test -p exchange -- hub::.
Ejecutar exchange localmente
Prepara PostgreSQL y guarda la cadena de conexión en DATABASE_URL. Esta variable corresponde a --database-url de exchange; consulta crates/exchange/src/config.rs. Al iniciar el proceso, db::connect ejecuta las migraciones incorporadas durante la compilación:
sqlx::migrate!("../../migrations")
Los archivos están en migrations/ en la raíz y se ejecutan automáticamente al iniciar, sin necesidad de sqlx-cli.
Las operaciones de auditoría también requieren una clave de cifrado. Los ejemplos siguientes generan una clave de prueba local. Guárdela de forma segura y reutilícela en los siguientes inicios; generar una nueva cada vez impide descifrar los detalles de auditoría existentes.
export DATABASE_URL='postgres://luci:luci@127.0.0.1:5432/luci'
export AUDIT_ENCRYPTION_KEY="$(python -c 'import base64, secrets; print(base64.b64encode(secrets.token_bytes(32)).decode())')"
cargo run -p exchange -- --listen 127.0.0.1:8080
En PowerShell, define primero la variable de entorno:
$env:DATABASE_URL = "postgres://luci:luci@127.0.0.1:5432/luci"
$env:AUDIT_ENCRYPTION_KEY = python -c "import base64, secrets; print(base64.b64encode(secrets.token_bytes(32)).decode())"
cargo run -p exchange -- --listen 127.0.0.1:8080
Si ya compilaste el binario de publicación, sustituye cargo run -p exchange -- por ./target/release/exchange. La dirección de escucha predeterminada es 0.0.0.0:8080; para depurar localmente se recomienda especificar 127.0.0.1.
Si no existe ninguna cuenta de operador habilitada en la base de datos, el arranque crea un administrador inicial y muestra el token en ese registro de inicio. El texto sin cifrar solo aparece una vez. El despliegue, el proxy inverso y las cuentas se explican en docs/deployment.md del repositorio. Esa página incluye direcciones de servidores y no se publica en este sitio.
Comprobaciones antes del commit
Ejecute estas comprobaciones desde la raíz del repositorio. Para cambios Rust, empiece por las pruebas del crate afectado y después compruebe el workspace. Si el formato detecta diferencias existentes ajenas al cambio, formatee solo los archivos modificados. Android, la extensión del navegador y la consola móvil necesitan además sus propias compilaciones y pruebas; las pruebas Rust no cubren esas interfaces.
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
Mantener la documentación
Verifique el comportamiento de la implementación antes de actualizar las guías en docs/. Los temas web tienen una referencia en website/docs/<topic>.md y nueve traducciones en website/docs/content/<locale>/<topic>.md. Mantenga alineados comandos, campos, ejemplos y niveles de títulos. Genere las páginas y los índices de búsqueda con el script en vez de editar solo HTML. Ejecute lo siguiente desde la raíz con Python 3.11+, markdown-it-py y Node.js instalados:
python -m pip install markdown-it-py
python scripts/build-docs.py
python scripts/build-docs.py --check
python scripts/test-docs.py
python scripts/test-docs-markdown.py
node scripts/test-docs-locale.js
python scripts/test-build-docs.py
python scripts/test-site-seo.py
La comprobación de generación también compara cada archivo generado byte a byte y falla si falta una salida o está desactualizada, sin escribir archivos. CI la ejecuta antes de regenerar.
Las comprobaciones validan traducciones completas, ejemplos, títulos, enlaces, anclas y rutas de idioma. Incluya las páginas generadas en el mismo commit que sus fuentes. La generación solo cambia archivos locales; el despliegue del sitio y la publicación de descargas son operaciones separadas.
Documentación relacionada
- Descripción técnica: conexiones de salida, traducción de sesiones, epoch, colas limitadas y almacenamiento de tokens.
- Uso: inicio de sesión, alta de dispositivos, arranque del agente, comandos y shell.
- Guía de despliegue en
docs/deployment.mddel repositorio; contiene direcciones de servidores y no se publica en el sitio. - Protocolo de comunicación.
- Despliegue multiplataforma.