Para ejecutar el modelo de lenguaje DeepSeek en un NAS y controlarlo de forma remota desde un dispositivo móvil, se requiere una configuración que integre túneles de red, gestión de permisos y scripts de automatización. Este enfoque asegura tanto la funcionalidad como la seguridad del sistema.
1. Despliegue del servicio del modelo DeepSeek
Selección del modelo: Se recomienda un modelo de código abierto optimizado para harwdare limitado, como una versión cuantificada de 4 bits de DeepSeek-MoE-16B-chat.
Implementación con Docker:
# Lanzar el contenedor de Ollama
docker run -d -p 11434:11434 --name ollama-service -v /ruta/a/modelos:/root/.ollama ollama/ollama
ollama pull deepseek-moe-16b-chat:4bit
Prueba de la API:
curl http://localhost:11434/api/generate -d '{"model":"deepseek-moe-16b-chat", "prompt":"Hola"}'
2. Configuración del túnel de red con frp
Configuración del servidor (en un VPS):
# frps.ini
[common]
bind_port = 7000
authentication_method = token
token = token_seguro_personalizado
Configuración del cliente (en el NAS):
# frpc.ini
[common]
server_addr = ip_del_vps
server_port = 7000
token = token_seguro_personalizado
[acceso_deepseek]
type = tcp
local_ip = 127.0.0.1
local_port = 11434
remote_port = 11434
Iniciar el cliente frp:
docker run -d --network host -v /ruta/frpc.ini:/etc/frp/frpc.ini --name frpc-client snowdreamtech/frpc
3. Gestión de permisos y seguridad
Crear un usuario dedicado:
sudo useradd -m deepseek-user
sudo usermod -aG docker,nasusers deepseek-user
Restricción de privilegios sudo:
# /etc/sudoers.d/deepseek-user
deepseek-user ALL=(root) NOPASSWD: /scripts/pelicula_descarga.sh
4. Desarrollo de scripts para tareas automatizadas
Script de ejemplo (/scripts/pelicula\_descarga.sh):
#!/bin/bash
TITULO="$1"
# Enviar solicitud a la API de nastools
curl -X POST "http://localhost:3000/api/download" -d "title=$TITULO"
# Monitorear finalización de descarga (lógica de sondeo personalizable)
while [ ! -f "/descargas/$TITULO.mkv" ]; do sleep 60; done
# Ejecutar metadatos y organización
/opt/tinyMediaManager/tinyMediaManagerCMD.sh -update -scrape
mv "/descargas/$TITULO.mkv" "/media/peliculas/"
Permisos del script:
chmod +x /scripts/pelicula_descarga.sh
sudo chown deepseek-user:deepseek-user /scripts/pelicula_descarga.sh
5. Capa de srevicio intermedio con Python
Instalación de dependencias:
pip install fastapi uvicorn requests
Código del servicio (servidor/main.py):
from fastapi import FastAPI, HTTPException
import requests
import subprocess
app = FastAPI()
PUNTO_FINAL_DEEPSEEK = "http://localhost:11434/api/generate"
def interpretar_orden(entrada_usuario):
prompt_estructurado = f"""Instrucción del usuario: {entrada_usuario}
Devuelve un comando en formato JSON con una acción y sus parámetros. Acción disponible: descargar_pelicula.
Ejemplo: {{"accion": "descargar_pelicula", "titulo": "Origen"}}"""
respuesta = requests.post(PUNTO_FINAL_DEEPSEEK, json={
"model": "deepseek-moe-16b-chat",
"prompt": prompt_estructurado,
"format": "json"
})
return respuesta.json()["response"]
@app.post("/ejecutar")
async def ejecutar_orden(datos: dict):
try:
comando = interpretar_orden(datos["texto"])
if comando["accion"] == "descargar_pelicula":
subprocess.run(["sudo", "/scripts/pelicula_descarga.sh", comando["titulo"]], check=True)
return {"estado": "exito"}
else:
raise HTTPException(status_code=400, detail="Acción no soportada")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Arrancar el servidor de la capa intermedia:
uvicorn servidor.main:app --host 0.0.0.0 --port 8000
6. Entegración con cliente móvil
Uso de un cliente HTTP (por ejemplo, en Android con Tasker):
- Configurar una solicitud POST a
http://ip_del_vps:8000/ejecutar. - El cuerpo de la solicitud debe ser un JSON como:
{"texto": "Descargar la película Origen"}.
Medidas de seguridad adicionales:
- Incluir verificación mediante una clave de API.
- Habilitar HTTPS utilizando un proxy inverso como Caddy o la función HTTPS de frp.
7. Monitorización y registros
Revisión de registros:
journalctl -u servicio_deepseek -f # Registros del servicio principal
tail -f /var/log/frp/frpc.log # Registros del túnel de red
Notificaciones de fallos: Integrar alertas en los scripts, por ejemplo, mediante Telegram:
curl -s -X POST "https://api.telegram.org/bot{TOKEN_BOT}/sendMessage" \
-d "chat_id={ID_CHAT}&text=La descarga falló: $TITULO"
Consideraciones técnicas clave
- Modelos alternativos: Si el modelo DeepSeek no es viable en el hardware local, se pueden utilizar alternativas eficientes como Llama 3 o Phi-3.
- Protección de red: Preferir el uso de una VPN sobre la exposición directa a Internet. Implementar herramientas como fail2ban para mitigar ataques de fuerza bruta.
- Validación de entradas: Realizar una verificación estricta de los comandos recibidos para prevenir inyección de código.
- Control de recursos: Vigilar el consumo de CPU y memoria con
docker statspara evitar la sobrecarga del NAS.