Implementación y control remoto de DeepSeek en un NAS

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):

  1. Configurar una solicitud POST a http://ip_del_vps:8000/ejecutar.
  2. 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 stats para evitar la sobrecarga del NAS.

Etiquetas: DeepSeek NAS frp FastAPI Docker

Publicado el 7-22 12:22