Entender SwissKnife
Arquitectura
Cómo se compone, sirve y despliega SwissKnife.
SwissKnife es una única aplicación cliente. No tiene API de aplicación, base de datos ni servicio de autenticación.
Navegador
→ aplicación React
→ imágenes: Canvas 2D
→ audio / vídeo: FFmpeg WASM (un hilo, cola secuencial)
→ núcleo FFmpeg: /ffmpeg/ffmpeg-core.js y /ffmpeg/ffmpeg-core.wasmEn producción con Docker:
Nginx sin privilegios (puerto 2501)
→ archivos estáticos de dist/
→ fallback de la SPA a index.html
→ cabeceras COOP / COEP / CSP (SharedArrayBuffer)Stack verificado
| Capa | Elección actual |
|---|---|
| Interfaz | React 19, TypeScript estricto |
| Build | Vite 6, Tailwind CSS 4 |
| Imágenes | API Canvas |
| Audio / vídeo | @ffmpeg/ffmpeg 0.12 y copia local de @ffmpeg/core 0.12.6 |
| Contenedor | Node 22 Alpine para compilar, Nginx unprivileged 1.27 Alpine en ejecución |
| Controles | ESLint, Vitest (npm test), tsc --noEmit |
Dos artefactos distintos
| Artefacto | Comando | Uso |
|---|---|---|
| Producto estándar | npm run build | Docker, GHCR y despliegue normal |
| Demo pública | npm run build:demo | demo pública en Vercel únicamente |
El Dockerfile ejecuta npm run build. El vercel.json del repositorio del producto ejecuta npm run build:demo. No deben intercambiarse.
Archivos Compose del repositorio
| Archivo | Origen de la imagen |
|---|---|
docker-compose.yml | ghcr.io/lucas-lepajollec/swissknife:latest |
docker-compose.build.yml | build local desde el Dockerfile |
La instalación predeterminada para homelab descarga la imagen publicada en lugar de recompilar el checkout cada vez.