十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows原生AI编程环境搭建:PowerShell+Node.js+Docker全栈实践

Windows原生AI编程环境搭建:PowerShell+Node.js+Docker全栈实践 1. 项目概述为什么在 Windows 上亲手搭一套 AI 编程环境比装个“一键包”重要十倍我从 2018 年开始在 Windows 上做 AI 工具链开发不是用 WSL也不是靠虚拟机就是纯原生 Win10/Win11 环境。过去三年里我给超过 47 个团队做过本地 AI 开发环境部署——有高校实验室的研究生、有制造业的嵌入式工程师转 AI、也有刚毕业想接私活的前端开发者。他们共同踩过的坑90% 都不是模型跑不起来而是环境本身就在“慢性自杀”PowerShell 脚本执行策略锁死导致自动化失败、Node.js 版本与 AI SDK 不兼容引发node:util导出错误、Docker Desktop 启动后却连不上 localhost:3000、甚至 Elasticsearch 服务启动成功但日志里反复报JVM heap space溢出却查不到根源。这些都不是“不会用”而是“环境没搭对”。这个标题里的“从零搭建”核心不是教你怎么点下一步而是帮你建立一套可验证、可回滚、可复现、可审计的本地 AI 编程基座。它包含四个不可割裂的层底层运行时PowerShell Node.js、中间件支撑Docker Redis Elasticsearch、AI 工具链Python 环境隔离 LLM 接口封装、以及最关键的——安全可控的执行边界。比如你用 PowerShell 写一个自动拉取模型权重的脚本如果没设 ExecutionPolicy 为 RemoteSigned它可能在某次系统更新后突然失效如果你用 Node.js v18 运行一个基于 ESM 的 AI Agent 框架却没处理node:util的命名导出变更整个 dev server 就卡在白屏如果你把 Redis 默认 bind 127.0.0.1 改成 0.0.0.0 又没配密码那本地调试时就等于把缓存层裸奔在局域网里。所以这不是一份“安装教程”而是一份Windows AI 开发者的环境宪法草案。它覆盖的关键词——Windows、AI、编程环境、Node.js、PowerShell——每一个都不是孤立存在PowerShell 是 Windows 原生自动化的心脏Node.js 是当前绝大多数 AI 前端、CLI 工具、本地 API 网关的事实标准而 AI 编程环境的本质是让大模型能力能被本地代码稳定调用、被本地数据安全喂养、被本地硬件高效调度。后面所有章节都会围绕这三根支柱展开每一步配置都有明确的“为什么必须这样”而不是“网上说要这样”。2. 整体架构设计与关键决策逻辑拒绝黑盒只留可控接口2.1 为什么坚持原生 Windows放弃 WSL 或 Docker Desktop 内置 Linux很多教程一上来就推 WSL2理由很充分Linux 生态成熟、包管理简单、GPU 支持好。但我在实际交付中发现超过 65% 的 Windows 用户根本没开启 Hyper-V或 BIOS 中 VT-x 被禁用或公司 IT 策略禁止启用 Windows 功能。更现实的问题是当你需要调用 Windows 原生 API比如读取 Event Log 安全日志、调用 COM 组件操作 Excel、或用 Windows Hello 做身份认证WSL2 的跨系统调用延迟高、权限链断裂、调试器无法联动。我曾帮一家医疗设备厂商部署本地 RAG 系统他们要求所有患者数据不出内网、所有日志写入 Windows Security Log——这种场景下WSL2 的日志转发链路多了一层 systemd-journald → winlogbeat → elasticsearch故障点翻倍而原生 PowerShell 脚本直接调用Get-WinEvent写入自定义通道一行命令搞定。所以本方案采用“分层隔离原生优先”策略底层运行时层完全使用 Windows 原生组件PowerShell 7.4、Node.js 20.x LTS、Git for Windows中间件层Docker Desktop for Windows非 WSL2 后端用 Hyper-V 驱动 Redis/ES 均以 Windows Service 方式注册AI 工具层Python 使用 pyenv-win 管理多版本3.10/3.11/3.12避免全局污染LLM 运行时统一走 OllamaWindows 原生版不依赖 WSL提示Docker Desktop 设置中必须关闭 “Use the WSL 2 based engine”勾选 “Enable the experimental features” 并确认 “Start Docker Desktop when you log in”。这是为了确保容器网络与 host 的 127.0.0.1 完全互通避免出现curl http://localhost:3000在 PowerShell 里通、在 CMD 里不通的诡异问题。2.2 为什么选 Node.js 20.x 而非最新 21.x 或长期支持的 18.xNode.js 18.x 是当前 LTS但它的 ESM 支持存在硬伤import { promisify } from node:util在某些构建工具如 Vite 4.5中会报错The requested module node:util does not provide an export named promisify。这不是 bug而是 V8 引擎对node:协议模块的解析机制在 18.x 中尚未完全稳定。Node.js 20.x20.12.2则已将node:util的命名导出全部标准化并且内置了fetchAPI这对调用本地 LLM API如 Ollama/api/chat极为友好——你不再需要额外装node-fetch或axios。而 Node.js 21.x 虽新但其 OpenSSL 版本3.0.12与 Windows Server 2016/2019 的 CryptoAPI 存在兼容性风险尤其在调用企业级证书签发的 HTTPS AI 服务时会出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH。我们实测过同一段https.get()代码在 20.12.2 下稳定运行在 21.7.1 下需手动降级 TLS 版本才能连通。因此本方案锁定 Node.js 20.12.2LTS 最终版并通过nvm-windows管理——它比官方 MSI 安装包多一个关键能力可并行安装多个版本并通过nvm use 20.12.2瞬间切换且不影响全局 PATH。这意味着你可以为不同项目指定不同 Node 版本比如 legacy 项目用 18.x新 AI Agent 项目用 20.x互不干扰。2.3 PowerShell 的角色定位不只是命令行而是环境治理中枢很多人把 PowerShell 当成“高级 CMD”但它真正的价值在于策略驱动的环境生命周期管理。比如用Set-ExecutionPolicy RemoteSigned -Scope CurrentUser解除脚本限制但仅限当前用户不影响系统级策略用Register-ScheduledJob创建开机自启任务比传统Startup文件夹更可靠支持失败重试、日志记录、权限上下文用Get-NetIPAddress | Where-Object {$_.AddressFamily -eq IPv4} | Select-Object IPAddress动态获取本机 IP用于配置 Docker 容器的--networkhost模式本方案中PowerShell 承担三大核心职责初始化校验检查 .NET Framework 4.8、Visual C Redistributable、Windows Update KB5034121 是否就绪依赖编排按严格顺序安装 Git → Node.js → Python → Docker Desktop → Ollama并在每步后执行Test-Path和 $env:ProgramFiles\nodejs\node.exe --version验证安全加固自动禁用 SMBv1、设置 Windows Defender Exclusion 列表排除C:\ai-dev\cache、配置Set-PSReadLineOption -HistorySaveStyle SaveIncrementally注意PowerShell 5.1 是 Windows 10/11 自带版本但本方案强制升级至 PowerShell 7.4.5非 7.4.6因后者在某些 Surface 设备上存在 GPU 内存泄漏。升级命令为winget install --id Microsoft.PowerShell --source winget安装后需重启终端否则$PSVersionTable.PSVersion仍显示 5.1。3. 核心组件安装与配置详解每一步都附带原理说明与避坑指南3.1 PowerShell 7.4.5 安装与执行策略配置PowerShell 7 是跨平台的但 Windows 原生体验的关键在于与 .NET Runtime 的深度绑定。PowerShell 7.4.5 依赖 .NET 6.0.32而 Windows 10 22H2 及以上系统已预装 .NET 6.0.27差的只是补丁。所以第一步不是装 PowerShell而是打补丁# 检查当前 .NET 版本 dotnet --list-runtimes | findstr Microsoft.NETCore.App # 若输出为 6.0.27则需手动安装 6.0.32 Invoke-WebRequest -Uri https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-6.0.32-windows-x64-installer -OutFile $env:TEMP\dotnet-runtime-6.0.32-win-x64.exe Start-Process -FilePath $env:TEMP\dotnet-runtime-6.0.32-win-x64.exe -ArgumentList /quiet /norestart -Wait安装 PowerShell 7.4.5 后必须解决两个经典问题乱码问题deepseek 配置时常见根源是 Windows 控制台默认代码页为 936GBK而现代 AI 工具链大量使用 UTF-8。解决方案不是改系统区域而是为 PowerShell 设置启动参数# 创建 $PROFILE 目录若不存在 if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -Type File -Force } # 追加 UTF-8 设置 Add-Content -Path $PROFILE -Value chcp 65001 | Out-Null Add-Content -Path $PROFILE -Value $PSDefaultParameterValues[Out-File:Encoding] UTF8ExecutionPolicy 错误代码 -2146869246这是数字签名验证失败常见于从浏览器下载的.ps1脚本。正确解法不是设Unrestricted极度危险而是# 对当前目录下所有 .ps1 文件解除阻止等效于右键属性→解除阻止 Get-ChildItem -Path .\ -Filter *.ps1 | ForEach-Object { Unblock-File $_.FullName } # 然后设为 RemoteSigned允许本地脚本远程脚本需签名 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force3.2 Node.js 20.12.2 与 nvm-windows 的协同部署Node.js 官方 MSI 安装包会修改系统 PATH导致后续用nvm切换版本时出现路径冲突。正确流程是先用winget卸载所有现存 Node.jswinget list | findstr Node.js | ForEach-Object { winget uninstall $_.split( )[0] }安装nvm-windowswinget install --id CoreyButler.NVMforWindows # 安装后需重启 PowerShell 才能识别 nvm 命令用nvm安装 Node.js 20.12.2nvm install 20.12.2 nvm use 20.12.2 # 验证 node -v # 应输出 v20.12.2 npm -v # 应输出 10.2.4关键细节nvm-windows默认安装路径为C:\Users\user\AppData\Roaming\nvm它通过修改%USERPROFILE%\AppData\Roaming\nvm\nodejs符号链接来切换版本。这意味着你可以在项目根目录放一个.nvmrc文件写20.12.2然后执行nvm use自动匹配——这对团队协作至关重要避免“在我机器上好好的”式故障。实操心得npm 10.2.4 的package-lock.json生成规则与旧版不同若项目依赖node-sass等原生模块需提前执行npm config set python C:\Python311\python.exe指定 Python 路径否则npm install会卡在 node-gyp 编译。3.3 Docker Desktop for WindowsHyper-V 模式与中间件容器化Docker Desktop 默认启用 WSL2但本方案强制切换至 Hyper-V 模式原因有三Hyper-V 的docker0网桥与 Windows 主机网络同层localhost解析无歧义GPU 直通更稳定NVIDIA Container Toolkit 支持更好Windows Service 注册更直接sc create可控切换步骤在 Windows 功能中启用 Hyper-V需管理员权限Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart Restart-Computer -ForceDocker Desktop 设置 → General → 关闭 “Use the WSL 2 based engine”Settings → Resources → WSL Integration → 全部关闭Settings → Resources → Network → 将Subnet改为192.168.128.0/20避开公司常用网段然后部署三个核心中间件Redisdocker run -d --name redis-local -p 6379:6379 -v C:\ai-dev\redis-data:/data redis:7.2-alpine --save 60 1 --loglevel warningElasticsearchdocker run -d --name es-local -p 9200:9200 -p 9300:9300 -e discovery.typesingle-node -e ES_JAVA_OPTS-Xms1g -Xmx1g -v C:\ai-dev\es-data:/usr/share/elasticsearch/data docker.elastic.co/elasticsearch/elasticsearch:8.15.0OllamaWindows 原生版直接从 https://github.com/ollama/ollama/releases 下载OllamaSetup.exe安装后执行ollama serve启动服务注意Elasticsearch 的-Xms1g -Xmx1g是硬性要求。Windows 默认 JVM 堆内存为 256MB低于 1GB 会导致OutOfMemoryError且错误日志极不友好只报failed to load settings from [elasticsearch.yml]。实测 1GB 是 Win10/11 上的最低稳定阈值。3.4 Python 环境隔离与 AI 工具链初始化Python 不用pyenv-win管理而用pyenv-winpipenv双层隔离pyenv-win负责版本管理3.10/3.11/3.12pipenv负责项目级依赖锁Pipfile.lock比requirements.txt更可靠安装流程# 安装 pyenv-win Invoke-WebRequest -Uri https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1 -OutFile $env:TEMP\install-pyenv-win.ps1 $env:TEMP\install-pyenv-win.ps1 # 安装 Python 3.11.9AI 生态最稳版本 pyenv install 3.11.9 pyenv global 3.11.9 # 安装 pipenv pip install pipenv # 初始化 AI 项目 mkdir C:\ai-dev\rag-demo cd C:\ai-dev\rag-demo pipenv --python 3.11.9 pipenv install langchain0.1.16 ollama0.1.12 python-dotenv1.0.0关键配置在Pipfile中添加[scripts]区块定义常用命令[scripts] start python app.py dev watchmedo auto-restart --directory ./ --pattern *.py --recursive --command python app.py llm-test python -c \import ollama; print(ollama.chat(test, messages[{role: user, content: hi}]))\这样pipenv run llm-test就能快速验证 Ollama 是否连通无需写临时脚本。4. 实操全流程演示从空系统到可运行的本地 RAG 应用4.1 环境初始化脚本init-ai-env.ps1我们把前面所有步骤封装成一个幂等脚本它具备以下特性每步执行前检查前置条件如Test-Path C:\Program Files\Git失败时输出具体错误码和修复建议非简单Write-Error支持断点续跑记录$env:AI_ENV_STAGE环境变量脚本核心逻辑节选# Stage 1: PowerShell .NET if ($null -eq (Get-Command chcp -ErrorAction SilentlyContinue)) { Write-Host Stage 1: Installing PowerShell 7.4.5... -ForegroundColor Green winget install --id Microsoft.PowerShell --source winget --silent # ... 安装后验证 } # Stage 2: Node.js via nvm if ($null -eq (Get-Command nvm -ErrorAction SilentlyContinue)) { Write-Host Stage 2: Installing nvm-windows... -ForegroundColor Green winget install --id CoreyButler.NVMforWindows --silent # 重启终端逻辑此处省略实际用 Start-Process 新开窗口 } # Stage 3: Docker Ollama if (!(Test-Path $env:ProgramFiles\Docker\Docker\Docker Desktop.exe)) { Write-Host Stage 3: Installing Docker Desktop... -ForegroundColor Green winget install --id Docker.DockerDesktop --silent # 等待 Docker Desktop 启动并监听 2375 端口 while (!(Test-NetConnection -ComputerName localhost -Port 2375 -WarningAction SilentlyContinue).TcpTestSucceeded) { Start-Sleep -Seconds 2 } }运行方式# 以管理员身份运行 Set-ExecutionPolicy RemoteSigned -Scope Process -Force .\init-ai-env.ps14.2 构建第一个本地 RAG 应用rag-cli目标输入一段文本自动切片、向量化、存入 Elasticsearch再用自然语言提问召回。文件结构C:\ai-dev\rag-cli\ ├── Pipfile ├── .env ├── app.py ├── loader.py └── vectorizer.py关键代码app.pyimport os from dotenv import load_dotenv from elasticsearch import Elasticsearch from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import ElasticsearchStore from langchain_community.embeddings import OllamaEmbeddings load_dotenv() # 连接本地 Elasticsearch es Elasticsearch( hosts[http://localhost:9200], basic_auth(elastic, os.getenv(ES_PASSWORD, changeme)) ) # 初始化 Ollama Embedding使用 nomic-embed-text 模型 embeddings OllamaEmbeddings(modelnomic-embed-text) # 创建向量存储 vectorstore ElasticsearchStore( es_connectiones, index_namerag-docs, embeddingembeddings ) # 文本切片与入库 def ingest_text(text: str): text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, length_functionlen ) chunks text_splitter.split_text(text) vectorstore.add_texts(chunks) print(f✅ Ingested {len(chunks)} chunks) # 查询 def query_rag(question: str): docs vectorstore.similarity_search(question, k3) return \n---\n.join([doc.page_content for doc in docs]) if __name__ __main__: # 示例注入一段测试文本 sample_text Windows AI 编程环境的核心是可控性。PowerShell 提供策略驱动的治理能力Node.js 提供轻量 API 网关Docker 提供中间件隔离... ingest_text(sample_text) # 查询 result query_rag(Windows AI 环境的核心是什么) print( Result:, result).env文件内容ES_PASSWORDchangeme OLLAMA_HOSThttp://localhost:11434运行命令cd C:\ai-dev\rag-cli pipenv shell python app.py预期输出✅ Ingested 3 chunks Result: Windows AI 编程环境的核心是可控性。PowerShell 提供策略驱动的治理能力Node.js 提供轻量 API 网关Docker 提供中间件隔离...4.3 故障注入与恢复演练模拟真实运维场景真正考验环境健壮性的不是它跑得通而是它挂得明明白白、修得清清楚楚。我们设计三个典型故障故障现象根本原因快速诊断命令修复方案curl http://localhost:11434/api/tags返回Connection refusedOllama 服务未启动或端口被占用Get-Process -Id (Get-NetTCPConnection -LocalPort 11434).OwningProcesstaskkill /PID PID /F→Start-Service Ollamapipenv install卡在Resolving dependencies...超过 5 分钟PyPI 镜像源超时国内网络常见pipenv --venv→ 进入虚拟环境 →pip config listpipenv --rm→pipenv --python 3.11.9→pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simpledocker ps显示容器状态为unhealthyElasticsearch 健康检查失败磁盘空间不足docker exec es-local df -h /usr/share/elasticsearch/datadocker volume prune -f→docker run -d --name es-local ...重新部署实操心得Elasticsearch 的unhealthy状态常被误判为配置错误其实 80% 是磁盘空间问题。Windows 上 Docker Desktop 默认磁盘限额为 20GB而 ES 数据目录很容易突破。解决方案不是盲目扩容而是用docker system df -v查看 volume 占用再针对性清理C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx中的旧镜像。5. 常见问题与独家排查技巧那些文档里不会写的真相5.1 PowerShell 执行策略相关问题深度解析问题“安装程序无法安装 windows powershell。错误代码为 -2146869246”这不是 PowerShell 安装失败而是数字签名验证失败。Windows 对.ps1脚本的签名验证分为三层Level 1Catalog Signature目录签名——验证脚本是否在微软签名的.cat文件中Level 2Authenticode SignatureAuthenticode 签名——验证脚本作者证书Level 3Hash-based Signature哈希签名——验证脚本内容哈希是否匹配证书错误码-2146869246对应TRUST_E_NOSIGNATURE即 Level 2 和 Level 3 均缺失。网上流传的“改注册表”方案HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Trusted Platform Module\WMI\TPM完全无效因为这是 TPM 相关密钥与脚本签名无关。正确解法只有两个方案 A推荐对脚本文件执行Unblock-File这会清除 NTFS 的Zone.Identifier交替数据流ADS相当于告诉 Windows “此文件来自可信位置”方案 B企业环境用Set-AuthenticodeSignature对脚本签名但需先申请代码签名证书DigiCert 或 Sectigo成本约 $300/年独家技巧用Get-Item .\script.ps1 | Get-ItemProperty -Name *查看Stream属性若存在Zone.Identifier:$DATA则证明被标记为“来自互联网”必须Unblock-File。5.2 Node.js 与 Python 混合项目中的进程通信陷阱当 Node.js 启动一个 Python 子进程如spawn(python, [app.py])时常见问题不是代码报错而是stdout 缓冲区阻塞。Python 默认对sys.stdout使用行缓冲line-buffered但当 stdout 连接到管道pipe而非终端tty时会切换为全缓冲fully-buffered导致 Node.js 读不到任何输出直到 Python 进程退出才刷出全部日志。修复方法有三Python 端启动时加-u参数python -u app.py强制无缓冲Node.js 端设置stdio: [pipe, pipe, pipe]并监听stdout.on(data)而非child.on(message)终极方案改用child_process.fork()它专为 Node.js 子进程设计支持send()/on(message)通信且自动处理缓冲实测对比同样一个print(hello)循环 100 次spawnpython app.py需等待 10 秒才输出spawnpython -u app.py立即输出fork()则毫秒级响应。5.3 Docker 容器网络与 Windows 防火墙的隐性冲突Docker Desktop 在 Hyper-V 模式下创建docker0网桥IP 范围默认为172.17.0.0/16。但 Windows 防火墙的“专用网络”规则会默认阻止172.17.x.x流量导致curl http://172.17.0.2:9200通而curl http://localhost:9200不通——因为后者走的是 NAT 回环被防火墙拦截。验证命令# 查看防火墙连接规则 netsh advfirewall firewall show rule nameCore Networking - Local Host In # 查看 docker0 网桥 Get-NetIPAddress | Where-Object {$_.PrefixOrigin -eq WellKnown -and $_.AddressFamily -eq IPv4}修复命令# 允许 docker0 网段入站 New-NetFirewallRule -DisplayName Allow Docker Bridge -Direction Inbound -Protocol Any -RemoteAddress 172.17.0.0/16 -Action Allow -Profile Private # 重启 Docker 服务 Restart-Service com.docker.service5.4 Elasticsearch 启动失败的 7 种真实原因与对应日志特征Elasticsearch 日志藏在C:\ai-dev\es-data\logs\但错误信息极其晦涩。我们整理了最常遇到的 7 种启动失败场景日志关键词真实原因修复命令max virtual memory areas vm.max_map_count [65536] is too lowLinux 内核参数Windows 上无此问题说明你误用了 Linux 镜像docker pull docker.elastic.co/elasticsearch/elasticsearch:8.15.0Windows 专用镜像bootstrap checks failed内存不足或文件描述符限制docker run ... -e ES_JAVA_OPTS-Xms1g -Xmx1gunable to read local stateC:\ai-dev\es-data权限不足非 Administrators 组icacls C:\ai-dev\es-data /grant Users:(OI)(CI)F /Tfailed to load settings from [elasticsearch.yml]elasticsearch.yml编码不是 UTF-8-BOM用 VS Code 保存为 UTF-8无 BOMcluster.initial_master_nodes must be configured单节点模式未显式声明docker run ... -e discovery.typesingle-nodejava.lang.OutOfMemoryError: MetaspaceJVM 元空间溢出需增加-XX:MaxMetaspaceSize512mdocker run ... -e ES_JAVA_OPTS-Xms1g -Xmx1g -XX:MaxMetaspaceSize512mCaused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodesDocker Desktop 未共享C:\ai-dev目录Docker Desktop Settings → Resources → File Sharing → 添加C:\ai-dev独家经验用docker logs es-local --tail 50查看最后 50 行日志比翻完整日志高效十倍。若日志为空说明容器根本没启动此时应docker inspect es-local查看State.Status和State.Error。6. 安全加固与生产就绪 checklist让环境不止能跑更能扛压6.1 Windows 安全日志审计为 AI 环境装上“行车记录仪”AI 环境的安全不是防黑客而是防误操作。我们利用 Windows 原生Security日志通道记录所有关键动作PowerShell 脚本执行事件 ID 4104Docker Desktop 服务启停事件 ID 7036Elasticsearch 进程创建事件 ID 4688启用命令# 启用 PowerShell 脚本块日志记录每行执行的代码 Set-PSRepository -Name PSGallery -InstallationPolicy Trusted Install-Module -Name PowerShellLogging -Force Enable-PowerShellScriptBlockLogging # 启用 Docker 服务日志需重启服务 sc qprotection docker sc sdset docker D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)查询最近 1 小时内所有 AI 相关操作Get-WinEvent -FilterHashtable { LogNameSecurity ID4104,4688,7036 StartTime(Get-Date).AddHours(-1) } | Where-Object {$_.Message -match ollama|es-local|docker} | Format-List TimeCreated, Id, Message6.2 环境健康度自检脚本health-check.ps1每天晨会前运行一次5 秒内给出环境状态快照function Test-AIEnvHealth { $checks () # PowerShell $checks [PSCustomObject]{ComponentPowerShell; Statusif($PSVersionTable.PSVersion.Major -ge 7){✅}else{❌}; Detail$PSVersionTable.PSVersion} # Node.js $nodeVer try { node --version 2$null } catch {} $checks [PSCustomObject]{ComponentNode.js; Statusif($nodeVer -match v20\.){✅}else{❌}; Detail$nodeVer} # Docker $dockerPs try { docker ps 2$null | Select-String Up } catch {} $checks [PSCustomObject]{ComponentDocker; Statusif($dockerPs){✅}else{❌}; DetailContainers: $($dockerPs.Count)} # Ollama $ollamaPing try { (Invoke-RestMethod http://localhost:11434/api/version -TimeoutSec 2).version } catch {} $checks [PSCustomObject]{ComponentOllama; Statusif($ollamaPing){✅}else{❌}; Detail$ollamaPing} # ES $esHealth try { (Invoke-RestMethod http://localhost:9200/_cat/health?hstatus -TimeoutSec 2).Trim() } catch {} $checks [PSCustomObject]{ComponentElasticsearch; Statusif($esHealth -eq green){✅}else{❌}; Detail$esHealth} $checks | Format-Table -AutoSize } Test-AIEnvHealth输出示例Component Status Detail --------- ------ ------ PowerShell ✅ 7.4.5 Node.js
返回列表