Apple2Apple es una aplicación de escritorio para transferir archivos entre amigos mediante una arquitectura P2P híbrida.
La idea principal es que los archivos no se suban a un servidor central. Se necesita un servidor de señalización para que dos clientes puedan encontrarse y establecer una conexión directa.
App Electron A ───── signaling ───── NAS ───── signaling ───── App Electron B
App Electron A ─────────────── P2P / WebRTC ─────────────── App Electron B
- Servidor de señalización WebSocket
- Registro de peers con routeId
- Relay entre peers
- App Electron básica
- WebRTC DataChannel
- Transferencia por chunks
- Pausa - Resumen transferencias básica (En RAM)
- Cifrado E2E
- Firmas digitales
- Reanudación de transferencias
- Pausa - Resumen transferencias persistente
- Servidor de señalización WebSocket funcionando en un contenedor Docker de un servidor.
- App Electron con React y TypeScript.
- Configuración local de servidor y token.
- Conexión WebSocket desde la app Electron al servidor.
- Sistema
hellopara registrar unrouteId. - Sistema
relaypara reenviar mensajes entre peers conectados. - WebRTC DataChannel.
- Transferencia de archivos por chunks.
- Lista local de amigos.
- Cifrado extremo a extremo.
- Firmas digitales.
- Reanudación de transferencias.
- Electron
- React
- TypeScript
- Vite
- WebSocket
- WebRTC DataChannel
- Node.js
- Fastify
- @fastify/websocket
- Docker
- Docker Compose
- Nginx Proxy Manager
apps/desktop → aplicación de escritorio
apps/signal-server → servidor de señalización para la NAS
wss://servidor/ws?token=TOKEN
Cliente manda:
{
"type": "hello",
"routeId": "pc-ejemplo"
}Server responde:
{
"type": "hello.ok",
"routeId": "pc-ejemplo",
"onlinePeers": x
}{
"type": "relay",
"from": "pc-ejemplo",
"to": "raspi-ejemplo",
"envelope": {
"type": "test",
"message": "[contenido]"
}
}webrtc.offer
webrtc.answer
webrtc.ice
Tras establecer WebRTC, la transferencia entre clientes será P2P.
El servidor de señalización se despliega con Docker Compose.
docker compose up -d --buildEndpoint health:
curl http://[ip]:6767/healthEntrar en la carpeta:
cd apps/desktopInstalar dependencias:
npm installEjecutar en desarrollo:
npm run devBuild:
npm run buildGenerar instalador o ejecutable, según la configuración de Electron Builder:
npm run dist- El servidor no guarda archivos, ni claves privadas ni lista de amigos. Es un punto de encuentro temporal
- Cada PC debe tener su propia identidad local y una lista de amigos.
- Las claves públicas de amigos deberán verificarse mediante fingerprint o QR.
- Los archivos deberán cifrarse extremo a extremo.
- Los mensajes importantes deberán ir firmados.
Pendiente de definir.