commit 922299e2a5a6f2c303fb6198a990ca2ec091c18c Author: Labstream Date: Thu Jun 18 14:14:03 2026 -0500 Envoltorio de escritorio Windows (Tauri 2) para Labstream OS Cliente delgado que abre os.labstreamsas.com en su propia ventana. Incluye build por GitHub Actions y guía de versionado. Co-Authored-By: Claude Opus 4.8 diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml new file mode 100644 index 0000000..387af02 --- /dev/null +++ b/.github/workflows/build-windows.yml @@ -0,0 +1,57 @@ +name: Build instalador Windows + +# Se dispara al publicar una etiqueta de versión (ej. v1.0.0) y también +# a mano desde la pestaña Actions (workflow_dispatch) para pruebas. +on: + push: + tags: + - "v*" + workflow_dispatch: + +permissions: + contents: write # necesario para crear/actualizar el Release con el .exe + +jobs: + build: + runs-on: windows-latest + steps: + - name: Clonar repo + uses: actions/checkout@v4 + + - name: Instalar Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Instalar Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache de Rust + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Instalar dependencias + run: npm install + + - name: Generar iconos + run: npm run icons + + - name: Construir instalador + run: npm run tauri build + + - name: Publicar instalador en el Release + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v2 + with: + files: | + src-tauri/target/release/bundle/nsis/*-setup.exe + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Subir instalador como artefacto (para pruebas sin tag) + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + uses: actions/upload-artifact@v4 + with: + name: labstream-os-setup + path: src-tauri/target/release/bundle/nsis/*-setup.exe diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f5ea43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Dependencias +node_modules/ + +# Build de Rust / Tauri +src-tauri/target/ + +# Iconos generados por `tauri icon` (se regeneran desde app-icon.png) +src-tauri/icons/*.png +src-tauri/icons/*.ico +src-tauri/icons/*.icns +!src-tauri/icons/.gitkeep + +# Esquemas/IPC generados por Tauri +src-tauri/gen/ + +# Sistema +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bca474 --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +# Labstream OS — App de escritorio (Windows) + +Envoltorio de escritorio para **Labstream OS**. Es un cliente delgado hecho con +[Tauri 2](https://tauri.app): abre una ventana propia (sin barra de navegador) +que carga el servidor de Labstream OS que corre en el NAS +(`https://os.labstreamsas.com`). + +No contiene la app: el backend, la base de datos, OnlyOffice, etc. siguen en el +NAS. Esto solo le da al equipo un ícono y una ventana propia en Windows. + +El servidor objetivo se configura en `src-tauri/tauri.conf.json` → +`app.windows[0].url`. + +--- + +## Prerrequisitos (solo para construir) + +Quien instala el `.exe` **no necesita nada** (WebView2 ya viene en Windows 10/11). +Para *construir* el instalador hacen falta: + +- [Node.js 20+](https://nodejs.org) +- [Rust](https://rustup.rs) (incluye `cargo`) +- En Windows: las "Visual Studio Build Tools" con el componente de C++. + +> ⚠️ **Importante:** el `.exe` de Windows se construye **en Windows**. Tauri no +> compila de forma cruzada desde macOS de manera fiable. Por eso lo normal es +> dejar que **GitHub Actions** lo construya (ver más abajo). Si quieres hacerlo +> a mano, usa una PC o máquina virtual con Windows. + +--- + +## Construir el instalador con GitHub Actions (recomendado) + +El flujo no requiere tener Windows a mano: + +1. Sube este proyecto a su propio repositorio (ej. `Labstream2026/labstream-desktop`). +2. Cambia la versión en **dos** sitios (deben coincidir): + - `src-tauri/tauri.conf.json` → `"version"` + - `src-tauri/Cargo.toml` → `version` + - (opcional) `package.json` → `"version"` +3. Crea y publica la etiqueta de versión: + ```bash + git commit -am "Versión 1.1.0" + git tag v1.1.0 + git push origin main --tags + ``` +4. GitHub Actions construye el `.exe` y lo publica en **Releases**. El equipo lo + descarga desde ahí: `https://github.com/Labstream2026/labstream-desktop/releases`. + +También puedes lanzarlo a mano sin etiqueta desde la pestaña **Actions → +Build instalador Windows → Run workflow** (el `.exe` queda como *artifact*). + +--- + +## Construir en local (en una PC Windows) + +```bash +npm install +npm run build # genera iconos + compila el instalador +``` + +El instalador queda en: +``` +src-tauri/target/release/bundle/nsis/Labstream OS__x64-setup.exe +``` + +Para desarrollo con recarga en caliente: `npm run dev`. + +--- + +## Versiones (SemVer) + +Se usa `MAYOR.MENOR.PARCHE`: + +| Cambio | Ejemplo | +| ------------------------------ | --------------- | +| Corrección / arreglo | 1.0.0 → 1.0.1 | +| Función nueva compatible | 1.0.1 → 1.1.0 | +| Cambio grande / incompatible | 1.1.0 → 2.0.0 | + +La versión del **envoltorio** es independiente de la de la app web +(`labstream-os`). Como la ventana siempre apunta al mismo servidor, casi nunca +chocan; documenta aquí si en algún momento una versión del envoltorio exige una +versión mínima del backend. + +--- + +## Actualización automática (opcional, recomendable a futuro) + +Hoy, para actualizar, el equipo descarga el nuevo `.exe` del Release y lo +reinstala encima. Para que las apps ya instaladas se actualicen solas, Tauri +trae un *updater*. Para activarlo (paso futuro): + +1. Genera el par de claves de firma: + ```bash + npm run tauri signer generate -- -w ~/.tauri/labstream.key + ``` +2. Añade el `plugin-updater` y la clave pública en `tauri.conf.json`, y guarda la + clave privada como **secret** en GitHub (`TAURI_SIGNING_PRIVATE_KEY`). +3. Apunta el updater al `latest.json` que publica el Release. + +Se deja sin activar a propósito para que la **primera** versión compile sin +configuración extra. + +--- + +## Aviso de SmartScreen (instalación interna) + +Como el instalador **no está firmado** con un certificado de pago, Windows +mostrará una pantalla azul *"Windows protegió su PC"* la primera vez. Es normal +para apps internas: + +> **Más información → Ejecutar de todos modos** + +Si en el futuro se distribuye a clientes externos, conviene un certificado de +*code signing* (~150–400 USD/año) para quitar ese aviso. + +--- + +## Estructura + +``` +labstream-desktop/ +├── app-icon.png fuente del ícono (1024×1024) +├── dist/index.html pantalla de respaldo (requerida por Tauri) +├── package.json scripts de build +├── src-tauri/ +│ ├── tauri.conf.json nombre, versión, URL del servidor, instalador +│ ├── Cargo.toml dependencias Rust + versión +│ ├── build.rs +│ ├── capabilities/default.json +│ ├── icons/ se generan desde app-icon.png +│ └── src/{main.rs,lib.rs} +└── .github/workflows/build-windows.yml build automático del .exe +``` diff --git a/app-icon.png b/app-icon.png new file mode 100644 index 0000000..5d71e6a Binary files /dev/null and b/app-icon.png differ diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..06f17ab --- /dev/null +++ b/dist/index.html @@ -0,0 +1,44 @@ + + + + + + Labstream OS + + + + +
+
+

