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 <noreply@anthropic.com>
Este commit está contenido en:
57
.github/workflows/build-windows.yml
vendido
Archivo normal
57
.github/workflows/build-windows.yml
vendido
Archivo normal
@@ -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
|
||||||
17
.gitignore
vendido
Archivo normal
17
.gitignore
vendido
Archivo normal
@@ -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
|
||||||
135
README.md
Archivo normal
135
README.md
Archivo normal
@@ -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_<versión>_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
|
||||||
|
```
|
||||||
BIN
app-icon.png
Archivo normal
BIN
app-icon.png
Archivo normal
Archivo binario no mostrado.
|
Después Anchura: | Altura: | Tamaño: 52 KiB |
44
dist/index.html
vendido
Archivo normal
44
dist/index.html
vendido
Archivo normal
@@ -0,0 +1,44 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Labstream OS</title>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
height: 100%;
|
||||||
|
background: #6366f1;
|
||||||
|
color: #fff;
|
||||||
|
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.box { max-width: 420px; padding: 24px; }
|
||||||
|
h1 { font-size: 20px; font-weight: 600; margin: 0 0 8px; }
|
||||||
|
p { opacity: 0.85; font-size: 14px; line-height: 1.5; margin: 0; }
|
||||||
|
.spinner {
|
||||||
|
width: 28px; height: 28px; margin: 0 auto 20px;
|
||||||
|
border: 3px solid rgba(255,255,255,0.35);
|
||||||
|
border-top-color: #fff; border-radius: 50%;
|
||||||
|
animation: spin 0.8s linear infinite;
|
||||||
|
}
|
||||||
|
@keyframes spin { to { transform: rotate(360deg); } }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!--
|
||||||
|
Pantalla de respaldo. En condiciones normales la ventana carga directamente
|
||||||
|
el servidor del NAS (app.windows[].url en tauri.conf.json), así que este
|
||||||
|
archivo casi nunca se ve. Solo aparece si se cambia la config para arrancar
|
||||||
|
en local. Es obligatorio porque Tauri exige un frontendDist existente.
|
||||||
|
-->
|
||||||
|
<div class="box">
|
||||||
|
<div class="spinner"></div>
|
||||||
|
<h1>Labstream OS</h1>
|
||||||
|
<p>Conectando con el espacio de trabajo…</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
15
package.json
Archivo normal
15
package.json
Archivo normal
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src-tauri/Cargo.toml
Archivo normal
20
src-tauri/Cargo.toml
Archivo normal
@@ -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"
|
||||||
3
src-tauri/build.rs
Archivo normal
3
src-tauri/build.rs
Archivo normal
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
tauri_build::build()
|
||||||
|
}
|
||||||
10
src-tauri/capabilities/default.json
Archivo normal
10
src-tauri/capabilities/default.json
Archivo normal
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
0
src-tauri/icons/.gitkeep
Archivo normal
0
src-tauri/icons/.gitkeep
Archivo normal
12
src-tauri/src/lib.rs
Archivo normal
12
src-tauri/src/lib.rs
Archivo normal
@@ -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");
|
||||||
|
}
|
||||||
6
src-tauri/src/main.rs
Archivo normal
6
src-tauri/src/main.rs
Archivo normal
@@ -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()
|
||||||
|
}
|
||||||
50
src-tauri/tauri.conf.json
Archivo normal
50
src-tauri/tauri.conf.json
Archivo normal
@@ -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"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Referencia en una nueva incidencia
Block a user