AI与NAS交互

在NAS上部署DeepSeek并通过手机客户端远程控制其执行任务,需遵循以下步骤。此方案结合了内网穿透、权限管理和自动化脚本,确保安全性与功能性:


1. 部署DeepSeek模型服务

  • 选择模型:使用轻量级开源模型(如DeepSeek-MoE-16B-chat的4-bit量化版),确保NAS硬件兼容。
  • Docker部署
    # 使用Ollama部署
    docker run -d -p 11434:11434 --name ollama -v /path/to/models:/root/.ollama ollama/ollama
    ollama pull deepseek-moe-16b-chat:4bit
    
  • 验证API:通过curl http://localhost:11434/api/generate -d '{"model":"deepseek-moe-16b-chat", "prompt":"Hello"}'测试响应。

2. 配置内网穿透(以frp为例)

  • 服务端配置(VPS)
    # frps.ini
    [common]
    bind_port = 7000
    authentication_method = token
    token = your_secure_token
    
  • 客户端配置(NAS)
    # frpc.ini
    [common]
    server_addr = your_vps_ip
    server_port = 7000
    token = your_secure_token
    
    [deepseek]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 11434
    remote_port = 11434
    
  • 启动命令
    docker run -d --network host -v /path/to/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
    

3. 权限管理与安全配置

  • 专用用户
    sudo useradd -m deepseek
    sudo usermod -aG docker,nasusers deepseek
    
  • Sudo权限限制
    # /etc/sudoers.d/deepseek
    deepseek ALL=(root) NOPASSWD: /scripts/download_movie.sh
    

4. 任务执行脚本开发

  • 脚本示例 (/scripts/download_movie.sh)
    #!/bin/bash
    MOVIE_NAME="$1"
    # 调用nastools API添加下载
    curl -X POST "http://localhost:3000/api/download" -d "title=$MOVIE_NAME"
    # 等待下载完成(需自定义轮询逻辑)
    while [ ! -f "/downloads/$MOVIE_NAME.mkv" ]; do sleep 60; done
    # 执行刮削
    /opt/tinyMediaManager/tinyMediaManagerCMD.sh -update -scrape
    # 移动文件到Jellyfin
    mv "/downloads/$MOVIE_NAME.mkv" "/media/movies/"
    
  • 权限设置
    chmod +x /scripts/download_movie.sh
    sudo chown deepseek:deepseek /scripts/download_movie.sh
    

5. 中间层服务(Python示例)

  • 安装依赖
    pip install fastapi uvicorn requests
    
  • 服务代码 (app/main.py)
    from fastapi import FastAPI, HTTPException
    import requests
    import subprocess
    
    app = FastAPI()
    DEEPSEEK_API = "http://localhost:11434/api/generate"
    
    def parse_command(user_input):
        # 调用DeepSeek API,使用结构化提示词
        prompt = f"""用户指令:{user_input}
        请生成JSON格式命令,包含action和参数。可选action: download_movie。
        示例:{{"action": "download_movie", "title": "Inception"}}"""
        
        response = requests.post(DEEPSEEK_API, json={
            "model": "deepseek-moe-16b-chat",
            "prompt": prompt,
            "format": "json"
        })
        return response.json()["response"]
    
    @app.post("/execute")
    async def execute_command(input: dict):
        try:
            command = parse_command(input["text"])
            if command["action"] == "download_movie":
                subprocess.run(["sudo", "/scripts/download_movie.sh", command["title"]], check=True)
                return {"status": "success"}
            else:
                raise HTTPException(status_code=400, detail="Unsupported action")
        except Exception as e:
            raise HTTPException(status_code=500, detail=str(e))
    
  • 启动服务
    uvicorn main:app --host 0.0.0.0 --port 8000
    

6. 手机客户端集成

  • 使用HTTP客户端(如Tasker+HTTP Request)

    1. 配置POST请求到http://your_vps_ip:8000/execute
    2. Body格式:{"text": "下载盗梦空间电影"}
  • 安全增强

    • 添加API密钥验证
    • 使用HTTPS(通过frp的HTTPS代理或Caddy反向代理)

7. 监控与日志

  • 日志查看
    journalctl -u deepseek_service -f  # 查看服务日志
    tail -f /var/log/frp/frpc.log      # 内网穿透日志
    
  • 失败通知:在脚本中添加邮件/Telegram通知:
    curl -s -X POST "https://api.telegram.org/bot{BOT_TOKEN}/sendMessage" \
         -d "chat_id={CHAT_ID}&text=Download failed: $MOVIE_NAME"
    

关键注意事项

  1. 模型选择:若DeepSeek官方模型无法本地部署,可替换为Llama 3或Phi-3等高效模型。
  2. 网络安全:使用VPN替代公网暴露更安全,或配置fail2ban防止暴力破解。
  3. 输入过滤:严格校验用户输入,防止命令注入攻击。
  4. 资源监控:通过docker stats监控容器资源使用,避免NAS过载。

此方案平衡了功能实现与安全性,通过多层防护确保家庭网络环境的安全。实际部署时需根据具体NAS性能调整模型参数和并发设置。

posted @ 2025-02-11 17:01  BaldButStrong  阅读(44)  评论(0)    收藏  举报