Labstream OS

+

Conectando con el espacio de trabajo…

+
+ + diff --git a/package.json b/package.json new file mode 100644 index 0000000..78af926 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "labstream-desktop", + "version": "1.0.0", + "private": true, + "description": "App de escritorio (Windows) que envuelve Labstream OS — cliente del servidor del NAS.", + "scripts": { + "icons": "tauri icon app-icon.png", + "dev": "npm run icons && tauri dev", + "build": "npm run icons && tauri build", + "tauri": "tauri" + }, + "devDependencies": { + "@tauri-apps/cli": "^2" + } +} diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..5315537 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "labstream-desktop" +version = "1.0.0" +description = "Cliente de escritorio de Labstream OS" +authors = ["Labstream SAS"] +edition = "2021" +rust-version = "1.77.2" + +[lib] +name = "labstream_desktop_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..adc7b23 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Permisos por defecto del envoltorio de escritorio.", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default" + ] +} diff --git a/src-tauri/icons/.gitkeep b/src-tauri/icons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..04ba033 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,12 @@ +// Punto de entrada de la app de escritorio de Labstream OS. +// Es un "envoltorio": la ventana carga directamente el servidor del NAS +// (ver `app.windows[].url` en tauri.conf.json), así que aquí no hay lógica de UI. +// El plugin `opener` permite que los enlaces externos abran el navegador del sistema. + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .run(tauri::generate_context!()) + .expect("error al arrancar Labstream OS"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..03e5c36 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Evita que se abra una consola de Windows detrás de la ventana en la build de release. +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + labstream_desktop_lib::run() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..6e32a6f --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "Labstream OS", + "version": "1.0.0", + "identifier": "co.labstream.os", + "build": { + "frontendDist": "../dist" + }, + "app": { + "withGlobalTauri": false, + "windows": [ + { + "label": "main", + "title": "Labstream OS", + "url": "https://os.labstreamsas.com", + "width": 1400, + "height": 900, + "minWidth": 1024, + "minHeight": 700, + "resizable": true, + "center": true, + "decorations": true + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": ["nsis"], + "publisher": "Labstream SAS", + "category": "Productivity", + "shortDescription": "Espacio de trabajo de Labstream", + "longDescription": "Cliente de escritorio de Labstream OS para Windows. Abre el espacio de trabajo de Labstream en su propia ventana.", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "windows": { + "nsis": { + "installMode": "currentUser", + "languages": ["Spanish", "SpanishInternational", "English"] + } + } + } +}