Auto-sync: 2026-04-17 08:37
This commit is contained in:
@@ -1,114 +0,0 @@
|
||||
---
|
||||
title: 输出可能为: origin https://github.com/ishenwei/tiktok_pm.git (fetch)
|
||||
source:
|
||||
author: shenwei
|
||||
published:
|
||||
created:
|
||||
description:
|
||||
tags: [github, proxy, push, socks5]
|
||||
---
|
||||
|
||||
#github #push #proxy #socks5
|
||||
|
||||
|
||||
这是一个典型的**网络连接干扰**问题,特别是在国内访问 GitHub 时非常常见。
|
||||
|
||||
### 核心原因分析
|
||||
|
||||
`Recv failure: Connection was reset`(连接重置)并不是账号权限验证失败,而是 **TCP 连接层面的中断**。
|
||||
|
||||
- **现象:** 客户端尝试与 GitHub 服务器建立安全连接(TLS Handshake),但中间的网络防火墙(GFW)检测到了流量特征或目标域名,强行发送了 TCP RST 包阻断连接。
|
||||
|
||||
- **为何间歇性:** GitHub 的 CDN 节点众多,部分 IP 被封锁,部分未被封锁;或者是干扰策略存在由于流量负载导致的“漏网之鱼”。
|
||||
|
||||
|
||||
### 解决方案
|
||||
|
||||
最有效、最根本的解决方案是让 Git 的流量走你本地的代理通道(既然你之前提到过使用 V2RayN,这是最直接的利用方式)。
|
||||
|
||||
#### 方法一:为 Git 单独配置代理(推荐)
|
||||
|
||||
这种方法只会影响 Git 命令,不会干扰终端里其他命令的网络请求。
|
||||
|
||||
假设你的代理软件(如 V2RayN, Clash 等)本地监听端口如下(请根据你实际设置修改端口号):
|
||||
|
||||
- HTTP/HTTPS 代理端口:`10809`
|
||||
|
||||
- SOCKS5 代理端口:`10808`
|
||||
|
||||
|
||||
**1. 设置 HTTP 代理(最通用)** 在终端(Terminal 或 PowerShell)执行:
|
||||
|
||||
Bash
|
||||
|
||||
```
|
||||
git config --global http.proxy http://127.0.0.1:10809
|
||||
git config --global https.proxy http://127.0.0.1:10809
|
||||
```
|
||||
|
||||
_注意:即使是访问 `https://`,配置项名称也是 `https.proxy`,但代理协议通常写 `http://` 即可,除非你的代理明确要求 https。_
|
||||
|
||||
**2. 设置 SOCKS5 代理(速度通常更快)** 如果你想走 SOCKS5 协议:
|
||||
|
||||
Bash
|
||||
|
||||
```
|
||||
git config --global http.proxy socks5://127.0.0.1:10808
|
||||
git config --global https.proxy socks5://127.0.0.1:10808
|
||||
```
|
||||
|
||||
**验证配置是否生效:**
|
||||
|
||||
Bash
|
||||
|
||||
```
|
||||
git config --global --get http.proxy
|
||||
```
|
||||
|
||||
**如何取消代理:** 如果你切换了网络环境(例如到了国外),不再需要代理,可以使用以下命令取消:
|
||||
|
||||
Bash
|
||||
|
||||
```
|
||||
git config --global --unset http.proxy
|
||||
git config --global --unset https.proxy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 方法二:从 HTTPS 切换到 SSH 协议
|
||||
|
||||
有时候 HTTPS 的 443 端口干扰严重,但 SSH 的 22 端口相对稳定(或者反过来)。你可以尝试更改远程仓库地址。
|
||||
|
||||
**1. 查看当前远程地址**
|
||||
|
||||
Bash
|
||||
|
||||
```
|
||||
git remote -v
|
||||
# 输出可能为: origin https://github.com/ishenwei/tiktok_pm.git (fetch)
|
||||
```
|
||||
|
||||
**2. 修改为 SSH 地址**
|
||||
|
||||
Bash
|
||||
|
||||
```
|
||||
git remote set-url origin git@github.com:ishenwei/tiktok_pm.git
|
||||
```
|
||||
|
||||
_前提:你必须已经生成了 SSH Key (`ssh-keygen`) 并将公钥上传到了 GitHub Settings 中。_
|
||||
|
||||
**进阶:如果 SSH 直连也不稳** 可以通过修改 `~/.ssh/config` (Linux/Mac) 或 `C:\Users\你的用户名\.ssh\config` (Windows),让 SSH 连接也走代理:
|
||||
|
||||
Plaintext
|
||||
|
||||
```
|
||||
Host github.com
|
||||
User git
|
||||
Hostname github.com
|
||||
# Windows 下使用 connect.exe (Git自带)
|
||||
ProxyCommand connect -S 127.0.0.1:10808 %h %p
|
||||
# Linux/Mac 下使用 ncat (需安装 netcat)
|
||||
# ProxyCommand nc -X 5 -x 127.0.0.1:10808 %h %p
|
||||
```
|
||||
@@ -1,155 +0,0 @@
|
||||
---
|
||||
title: 1. 安装Plex
|
||||
source:
|
||||
author: shenwei
|
||||
published:
|
||||
created: 2025-02-23
|
||||
description:
|
||||
tags: []
|
||||
---
|
||||
|
||||
|
||||
|
||||
# 1. 安装Plex
|
||||
|
||||
## 1.1 群晖NAS安装Plex Server
|
||||
|
||||
目前在群晖的套件中心里直接找到 Plex Media Server直接安装即可
|
||||
|
||||
目前我的Plex账号是用Apple ID: ishenwei@hotmail.com来进行登录的
|
||||
|
||||
## 1.2 在当贝盒子上安装Plex客户端
|
||||
|
||||
客厅里的电视是用当贝盒子进行视频播放的,从AppMirror网站上下载了最新版本的
|
||||
|
||||

|
||||
|
||||
com.plexapp.android_10.26.0.2578-966828321_minAPI23(armeabi-v7a)(nodpi)_apkmirror.com
|
||||
|
||||
## 1.3 在卧房电视机的华为盒子上安装Plex客户端
|
||||
|
||||
因为该盒子里的操作系统较老,所以不支持Android 6.0+只能支持5.0+,所以我找到了能支持5.0+的最高的版本
|
||||
|
||||
com.plexapp.android_10.5.0.4996-944846913_minAPI21(armeabi-v7a)(nodpi)_apkmirror.com
|
||||
|
||||

|
||||
|
||||
以上两个APK文件我保存在: NAS/Software/家庭影视平台/Plex
|
||||
|
||||
# 2.安装Xiaoya Alist
|
||||
|
||||
这个是利用NAS的container manager的docker方式来进行安装的,整个过程比较波折,其中还学习到了一些关于Doker的技巧
|
||||
|
||||
总的来说Xiaoya Alist是一个网络资源分享平台,运行以后可以出现一个列表,当配置好云盘链接后,可以将相关资源直接转存到自己的云盘上,比如Aliyun
|
||||
|
||||
我自己 NAS上小雅的链接是:
|
||||
|
||||
[http://192.168.3.17:5678/](http://192.168.3.17:5678/)
|
||||
|
||||

|
||||
|
||||
## 2.1 安装xiaoya alist
|
||||
|
||||
首先我的NAS上的Container Manager除了问题,怎么呀刷不出注册表信息,就是无法读取docker hub的信息。我尝试了用Putty通过SSH登录NAS,然后用docker pull的命令下载也不行。在这里必须要主要,要NAS支持可以通过SSH访问必须进行配置。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
后来我查询了ChatGPT, 里面选择了另一个从另一台机器下载Docker Image然后再load到NAS机器上的方法。 整个过程如下:
|
||||
|
||||
我在我自己工作的笔记本上安装了DockerDesktop版本,然后正常的pull xiaoya 的image:
|
||||
|
||||
```docker
|
||||
docker pull xiaoyaliu/alist
|
||||
```
|
||||
|
||||
通过以下命令将下载的image打包成tar文件
|
||||
|
||||
```docker
|
||||
docker save -o xiaoya.tar xiaoyaliu/alist
|
||||
```
|
||||
|
||||
我将打包好的xiaoya.tar文件上传到NAS文件系统里去,然后还是通过Putty来运行docker命令将image导入NAS的Docker中去。
|
||||
|
||||
```docker
|
||||
#cd 到xiaoya.tar存放的路径之后运行以下命令
|
||||
docker load < xiaoya.tar
|
||||
```
|
||||
|
||||
然后再进入NAS的Container Manager 界面后在image里就可以看到扫xiaoya/alist这个image了
|
||||
|
||||

|
||||
|
||||
接下来需要进行一些配置工作:
|
||||
|
||||
在本地先准备三个txt文件,然后根据官方文档配置Aliyun的token
|
||||
|
||||
**myopentoken.txt**
|
||||
|
||||
访问这个链接 后,用手机阿里云盘扫描二维码,然后在手机上确认授权,然后点击I have scan, 将生成的token保存在myopentoken.txt文件里。
|
||||
|
||||
[Get Aliyundrive Refresh Token](https://alist.nn.ci/tool/aliyundrive/request.html)
|
||||
|
||||

|
||||
|
||||
**mytoken.txt**
|
||||
|
||||
访问这个链接 然后用阿里云盘的App扫描二维码,将生成的token保存在mytoken.txt里
|
||||
|
||||
[阿里云盘 / 分享](https://alist.nn.ci/zh/guide/drivers/aliyundrive.html)
|
||||
|
||||

|
||||
|
||||
**temp_transfer_folder_id.txt**
|
||||
|
||||
登录网页版阿里云盘,在资源盘目录下创建一个folder, 将URL里的folder 的token保存在这个txt文件里。 这个目录将来会用于存放从xiaoya那边转存过来的视频
|
||||
|
||||

|
||||
|
||||
最后将这三个txt文件全部上传至 NAS/docker/xiaoya/ 目录下
|
||||
|
||||
配置Docker启动xiaoya,请注意以下圈出的是需要配置的地方:
|
||||
|
||||

|
||||
|
||||
启动后检查日志,看小雅是否正常启动。
|
||||
|
||||
[http://192.168.3.17:5678/](http://192.168.3.17:5678/)
|
||||
|
||||
# 3. 配置安装CloudDrive2来在NAS挂载Aliyun盘
|
||||
|
||||
在套件中心,设置里添加矿神源
|
||||
|
||||

|
||||
|
||||
然后在社群里找到CloudDrive2这个应用, 并安装。因为我的DSM是7+版本,所以需要额外在Putty root 下执行一条命令:
|
||||
|
||||
```docker
|
||||
sudo -i
|
||||
#input NAS admin password
|
||||
|
||||
sudo sed -i 's/package/root/g' /var/packages/CloudDrive2/conf/privilege
|
||||
```
|
||||
|
||||

|
||||
|
||||
安装成功后打开CloudDrive进行配置:
|
||||
|
||||
[http://192.168.3.17:19798/](http://192.168.3.17:19798/)
|
||||
|
||||

|
||||
|
||||
用阿里云盘app扫描二维码,并授权,请主要,不要授权备份目录,仅资源目录即可
|
||||
|
||||

|
||||
|
||||
对Aliyun目录进行mount
|
||||
|
||||

|
||||
|
||||
# 4. 在Plex里导入Aliyun盘的内容
|
||||
|
||||

|
||||
|
||||
目前的策略是,可以用xiaoya选择要看的视频,然后在aliyun盘里移动到相应的目录比如 aliyun-movie, aliyun-tvshows, aliyun-documentory 然后让Plex进行视频刮削,并显示在Plex Media Server里。
|
||||
@@ -1,695 +0,0 @@
|
||||
---
|
||||
title: 安装 Playwright 浏览器
|
||||
source:
|
||||
author: shenwei
|
||||
published:
|
||||
created: 2025-11-11
|
||||
description: 可自动化、可扩展、AI增强的电商数据采集与处理系统
|
||||
tags: []
|
||||
link:
|
||||
---
|
||||
|
||||
|
||||
|
||||
|
||||
非常好的思路——你想要的是一个**可自动化、可扩展、AI增强的数据采集与处理系统**,基于 Docker + Ubuntu + n8n 搭建。下面我给你一个详细的设计与工具选择建议,从爬取到分析的整体架构。
|
||||
|
||||
---
|
||||
|
||||
## 🧩 一、系统整体架构建议
|
||||
|
||||
你的目标系统可以分为三个层次:
|
||||
|
||||
|层次|组件|说明|
|
||||
|---|---|---|
|
||||
|**数据采集层(爬虫)**|Scrapy / Playwright / Selenium / Apify|从各大电商网站采集结构化信息(标题、描述、图片、视频等)|
|
||||
|**数据处理层(自动化管道)**|n8n + LLM API (e.g., OpenAI, Ollama, LM Studio)|对采集数据进行清洗、分类、摘要、翻译、属性提取等AI处理|
|
||||
|**存储与展示层**|PostgreSQL / SQLite + MinIO / NAS + Grafana / Metabase|存储文本、图片和视频元数据,并可视化结果|
|
||||
|
||||
---
|
||||
|
||||
## 🕷️ 二、爬虫工具推荐与对比
|
||||
|
||||
|工具|适用场景|优点|缺点|
|
||||
|---|---|---|---|
|
||||
|**Scrapy**|静态页面、电商产品信息|轻量高效、插件生态丰富、可Docker化部署|对JS渲染页面支持弱,需要配合Splash或Playwright|
|
||||
|**Playwright (Python/Node.js)**|动态渲染页面、滚动加载、视频图片加载|可模拟浏览器、支持无头模式、可靠性高|相对重,适合单站点深度采集|
|
||||
|**Apify (Open Source SDK)**|通用网页爬取+API接口+调度|已内置防封禁策略、支持Docker|学习曲线略陡、对纯本地化部署需定制|
|
||||
|**Colly (Go语言)**|高性能爬虫服务、轻量API爬取|性能强、可编译为二进制Docker镜像|JS支持弱,不适合电商复杂页面|
|
||||
|**Crawlee (Node.js)**|Apify的开源核心框架,支持Playwright/Selenium|与n8n、LangChain容易集成|需要JS/TS开发基础|
|
||||
|
||||
**推荐组合:**
|
||||
|
||||
> ✅ **Scrapy + Playwright(或Crawlee + Playwright)**
|
||||
|
||||
- Scrapy 负责结构化抓取、分页调度、下载媒体;
|
||||
|
||||
- Playwright 负责加载动态页面;
|
||||
|
||||
- 两者可通过 Docker Compose 容器化;
|
||||
|
||||
- 输出 JSON 或 CSV 文件供 n8n 消费。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 三、Docker 架构示例
|
||||
|
||||
|
||||
Scrapy 爬完的数据(JSON/CSV)存放在 `/data`,由 n8n 定时读取和处理。
|
||||
|
||||
---
|
||||
|
||||
## 🤖 四、n8n 中的AI集成与自动化
|
||||
|
||||
在 n8n 中可以通过 workflow 实现整个管线自动化:
|
||||
|
||||
**工作流示例:**
|
||||
|
||||
1. **Cron Trigger** → 定时启动
|
||||
|
||||
2. **Execute Command Node** → 执行 `docker exec scraper scrapy crawl amazon`
|
||||
|
||||
3. **Read File Node** → 读取爬取的 JSON 文件
|
||||
|
||||
4. **OpenAI / Ollama Node** → 调用 LLM 对产品描述提取属性(品牌、型号、价格区间、关键词等)
|
||||
|
||||
5. **Database Node** → 写入 PostgreSQL / SQLite
|
||||
|
||||
6. **Webhook / Email Node** → 生成报表或通知
|
||||
|
||||
|
||||
你也可以用 n8n 的 “HTTP Request Node” 抓取 API 页面(适合公开电商API如阿里、Shopee)。
|
||||
|
||||
---
|
||||
|
||||
## 🧠 五、AI 处理建议
|
||||
|
||||
结合 LLM 做如下任务:
|
||||
|
||||
- **内容摘要与分类**(提炼产品特点)
|
||||
|
||||
- **多语言翻译**
|
||||
|
||||
- **特征提取**(品牌、价格、类别)
|
||||
|
||||
- **异常检测**(自动识别异常价格或缺图产品)
|
||||
|
||||
- **结构化JSON输出**,便于数据库存储
|
||||
|
||||
|
||||
可以本地使用 **Ollama** (Mistral, Llama3) 模型,通过 n8n 的 HTTP Request 调用本地 `http://localhost:11434/api/generate`。
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ 六、数据存储与管理建议
|
||||
|
||||
|数据类型|存储建议|工具|
|
||||
|---|---|---|
|
||||
|文本/结构化数据|PostgreSQL / SQLite|适合AI分析、可视化|
|
||||
|图片/视频|MinIO / 本地NAS|模拟S3存储方式|
|
||||
|Dashboard|Grafana / Metabase|生成电商趋势与分析报表|
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ 七、防封与安全建议
|
||||
|
||||
- 使用 **User-Agent轮换**(Scrapy 内置 `scrapy-user-agents`)
|
||||
|
||||
- **代理池**(BrightData / ScraperAPI / 免费代理)
|
||||
|
||||
- 对同一网站设置 **下载延迟 + 随机化访问**
|
||||
|
||||
- **分布式调度** 可用 `Scrapyd` 或 `Archetype`(Scrapy集群)
|
||||
|
||||
- 不采集个人隐私信息或侵权内容(仅公开页面信息)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🚀 八、后续可扩展方向
|
||||
|
||||
- 增加 **FastAPI 服务层**:暴露 REST API 给前端或 BI 工具;
|
||||
|
||||
- 使用 **LangChain** 结合 Vector DB(e.g. Qdrant / Milvus)存储产品语义信息;
|
||||
|
||||
- n8n 可触发自动生成市场趋势报告(AI Summarizer);
|
||||
|
||||
- 可视化电商类目趋势(Grafana + Postgres)。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ✅ 推荐起步路径
|
||||
|
||||
1. **在 Ubuntu 上安装 Docker + Docker Compose**
|
||||
|
||||
2. 启动基础环境:`scrapy + playwright + n8n`
|
||||
|
||||
3. 选择 1–2 个电商站点(如 Amazon / JD / Taobao)
|
||||
|
||||
4. 构建 Scrapy 爬虫模板
|
||||
|
||||
5. 用 n8n 处理数据并测试 AI 工作流
|
||||
|
||||
6. 逐步扩展至全自动管线
|
||||
|
||||
|
||||
---
|
||||
|
||||
太好了 ✅ 我将为你生成一个**可直接部署的爬虫自动化系统骨架**,基于以下目标设计:
|
||||
|
||||
> **目标:** 在 Ubuntu 上使用 Docker Compose 部署一个自动化电商爬虫系统,采集电商网站产品信息 → 存入本地文件 → 由 n8n 自动读取并利用 AI 处理。
|
||||
|
||||
下面是完整结构与代码示例。
|
||||
|
||||
---
|
||||
|
||||
## 🧩 一、项目目录结构
|
||||
|
||||
```bash
|
||||
ecommerce-crawler/
|
||||
├── docker-compose.yml
|
||||
├── scrapy/
|
||||
│ ├── Dockerfile
|
||||
│ ├── requirements.txt
|
||||
│ ├── scrapy.cfg
|
||||
│ └── ecommerce/
|
||||
│ ├── __init__.py
|
||||
│ ├── items.py
|
||||
│ ├── middlewares.py
|
||||
│ ├── pipelines.py
|
||||
│ ├── settings.py
|
||||
│ └── spiders/
|
||||
│ └── amazon_spider.py
|
||||
├── n8n_data/ # n8n 数据持久化
|
||||
├── data/ # 爬取结果输出目录
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧱 二、`docker-compose.yml`
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
# Scrapy 爬虫容器
|
||||
scraper:
|
||||
build: ./scrapy
|
||||
container_name: ecommerce-scraper
|
||||
working_dir: /app/scrapy
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
depends_on:
|
||||
- playwright
|
||||
environment:
|
||||
- PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
|
||||
networks:
|
||||
- crawler-net
|
||||
|
||||
|
||||
# Playwright 浏览器支持容器
|
||||
playwright:
|
||||
image: mcr.microsoft.com/playwright/python:v1.48.0-jammy
|
||||
shm_size: 2gb
|
||||
networks:
|
||||
- crawler-net
|
||||
|
||||
# n8n 自动化平台
|
||||
#n8n:
|
||||
# image: n8nio/n8n:latest
|
||||
# container_name: n8n
|
||||
# ports:
|
||||
# - 5678:5678
|
||||
# environment:
|
||||
# - N8N_BASIC_AUTH_ACTIVE=true
|
||||
# - N8N_BASIC_AUTH_USER=admin
|
||||
# - N8N_BASIC_AUTH_PASSWORD=changeme
|
||||
# - N8N_PATH=/workflows
|
||||
# volumes:
|
||||
# - ./n8n_data:/home/node/.n8n
|
||||
# - ./data:/data
|
||||
# networks:
|
||||
# - crawler-net
|
||||
|
||||
networks:
|
||||
crawler-net:
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐍 三、Scrapy 部分
|
||||
|
||||
### `scrapy/Dockerfile`
|
||||
|
||||
```dockerfile
|
||||
FROM mcr.microsoft.com/playwright/python:v1.48.0-jammy
|
||||
|
||||
WORKDIR /app
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
COPY . .
|
||||
|
||||
# 安装 Playwright 浏览器
|
||||
RUN playwright install
|
||||
|
||||
WORKDIR /app
|
||||
CMD ["scrapy", "crawl", "amazon"]
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `scrapy/requirements.txt`
|
||||
|
||||
```txt
|
||||
scrapy==2.13.3
|
||||
playwright==1.48.0
|
||||
scrapy-playwright==0.0.44
|
||||
```
|
||||
|
||||
> 说明:`scrapy-playwright` 插件可直接让 Scrapy 调用 Playwright 渲染动态页面,非常适合电商网站。
|
||||
|
||||
---
|
||||
|
||||
### `scrapy/scrapy.cfg`
|
||||
|
||||
```ini
|
||||
[settings]
|
||||
default = settings
|
||||
|
||||
[deploy]
|
||||
# 如果你将来要用 scrapyd 部署,可以在这里定义目标(可忽略)
|
||||
# url = http://localhost:6800/
|
||||
# project = crawler
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `scrapy/ecommerce/settings.py`
|
||||
|
||||
```python
|
||||
BOT_NAME = "scrapy"
|
||||
|
||||
SPIDER_MODULES = ["spiders"] # 指向当前目录下的 spiders
|
||||
NEWSPIDER_MODULE = "spiders" # 新建 spider 时默认放在这里
|
||||
|
||||
ROBOTSTXT_OBEY = False
|
||||
DOWNLOAD_DELAY = 2
|
||||
|
||||
DOWNLOAD_HANDLERS = {
|
||||
"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
|
||||
"https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
|
||||
}
|
||||
|
||||
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
|
||||
|
||||
PLAYWRIGHT_LAUNCH_OPTIONS = {
|
||||
"headless": True,
|
||||
"args": ["--no-sandbox", "--disable-setuid-sandbox"],
|
||||
}
|
||||
PLAYWRIGHT_BROWSER_TYPE = "chromium"
|
||||
|
||||
FEEDS = {
|
||||
"/app/data/amazon.json": {"format": "json", "overwrite": True},
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `scrapy/ecommerce/items.py`
|
||||
|
||||
```python
|
||||
import scrapy
|
||||
|
||||
class ProductItem(scrapy.Item):
|
||||
title = scrapy.Field()
|
||||
price = scrapy.Field()
|
||||
rating = scrapy.Field()
|
||||
image_urls = scrapy.Field()
|
||||
images = scrapy.Field()
|
||||
product_url = scrapy.Field()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `scrapy/ecommerce/pipelines.py`
|
||||
|
||||
```python
|
||||
import json
|
||||
|
||||
class JsonWriterPipeline:
|
||||
def open_spider(self, spider):
|
||||
self.file = open("data/products.json", "w", encoding="utf-8")
|
||||
self.file.write("[\n")
|
||||
|
||||
def close_spider(self, spider):
|
||||
self.file.write("]\n")
|
||||
self.file.close()
|
||||
|
||||
def process_item(self, item, spider):
|
||||
line = json.dumps(dict(item), ensure_ascii=False) + ",\n"
|
||||
self.file.write(line)
|
||||
return item
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `scrapy/ecommerce/spiders/amazon_spider.py`
|
||||
|
||||
> ⚠️ 仅作演示用途,使用通用搜索页采集,不涉及登录或侵权内容。
|
||||
|
||||
```python
|
||||
import scrapy
|
||||
from scrapy_playwright.page import PageMethod
|
||||
|
||||
class QuotesSpider(scrapy.Spider):
|
||||
name = "amazon"
|
||||
start_urls = ["https://quotes.toscrape.com/js/"]
|
||||
|
||||
custom_settings = {
|
||||
"PLAYWRIGHT_LAUNCH_OPTIONS": {"headless": True},
|
||||
"PLAYWRIGHT_CONTEXT_ARGS": {"viewport": {"width": 1280, "height": 720}},
|
||||
}
|
||||
|
||||
def start_requests(self):
|
||||
for url in self.start_urls:
|
||||
yield scrapy.Request(
|
||||
url,
|
||||
meta={
|
||||
"playwright": True,
|
||||
"playwright_page_methods": [
|
||||
PageMethod("wait_for_selector", "div.quote")
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
async def parse(self, response):
|
||||
quotes = response.css("div.quote")
|
||||
for quote in quotes:
|
||||
text = quote.css("span.text::text").get()
|
||||
author = quote.css("small.author::text").get()
|
||||
yield {"text": text, "author": author}
|
||||
|
||||
# 翻页
|
||||
next_page = response.css("li.next a::attr(href)").get()
|
||||
if next_page:
|
||||
next_url = response.urljoin(next_page)
|
||||
yield scrapy.Request(
|
||||
next_url,
|
||||
meta={
|
||||
"playwright": True,
|
||||
"playwright_page_methods": [
|
||||
PageMethod("wait_for_selector", "div.quote")
|
||||
],
|
||||
},
|
||||
callback=self.parse
|
||||
)
|
||||
```
|
||||
|
||||
### `scrapy/ecommerce/spiders/__init__.py`
|
||||
|
||||
```python
|
||||
#empty
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 四、运行方式
|
||||
|
||||
```bash
|
||||
# 1. 构建并启动所有容器
|
||||
docker compose up --build -d
|
||||
|
||||
# 2. 进入 Scrapy 容器执行爬虫
|
||||
docker exec -it ecommerce-scraper scrapy crawl amazon
|
||||
|
||||
# 3. 查看数据
|
||||
cat data/products.json
|
||||
```
|
||||
|
||||
### Docker 命令
|
||||
|
||||
|
||||
``` bash
|
||||
docker compose down -v
|
||||
docker compose up --build -d
|
||||
|
||||
docker exec -it ecommerce-scraper bash
|
||||
|
||||
#进入交互模式
|
||||
docker run -it --entrypoint bash ecommerce-scraper
|
||||
```
|
||||
---
|
||||
|
||||
## 🤖 五、n8n 自动化流程(示例)
|
||||
|
||||
你可以在 n8n Web UI([http://localhost:5678)导入如下逻辑:](http://localhost:5678%EF%BC%89%E5%AF%BC%E5%85%A5%E5%A6%82%E4%B8%8B%E9%80%BB%E8%BE%91%EF%BC%9A/)
|
||||
|
||||
**Workflow 示例逻辑:**
|
||||
|
||||
1. **Cron Node**:每天凌晨触发
|
||||
|
||||
2. **Execute Command Node**:执行命令
|
||||
`docker exec ecommerce-scraper scrapy crawl amazon`
|
||||
|
||||
3. **Read File Node**:读取 `/data/products.json`
|
||||
|
||||
4. **OpenAI Node**(或 HTTP Request 调本地 Ollama):
|
||||
|
||||
- Prompt 示例:
|
||||
|
||||
```text
|
||||
从以下JSON中提取每个产品的简短摘要(不超过30字)并分类。
|
||||
```
|
||||
|
||||
5. **Write to Database Node**(或 Google Sheet / CSV)
|
||||
保存提炼结果
|
||||
|
||||
6. **Telegram / Email Node**
|
||||
发送日报通知
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 💡 六、后续增强建议
|
||||
|
||||
|功能|工具|说明|
|
||||
|---|---|---|
|
||||
|图像下载/视频下载|Scrapy 自带 `ImagesPipeline` 或 `requests`|下载并存储本地或 MinIO|
|
||||
|多站点并行爬取|Scrapy 多 Spider + n8n 并行调度|自动轮询不同站点|
|
||||
|数据可视化|Metabase / Grafana|接 PostgreSQL 实时展示产品趋势|
|
||||
|向量搜索|Qdrant / Weaviate|用于AI语义检索|
|
||||
|本地AI处理|Ollama + Llama3|替代外部API|
|
||||
|
||||
---
|
||||
|
||||
是否希望我帮你再生成一个 **完整可导入的 n8n workflow JSON 文件模板**(包含 Cron、执行 Scrapy、读取 JSON、调用 AI、存入数据库)?
|
||||
这样你只需导入到 n8n UI 就能立即自动化整个流程。
|
||||
|
||||
非常好 👍
|
||||
下面是一个**完整可导入的 n8n Workflow JSON 模板**,它能自动:
|
||||
|
||||
1️⃣ 定时运行 Scrapy 爬虫(通过 Docker 命令)
|
||||
2️⃣ 读取爬取的数据(`products.json`)
|
||||
3️⃣ 调用 AI(可选择 OpenAI 或本地 Ollama)进行摘要与分类
|
||||
4️⃣ 存入数据库或文件
|
||||
5️⃣ 发送报告通知
|
||||
|
||||
---
|
||||
|
||||
## 🧩 一、Workflow 功能概览
|
||||
|
||||
|步骤|节点类型|功能|
|
||||
|---|---|---|
|
||||
|1|**Cron Trigger**|每天凌晨 2:00 自动触发|
|
||||
|2|**Execute Command**|执行 `docker exec ecommerce-scraper scrapy crawl amazon`|
|
||||
|3|**Read Binary File**|读取 `/data/products.json`|
|
||||
|4|**OpenAI (或 HTTP Request)**|提炼摘要与分类(可切换 Ollama)|
|
||||
|5|**Write Binary File**|输出 `data/products_summary.json`|
|
||||
|6|**Email (或 Telegram)**|发送日报通知|
|
||||
|
||||
---
|
||||
|
||||
## 📦 二、Workflow JSON 模板(可直接导入)
|
||||
|
||||
将以下 JSON 内容保存为
|
||||
👉 `workflow_ecommerce_automation.json`
|
||||
然后在 n8n Web UI → **Import from file** 导入。
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Ecommerce Crawler + AI Summary",
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {
|
||||
"triggerTimes": {
|
||||
"item": [
|
||||
{
|
||||
"mode": "everyDay",
|
||||
"hour": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"id": "1",
|
||||
"name": "Cron Trigger",
|
||||
"type": "n8n-nodes-base.cron",
|
||||
"typeVersion": 1,
|
||||
"position": [250, 250]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"command": "docker exec ecommerce-scraper scrapy crawl amazon"
|
||||
},
|
||||
"id": "2",
|
||||
"name": "Run Scrapy Crawler",
|
||||
"type": "n8n-nodes-base.executeCommand",
|
||||
"typeVersion": 1,
|
||||
"position": [500, 250]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"path": "/data/products.json",
|
||||
"options": {}
|
||||
},
|
||||
"id": "3",
|
||||
"name": "Read Products JSON",
|
||||
"type": "n8n-nodes-base.readBinaryFile",
|
||||
"typeVersion": 1,
|
||||
"position": [750, 250]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"functionCode": "const data = JSON.parse(Buffer.from(items[0].binary.data.data, 'base64').toString());\nreturn data.map(p => ({ json: p }));"
|
||||
},
|
||||
"id": "4",
|
||||
"name": "Parse JSON",
|
||||
"type": "n8n-nodes-base.function",
|
||||
"typeVersion": 1,
|
||||
"position": [1000, 250]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"model": "gpt-4-turbo",
|
||||
"prompt": "你是一个电商产品分析助手。请从以下产品信息中提取每个产品的简短摘要(不超过30字)并归类到相应产品类别。\n\n输入数据:{{$json[\"title\"]}},价格:{{$json[\"price\"]}},评分:{{$json[\"rating\"]}}。\n\n输出格式:{\"title\":\"...\",\"summary\":\"...\",\"category\":\"...\"}"
|
||||
},
|
||||
"id": "5",
|
||||
"name": "AI Summarize & Categorize",
|
||||
"type": "n8n-nodes-base.openAi",
|
||||
"typeVersion": 2,
|
||||
"position": [1250, 250],
|
||||
"credentials": {
|
||||
"openAIApi": {
|
||||
"id": "YOUR-OPENAI-CREDENTIAL-ID",
|
||||
"name": "OpenAI API"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"fileName": "/data/products_summary.json",
|
||||
"options": {},
|
||||
"dataPropertyName": "json"
|
||||
},
|
||||
"id": "6",
|
||||
"name": "Write Summary JSON",
|
||||
"type": "n8n-nodes-base.writeBinaryFile",
|
||||
"typeVersion": 1,
|
||||
"position": [1500, 250]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"fromEmail": "noreply@yourdomain.com",
|
||||
"toEmail": "your@email.com",
|
||||
"subject": "Daily Product Summary Report",
|
||||
"text": "今日电商产品摘要已生成,请查看 /data/products_summary.json 文件。"
|
||||
},
|
||||
"id": "7",
|
||||
"name": "Send Email Notification",
|
||||
"type": "n8n-nodes-base.emailSend",
|
||||
"typeVersion": 1,
|
||||
"position": [1750, 250]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Cron Trigger": { "main": [[{ "node": "Run Scrapy Crawler", "type": "main", "index": 0 }]] },
|
||||
"Run Scrapy Crawler": { "main": [[{ "node": "Read Products JSON", "type": "main", "index": 0 }]] },
|
||||
"Read Products JSON": { "main": [[{ "node": "Parse JSON", "type": "main", "index": 0 }]] },
|
||||
"Parse JSON": { "main": [[{ "node": "AI Summarize & Categorize", "type": "main", "index": 0 }]] },
|
||||
"AI Summarize & Categorize": { "main": [[{ "node": "Write Summary JSON", "type": "main", "index": 0 }]] },
|
||||
"Write Summary JSON": { "main": [[{ "node": "Send Email Notification", "type": "main", "index": 0 }]] }
|
||||
},
|
||||
"active": true
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧠 三、使用说明
|
||||
|
||||
1. **导入流程**
|
||||
|
||||
- 访问 `http://<你的服务器IP>:5678`
|
||||
|
||||
- 点击右上角「Import from File」→ 选择上面的 JSON 文件
|
||||
|
||||
2. **配置 OpenAI 凭证**
|
||||
|
||||
- n8n → Credentials → 新建 OpenAI API Key
|
||||
|
||||
- 将 `YOUR-OPENAI-CREDENTIAL-ID` 替换为对应 ID
|
||||
|
||||
- 若使用本地 Ollama,则:
|
||||
|
||||
- 替换节点 `AI Summarize & Categorize` 为 “HTTP Request”
|
||||
|
||||
- URL 填入 `http://ollama:11434/api/generate`
|
||||
|
||||
- POST body 示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"model": "llama3",
|
||||
"prompt": "分析以下产品信息:{{$json[\"title\"]}} ..."
|
||||
}
|
||||
```
|
||||
|
||||
3. **设置邮箱凭证**
|
||||
|
||||
- n8n → Credentials → Email Send (SMTP)
|
||||
|
||||
- 支持 Gmail, Outlook, AWS SES 等
|
||||
|
||||
4. **测试运行**
|
||||
|
||||
- 手动点击 ▶️ 运行
|
||||
|
||||
- 查看 `/data/products_summary.json`
|
||||
|
||||
- 邮箱将收到日报通知
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🚀 四、可选扩展
|
||||
|
||||
|目标|实现方式|
|
||||
|---|---|
|
||||
|改为多站点爬取|添加更多 spider(如 `jd_spider.py`, `ebay_spider.py`)并在 n8n 串联运行|
|
||||
|增加数据库写入|在 n8n 中加入 “PostgreSQL Node” 写入产品与AI摘要|
|
||||
|生成图表报表|把数据库接入 Grafana / Metabase|
|
||||
|向量检索增强|在 n8n 中调用 Qdrant 插入语义向量|
|
||||
|
||||
---
|
||||
|
||||
是否希望我在下一步帮你生成一个适配 **Ollama 本地模型(离线AI处理)** 的 workflow 版本?
|
||||
它将不依赖外部API,完全在本地自动运行分析。
|
||||
|
||||
|
||||
|
||||
@@ -1,429 +0,0 @@
|
||||
---
|
||||
title: 一、系统要求
|
||||
source:
|
||||
author: shenwei
|
||||
published:
|
||||
created:
|
||||
description:
|
||||
tags: [ollama, openclaw, qwen, qwen-coder, ubuntu]
|
||||
---
|
||||
|
||||
|
||||
#ubuntu #ollama #qwen-coder #qwen #openclaw
|
||||
```table-of-contents
|
||||
```
|
||||
|
||||
# 一、系统要求
|
||||
|
||||
运行 `qwen2.5-coder:7b` 推荐配置:
|
||||
|
||||
| 资源 | 最低 | 推荐 |
|
||||
| ---- | ------- | ---------- |
|
||||
| CPU | 4 cores | 8+ cores |
|
||||
| RAM | 8GB | 16GB |
|
||||
| GPU | 无需 | NVIDIA GPU |
|
||||
| Disk | 10GB | 20GB |
|
||||
| | | |
|
||||
|
||||
模型大小:
|
||||
|
||||
```
|
||||
约 4.5GB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 二、Ubuntu 安装 Ollama
|
||||
|
||||
## 1 更新系统
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt upgrade -y
|
||||
```
|
||||
|
||||
安装 curl
|
||||
|
||||
```bash
|
||||
sudo apt install -y curl
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2 安装 Ollama
|
||||
|
||||
执行官方安装脚本:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://ollama.com/install.sh | sh
|
||||
```
|
||||
|
||||
安装过程会自动:
|
||||
|
||||
- 安装 `ollama` CLI
|
||||
- 创建 systemd 服务
|
||||
- 启动 Ollama API
|
||||
|
||||
---
|
||||
|
||||
## 3 验证安装
|
||||
|
||||
```bash
|
||||
ollama --version
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```
|
||||
ollama version 0.5.x
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 三、启动 Ollama 服务
|
||||
|
||||
检查状态:
|
||||
|
||||
```bash
|
||||
systemctl status ollama
|
||||
```
|
||||
|
||||
如果未运行:
|
||||
|
||||
```bash
|
||||
sudo systemctl start ollama
|
||||
```
|
||||
|
||||
开机启动:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable ollama
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 四、下载 Qwen2.5-Coder 7B
|
||||
|
||||
下载模型:
|
||||
|
||||
```bash
|
||||
ollama pull qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
下载大小:
|
||||
|
||||
```
|
||||
≈ 4.5GB
|
||||
```
|
||||
|
||||
下载完成查看:
|
||||
|
||||
```bash
|
||||
ollama list
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```
|
||||
NAME SIZE
|
||||
qwen2.5-coder:7b 4.6 GB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 五、运行模型
|
||||
|
||||
启动交互模式:
|
||||
|
||||
```bash
|
||||
ollama run qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
终端将进入:
|
||||
|
||||
```
|
||||
>>> Send a message (/? for help)
|
||||
```
|
||||
|
||||
测试:
|
||||
|
||||
```
|
||||
Write a Python script to monitor CPU usage
|
||||
```
|
||||
|
||||
模型会生成代码。
|
||||
|
||||
---
|
||||
|
||||
# 六、通过 API 调用
|
||||
|
||||
Ollama 默认提供 REST API:
|
||||
|
||||
```
|
||||
http://localhost:11434
|
||||
```
|
||||
|
||||
测试 API:
|
||||
|
||||
```bash
|
||||
curl http://localhost:11434/api/chat -d '{
|
||||
"model": "qwen2.5-coder:7b",
|
||||
"messages": [
|
||||
{"role": "user", "content": "Write a bash script to backup a directory"}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
返回示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"message": {
|
||||
"role": "assistant",
|
||||
"content": "Here is a bash backup script..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 七、Python 调用
|
||||
|
||||
安装 SDK:
|
||||
|
||||
```bash
|
||||
pip install ollama
|
||||
```
|
||||
|
||||
示例代码:
|
||||
|
||||
```python
|
||||
from ollama import chat
|
||||
|
||||
response = chat(
|
||||
model="qwen2.5-coder:7b",
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Write a Python script to parse a CSV file"
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
print(response["message"]["content"])
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 八、NodeJS 调用
|
||||
|
||||
安装 SDK:
|
||||
|
||||
```bash
|
||||
npm install ollama
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```javascript
|
||||
import ollama from 'ollama'
|
||||
|
||||
const response = await ollama.chat({
|
||||
model: 'qwen2.5-coder:7b',
|
||||
messages: [
|
||||
{ role: 'user', content: 'Write a docker-compose for n8n and postgres' }
|
||||
]
|
||||
})
|
||||
|
||||
console.log(response.message.content)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 九、开放远程 API(推荐)
|
||||
|
||||
默认只监听:
|
||||
|
||||
```
|
||||
127.0.0.1
|
||||
```
|
||||
|
||||
如果要给:
|
||||
|
||||
- n8n
|
||||
|
||||
- OpenClaw
|
||||
|
||||
- WebUI
|
||||
|
||||
- Agent
|
||||
|
||||
|
||||
使用,需要修改。
|
||||
|
||||
编辑:
|
||||
|
||||
```
|
||||
/etc/systemd/system/ollama.service
|
||||
```
|
||||
|
||||
增加:
|
||||
|
||||
```
|
||||
Environment="OLLAMA_HOST=0.0.0.0"
|
||||
```
|
||||
|
||||
重新加载:
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart ollama
|
||||
```
|
||||
|
||||
访问:
|
||||
|
||||
```
|
||||
http://服务器IP:11434
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 十、GPU 加速(可选)
|
||||
|
||||
检查 GPU:
|
||||
|
||||
```bash
|
||||
nvidia-smi
|
||||
```
|
||||
|
||||
如果安装了 CUDA:
|
||||
|
||||
Ollama 会 **自动使用 GPU**。
|
||||
|
||||
无需额外配置。
|
||||
|
||||
---
|
||||
|
||||
# 十一、模型管理
|
||||
|
||||
查看模型:
|
||||
|
||||
```bash
|
||||
ollama list
|
||||
```
|
||||
|
||||
删除模型:
|
||||
|
||||
```bash
|
||||
ollama rm qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
更新模型:
|
||||
|
||||
```bash
|
||||
ollama pull qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 十二、性能优化
|
||||
|
||||
如果机器较小:
|
||||
|
||||
推荐:
|
||||
|
||||
```
|
||||
qwen2.5-coder:3b
|
||||
```
|
||||
|
||||
下载:
|
||||
|
||||
```bash
|
||||
ollama pull qwen2.5-coder:3b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 十三、推荐搭配工具
|
||||
|
||||
如果你正在做 **AI automation / agent / coding**
|
||||
|
||||
建议搭配:
|
||||
|
||||
|工具|用途|
|
||||
|---|---|
|
||||
|Open WebUI|ChatGPT UI|
|
||||
|n8n|AI automation|
|
||||
|LangChain|Agent framework|
|
||||
|OpenClaw|AI coding agent|
|
||||
|
||||
例如 OpenClaw 配置:
|
||||
|
||||
```
|
||||
ollama/qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 十四、最简安装流程(3条命令)
|
||||
|
||||
如果你只想快速安装:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://ollama.com/install.sh | sh
|
||||
|
||||
ollama pull qwen2.5-coder:7b
|
||||
|
||||
ollama run qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 十五、一个很多人不知道的优化(非常重要)
|
||||
|
||||
如果你打算做:
|
||||
|
||||
- DevOps automation
|
||||
|
||||
- SQL Agent
|
||||
|
||||
- Kubernetes troubleshooting
|
||||
|
||||
- n8n workflow AI
|
||||
|
||||
|
||||
强烈建议使用:
|
||||
|
||||
```
|
||||
qwen2.5-coder:7b
|
||||
```
|
||||
|
||||
原因:
|
||||
|
||||
- Tool usage能力强
|
||||
|
||||
- Shell / Python / SQL理解强
|
||||
|
||||
- Repo级代码理解
|
||||
|
||||
|
||||
比普通 `qwen2.5:7b` **更适合工程任务**。
|
||||
|
||||
---
|
||||
|
||||
如果需要,我可以再给你一份 **更高级部署指南**:
|
||||
|
||||
**《Ubuntu 本地 AI Stack:Ollama + Qwen2.5-Coder + OpenWebUI + n8n + Agent 自动化》**
|
||||
|
||||
会包含:
|
||||
|
||||
- 本地 ChatGPT UI
|
||||
|
||||
- AI Coding Agent
|
||||
|
||||
- 自动化工作流
|
||||
|
||||
- DevOps AI 助手
|
||||
|
||||
|
||||
基本上是一套 **完整的本地 AI 基础设施(非常适合开发者)**。
|
||||
@@ -7,8 +7,6 @@ created: 2025-03-06
|
||||
description:
|
||||
tags: [docker, nas, synology]
|
||||
---
|
||||
|
||||
|
||||
#docker #synology #nas
|
||||
|
||||
Here is a example about transfer Docker images from my work laptop to my Synology NAS Docker
|
||||
|
||||
Reference in New Issue
Block a user