结构变化

This commit is contained in:
2026-04-14 12:19:28 +08:00
parent be67293b60
commit 65803c911d
176 changed files with 0 additions and 381 deletions

View File

@@ -0,0 +1,36 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [apache, bi, docker, mysql, superset]
---
#docker #superset #apache #mysql #bi
``` bash
docker pull apache/superset:GHA-19524015706
```
``` bash
docker run -d -p 8777:8088 -e "SUPERSET_SECRET_KEY=mysuperset" --name superset apache/superset:GHA-19524015706
```
``` bash
docker exec -it superset superset fab create-admin --username admin --firstname Superset --lastname Admin --email admin@superset.com --password admin
```
``` bash
docker exec -it superset superset db upgrade
```
``` bash
docker exec -it superset superset load_examples
```
``` bash
docker exec -it superset superset init
```

View File

@@ -0,0 +1,112 @@
---
title: Mac Mini 服务器配置:防止自动锁屏与睡眠
source:
author: shenwei
published:
created:
description:
tags: []
---
# Mac Mini 服务器配置:防止自动锁屏与睡眠
本文档记录如何配置 Mac Mini 作为服务器使用时,防止自动锁屏和睡眠,确保可以通过远程桌面(如 RustDesk持续访问。
## 问题描述
Mac Mini 作为服务器使用时,关闭显示器后会自动锁屏或进入睡眠状态,导致远程访问软件(如 RustDesk、VNC无法连接需要物理到主机上输入密码解锁。
## 解决方案
### 方法:关闭所有自动睡眠与锁屏设置
在终端中运行以下命令:
```bash
sudo pmset -a sleep 0
sudo pmset -a displaysleep 0
sudo pmset -a standby 0
sudo pmset -a hibernatemode 0
sudo pmset -a womp 1
```
#### 命令解释
| 命令 | 作用 |
|------|------|
| `pmset -a sleep 0` | 禁止系统睡眠 |
| `pmset -a displaysleep 0` | 禁止显示器关闭 |
| `pmset -a standby 0` | 禁止待机模式 |
| `pmset -a hibernatemode 0` | 禁止休眠(内存保存到磁盘) |
| `pmset -a womp 1` | 启用网络唤醒WOL |
#### 参数说明
- `-a`:应用于所有电源模式(电池和电源适配器)
- `-b`:仅电池模式
- `-c`:仅电源适配器模式
---
## 可选:使用 caffeinate 保持唤醒
如果需要临时保持唤醒状态(不修改系统设置),可以使用 `caffeinate` 工具:
### 安装
```bash
brew install caffeinate
```
### 使用
```bash
# 保持唤醒(按 Ctrl+C 停止)
caffeinate -d -i -s
```
#### 参数说明
| 参数 | 作用 |
|------|------|
| `-d` | 防止显示器睡眠 |
| `-i` | 防止系统空闲时睡眠 |
| `-s` | 防止系统睡眠 |
| `-u` | 模拟用户活动(防止睡眠) |
---
## 验证当前电源设置
查看当前电源管理设置:
```bash
pmset -g
```
查看具体睡眠设置:
```bash
pmset -g sleep
pmset -g displaysleep
```
---
## 注意事项
1. **sudo 权限**:运行 pmset 命令需要管理员权限
2. **功耗**:关闭睡眠会增加功耗,适合始终接电的服务器场景
3. **网络唤醒**:启用 WOL 后,可以通过其他设备远程唤醒 Mac Mini
4. **安全性**:如果 Mac Mini 放在不安全的地方,建议设置强密码和防火墙
---
## 相关链接
- Apple pmset 官方文档https://support.apple.com/zh-cn/HT201685
---
*文档创建日期2026-03-15*
*最后更新2026-03-15*

View File

@@ -0,0 +1,155 @@
---
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网站上下载了最新版本的
![http://zipline.ishenwei.online/u/7TB8tp.png](http://zipline.ishenwei.online/u/7TB8tp.png)
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
![image.png](http://zipline.ishenwei.online/u/m4sQrt.png)
以上两个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/)
![image.png](http://zipline.ishenwei.online/u/QcKcwS.png)
## 2.1 安装xiaoya alist
首先我的NAS上的Container Manager除了问题怎么呀刷不出注册表信息就是无法读取docker hub的信息。我尝试了用Putty通过SSH登录NAS然后用docker pull的命令下载也不行。在这里必须要主要要NAS支持可以通过SSH访问必须进行配置。
![image.png](http://zipline.ishenwei.online/u/9RSBIR.png)
![image.png](http://zipline.ishenwei.online/u/2dRkNO.png)
后来我查询了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了
![image.png](http://zipline.ishenwei.online/u/DJqT3S.png)
接下来需要进行一些配置工作:
在本地先准备三个txt文件然后根据官方文档配置Aliyun的token
**myopentoken.txt**
访问这个链接 后用手机阿里云盘扫描二维码然后在手机上确认授权然后点击I have scan, 将生成的token保存在myopentoken.txt文件里。
[Get Aliyundrive Refresh Token](https://alist.nn.ci/tool/aliyundrive/request.html)
![image.png](http://zipline.ishenwei.online/u/TyXMv9.png)
**mytoken.txt**
访问这个链接 然后用阿里云盘的App扫描二维码将生成的token保存在mytoken.txt里
[阿里云盘 / 分享](https://alist.nn.ci/zh/guide/drivers/aliyundrive.html)
![image.png](http://zipline.ishenwei.online/u/A8Wtcz.png)
**temp_transfer_folder_id.txt**
登录网页版阿里云盘在资源盘目录下创建一个folder, 将URL里的folder 的token保存在这个txt文件里。 这个目录将来会用于存放从xiaoya那边转存过来的视频
![image.png](http://zipline.ishenwei.online/u/TUwd9j.png)
最后将这三个txt文件全部上传至 NAS/docker/xiaoya/ 目录下
配置Docker启动xiaoya请注意以下圈出的是需要配置的地方
![image.png](http://zipline.ishenwei.online/u/Rf1pNS.png)
启动后检查日志,看小雅是否正常启动。
[http://192.168.3.17:5678/](http://192.168.3.17:5678/)
# 3. 配置安装CloudDrive2来在NAS挂载Aliyun盘
在套件中心,设置里添加矿神源
![image.png](http://zipline.ishenwei.online/u/dwpGsY.png)
然后在社群里找到CloudDrive2这个应用, 并安装。因为我的DSM是7+版本所以需要额外在Putty root 下执行一条命令:
```docker
sudo -i
#input NAS admin password
sudo sed -i 's/package/root/g' /var/packages/CloudDrive2/conf/privilege
```
![image.png](http://zipline.ishenwei.online/u/Vy2E54.png)
安装成功后打开CloudDrive进行配置
[http://192.168.3.17:19798/](http://192.168.3.17:19798/)
![image.png](http://zipline.ishenwei.online/u/EmE0Pv.png)
用阿里云盘app扫描二维码并授权请主要不要授权备份目录仅资源目录即可
![image.png](http://zipline.ishenwei.online/u/g7uvm9.png)
对Aliyun目录进行mount
![image.png](http://zipline.ishenwei.online/u/jzRBHR.png)
# 4. 在Plex里导入Aliyun盘的内容
![image.png](http://zipline.ishenwei.online/u/9KgtEH.png)
目前的策略是可以用xiaoya选择要看的视频然后在aliyun盘里移动到相应的目录比如 aliyun-movie, aliyun-tvshows, aliyun-documentory 然后让Plex进行视频刮削并显示在Plex Media Server里。

View File

@@ -0,0 +1,695 @@
---
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 DBe.g. Qdrant / Milvus存储产品语义信息
- n8n 可触发自动生成市场趋势报告AI Summarizer
- 可视化电商类目趋势Grafana + Postgres
---
## ✅ 推荐起步路径
1. **在 Ubuntu 上安装 Docker + Docker Compose**
2. 启动基础环境:`scrapy + playwright + n8n`
3. 选择 12 个电商站点(如 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完全在本地自动运行分析。

View File

@@ -0,0 +1,429 @@
---
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 StackOllama + Qwen2.5-Coder + OpenWebUI + n8n + Agent 自动化》**
会包含:
- 本地 ChatGPT UI
- AI Coding Agent
- 自动化工作流
- DevOps AI 助手
基本上是一套 **完整的本地 AI 基础设施(非常适合开发者)**

View File

@@ -0,0 +1,816 @@
#vps #caddy #frp #reverse-proxy #troubleshooting #cloudflare
```table-of-contents
```
思路Aliyun DNS 指向 公网上的一台VPSVPS 上运行 Caddy内网主机通过 frp 将服务暴露到 VPS本地 127.0.0.1 或某个端口VPS 反向代理到该端口。
- 在 VPS 上运行 `frps`frp server
- 在每个内网设备运行 `frpc` (frp client),将本地服务映射到 VPS 上的独立端口或域名映射frp 支持 http/https 映射,和 subdomain 映射需要 frp 企业/配置域名解析到 VPS
- VPS 上的 Caddy 反向代理到 frps 映射端口127.0.0.1:xxxxx
frp 优点:专为内网穿透设计,支持 NAT、自动重连、Web 管理面板(可选)。推荐当你有多台设备和多端口时使用。
# 前置共识(已知条件)
- 域名:`ishenwei.online`(在阿里云 DNS 控制台管理)
- 内网服务:
- NAS`192.168.3.17:5000`(对应 `nas.ishenwei.online`
- Ubuntu1 n8n`192.168.3.47:5678`(希望对应 `n8n.ishenwei.online`
- Ubuntu1 transmission: `192.168.3.47:9091`(希望对应 `transmission.ishenwei.online`
- Ubuntu1 Grafana: `192.168.3.47:3000`(希望对应 `grafana.ishenwei.online`
- 你有一台公网 VPSUbuntu可用于反代或做中继IP: `192.227.222.142`(固定)
## 🧭 目标
- 公网 VPSUbuntu公网 IP = `192.227.222.142`
- 内网 NAS (`192.168.3.17:5000`)
- 内网 Ubuntu (`192.168.3.47:5678`)
- 通过 `frp` 建立安全的反向隧道
- 通过 `Caddy` 在 VPS 上为每个子域名提供 HTTPS 域名访问:
| 域名 | 映射目标 |
| ---------------------------------------------------------- | ---------------------------- |
| [https://nas.ishenwei.online](https://nas.ishenwei.online) | → NAS `192.168.3.17:5000` |
| [https://n8n.ishenwei.online](https://n8n.ishenwei.online) | → Ubuntu `192.168.3.47:5678` |
| | |
| | |
| | |
公网VPSfrps服务端
↓(公网端口转发)
192.227.222.142
通过 frp 反向代理访问内网主机
内网 Ubuntu (192.168.3.47) 启动 frpc
├─ n8n 服务 (5678)
├─ Transmission (9091)
└─ Grafana (3000)
## 🧱 拓扑图
Internet
┌──────────────────────────┐
│ VPS (192.227.222.142) │
│ - frps (监听 7000) │
│ - Caddy (80/443 TLS) │
│ ├─ nas.ishenwei.online → 127.0.0.1:15000 (映射NAS:5000)
│ └─ n8n.ishenwei.online → 127.0.0.1:15678 (映射Ubuntu:5678)
└──────────────────────────┘
▲ ▲
│ frp tunnel │ frp tunnel
┌────────────┐ ┌────────────┐
│ NAS (192.168.3.17) │ │ Ubuntu (192.168.3.47) │
│ frpc.ini │ │ frpc.ini │
│ 映射5000→15000 │ │ 映射5678→15678 │
└────────────┘ └────────────┘
## 🧩 第 1 步:阿里云 DNS 配置
进入阿里云控制台 → 域名解析:
| 主机记录 | 记录类型 | 记录值 | TTL |
| ---- | ---- | --------------- | --- |
| nas | A | 192.227.222.142 | 600 |
| n8n | A | 192.227.222.142 | 600 |
保存即可。
验证命令(任意机器执行):
`dig nas.ishenwei.online +short # 应返回 192.227.222.142
## 🧩 第 2 步:在 VPS 安装 Caddy + frps
### 1⃣ 安装 Caddy
``` bash
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg chmod o+r /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy
```
Caddy 安装后会自动作为系统服务运行。
---
### 2⃣ 安装 frpsfrp 服务端)
``` bash
cd /opt
sudo mkdir frp && cd frp
FRP_VER=0.65.0 # 若有更新,可替换版本号
sudo curl -LO https://github.com/fatedier/frp/releases/download/v${FRP_VER}/frp_${FRP_VER}_linux_amd64.tar.gz
sudo tar xzf frp_${FRP_VER}_linux_amd64.tar.gz
sudo mv frp_${FRP_VER}_linux_amd64/* /opt/frp/
```
创建配置文件 `/opt/frp/frps.ini`
``` bash
[common]
bind_addr = 0.0.0.0
bind_port = 7000
---
title: 前置共识(已知条件)
author: shenwei
tags: [caddy, cloudflare, frp, log, reverse-proxy, troubleshooting, vps]
---
---
title: 前置共识(已知条件)
source:
author: shenwei
published:
created:
description:
tags: [caddy, cloudflare, frp, log, reverse-proxy, troubleshooting, vps]
---
# Dashboard
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = StrongPassword123!
# 认证 Token
token = Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs
```
创建 systemd 单元 `/etc/systemd/system/frps.service`
``` bash
[Unit]
Description=frp server (frps)
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
启动:
```
sudo systemctl daemon-reload
sudo systemctl enable --now frps
```
验证:
```
sudo systemctl status frps
ss -ltnp | grep 7000
```
### 3⃣ VPS 防火墙设置(允许必要端口)
``` bash
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 7000/tcp # frp server 端口
sudo ufw allow 7050 # frp server dashboard
sudo ufw allow 60022 # Ubuntu SSH
sudo ufw allow 60023 # NAS SSH
sudo ufw allow 65005 # webdav
sudo ufw allow 63306 # NAS mysql
sudo ufw allow 60080 # NAS web
sudo ufw enable
sudo ufw status verbose
```
如果你想让 frp dashboard 从本地访问:`ssh -L 7500:127.0.0.1:7500 ubuntu@192.227.222.142`,然后本地打开 `http://127.0.0.1:7500`。
## 🧩 第 3 步:在 NAS 与内网 Ubuntu 安装 frpc
两台机器都执行以下步骤(路径、端口配置不同)
### 2⃣ 安装 frpsfrp 服务端)
``` bash
cd /opt
sudo mkdir frp && cd frp
FRP_VER=0.65.0 # 若有更新,可替换版本号
sudo curl -LO https://github.com/fatedier/frp/releases/download/v${FRP_VER}/frp_${FRP_VER}_linux_amd64.tar.gz
sudo tar xzf frp_${FRP_VER}_linux_amd64.tar.gz
sudo mv frp_${FRP_VER}_linux_amd64/* /opt/frp/
```
### 3⃣ 内网 NAS192.168.3.17)配置
创建 `/opt/frp/frpc.ini`
``` bash
[common]
server_addr = 192.227.222.142
server_port = 7000
token = Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs
# 每个本地服务一个 section
# nas 映射: 本地 5000 -> VPS 127.0.0.1:15000
[nas]
type = tcp
local_ip = 127.0.0.1
local_port = 5000
remote_port = 15000
# Navidrome: 本地 4533 -> VPS 127.0.0.1:4533
[navidrome]
type = tcp
local_ip = 127.0.0.1
local_port = 4533
remote_port = 14533
# Calibre: 本地 8083 -> VPS 127.0.0.1:18083
[calibre]
type = tcp
local_ip = 127.0.0.1
local_port = 8083
remote_port = 18083
[webdav]
type = tcp
local_ip = 127.0.0.1
local_port = 5005
remote_port = 60055
```
创建 systemd 单元 `/etc/systemd/system/frpc.service`
``` bash
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
启动:
``` bash
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc
```
如需重启
``` bash
sudo systemctl restart frpc
```
### 3⃣ 内网 Ubuntu192.168.3.47)配置
创建 `/opt/frp/frpc.ini`
``` bash
[common]
server_addr = 192.227.222.142
server_port = 7000
token = Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs
# 每个本地服务一个 section
# n8n 映射: 本地 5678 -> VPS 127.0.0.1:15678
[n8n]
type = tcp
local_ip = 127.0.0.1
local_port = 5678
remote_port = 15678
# Transmission: 本地 9091 -> VPS 127.0.0.1:19091
[transmission]
type = tcp
local_ip = 127.0.0.1
local_port = 9091
remote_port = 19091
# Grafana: 本地 3000 -> VPS 127.0.0.1:13000
[grafana]
type = tcp
local_ip = 127.0.0.1
local_port = 3000
remote_port = 13000
```
创建 systemd 单元 `/etc/systemd/system/frpc.service`
``` bash
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
启动:
``` bash
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc
```
如需重启
``` bash
sudo systemctl restart frpc
```
## 🧩 第 4 步VPS 上配置 Caddy 反向代理
编辑 `/etc/caddy/Caddyfile`
``` bash
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.
:80 {
# Set this path to your site's directory.
root * /usr/share/caddy
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
}
n8n.ishenwei.online {
reverse_proxy 127.0.0.1:15678
#log {
# output file /var/log/caddy/n8n.access.log
# format single_field common_log
#}
}
transmission.ishenwei.online {
reverse_proxy 127.0.0.1:19091
#log {
# output file /var/log/caddy/transmission.access.log
# format single_field common_log
#}
}
grafana.ishenwei.online {
reverse_proxy 127.0.0.1:13000
#log {
# output file /var/log/caddy/grafana.access.log
# format single_field common_log
#}
}
nas.ishenwei.online {
reverse_proxy 127.0.0.1:15000
}
navidrome.ishenwei.online {
reverse_proxy 127.0.0.1:14533
}
calibre.ishenwei.online {
reverse_proxy 127.0.0.1:18083
}
# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
```
如需重启 Caddy
``` bash
sudo systemctl reload caddy
sudo systemctl status caddy
```
或者:
``` bash
#彻底重启 Caddy 服务(强制方式)
sudo systemctl restart caddy
```
Caddy 会自动申请并更新 Let's Encrypt 证书,提供 HTTPS 访问。
如果 systemctl 无响应Caddy 卡死或崩溃)
``` bash
sudo systemctl stop caddy
sudo pkill -9 caddy # 杀掉所有残留进程 sudo systemctl start caddy
```
## 验证 Caddyfile 语法(最关键)
```
sudo caddy validate --config /etc/caddy/Caddyfile
```
如果返回:
`Valid configuration`
说明语法正确,可以重载。
如果报错Caddy 会指明**哪一行有问题**,例如:
`parse error: unknown directive at line 12`
你需要根据提示修正。
## 🧩 第 5 步:测试验证
### 1⃣ 在 VPS 上
``` bash
curl http://127.0.0.1:15678
curl http://127.0.0.1:15000
curl http://127.0.0.1:19091
curl http://127.0.0.1:13000
ss -ltnp | egrep '15678|19091|13000|7000|60022'
```
```
root@racknerd-66f115a:~# ss -ltnp | egrep '15678|19091|13000|7000'
LISTEN 0 4096 *:19091 *:* users:(("frps",pid=59421,fd=10))
LISTEN 0 4096 *:13000 *:* users:(("frps",pid=59421,fd=8))
LISTEN 0 4096 *:15678 *:* users:(("frps",pid=59421,fd=9))
LISTEN 0 4096 *:7000 *:* users:(("frps",pid=59421,fd=6))
```
### 2⃣ 在浏览器中
访问:
- [https://nas.ishenwei.online](https://nas.ishenwei.online)
- [https://n8n.ishenwei.online](https://n8n.ishenwei.online)
应能通过 HTTPS 打开对应服务。
## 🧩 第 6 步:可选安全加固
### 1⃣ Caddy 基础认证
在 Caddyfile 的 `n8n.ishenwei.online` 段中加入:
``` bash
basicauth /* { admin JDJhJDE0JDN3ZXVhV2YyZG9SY2hvYzVmZ2h3QUlVblpOMU4vS1ptcENrSlhySElMb3l5dytOMkh0Tk93 }
```
> 用 `caddy hash-password` 生成密码散列。
### 2⃣ 防火墙
只放行必要端口:
``` bash
sudo ufw allow 22,80,443,7000/tcp
sudo ufw enable
```
## 🧩 第 7 步Dashboard可选
访问:
``` bash
http://192.227.222.142:7500
用户名admin 密码StrongPassword123!
```
你可以实时查看 frp 客户端的连接状态。
FRP 架构已经稳定运行HTTP 反代验证通过),接下来要实现 **通过域名 `ubuntu1.ishenwei.online` SSH 到内网的 Ubuntu (192.168.3.47:22)**。
⚠️ **重点提醒(安全性)**
SSH 穿透与 HTTP 不同,它是纯 TCP 流量,不经 CaddyCaddy 只处理 HTTP/HTTPS所以
- **Caddy 不参与 SSH 的代理**。
- **只用 frps + frpc 配置即可完成**。
- **CaddyFile 无需修改**。
## 🧭 拓扑关系
``` bash
外部SSH客户端
ubuntu1.ishenwei.online:60022 VPS公网
FRP Server (frps) on VPS
FRP Client (frpc) on 192.168.3.47
Local Ubuntu SSH (192.168.3.47:22)
```
## 🧩 VPS 端frps配置
编辑 `/opt/frp/frps.ini`
> 不需要添加新的 section这里只是定义基础参数。frps 会自动识别来自客户端的 TCP 映射。
---
## 🧩 内网 Ubuntu192.168.3.47)端 frpc 配置
编辑 `/opt/frp/frpc.ini`,在现有配置文件中追加:
``` bash
# SSH 映射
[ubuntu_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 60022
```
> - `type = tcp` 表示这是纯 TCP 代理,不走 HTTP 协议
>
> - `remote_port = 60022` 是 VPS 上暴露的端口(外部 SSH 连接入口)
>
---
## 🔧 启动并验证
在内网机器上:
```
sudo systemctl restart frpc
sudo systemctl status frpc
```
验证日志中是否出现:
`[ubuntu_ssh] start proxy success`
---
## 🌐 在外部电脑上连接 SSH
从公网(任意地方)执行:
`ssh -p 60022 user@ubuntu1.ishenwei.online`
> 注意DNS 只解析到 IP**SSH 的端口要显式指定为 `-p 60022`**。
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 7000/tcp # frp server 端口
sudo ufw allow 7050
sudo ufw allow 60022
sudo ufw enable
sudo ufw status verbose
---
## 🔒 (可选)安全加固建议
1. **不要直接使用 22 或常见端口**,比如:
`remote_port = 26222`
避免被扫描。
2. **限制来源 IP**(仅 VPS 防火墙开放指定来源):
`sudo ufw allow from <your_home_ip> to any port 60022 proto tcp`
3. **使用公钥认证禁用密码登录**
- 编辑 `/etc/ssh/sshd_config`
`PasswordAuthentication no`
- 重启 SSH
`sudo systemctl restart ssh`
---
## ✅ 总结
|组件|是否需要修改|说明|
|---|---|---|
|**Caddy**|❌ 无需修改|不处理 SSH|
|**frps (VPS)**|✅ 保持默认端口即可||
|**frpc (内网 Ubuntu)**|✅ 新增 `[ubuntu_ssh]` section||
|**DNS**|✅ 添加 `ubuntu1.ishenwei.online -> VPS公网IP`||
|**SSH 连接**|✅ 使用 `ssh -p 60022 user@ubuntu1.ishenwei.online`|
## 错误排查 #troubleshooting
### ✔ 第 1 步:确认 frps 是否真的在监听端口(排除端口被占用/劫持)
``` bash
ss -lntup | grep 7000
ss -lntup | grep frps
```
结果:
``` bash
root@racknerd-66f115a:~# ss -lntup | grep 7000
tcp LISTEN 0 4096 *:7000 *:* users:(("frps",pid=413014,fd=6))
root@racknerd-66f115a:~# ss -lntup | grep frps
tcp LISTEN 0 4096 *:7000 *:* users:(("frps",pid=413014,fd=6))
tcp LISTEN 0 4096 *:7500 *:* users:(("frps",pid=413014,fd=3))
```
如果这里显示:
❌ 端口被 Caddy/Nginx 占用
❌ frps 未绑定 0.0.0.0
❌ frps 在 LISTEN 但不是你期望的配置文件
### ✔ 第 2 步:确定 frps 进程读取的配置是否跟你想的一样
执行:
``` bash
ps -ef | grep frps
```
你要看到类似:
``` bash
root@racknerd-66f115a:~# ps -ef | grep frps
root 413014 1 0 02:23 ? 00:00:00 /opt/frp/frps -c /opt/frp/frps.ini
root 419007 414182 0 02:57 pts/1 00:00:00 grep --color=auto frps
```
如果看到:
- 路径不对
- 配置文件不对
- 或者正运行旧版本二进制
那 frps 实际载入的 token、bind_port 等信息就不匹配。
**尤其要确认 token 是否是你以为的那个。**
👉 很多人遇到的问题是:
他们编辑了 `/opt/frp/frps.ini`,但 systemd service 其实加载另一个路径,例如 `/etc/frp/frps.ini`。
### ✔ 第 3 步:确认防火墙是否把 7000 封了
在 VPS 执行:
```
sudo iptables -L -n
sudo ufw status
sudo firewall-cmd --list-all
```
你需要确保:
- `tcp 7000` 在 **ACCEPT**
- Cloudflare 没有影响你(你用的是直连 IP不会影响
- Caddy/Nginx 没修改 nftables某些 One-key 脚本会修改)
### ✔ 第 4 步:确认没有 Caddy/Nginx 误 proxy 了 TCP 7000
检查 Caddy 配置:
``` bash
vi /etc/caddy/Caddyfile
```
**是否存在以下配置:**
`:7000 { reverse_proxy ... }`
如果有 → FRP 就没法直接监听这个端口。
### ✔ 第 5 步:确认 frps 日志是否有拒绝认证token mismatch
执行:
```
journalctl -u frps -n 100 --no-pager
```
如果你看到类似:
`authentication failed token mismatch invalid login`
那肯定是 token 和 frpc 不一致。
👉 很多人以为一样,但实际是空格、换行、编码问题导致不一致。
### ✔ 第 6 步:尝试手动 telnet 登录后观察 frps 日志变化
**非常关键的诊断动作**
你从任意 frpc 客户端执行:
``` bash
telnet 192.227.222.142 7000
```
同时在 frps VPS 执行:
``` bash
journalctl -u frps -f
```
正常情况下,你应该看到 frps 有日志反应:
- 有连接建立
- 有 login 请求
如果 frps 完全无反应:
➡ **说明请求没有到达 frps 进程 → 必然是端口被别的服务占用 / iptables 拦截 / SELinux 限制 / Caddy/Nginx 覆盖了端口**
### ✔ 第 7 步:强制重启 frps 和 frpc
在 frps 机器上:
```
systemctl restart frps
```
确认状态:
```
systemctl status frps
```
在 frpc 机器上:
```
systemctl restart frpc
systemctl status frpc
journalctl -u frpc -n 50
```
如果 frpc 日志里直接报:
`dial tcp 192.227.222.142:7000: connection reset`
➡ 防火墙问题
如果报:
`authentication failed`
➡ token 不一致
如果:
`wait until server ready`
➡ frps 端口被劫持

View File

@@ -0,0 +1,137 @@
---
title: 3X-UI Xray on BandwagonVPS
source:
author: shenwei
published:
created:
description:
tags: []
---
# 3X-UI Xray on BandwagonVPS
```table-of-contents
```
---
## 1. 服务器信息
| 项目 | 值 |
|------|-----|
| 服务器 | VPS2 (Bandwagon) |
| IP | 104.194.92.188 |
| 域名 | kiwi.ishenwei.online |
| SSH | `ssh vps2` |
| Web管理 | https://kiwi.ishenwei.online:2053/ |
| 用户名 | d96nRBgFUL |
| 密码 | er9XU0VsF1 |
---
## 2. 安装 3X-UI
### 一键安装命令
```bash
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
### 命令行管理
```bash
ssh vps2
x-ui
```
### 管理菜单说明
```
╔────────────────────────────────────────────────╗
║ 3X-UI Panel Management Script ║
║ 0. Exit Script ║
────────────────────────────────────────────────║
║ 1. Install ║
║ 2. Update ║
║ 3. Update Menu ║
║ 4. Legacy Version ║
║ 5. Uninstall ║
────────────────────────────────────────────────║
║ 6. Reset Username & Password ║
║ 7. Reset Web Base Path ║
║ 8. Reset Settings ║
║ 9. Change Port ║
║ 10. View Current Settings ║
────────────────────────────────────────────────║
║ 11. Start ║
║ 12. Stop ║
║ 13. Restart ║
║ 14. Check Status ║
║ 15. Logs Management ║
────────────────────────────────────────────────║
║ 16. Enable Autostart ║
║ 17. Disable Autostart ║
────────────────────────────────────────────────║
║ 18. SSL Certificate Management ║
║ 19. Cloudflare SSL Certificate ║
║ 20. IP Limit Management ║
║ 21. Firewall Management ║
║ 22. SSH Port Forwarding Management ║
────────────────────────────────────────────────║
║ 23. Enable BBR ║
║ 24. Update Geo Files ║
║ 25. Speedtest by Ookla ║
╚────────────────────────────────────────────────╝
```
### 常用操作
| 操作 | 命令 |
|------|------|
| 启动 | `x-ui` → 输入 `11` |
| 停止 | `x-ui` → 输入 `12` |
| 重启 | `x-ui` → 输入 `13` |
| 查看状态 | `x-ui` → 输入 `14` |
| 更新Geo文件 | `x-ui` → 输入 `24` |
| 启用BBR | `x-ui` → 输入 `23` |
### 当前状态
- Panel state: Running ✅
- xray state: Running ✅
- Autostart: Enabled ✅
---
## 3. 配置入站规则
### Web 管理地址
- 地址: https://104.194.92.188:18888/2atA1GaPdNBMyRRGWi
- 用户名: d96nRBgFUL
- 密码: er9XU0VsF1
### 配置策略
使用 VLESS+Reality 方式配置,需要产生公钥和私钥。
![[IMG-20260210125706904.png]]
![[IMG-20260210125706904.png]]
---
## 4. 本地客户端
### Windows/Linux
客户端: [v2rayN](https://github.com/2dust/v2rayN)
### Android
客户端: [v2rayNG](https://github.com/2dust/v2rayNG)
---
## 5. 网络测试
- 国内访问直连: ✅ 200
- 国外访问直连: ✅ 200

View File

@@ -0,0 +1,100 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [backup, clonezilla, nas, rufus, ubuntu]
---
#clonezilla #ubuntu #backup #nas #rufus
```table-of-contents
```
既然你已经准备好使用 **Clonezilla (再生龙)** 来实现类似 Ghost 的全盘镜像备份,以下是针对你**旧笔记本(源机)**备份到 **NAS存储端**的详细手把手步骤。
## 制作Clonezilla启动盘
- **下载 ISO 镜像:** 访问 [Clonezilla 官网下载页](https://clonezilla.org/downloads.php)。
- **CPU 架构:** 选择 `amd64`。
- **发行版类型:** 选择 `debian`(更稳定)。
- **文件类型:** 选择 `iso`。
- **准备 U 盘:** 至少 1GB 容量,请提前备份 U 盘内数据,制作过程会**格式化** U 盘。
- **启动 Rufus** 插入 U 盘并运行 Rufus 软件。
- **选择设备:** 在“设备”下拉菜单中确认选中了你的 U 盘。
- **选择镜像:** 点击右侧的“选择”按钮,找到你下载好的 `clonezilla-live-xxxx-amd64.iso` 文件。
- **分区方案与目标系统类型(关键):**
- **针对较新的笔记本:** 分区方案选 `GPT`,目标系统选 `UEFI (非 CSM)`。
- **针对很老的笔记本:** 如果你的笔记本不支持 UEFI分区方案选 `MBR`,目标系统选 `BIOS (或 UEFI-CSM)`。
- _建议如果不确定先尝试 GPT。_
- **文件系统:** 保持默认的 `FAT32`(这是 UEFI 启动的标准格式)。
- **开始制作:** 点击“开始”。
- **模式选择(重点):**
- Rufus 可能会弹出“检测到 ISOHybrid 镜像”的提示。
- **请务必选择:“以 ISO 镜像模式写入 (推荐)”**。
- 如果制作后无法启动再尝试使用“DD 镜像模式”重新制作。
10. **等待完成:** 进度条显示“准备就绪”后,即可拔掉 U 盘。
> [!NOTE] 蓝色U盘
> 蓝色U盘 32G 安装了Clonezilla
---
## 在旧笔记本上启动 Clonezilla
### 1. 启动与环境准备
1. 将制作好的 Rufus U 盘插入笔记本,重启并进入 **F9** (HP ZBook 常用) 启动菜单,选择 U 盘启动。
2. 在 Clonezilla 初始菜单选择:`Clonezilla live (Default settings, VGA 800x600)`。
3. **语言选择**:建议选择 `en_US.UTF-8 English` (英文界面更稳,报错容易查) 或 `zh_CN.UTF-8`。
4. **键盘布局**:保持默认 `Keep default keyboard layout`。
5. **启动 Clonezilla**:选择 `Start_Clonezilla`。
---
### 2. 设置备份模式
1. **模式选择**:选择 `device-image` (将硬盘备份为一个镜像文件,存放在 NAS 或外置硬盘上)。
2. **挂载备份目录 (Mounting the repo)**
- 如果你使用 **NAS**:选择 `nfs_server` (推荐Linux 兼容性最好)
- 如果你使用 **外置硬盘**:插上硬盘,选择 `local_dev`。
---
### 3. 连接 NAS (以 NFS 为例)
如果你选择了 `nfs_server`,接下来的填空非常关键:
1. **网卡配置**:选择 `dhcp` (确保笔记本连了网线)。
2. **NFS 服务器 IP**:输入你 NAS 的 IP 地址 (例如 `192.168.3.17`)。
3. **挂载路径**:输入你 NAS 上共享文件夹的绝对路径 (例如 `/volume2/backups`)。
4. **确认挂载**:挂载成功后,你会看到磁盘空间信息。按下 **Enter** 继续。
---
### 4. 配置备份参数
1. **向导模式**:选择 `Beginner` (初学者模式,默认参数已足够)。
2. **具体操作**:选择 `savedisk` (保存整个本地磁盘)。
3. **镜像名称**:它会自动生成一个日期格式的名称,你可以修改为 `Ubuntu_Server_Ghost_20251220`。
4. **选择源磁盘**:选中你笔记本的内置硬盘 (通常是 `sda` 或 `nvme0n1`)。
5. **压缩选项**:选择 `-z1p` (默认的高压缩率,适合节省 NAS 空间)。
6. **文件系统检查**:选择 `-sfsck` (跳过检查,节省时间)。
7. **备份后操作**:选择 `Choose` (备份完后让你选重启还是关机)。
---
### 5. 开始克隆 (Ghost 进度条)
1. Clonezilla 会在终端显示一大段确认信息。
2. 输入 **y** 并回车 (确认开始)。
3. 输入 **y** 并回车 (确认再次确认)。
4. **等待**:此时会出现蓝红色的进度条,显示传输速度和剩余时间。
---
### 6. 灾难恢复 (恢复步骤)
如果哪天硬盘坏了,步骤几乎一样,只需在 **第 4 步** 的“具体操作”中:
- 选择 `restoredisk` (还原镜像到磁盘)。
- 选中你存在 NAS 上的那个镜像文件夹。
- 确认后,它会覆盖新硬盘的所有数据,完成后系统即刻复活。

View File

@@ -0,0 +1,205 @@
---
title: Linux 运维必会的 150 个命令,不熟练早晚得出事?
source: https://mp.weixin.qq.com/s/_h2eTqPvduZctE0YarQtWw
author: shenwei
published:
created: 2025-09-29
description: 最全总结
tags: [linux]
---
#linux
Linux 命令是对 Linux 系统进行管理的命令。对于 Linux 系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件, Linux 系统管理的命令是它正常运行的核心,与之前的 DOS 命令类似。
Linux 命令在系统中有两种类型:内置 Shell 命令和 Linux 命令。
| 命令 | 功能说明 |
| ------------------------------- | -------------------------------------------------------------- |
| **线上查询及帮助命令 2 个)** | |
| **man** | 查看命令帮助,命令的词典,更复杂的还有 info但不常用。 |
| **help** | 查看 Linux 内置命令的帮助,比如 cd 命令。 |
| **文件和目录操作命令 18 个)** | |
| **ls** | 全拼 list功能是列出目录的内容及其内容属性信息。 |
| **cd** | 全拼 change directory功能是从当前工作目录切换到指定的工作目录。 |
| **cp** | 全拼 copy其功能为复制文件或目录。 |
| **find** | 查找的意思,用于查找目录及目录下的文件。 |
| **mkdir** | 全拼 make directories其功能是创建目录。 |
| **mv** | 全拼 move其功能是移动或重命名文件。 |
| **pwd** | 全拼 print working directory其功能是显示当前工作目录的绝对路径。 |
| **rename** | 用于重命名文件。 |
| **rm** | 全拼 remove其功能是删除一个或多个文件或目录。 |
| **rmdir** | 全拼 remove empty directories功能是删除空目录。 |
| **touch** | 创建新的空文件,改变已有文件的时间戳属性。 |
| **tree** | 功能是以树形结构显示目录下的内容。 |
| **basename** | 显示文件名或目录名。 |
| **dirname** | 显示文件或目录路径。 |
| **chattr** | 改变文件的扩展属性。 |
| **lsattr** | 查看文件扩展属性。 |
| **file** | 显示文件的类型。 |
| **md5sum** | 计算和校验文件的 MD5 值。 |
| **查看文件及内容处理命令21 个)** | |
| **cat** | 全拼 concatenate功能是用于连接多个文件并且打印到屏幕输出或重定向到指定文件中。 |
| **tac** | tac 是 cat 的反向拼写,因此命令的功能为反向显示文件内容。 |
| **more** | 分页显示文件内容。 |
| **less** | 分页显示文件内容more 命令的相反用法。 |
| **head** | 显示文件内容的头部。 |
| **tail** | 显示文件内容的尾部。 |
| **cut** | 将文件的每一行按指定分隔符分割并输出。 |
| **split** | 分割文件为不同的小片段。 |
| **paste** | 按行合并文件内容。 |
| **sort** | 对文件的文本内容排序。 |
| **uniq** | 去除重复行。oldboy |
| **wc** | 统计文件的行数、单词数或字节数。 |
| **iconv** | 转换文件的编码格式。 |
| **dos2unix** | 将 DOS 格式文件转换成 UNIX 格式。 |
| **diff** | 全拼 difference比较文件的差异常用于文本文件。 |
| **vimdiff** | 命令行可视化文件比较工具,常用于文本文件。 |
| **rev** | 反向输出文件内容。 |
| **grep/egrep** | 过滤字符串,三剑客老三。 |
| **join** | 按两个文件的相同字段合并。 |
| **tr** | 替换或删除字符。 |
| **vi/vim** | 命令行文本编辑器。 |
| **文件压缩及解压缩命令4 个)** | |
| **tar** | 打包压缩。oldboy |
| **unzip** | 解压文件。 |
| **gzip** | gzip 压缩工具。 |
| **zip** | 压缩工具。 |
| **信息显示命令11 个)** | |
| **uname** | 显示操作系统相关信息的命令。 |
| **hostname** | 显示或者设置当前系统的主机名。 |
| **dmesg** | 显示开机信息,用于诊断系统故障。 |
| **uptime** | 显示系统运行时间及负载。 |
| **stat** | 显示文件或文件系统的状态。 |
| **du** | 计算磁盘空间使用情况。 |
| **df** | 报告文件系统磁盘空间的使用情况。 |
| **top** | 实时显示系统资源使用情况。 |
| **free** | 查看系统内存。 |
| **date** | 显示与设置系统时间。 |
| **cal** | 查看日历等时间信息。 |
| **搜索文件命令4 个)** | |
| **which** | 查找二进制命令,按环境变量 PATH 路径查找。 |
| **find** | 从磁盘遍历查找文件或目录。另外搜索公众号GitHub猿后台回复“赚钱”获取一份惊喜礼包。 |
| **whereis** | 查找二进制命令,按环境变量 PATH 路径查找。 |
| **locate** | 从数据库 (/var/lib/mlocate/mlocate.db) 查找命令,使用 updatedb 更新库。 |
| **用户管理命令10 个)** | |
| **useradd** | 添加用户。 |
| **usermod** | 修改系统已经存在的用户属性。 |
| **userdel** | 删除用户。 |
| **groupadd** | 添加用户组。 |
| **passwd** | 修改用户密码。 |
| **chage** | 修改用户密码有效期限。 |
| **id** | 查看用户的 uid,gid 及归属的用户组。 |
| **su** | 切换用户身份。 |
| **visudo** | 编辑 / etc/sudoers 文件的专属命令。 |
| **sudo** | 以另外一个用户身份(默认 root 用户)执行事先在 sudoers 文件允许的命令。 |
| **基础网络操作命令11 个)** | |
| **telnet** | 使用 TELNET 协议远程登录。 |
| **ssh** | 使用 SSH 加密协议远程登录。 |
| **scp** | 全拼 secure copy用于不同主机之间复制文件。 |
| **wget** | 命令行下载文件。 |
| **ping** | 测试主机之间网络的连通性。 |
| **route** | 显示和设置 linux 系统的路由表。 |
| **ifconfig** | 查看、配置、启用或禁用网络接口的命令。 |
| **ifup** | 启动网卡。 |
| **ifdown** | 关闭网卡。 |
| **netstat** | 查看网络状态。 |
| **ss** | 查看网络状态。 |
| **深入网络操作命令9 个)** | |
| **nmap** | 网络扫描命令。 |
| **lsof** | 全名 list open files也就是列举系统中已经被打开的文件。 |
| **mail** | 发送和接收邮件。 |
| **mutt** | 邮件管理命令。 |
| **nslookup** | 交互式查询互联网 DNS 服务器的命令。 |
| **dig** | 查找 DNS 解析过程。 |
| **host** | 查询 DNS 的命令。 |
| **traceroute** | 追踪数据传输路由状况。 |
| **tcpdump** | 命令行的抓包工具。 |
| **有关磁盘与文件系统的命令16 个)** | |
| **mount** | 挂载文件系统。 |
| **umount** | 卸载文件系统。 |
| **fsck** | 检查并修复 Linux 文件系统。 |
| **dd** | 转换或复制文件。 |
| **dumpe2fs** | 导出 ext2/ext3/ext4 文件系统信息。 |
| **dump** | ext2/3/4 文件系统备份工具。 |
| **fdisk** | 磁盘分区命令,适用于 2TB 以下磁盘分区。 |
| **parted** | 磁盘分区命令,没有磁盘大小限制,常用于 2TB 以下磁盘分区。 |
| **mkfs** | 格式化创建 Linux 文件系统。 |
| **partprobe** | 更新内核的硬盘分区表信息。 |
| **e2fsck** | 检查 ext2/ext3/ext4 类型文件系统。 |
| **mkswap** | 创建 Linux 交换分区。 |
| **swapon** | 启用交换分区。 |
| **swapoff** | 关闭交换分区。 |
| **sync** | 将内存缓冲区内的数据写入磁盘。 |
| **resize2fs** | 调整 ext2/ext3/ext4 文件系统大小。 |
| **系统权限及用户授权相关命令4 个)** | |
| **chmod** | 改变文件或目录权限。 |
| **chown** | 改变文件或目录的属主和属组。 |
| **chgrp** | 更改文件用户组。 |
| **umask** | 显示或设置权限掩码。 |
| **查看系统用户登陆信息的命令7 个)** | |
| **whoami** | 显示当前有效的用户名称,相当于执行 id -un 命令。 |
| **who** | 显示目前登录系统的用户信息。 |
| **w** | 显示已经登陆系统的用户列表,并显示用户正在执行的指令。 |
| **last** | 显示登入系统的用户。 |
| **lastlog** | 显示系统中所有用户最近一次登录信息。 |
| **users** | 显示当前登录系统的所有用户的用户列表。 |
| **finger** | 查找并显示用户信息。 |
| **内置命令及其它19 个)** | |
| **echo** | 打印变量,或直接输出指定的字符串 |
| **printf** | 将结果格式化输出到标准输出。 |
| **rpm** | 管理 rpm 包的命令。 |
| **yum** | 自动化简单化地管理 rpm 包的命令。 |
| **watch** | 周期性的执行给定的命令,并将命令的输出以全屏方式显示。 |
| **alias** | 设置系统别名。 |
| **unalias** | 取消系统别名。 |
| **date** | 查看或设置系统时间。 |
| **clear** | 清除屏幕,简称清屏。 |
| **history** | 查看命令执行的历史纪录。 |
| **eject** | 弹出光驱。 |
| **time** | 计算命令执行时间。 |
| **nc** | 功能强大的网络工具。 |
| **xargs** | 将标准输入转换成命令行参数。 |
| **exec** | 调用并执行指令的命令。 |
| **export** | 设置或者显示环境变量。 |
| **unset** | 删除变量或函数。 |
| **type** | 用于判断另外一个命令是否是内置命令。 |
| **bc** | 命令行科学计算器 |
| **系统管理与性能监视命令 (9 个)** | ``` 牛逼啊!接私活必备的 N 个开源项目!赶快收藏 ``` |
| **chkconfig** | 管理 Linux 系统开机启动项。 |
| **vmstat** | 虚拟内存统计。 |
| **mpstat** | 显示各个可用 CPU 的状态统计。 |
| **iostat** | 统计系统 IO。 |
| **sar** | 全面地获取系统的 CPU、运行队列、磁盘 I/O、分页交换区、内存、 CPU 中断和网络等性能数据。 |
| **ipcs** | 用于报告 Linux 中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。 |
| **ipcrm** | 用来删除一个或更多的消息队列、信号量集或者共享内存标识。 |
| **strace** | 用于诊断、调试 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。 |
| **ltrace** | 命令会跟踪进程的库函数调用, 它会显现出哪个库函数被调用。 |
| **关机 / 重启 / 注销和查看系统信息的命令6 个)** | |
| **shutdown** | 关机。 |
| **halt** | 关机。 |
| **poweroff** | 关闭电源。 |
| **logout** | 退出当前登录的 Shell。 |
| **exit** | 退出当前登录的 Shell。 |
| **Ctrl+d** | 退出当前登录的 Shell 的快捷键。 |
| **进程管理相关命令15 个)** | |
| **bg** | 将一个在后台暂停的命令,变成继续执行 (在后台执行)。 |
| **fg** | 将后台中的命令调至前台继续运行。 |
| **jobs** | 查看当前有多少在后台运行的命令。 |
| **kill** | 终止进程。 |
| **killall** | 通过进程名终止进程。 |
| **pkill** | 通过进程名终止进程。 |
| **crontab** | 定时任务命令。 |
| **ps** | 显示进程的快照。 |
| **pstree** | 树形显示进程。 |
| **nice/renice** | 调整程序运行的优先级。 |
| **nohup** | 忽略挂起信号运行指定的命令。 |
| **pgrep** | 查找匹配条件的进程。 |
| **runlevel** | 查看系统当前运行级别。 |
| **init** | 切换运行级别。 |
| **service** | 启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。 |
[[🟠如何判别你的Linux 服务器是 x64也就是 x86_64还是 ARM64]]

View File

@@ -0,0 +1,392 @@
#nas #minio #zipline #docker #synology #n8n #image
```table-of-contents
```
内容覆盖:
1. 架构概念
2. 前置准备DSM 设置)
3. 如何通过 DSM 的 GUI 创建 MinIO / PostgreSQL / Zipline
4. 如何在 MinIO 创建 Bucket 和权限
5. Zipline 初始化与 API Token
6. n8n 如何接入
7. 文件持久化(防止 NAS 重启丢失)
8. 进阶部署选项(可选)
---
# 1. 架构图Synology 专用)
```
[DSM Docker UI]
├── MinIO (9000 API, 9001 Console)
│ └── /volume1/docker/zipline-stack/minio/minio_data
├── PostgreSQL (Zipline DB)
│ └── /volume1/docker/zipline-stack/zipline/pg_data
└── Zipline (暴露 3333)
├── 前端上传 UI
└── n8n API 上传
```
Zipline → MinIOS3 → NAS 存储
![[IMG-20251229190624349.png]]
---
# 2. 前置准备
## 2.1 确保 DSM 已安装
- **Container Manager**DSM 7.2+ 自带,替代 Docker
- **Docker**DSM 7.1 及更早)
## 2.2 创建存储位置目录
DSM → File Station → 创建:
```
/volume1/docker/zipline-stack/minio/minio_data
/volume1/docker/zipline-stack/zipline/pg_data
```
---
## 2.3 **docker-compose.yml可直接复制**
``` bash
version: "3.9"
services:
minio:
image: minio/minio:latest
container_name: minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: Abcd_1234
ports:
- "9000:9000"
- "9001:9001"
volumes:
# 保留你精心组织的绝对路径
- /volume1/docker/zipline-stack/minio/minio_data:/data
restart: unless-stopped
deploy:
resources:
limits:
# [已移除 CPU 限制以修复报错]
memory: 1G
reservations:
memory: 256M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
postgres:
image: postgres:16
container_name: zipline_postgres
environment:
POSTGRES_USER: zipline
POSTGRES_PASSWORD: zipline
POSTGRES_DB: zipline
volumes:
# 保留你精心组织的绝对路径
- /volume1/docker/zipline-stack/zipline/pg_data:/var/lib/postgresql/data
restart: unless-stopped
deploy:
resources:
limits:
# [已移除 CPU 限制以修复报错]
memory: 512M
healthcheck:
test: ["CMD-SHELL", "pg_isready -U zipline"]
interval: 10s
timeout: 5s
retries: 5
zipline:
image: ghcr.io/diced/zipline:latest
container_name: zipline
depends_on:
minio:
condition: service_healthy
postgres:
condition: service_healthy
environment:
DATABASE_URL: postgres://zipline:zipline@postgres:5432/zipline
CORE_SECRET: 22d5d3159d5ed51743bc8c8ef007f836
ZPLINE_ADMIN_USERNAME: admin
ZPLINE_ADMIN_PASSWORD: Abcd_1234
STORAGE_ENGINE: s3
S3_BUCKET: zipline-bucket
S3_ENDPOINT: http://minio:9000
S3_ACCESS_KEY: admin
S3_SECRET_KEY: Abcd_1234
S3_REGION: us-east-1
S3_FORCE_PATH_STYLE: "true"
PORT: 3000
ports:
- "3333:3000"
restart: unless-stopped
deploy:
resources:
limits:
# [已移除 CPU 限制以修复报错]
memory: 512M
```
---
# 3. 你需要初始化 MinIO bucket一次性
进入 MinIO 控制台(浏览器):
```
http://192.168.3.17:9001/login
```
登录 → 创建 S3 Bucket
```
zipline-bucket
```
设置为 public否则图片无法直接访问
- Buckets → zipline-bucket → _Access Rules_ →
Policy: **public read**
## 正确设置 Public BucketCE 下可行方案)
### 方法 :使用 `mc` 命令行(推荐)
1. 下载 MinIO CLI `mc` 到你的 DSM 或本地 PC
```
wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc
```
2. 添加 alias
```
mc alias set local http://192.168.3.17:9000 admin StrongPasswordHere
```
3. 创建 public-read bucket
```
mc mb local/zipline-bucket
```
4. 赋予匿名读写权限:
```
mc anonymous set public local/zipline-bucket
```
5. 测试:
```
mc ls local/zipline-bucket
```
现在这个 bucket 的对象就可以**被公开访问**了。
#### a、`mc`MinIO Client文档 &命令参考
- `mc anonymous` 命令管理匿名unauthenticated访问策略。 [min.io+2min.io+2](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous.html?utm_source=chatgpt.com)
- 支持子命令(`get` / `list` / `set` / `set-json` 等): [min.io](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous.html?utm_source=chatgpt.com)
- `mc anonymous set` 语法(设置预定义策略):`none`, `download`, `upload`, `public` 四种选项可用。 [min.io+2min-io.cn+2](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html?utm_source=chatgpt.com)
- `mc anonymous set-json`:可以提供一个自定义的 IAM JSON policy 来配置更细粒度权限。 [min.io](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set-json.html?utm_source=chatgpt.com)
- `mc anonymous list`:查看某个 bucket 或前缀的匿名策略。 [min.io](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-list.html?utm_source=chatgpt.com)
#### b、可以设置的权限类型匿名访问策略
- `download`只允许匿名用户下载对象GET 操作)。 [min.io+1](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html?utm_source=chatgpt.com)
- `upload`只允许匿名用户上传对象PUT 操作)。 [min.io+1](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html?utm_source=chatgpt.com)
- `public`:既允许上传,也允许下载(等于读写权限)。 [min-io.cn+1](https://min-io.cn/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html?utm_source=chatgpt.com)
- `none`:禁用匿名访问(恢复私有)。 [min.io](https://min.io/docs/minio/linux/reference/minio-mc/mc-anonymous-set.html?utm_source=chatgpt.com)
#### c、使用示例
假设你的 MinIO alias 是 `local`bucket 名为 `mybucket`,你想:
- **设置 public读写权限**
`mc anonymous set public local/mybucket`
- **设置只读(下载)权限**
`mc anonymous set download local/mybucket`
- **设置只写(仅上传)权限**
`mc anonymous set upload local/mybucket`
- **禁用匿名访问**
`mc anonymous set none local/mybucket`
---
# 4. Zipline 初始化
访问:
``` bash
http://192.168.3.17:3333/dashboard
```
首次登陆使用:
- Username: `admin`
- Password: 你在 docker-compose的environment 中设置的
> [!NOTE] Docker Compose Environment Settings:
> S3_ACCESS_KEY: admin
> S3_SECRET_KEY: Abcd_1234
然后你可以:
- 生成 API Token给 n8n
- 设置上传规则
- 配置返回 URL默认即可
---
# 5. n8n 调用 Zipline 上传示例(最小可用)
https://zipline.diced.sh/docs/api
https://zipline.diced.sh/docs/api/upload
---
# 6. 性能分析NAS 场景)
| 项目 | MinIO | Zipline |
| -------- | ---------------- | ----------------------- |
| 存储性能 | 只受 NAS 硬盘/SSD 限制 | 仅处理 metadata |
| 并发 | 高S3 原生并行) | 中等(单 Node.js 进程) |
| 数据库 | 无(内置 KV | PostgreSQL/SQLite需要 DB |
| 扩展性 | 可横向扩容 | 单实例 → 前端微服务即可 |
| REST API | 完备 | 完备(适合 n8n |
# 7. 备份策略
这是一个涉及**分布式存储系统一致性**的经典运维话题。由于 Zipline 将元数据存在 Postgres将文件实体存在 MinIO你的备份方案必须确保这两者在时间点上是尽可能一致的。
针对 Synology NAS 环境,我为你设计了两种方案。考虑到你的技术背景,我强烈推荐**热备份 + 增量归档**,这是企业级运维的标准做法。
## 核心挑战:由于“脑体分离”导致的一致性问题
- **大脑 (Postgres)**记录了“文件A的ID是123位于MinIO的/bucket/a.jpg”。
- **身体 (MinIO)**:实际存储了 `a.jpg`。
- **风险**:如果你在 10:00 备份了数据库10:05 备份了 MinIO但这 5 分钟内你上传了新文件,恢复时就会出现“数据库找不到文件”或“文件没记录”的幽灵数据。
---
## 方案:基于脚本的逻辑热备份
这种方案利用数据库自带的工具导出数据,结合文件系统的增量备份。
### 1. 工作原理
1. **数据库**:不停止服务,使用 `pg_dump` 命令将 Postgres 内存中的数据导出为一个 `.sql` 文件。这是“逻辑备份”。
2. **MinIO**MinIO 的数据存储在物理磁盘上就是普通文件。
3. **归档**:使用 Synology Hyper Backup 将 `.sql` 文件和 `MinIO 数据目录` 一起备份到远端云端、USB 硬盘或其他 NAS
### 2. 利弊分析
- **优点**
- **零停机**:服务全程在线,不影响业务。
- **数据安全**`pg_dump` 导出的 SQL 文件是纯文本,不依赖特定的 Postgres 版本或 CPU 架构x86/ARM**迁移能力极强**。
- **原生支持**:完美契合 Synology Hyper Backup 的增量备份机制。
- **缺点**
- **微小的不一致性**:如果在导出 SQL 的几秒钟内恰好有文件上传,可能存在极小的时间差(对于个人/中小企业可忽略)。
- **配置门槛**:需要编写一个简单的 Shell 脚本。
### 3. 实施步骤
**第一步:创建备份存放目录** 在你的 NAS 上创建一个专门存放数据库备份文件的目录,例如: `/volume1/docker/zipline-stack/backups`
**第二步:编写自动备份脚本** 我为你写好了一个健壮的脚本,包含日志记录和旧备份自动清理功能。
请在 NAS 上创建一个文件,例如 `/volume1/docker/zipline-stack/backup_script.sh`,内容如下:
Bash
``` bash
#!/bin/bash
# ================= 配置区域 =================
# 备份保存路径
BACKUP_DIR="/volume1/docker/zipline-stack/backups"---
title: 1. 架构图Synology 专用)
author: shenwei
tags: [docker, image, minio, n8n, nas, synology, zipline]
---
---
title: 1. 架构图Synology 专用)
source:
author: shenwei
published:
created:
description:
tags: [docker, image, minio, n8n, nas, synology, zipline]
---
# Postgres 容器名称 (需与 docker-compose.yml 一致)
PG_CONTAINER="zipline_postgres"
# 数据库用户和名称
PG_USER="zipline"
PG_DB="zipline"
# 保留多少天的备份
RETENTION_DAYS=30
# 当前日期
DATE=$(date +%Y%m%d_%H%M%S)
# ================= 执行逻辑 =================
mkdir -p "$BACKUP_DIR"
echo "[$DATE] 开始备份 Postgres..."
# 1. 执行 pg_dump 导出数据库 (压缩格式)
# 注意:这里不直接备份 /var/lib/postgresql/data 目录,因为热备份该目录会导致数据损坏
docker exec "$PG_CONTAINER" pg_dump -U "$PG_USER" -d "$PG_DB" | gzip > "$BACKUP_DIR/db_$DATE.sql.gz"
if [ $? -eq 0 ]; then
echo "[$DATE] 数据库备份成功: db_$DATE.sql.gz"
else
echo "[$DATE] !!! 数据库备份失败 !!!"
exit 1
fi
# 2. 清理旧备份 (删除超过 30 天的文件)
find "$BACKUP_DIR" -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "[$DATE] 已清理超过 $RETENTION_DAYS 天的旧备份"
# 3. (可选) 如果你想在这里也把 MinIO 打包,可以用 tar但建议交给 Hyper Backup 处理
# echo "MinIO 数据量较大,建议由 Synology Hyper Backup 直接备份 minio_data 目录"
echo "[$DATE] 备份流程结束。"
```
**第三步:设置脚本权限** SSH 进入 NAS给脚本执行权限
Bash
``` bash
chmod +x /volume1/docker/zipline-stack/backup_script.sh
```
**第四步:配置 Synology 任务计划 (Task Scheduler)**
1. 打开 DSM 控制面板 -> **任务计划**。
2. 新增 -> **计划的任务** -> **用户定义的脚本**。
3. **常规**:用户账号选择 `root` (必须,否则无法操作 Docker)。
4. **计划**:建议每天凌晨 3:00 执行。
5. **任务设置** -> 用户定义的脚本框中填入:
Bash
``` bash
bash /volume1/docker/zipline-stack/backup_script.sh >> /volume1/docker/zipline-stack/backup.log 2>&1
```
![[IMG-20251229190624937.png]]
![[IMG-20251229190625061.png]]
![[IMG-20251229190625079.png]]
**第五步:配置 Synology Hyper Backup** 这是最后一道防线。
1. 打开 **Hyper Backup**。
2. 创建一个新的数据备份任务。
3. **选择备份源**
- 勾选 `/volume1/docker/zipline-stack/backups` (这里有刚才脚本生成的数据库 SQL)。
- 勾选 `/volume1/docker/zipline-stack/minio/minio_data` (这是图片实体文件)。
4. 设置备份目的地USB、另一台 NAS 或 Synology C2 云)。
![[IMG-20251229190625099.png]]
![[IMG-20251229190625117.png]]
# Reference URL
- Docker Volume Documentation: [https://docs.docker.com/storage/volumes/](https://docs.docker.com/storage/volumes/)
- MinIO Docker Persistence: [https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html](https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html)
- Synology Docker Permissions Advice: [https://kb.synology.com/en-global/DSM/tutorial/How_to_manage_ACL_settings_on_your_Synology_NAS](https://kb.synology.com/en-global/DSM/tutorial/How_to_manage_ACL_settings_on_your_Synology_NAS)
- MinIO mc anonymous https://docs.min.io/enterprise/aistor-object-store/reference/cli/mc-anonymous/

View File

@@ -0,0 +1,101 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [database, mariadb, mysql, nas]
---
#nas #mysql #database #mariadb
```table-of-contents
```
## Internal Access
| IP | 192.168.3.17 |
| -------- | ------------ |
| Port | 3307 |
| Username | shenwei |
| Password | !Abcde12345 |
| Username | root |
| Password | !Abcde12345 |
## Public Access
| Domain | mysql.ishenwei.online |
| -------- | --------------------- |
| Port | 63307 |
| Username | shenwei |
| Password | !Abcde12345 |
| Username | root |
| Password | !Abcde12345 |
## MariaDB新安装后需要强制创建一个用户用于远程访问非本机IP访问本机IP访问仅限root用户
进入 MariaDB使用 socket 登陆):
```
sudo mysql -u root -p -S /run/mysqld/mysqld10.sock
```
查看 root 主机权限:
``` sql
select host, user from mysql.user;
```
``` bash
shenwei@SHENWEI_DS718:/usr/local/mariadb10/etc/mysql$ sudo mysql -u root -p -S /run/mysqld/mysqld10.sock
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.11.6-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> select host, user from mysql.user;
+-----------+-------------+
| Host | User |
+-----------+-------------+
| | PUBLIC |
| localhost | mariadb.sys |
| localhost | mysql |
| localhost | root |
+-----------+-------------+
4 rows in set (0.002 sec)
```
这里已经看到关键问题了:
**你的 MariaDB 只有 `root@localhost`,并没有 `root@%` 或你要连接用的用户账号**。
而从你外部客户端连接失败的最常见原因就是:**没有对应的 Host/User 组合 + 缺少权限**。
你现在的 `mysql.user` 内容:
``` bash
| | PUBLIC |
| localhost | mariadb.sys |
| localhost | mysql |
| localhost | root |
```
这里唯一能用的账号就是:
- `root@localhost` → **只能从本机 localhost 登录**
这意味着从 **Synology Docker、其他机器、同网段的客户端** 都不能用 root 连接。
## 创建一个允许远程访问的用户
``` sql
CREATE USER 'shenwei'@'%' IDENTIFIED BY '!Abcde12345';
GRANT ALL PRIVILEGES ON *.* TO 'shenwei'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

View File

@@ -0,0 +1,121 @@
---
title: NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器
source: https://www.appinn.com/nodewarden/
author: shenwei
published: 2026-02-22
created: 2026-02-27
description: 部署 NodeWarden 之后的效果,就是在无服务器的情况下,也能在手机、电脑上使用 Bitwarden 客户端来保存密码了,支持自动登陆、二次验证之类的功能。
tags: []
---
Bitwarden 是少数客户端与服务器端都开源的密码管理系统,支持完整自托管部署。@ [Appinn](https://www.appinn.com/nodewarden/)
但有人更进一步:直接把服务器端运行在 Cloudflare Workers 上——也就是说,你连 VPS 都可以省了。
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 1](https://www.appinn.com/wp-content/uploads/2026/02/cover-1771765613977-1.jpg)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 1
部署 NodeWarden 之后的效果,就是在无服务器的情况下,也能在手机、电脑上使用 Bitwarden 客户端来保存密码了,支持自动登陆、二次验证之类的功能。
## NodeWarden 与 Bitwarden 区别
| 能力项 | Bitwarden | NodeWarden | 说明 |
| --- | --- | --- | --- |
| 单用户保管库(登录/笔记/卡片/身份) | ✅ | ✅ | 基于Cloudflare D1 |
| 文件夹 / 收藏 | ✅ | ✅ | 常用管理能力可用 |
| 全量同步 `/api/sync` | ✅ | ✅ | 已做兼容与性能优化 |
| 附件上传/下载 | ✅ | ✅ | 基于 Cloudflare R2 |
| 导入功能 | ✅ | ✅ | 覆盖常见导入路径 |
| 网站图标代理 | ✅ | ✅ | 通过 `/icons/{hostname}/icon.png` |
| passkey、TOTP | ❌ | ✅ | 官方需要会员,我们的不需要 |
| 多用户 | ✅ | ❌ | NodeWarden 定位单用户 |
| 组织/集合/成员权限 | ✅ | ❌ | 没必要实现 |
| 登录 2FATOTP/WebAuthn/Duo/Email | ✅ | ⚠️ 部分支持 | 仅支持 TOTP通过 `TOTP_SECRET` |
| SSO / SCIM / 企业目录 | ✅ | ❌ | 没必要实现 |
| Send | ✅ | ❌ | 基本没人用 |
| 紧急访问 | ✅ | ❌ | 没必要实现 |
| 管理后台 / 计费订阅 | ✅ | ❌ | 纯免费 |
| 推送通知完整链路 | ✅ | ❌ | 没必要实现 |
## 必要条件
1. 你需要有一个 Cloudflare 账号(必须有一个域名和信用卡)
2. 一个 GitHub 账号
## 具体部署步骤
### fork
- GitHub [https://github.com/shuaiplus/NodeWarden](https://github.com/shuaiplus/NodeWarden)
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 2](https://www.appinn.com/wp-content/uploads/2026/02/Screenshot-2026-02-22-13.31.48@2x.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 2
### 一键部署
在你自己的 GitHub 页面上,有一个按钮:
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 3](https://www.appinn.com/wp-content/uploads/2026/02/Screenshot-2026-02-22-13.33.59@2x.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 3
这个步骤需要在 Cloudflare 中绑定 GitHub 账号,根据页面提示即可。
### 设置 NodeWarden
部署成功之后Cloudflare 会提供一个临时地址,类似 1nodewarden.apipnn.workers.dev ,用浏览器打开它,如果打不开,就绑定一个你自己的二级域名。
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 4](https://www.appinn.com/wp-content/uploads/2026/02/Screenshot-2026-02-22-13.16.13@2x.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 4
根据页面提示,一步一步进行即可。
这个步骤主要有:
1. 设置 JWT\_SECRET
2. 设置自动更新 GitHub
3. 设置主账号与密码
4. 设置启用主账号的二次验证
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 5](https://www.appinn.com/wp-content/uploads/2026/02/Screenshot-2026-02-22-13.19.12@2x.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 5
最后一步成功之后,还能选择彻底隐藏这个设置页面:
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 6](https://www.appinn.com/wp-content/uploads/2026/02/Screenshot-2026-02-22-13.21.04@2x.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 6
设置完成。
## 在客户端登录
打开你的 Bitwarden 官方客户端,在登录的地方选择自托管,并输入 **服务器 URL**
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 7](https://www.appinn.com/wp-content/uploads/2026/02/IMG_1461.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 7
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 8](https://www.appinn.com/wp-content/uploads/2026/02/%E6%88%AA%E5%B1%8F-2026-02-22-21.44.16.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 8
之后,在使用刚刚设置页面设置的用户名和密码(如果设置了二次验证,还会要求输入验证码),就可以正常登录啦:
![NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 9](https://www.appinn.com/wp-content/uploads/2026/02/%E6%88%AA%E5%B1%8F-2026-02-22-21.48.13.avif)
NodeWarden - 把 Bitwarden 搬上 Cloudflare Workers彻底告别服务器 9
趁假期最后一天,快去试试吧。
---
原文https://www.appinn.com/nodewarden/
## 我的NodeWarden
https://nodewarden.ishenwei.online/
![[IMG-20260228191730714.png]]

View File

@@ -0,0 +1,24 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [clash, merlin-clash, rax50]
---
#rax50 #merlin-clash #clash
![[IMG-20260304185325682.png]]
进入RAX50路由器管理界面
在RAX50的Merlin Clash界面复制vless url进到小白一键订阅助手并重命名配置文件比如 kiwi3
![[IMG-20260304185325726.png]]
选择新建的配置文件
点保存&启动
如果不行,就再点一次快速重启
![[IMG-20260304185325770.png]]

View File

@@ -0,0 +1,111 @@
---
title: 启动 SSH 服务
source:
author: shenwei
published:
created:
description:
tags: [ssh, ubuntu]
---
#ubuntu #ssh
在 Ubuntu 24.04 中开启 SSH 服务非常简单,但这个版本引入了一个重要的变化:**默认使用 `ssh.socket` 激活机制**(即只有在连接请求进入时才启动 SSH 守护进程),这与旧版本略有不同。
以下是开启 SSH 的标准步骤:
### 1. 安装 OpenSSH Server
首先,你需要确保系统中安装了 SSH 服务端。打开终端并输入:
Bash
```
sudo apt update
sudo apt install openssh-server -y
```
---
### 2. 启动并设置开机自启
在 Ubuntu 24.04 中,你可以使用以下命令来确保服务处于活动状态并随系统启动:
Bash
```
# 启动 SSH 服务
sudo systemctl start ssh
# 设置开机自启
sudo systemctl enable ssh
```
> **注意:** 如果你发现 `systemctl status ssh` 显示服务未运行别担心。24.04 默认使用 **Socket 激活** 模式。你可以通过 `sudo systemctl status ssh.socket` 检查监听状态。
---
### 3. 配置防火墙 (UFW)
如果你的 Ubuntu 开启了防火墙,你需要手动允许 SSH 流量(默认端口 22
Bash
```
sudo ufw allow ssh
# 或者
sudo ufw allow 22/tcp
```
---
### 4. 验证 SSH 状态
你可以通过以下命令检查 SSH 是否已经准备就绪:
Bash
```
sudo systemctl status ssh
```
如果看到 `active (running)` 或者 `ListenStream=22` (针对 socket 模式),说明已经成功开启。
---
### 5. 如何从远程连接
在另一台电脑上,使用你的**用户名**和**局域网 IP** 进行连接:
Bash
```
ssh username@192.168.x.x
```
_(如果你不知道本机 IP请使用前面提到的 `hostname -I` 命令查看)_
---
### 进阶建议24.04 的特殊说明
如果你习惯了旧版本的管理方式,或者需要修改**自定义端口**(例如改为 2222在 24.04 中你可能需要注意:
- **修改端口:** 现在推荐通过 `sudo systemctl edit ssh.socket` 来修改监听端口,而不仅仅是修改 `/etc/ssh/sshd_config`
- **切换回传统模式:** 如果你希望 SSH 像以前一样一直作为后台进程运行,可以执行:
Bash
```
sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service
```
你想了解如何为 SSH 配置密钥登录以提高安全性吗?
---
[How to Enable SSH on Ubuntu 24.04](https://www.youtube.com/watch?v=F1_fkOYgu8g) 这个视频详细演示了在 Ubuntu 系统中从安装 OpenSSH 到通过防火墙配置的完整操作流程,非常适合新安装系统的用户参考。

View File

@@ -0,0 +1,284 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, proxychains, ubuntu, v2rayn]
---
#ubuntu #proxychains #docker #v2rayn
```table-of-contents
```
## 安装V2RayN
请参考以下文章来安装V2RayN
[[🟠3X-UI Xray on BandwagonVPS]]
[[🟠安装v2rayN]]
![[IMG-20251229190624376.png]]
## 验证代理可以科学上网
### 使用 `curl` 直接测试(最推荐)
这是最快、最直接的方法。我们可以强制 `curl` 使用 SOCKS5 代理去访问 Google 的状态页。
**执行命令:**
Bash
```
curl -x socks5h://127.0.0.1:10808 -v https://www.google.com
```
- **参数解释:**
- `-x socks5h://`:指定使用 SOCKS5 代理。注意加个 `h`,这表示让代理服务器去解析域名(防止本地 DNS 污染导致测试失败)。
- `-v`(Verbose) 显示详细连接过程。
- **判断标准:**
- 如果看到 `HTTP/2 200` 或者大量的 HTML 文本,说明**代理成功**。
- 如果显示 `Connection refused` 或 `Timeout`,说明**端口未开放或 V2Ray 未运行**。
## 配置 ProxyChains
ProxyChains 是最灵活的工具,它可以让原本不支持代理的终端命令通过代理运行。
1. **编辑配置文件:**
```
sudo nano /etc/proxychains4.conf
```
(如果是旧版本可能是 `/etc/proxychains.conf`)
2. 修改 ProxyList
滑动到文件末尾,注释掉默认的 socks4添加你的 V2Ray 节点信息:
```
[ProxyList]
# 格式: 类型 IP 端口
socks5 127.0.0.1 10808
```
3. 使用方法:
在任何命令前加上 proxychains4 即可。例如:
```
proxychains4 curl https://www.google.com
``````
使用:
``` bash
proxychains git clone https://github.com/...
proxychains curl https://google.com
```
## 2. 配置 Git 代理
Git 不会自动走系统变量,建议为其设置全局配置。
- **设置 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 --unset http.proxy
git config --global --unset https.proxy
```
---
## 3. 配置 Docker Pull (Daemon 代理)
`docker pull` 是由 Docker 守护进程Daemon执行的它不读取普通用户的环境变量。
1. **创建配置目录:**
Bash
```
sudo mkdir -p /etc/systemd/system/docker.service.d
```
2. **创建代理配置文件:**
Bash
```
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
```
3. **添加以下内容:**
Ini, TOML
```
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10808/"
Environment="HTTPS_PROXY=http://127.0.0.1:10808/"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporate.com"
```
_(注:这里通常使用 HTTP 代理端口)_
4. **重启 Docker 服务:**
```
sudo systemctl daemon-reload
sudo systemctl restart docker
```
**检查 Docker 守护进程是否加载了代理:**
**执行命令:**
```
docker info | grep -i proxy
```
- **预期输出:** 如果你配置成功,你应该能看到类似下面的信息:
```
HTTP Proxy: http://127.0.0.1:10808
HTTPS Proxy: http://127.0.0.1:10808
No Proxy: localhost,127.0.0.1
```
_(注:如果这里没有输出,说明 `/etc/systemd/system/docker.service.d/http-proxy.conf` 配置未生效,请记得执行 `systemctl daemon-reload` 和 `systemctl restart docker`)_
---
## 4. 配置 Docker 容器内应用代理
#### docker-compose.yml里面直接加 env
```
`environment:
- ALL_PROXY=socks5://172.24.0.1:10808
```
For example:gi
```
version: "3.9"
services:
homarr:
image: ghcr.io/homarr-labs/homarr
container_name: homarr
restart: unless-stopped
ports:
- "7575:7575"
volumes:
- /home/shenwei/Docker/homarr/appdata:/appdata
- /var/run/docker.sock:/var/run/docker.sock
environment:
- SECRET_ENCRYPTION_KEY=4a418def4be700be26672aa57a4c3d4b94abd2cf97021b5c4ecd3c1644c1f071
- ALL_PROXY=socks5://172.24.0.1:10808
```
2个方法知道如何获取docker network gate IP
1. Docker Portainer
![[IMG-20251229190624729.png]]
2. 获取运行时container的network gateway
适用于容器已经在运行的情况。进入容器的交互式 shell
```
docker exec -it <container_name_or_id> /bin/bash
```
- 如果容器没有 `bash`,可以用 `sh`
```
docker exec -it <container_name_or_id> sh
```
运行以下命令获取network gateway IP:
```
ip route | awk '/default/ { print $3 }'
```
For example:
``` bash
root@shenwei-HP-ZBook-01:/home/shenwei/Docker/homarr# docker exec -it homarr /bin/bash
23c94b2dfeb5:/app# ip route
default via 172.24.0.1 dev eth0
172.24.0.0/16 dev eth0 scope link src 172.24.0.2
23c94b2dfeb5:/app# ip route | awk '/default/ { print $3 }'
172.24.0.1
```
如果你希望容器内部的程序(如 `apt-get``pip`)能上网,有两种方案:
### 方案 A全局配置推荐 Docker 17.07+
修改当前用户的 Docker 客户端配置文件,这样所有 `docker run` 的容器都会自动带上代理环境变量。
1. **编辑配置文件:**
Bash
```
mkdir -p ~/.docker
nano ~/.docker/config.json
```
2. **添加内容:**
JSON
```
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:1081",
"httpsProxy": "http://127.0.0.1:1081",
"noProxy": "localhost,127.0.0.1"
}
}
}
```
**注意:** 如果你的容器使用的是 `bridge` 网络,`127.0.0.1` 指向的是容器内部。你需要将 IP 改为宿主机的虚拟网桥 IP通常是 `172.17.0.1`)。
### 方案 B运行时临时指定
在启动容器时通过 `-e` 参数注入环境变量:
Bash
```
docker run -e HTTP_PROXY="http://宿主机IP:1081" -e HTTPS_PROXY="http://宿主机IP:1081" my_image
```
---
## 总结建议
|**场景**|**推荐方式**|
|---|---|
|**临时终端命令**|`proxychains4 <command>`|
|**Git 操作**|`git config --global`|
|**下载 Docker 镜像**|修改 `systemd/system/docker.service.d`|
|**容器内部业务**|修改 `~/.docker/config.json`|
如果你在配置过程中遇到“连接被拒绝 (Connection Refused)”的问题,请检查 V2Ray 配置文件中是否开启了 HTTP 代理协议,并确认端口号是否正确。

View File

@@ -0,0 +1,361 @@
#ubuntu #rsync #backup #nas
```table-of-contents
```
既然你已经完成了 **Clonezilla** 的整机镜像备份,现在引入 **rsync** 实现日常的增量备份是构建“工作室级”数据保护体系的最后一步。
作为技术背景深厚且需要管理 TikTok 业务数据的用户rsync 的优势在于它可以**不关机**运行,并且只传输**变化过**的文件。
### 1. 核心逻辑与准备
**目标**:将 Ubuntu 服务器的实时数据代码、Docker 配置、业务数据)增量同步到已经挂载好的 NAS 目录(`/mnt/nas_backup`)。
**挂载检查** 在开始前,请确保你的 NAS 已经挂载成功(你之前提到 Samba 挂载已经成功):
Bash
```
df -h | grep nas_backup
```
_如果输出显示了 NAS 的 IP 和空间信息则可以继续。_
### 2. 编写 Rsync 自动化脚本
不要直接在命令行输入长命令,建议创建一个专门的脚本。
**创建脚本文件**
Bash
```
sudo nano /usr/local/bin/rsync_backup.sh
```
**粘贴以下内容(已根据你的 ZBook 环境优化)**
> [!NOTE] 此为最终可运行版本
``` bash
#!/bin/bash
LOCKFILE="/tmp/rsync_backup.lock"
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
echo "备份任务已在运行中,跳过本次执行。"
exit
fi
echo $$ > ${LOCKFILE}
trap "rm -f ${LOCKFILE}" EXIT
# --- 配置区 ---
MOUNT_POINT="/mnt/nas_backup"
DATE=$(date +%Y-%m-%d)
DEST="$MOUNT_POINT/docker_backups/$DATE"
LOG="/var/log/rsync_backup.log"
# --- 1. 挂载检查 ---
if ! mountpoint -q "$MOUNT_POINT"; then
echo "$(date): [错误] NAS 未挂载" >> "$LOG"
exit 1
fi
mkdir -p "$DEST"
# --- 2. 执行精确备份 ---
echo "--- 开始备份 Docker 数据: $(date) ---" >> "$LOG"
# 优化后的参数:
# -v: 显示详情 (方便初次调试)
# --exclude: 排除 Python 虚拟环境、__pycache__ 和 git 目录
rsync -azR --delete \
--exclude="venv/" \
--exclude=".venv/" \
--exclude="**/__pycache__/" \
--exclude=".git/" \
/var/lib/docker/volumes/ \
/etc/docker/ \
/home/shenwei/Docker/ \
"$DEST/" >> "$LOG" 2>&1
# --- 3. 状态检查 ------
title: --- 配置区 ---
author: shenwei
tags: [backup, nas, rsync, ubuntu]
---
---
title: --- 配置区 ---
source:
author: shenwei
published:
created:
description:
tags: [backup, nas, rsync, ubuntu]
---
# rsync 返回 23 表示部分文件由于权限或消失未传输,这在备份正在运行的系统时常见。
# 我们重点看是否大部分数据已同步。
if [ $? -eq 0 ] || [ $? -eq 23 ] || [ $? -eq 24 ]; then
echo "--- 备份完成: $(date) ---" >> "$LOG"
else
echo "--- 备份异常中止,错误码: $? ---" >> "$LOG"
fi
```
**赋予执行权限**
Bash
```
sudo chmod +x /usr/local/bin/rsync_backup.sh
```
### 3. 设置定时任务 (Crontab)
作为跨境电商业务,建议在凌晨 3 点(业务低峰期)执行自动备份。
1. **打开定时任务配置**
Bash
```
sudo crontab -e
```
2. **在文件末尾添加一行**
Plaintext
```
0 3 * * * /usr/local/bin/rsync_backup.sh
```
_这代表每天 03:00 自动运行备份脚本。_
### 4. 关键点Docker 数据的备份
由于你使用了大量自动化技术支持 TikTok 业务,**Docker 卷Volumes** 是最核心的数据。
- **路径**:默认在 `/var/lib/docker/volumes`。
- **一致性**:如果备份的是数据库(如 MySQL建议在脚本开头加入 `docker exec <容器名> mysqldump ...` 导出 SQL 文件,再由 rsync 同步。因为直接同步正在写入的二进制数据库文件可能导致恢复后无法启动。
### 5. 如何在灾难时还原?
- **单个文件丢失**:直接去 `/mnt/nas_backup/daily_sync` 下通过 `cp` 或 `rsync` 拷贝回来。
- **系统崩溃但能进 SSH**:反向执行 rsync 命令:
Bash
```
# 注意路径顺序颠倒
sudo rsync -aAXz /mnt/nas_backup/daily_sync/ /
```
- **硬盘彻底坏了**:先用你之前的 **Clonezilla** 镜像恢复整个系统,然后用 **rsync** 将最新的增量数据同步回来,即可实现“时间点恢复”。
### 💡 建议
鉴于你对技术细节的关注,你可以尝试运行一次手动备份来测试性能:
Bash
```
sudo nohup /usr/local/bin/rsync_backup.sh > /dev/null 2>&1 &
```
然后查看日志:`tail -f /var/log/rsync_backup.log`。
### 5. 如何实现NFS永久挂载
在 Linux 系统中,手动执行的 `mount` 命令是**临时性**的,重启后内核会重置所有挂载状态。要实现开机自动挂载,必须将配置写入系统的文件系统表文件 `/etc/fstab`。
由于你使用的是 **NFS** 协议,且考虑到笔记本在启动时网络初始化可能略慢于磁盘挂载,我们需要加入一些特定的参数来确保稳定性。
#### 1. 准备凭据(可选但推荐)
NFS 通常基于 IP 授权,不需要账号密码。如果你之前确认过手动挂载 `sudo mount -t nfs 192.168.3.17:/volume2/backup /mnt/nas_backup` 成功且无需密码,可以跳过此步。
#### 2. 修改 /etc/fstab 实现永久挂载
1. **备份原文件**(作为资深管理者,备份配置是标准操作):
Bash
```
sudo cp /etc/fstab /etc/fstab.bak
```
2. **编辑文件**
Bash
```
sudo nano /etc/fstab
```
3. **在文件末尾添加以下一行**
Plaintext
```
192.168.3.17:/volume2/backup /mnt/nas_backup nfs defaults,timeo=900,retrans=5,_netdev 0 0
```
#### 参数详解:
- **`defaults`**: 使用默认的挂载参数rw, suid, dev, exec, auto, nouser, async
- **`timeo=900`**: 设置超时时间为 90 秒(单位是 1/10 秒)。
- **`retrans=5`**: 如果超时,尝试重连 5 次。
- **`_netdev`**: **关键参数**。告诉系统这是一个网络设备,务必等到网络服务完全启动后再尝试挂载,防止开机过程因找不到网络而卡死。
---
#### 3. 测试配置(非常重要)
**千万不要直接重启!** 如果 `/etc/fstab` 写错了,系统可能无法正常启动。
执行以下命令验证:
Bash
```
# 1. 先卸载当前的挂载(如果当前还挂着的话)
sudo umount /mnt/nas_backup
# 2. 模拟开机自动挂载
sudo mount -a
# 3. 检查是否挂载成功
df -h | grep nas_backup
```
**如果 `sudo mount -a` 没有报错,且 `df` 能看到 NAS 空间,那么以后重启服务器,挂载都会自动生效。**
---
#### 4. 进阶:针对 Rsync 脚本的安全保护
在你的 `rsync` 脚本(`/usr/local/bin/rsync_backup.sh`)开头,建议加入一个**挂载检查**。防止在 NAS 掉线或由于某种原因挂载失败时,`rsync` 把备份数据写到了本地硬盘的挂载点目录(会导致笔记本硬盘迅速爆满)。
在脚本的配置区下方加入这段逻辑:
Bash
```
# 检查挂载点是否是一个有效的挂载
if ! mountpoint -q /mnt/nas_backup; then
echo "错误NAS 未挂载,备份任务取消!" >> /var/log/rsync_backup.log
# 在这里可以加入发送通知给你的逻辑
exit 1
fi
```
---
#### 5. 常见问题:重启后仍然失效?
如果在执行了上述操作后重启依然不生效,通常是因为 Ubuntu 的 `nfs-common` 服务启动慢于 `mount -a` 的执行。
- **对策**:你可以启动 `Remote File Systems` 目标服务:
Bash
```
sudo systemctl enable remote-fs.target
```
### 如何停止rsync进程
#### 1. 查找并杀死相关的 rsync 进程
你可以通过 `pgrep` 或 `ps` 命令锁定正在运行的备份任务。
- **查看当前运行的 rsync 进程:**
Bash
```
ps aux | grep rsync
```
- **优雅地停止所有 rsync 进程(推荐):** 发送 `SIGTERM` 信号,允许 `rsync` 完成当前的写入并清理临时文件,防止损坏目标端的数据结构。
Bash
```
sudo killall rsync
```
- **强制杀死(如果进程卡死):** 如果执行 `killall` 后进程依然存在(通常是因为网络 I/O 挂起),请使用 `SIGKILL`。
Bash
```
sudo killall -9 rsync
```
---
#### 2. 停止后台运行的脚本
由于你是通过脚本 `rsync_backup.sh` 启动的,有时只杀掉 `rsync` 进程,脚本可能会尝试进入循环或执行后续逻辑。
- **查找并杀掉备份脚本进程:**
Bash
```
sudo pkill -f rsync_backup.sh
```
---
#### 3. 清理残留的临时文件
`rsync` 在传输过程中会在目标目录NAS 挂载点)生成以 `.` 开头的临时文件。
- 如果你强行停止了进程,这些临时文件会残留在 `/mnt/nas_backup/daily_sync/` 中。
- 下一次运行 `rsync` 时,它通常会自动处理或覆盖这些文件,但如果你想手动清理:
Bash
```
# 注意:请确保没有 rsync 进程在运行时执行此操作
sudo find /mnt/nas_backup/daily_sync/ -name ".*" -type f -delete
```
---
#### 4. 针对日志中 SIGINT/SIGTERM 报错的建议
从你之前的日志看,系统收到了 `code 20` 错误,这通常就是因为进程被手动中断导致的。
**为了防止下次备份时再次因为手动关闭终端而中断,建议采用以下两种方式之一运行:**
1. **使用 `nohup` (你已经在尝试的方式)**
Bash
```
sudo nohup /usr/local/bin/rsync_backup.sh > /dev/null 2>&1 &
```
2. **使用 `screen` 或 `tmux` (更专业)**
- 创建一个新窗口:`screen -S backup`
- 运行脚本:`sudo /usr/local/bin/rsync_backup.sh`
- 按下 `Ctrl + A + D` 脱离窗口(脚本继续运行)。
- 随时回来查看:`screen -r backup`

View File

@@ -0,0 +1,70 @@
#ubuntu #rustdesk
```table-of-contents
```
这个问题产生的原因是 Ubuntu 24.04 默认使用了 **Wayland** 显示协议,而 Wayland 出于安全设计,严格限制了外部程序在用户未登录状态下(即 GDM 登录界面)获取屏幕控制权。
作为一名拥有技术背景的高级经理,你可能更倾向于直接通过修改系统底层配置来彻底解决此问题。最稳妥的方案是将 Ubuntu 的显示管理器回退到兼容性更好的 **X11 (Xorg)**。
---
### 解决方案:禁用 Wayland 强制开启 X11
通过以下步骤,你可以让 Ubuntu 无论在登录前还是登录后都使用 X11 协议,从而允许 RustDesk 在系统启动后立即接管控制权。
#### 1. 修改 GDM3 配置文件
打开终端,编辑 GNOME 显示管理器的配置文件:
Bash
```
sudo nano /etc/gdm3/custom.conf
```
#### 2. 取消注释 Wayland 禁用行
在文件中找到 `[daemon]` 部分,找到下面这一行: `#WaylandEnable=false`
将其前面的 **`#`** 删掉,使其生效:
Plaintext
```
[daemon]---
title: Uncoment the line below to force the login screen to use Xorg
author: shenwei
tags: [rustdesk, ubuntu]
---
---
title: Uncoment the line below to force the login screen to use Xorg
source:
author: shenwei
published:
created:
description:
tags: [rustdesk, ubuntu]
---
# Uncoment the line below to force the login screen to use Xorg
WaylandEnable=false
```
#### 3. 保存并重启服务
按下 `Ctrl + O` 保存,`Enter` 确认,再按 `Ctrl + X` 退出。 最后,重启 GDM 服务(或者直接重启电脑):
Bash
```
sudo systemctl restart gdm3
```
---
### 为什么这样做能解决问题?
- **登录前Login Screen**:禁用 Wayland 后Ubuntu 的登录界面将强制使用 X11 加载。RustDesk 的后台服务Service能够识别 X11 窗口并与其交互。
- **登录后Post-Login**:虽然 Wayland 在 24.04 上是趋势但对于需要频繁远程桌面运维Remote Service Delivery的场景X11 的稳定性与权限开放度目前仍优于 Wayland。

View File

@@ -0,0 +1,79 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [ubuntu]
---
#ubuntu
```table-of-contents
```
在 Ubuntu 24.04 中,笔记本合盖休眠的行为是由系统的登录管理器 `systemd-logind` 控制的。要让服务器在合盖后继续运行,你需要修改系统的配置文件。
以下是具体操作步骤:
### 1. 修改 `logind.conf` 配置文件
打开终端(或通过 SSH 连接),使用 `nano` 文本编辑器修改系统配置:
Bash
```
sudo nano /etc/systemd/logind.conf
```
### 2. 编辑配置项
在打开的文件中,找到以下几行代码(通常是被注释掉的,即行首有 `#`
- `HandleLidSwitch`:合盖时的动作(通常指用电池时)。
- `HandleLidSwitchExternalPower`:连接外接电源合盖时的动作。
- `HandleLidSwitchDocked`:连接扩展坞合盖时的动作。
将它们修改为 `ignore` 并**删除行首的 `#`**,修改后的内容应如下所示:
Plaintext
```
[Login]
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
```
- **ignore**:表示不执行任何操作,即系统继续运行。
### 3. 重启服务使配置生效
保存并退出(在 nano 中按 `Ctrl + O`,回车,然后按 `Ctrl + X`)。执行以下命令重启服务:
Bash
```
sudo systemctl restart systemd-logind
```
> **注意:** 在执行此命令时,你的当前会话(包括图形界面或当前的 SSH 连接)可能会短暂断开或重新加载。
---
### 进阶:彻底禁用系统的休眠功能(可选)
如果你希望从内核级别彻底禁止休眠(防止任何情况下的自动待机),可以运行以下命令:
Bash
```
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
```
_如果以后想恢复将 `mask` 改为 `unmask` 即可。_

View File

@@ -0,0 +1,38 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [clouddrive2, nas, synology]
---
#synology #nas #clouddrive2
在套件中心,设置里添加矿神源
![[IMG-20251229192828271.png]]
然后在社群里找到CloudDrive2这个应用, 并安装。因为我的DSM是7+版本所以需要额外在root 下执行一条命令:
![[IMG-20251229192828289.png]]
```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/)
![[IMG-20251229192828334.png]]
用阿里云盘app扫描二维码并授权请主要不要授权备份目录仅资源目录即可
![[IMG-20251229192828398.png]]
对Aliyun目录进行mount

View File

@@ -0,0 +1,914 @@
#vps #caddy #frp #reverse-proxy #troubleshooting #cloudflare #ubuntu
```table-of-contents
```
思路Cloudflare DNS 指向 公网上的一台VPSVPS 上运行 Caddy内网主机通过 frp 将服务暴露到 VPS本地 127.0.0.1 或某个端口VPS 反向代理到该端口。
- 在 VPS 上运行 `frps`frp server
- 在每个内网设备运行 `frpc` (frp client),将本地服务映射到 VPS 上的独立端口或域名映射frp 支持 http/https 映射,和 subdomain 映射需要 frp 企业/配置域名解析到 VPS
- VPS 上的 Caddy 反向代理到 frps 映射端口127.0.0.1:xxxxx
frp 优点:专为内网穿透设计,支持 NAT、自动重连、Web 管理面板(可选)。推荐当你有多台设备和多端口时使用。
![[IMG-20260313104655355.png]]
![[IMG-20260313104655497.png]]
# 前置共识(已知条件)
- 域名:`ishenwei.online`(在阿里云 DNS/Cloudflare 控制台管理)
- 内网服务:
- NAS server`192.168.3.17:5000`(对应 `nas.ishenwei.online`
- NAS mysql server`192.168.3.17:3306`(对应 `mysql.ishenwei.online`
- Ubuntu1 n8n`192.168.3.47:5678`(希望对应 `n8n.ishenwei.online`
- Ubuntu1 transmission: `192.168.3.47:9091`(希望对应 `transmission.ishenwei.online`
- Ubuntu1 Grafana: `192.168.3.47:3000`(希望对应 `grafana.ishenwei.online`
- 你有一台公网 VPSUbuntu可用于反代或做中继IP: `192.227.222.142`(固定)
## 🧭 目标
- 公网 VPSUbuntu公网 IP = `192.227.222.142`
- 内网 NAS (`192.168.3.17:5000`)
- 内网 Ubuntu (`192.168.3.47:5678`)
- 通过 `frp` 建立安全的反向隧道
- 通过 `Caddy` 在 VPS 上为每个子域名提供 HTTPS 域名访问:
| 域名 | 映射目标 |
| ---------------------------------------------------------- | ---------------------------- |
| [https://nas.ishenwei.online](https://nas.ishenwei.online) | → NAS `192.168.3.17:5000` |
| [https://n8n.ishenwei.online](https://n8n.ishenwei.online) | → Ubuntu `192.168.3.47:5678` |
| | |
| | |
| | |
公网VPSfrps服务端
↓(公网端口转发)
192.227.222.142
通过 frp 反向代理访问内网主机
内网 Ubuntu (192.168.3.47) 启动 frpc
├─ n8n 服务 (5678)
├─ Transmission (9091)
└─ Grafana (3000)
## 🧱 拓扑图
Internet
┌──────────────────────────┐
│ VPS (192.227.222.142) │
│ - frps (监听 7000) │
│ - Caddy (80/443 TLS) │
│ ├─ nas.ishenwei.online → 127.0.0.1:15000 (映射NAS:5000)
│ └─ n8n.ishenwei.online → 127.0.0.1:15678 (映射Ubuntu:5678)
└──────────────────────────┘
▲ ▲
│ frp tunnel │ frp tunnel
┌────────────┐ ┌────────────┐
│ NAS (192.168.3.17) │ │ Ubuntu (192.168.3.47) │
│ frpc.ini │ │ frpc.ini │
│ 映射5000→15000 │ │ 映射5678→15678 │
└────────────┘ └────────────┘
## 第 1 步Cloudflare DNS 配置
| 主机记录 | 记录类型 | 记录值 | TTL |
| ---- | ---- | --------------- | --- |
| nas | A | 192.227.222.142 | 600 |
| n8n | A | 192.227.222.142 | 600 |
Cloudflare Dashboard -> DNS
![[IMG-20260313104655641.png]]
保存即可。
验证命令(任意机器执行):
```
dig nas.ishenwei.online +short # 应返回 192.227.222.142
```
## 🧩 第 2 步:在 VPS 安装 Caddy + frps
### 1⃣ 安装 Caddy
``` bash
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
```
cd
Caddy 安装后会自动作为系统服务运行。
---
### 2⃣ 安装 frpfrp 服务端)
``` bash
# 在 VPS 与内网主机都执行(分别下载到 /opt/frp
cd /opt
sudo mkdir frp && cd frp
FRP_VER=0.65.0 # 若有更新,可替换版本号
curl -LO https://github.com/fatedier/frp/releases/download/v${FRP_VER}/frp_${FRP_VER}_linux_amd64.tar.gz
tar xzf frp_${FRP_VER}_linux_amd64.tar.gz
sudo mv frp_${FRP_VER}_linux_amd64 /opt/frp
```
创建配置文件 `/opt/frp/frps.ini`
``` bash
[common]
bind_addr = 0.0.0.0
bind_port = 7000
---
title: 前置共识(已知条件)
author: shenwei
tags: [caddy, cloudflare, frp, reverse-proxy, troubleshooting, ubuntu, vps]
---
---
title: 前置共识(已知条件)
source:
author: shenwei
published:
created:
description:
tags: [caddy, cloudflare, frp, reverse-proxy, troubleshooting, ubuntu, vps]
---
# Dashboard
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = StrongPassword123!
# 认证 Token
token = Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs
```
创建 systemd 单元 `/etc/systemd/system/frps.service`
``` bash
[Unit]
Description=frp server (frps)
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
启动:
```
sudo systemctl daemon-reload
sudo systemctl enable --now frps
```
验证:
```
sudo systemctl status frps
ss -ltnp | grep 7000
```
### 3⃣ VPS 防火墙设置(允许必要端口)
``` bash
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 7000/tcp # frp server 端口
sudo ufw allow 7050 # frp server dashboard
sudo ufw allow 60022 # Ubuntu1 SSH
sudo ufw allow 60023 # NAS SSH
sudo ufw allow 60024 # Ubuntu2 SSH
sudo ufw allow 65005 # webdav
sudo ufw allow 63306 # NAS mysql
sudo ufw allow 60080 # NAS web
sudo ufw enable
sudo ufw status verbose
```
运行结果:
``` bash
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
7000/tcp ALLOW IN Anywhere
7500/tcp ALLOW IN Anywhere
7050 ALLOW IN Anywhere
60022 ALLOW IN Anywhere
65005 ALLOW IN Anywhere
60023 ALLOW IN Anywhere
60021/tcp ALLOW IN Anywhere
60021/udp ALLOW IN Anywhere
63306 ALLOW IN Anywhere
60080 ALLOW IN Anywhere
60024 ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
7000/tcp (v6) ALLOW IN Anywhere (v6)
7500/tcp (v6) ALLOW IN Anywhere (v6)
7050 (v6) ALLOW IN Anywhere (v6)
60022 (v6) ALLOW IN Anywhere (v6)
65005 (v6) ALLOW IN Anywhere (v6)
60023 (v6) ALLOW IN Anywhere (v6)
60021/tcp (v6) ALLOW IN Anywhere (v6)
60021/udp (v6) ALLOW IN Anywhere (v6)
63306 (v6) ALLOW IN Anywhere (v6)
60080 (v6) ALLOW IN Anywhere (v6)
60024 (v6) ALLOW IN Anywhere (v6)
```
如果你想让 frp dashboard 从本地访问:`ssh -L 7500:127.0.0.1:7500 ubuntu@192.227.222.142`,然后本地打开 `http://127.0.0.1:7500`。
## 🧩 第 3 步:在 内网NAS服务器 与内网 Ubuntu服务器 安装 frpc
两台机器都执行以下步骤(路径、端口配置不同)
### 2⃣ 安装 frpfrp 客户端)
``` bash
# 在 VPS 与内网主机都执行(分别下载到 /opt/frp
cd /opt
sudo mkdir frp && cd frp
FRP_VER=0.65.0 # 若有更新,可替换版本号
curl -LO https://github.com/fatedier/frp/releases/download/v${FRP_VER}/frp_${FRP_VER}_linux_amd64.tar.gz
tar xzf frp_${FRP_VER}_linux_amd64.tar.gz
sudo mv frp_${FRP_VER}_linux_amd64 /opt/frp
```
### 3⃣ 内网 NAS192.168.3.17)配置
创建 `/opt/frp/frpc.ini`
``` bash
[common]
server_addr = 192.227.222.142
server_port = 7000
token = Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs
# 每个本地服务一个 section
# nas 映射: 本地 5000 -> VPS 127.0.0.1:15000
[nas]
type = tcp
local_ip = 127.0.0.1
local_port = 5000
remote_port = 15000
# Navidrome: 本地 4533 -> VPS 127.0.0.1:4533
[navidrome]
type = tcp
local_ip = 127.0.0.1
local_port = 4533
remote_port = 14533
# Calibre: 本地 8083 -> VPS 127.0.0.1:18083
[calibre]
type = tcp
local_ip = 127.0.0.1
local_port = 8083
remote_port = 18083
[webdav]
type = tcp
local_ip = 127.0.0.1
local_port = 5005
remote_port = 65005
[miniflux]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 18080
[zipline]
type = tcp
local_ip = 127.0.0.1
local_port = 3333
remote_port = 13333
[nas_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3307
remote_port = 63307
[nas_web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 10080
```
创建 systemd 单元 `/etc/systemd/system/frpc.service`
``` bash
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
启动:
``` bash
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc
```
如需重启
``` bash
sudo systemctl restart frpc
```
### 3⃣ 内网 Ubuntu192.168.3.47)配置
创建 `/opt/frp/frpc.ini`
``` bash
[common]
server_addr = 192.227.222.142
server_port = 7000
token = Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs
# 每个本地服务一个 section
# n8n 映射: 本地 5678 -> VPS 127.0.0.1:15678
[n8n]
type = tcp
local_ip = 127.0.0.1
local_port = 5678
remote_port = 15678
# Transmission: 本地 9091 -> VPS 127.0.0.1:19091
[transmission]
type = tcp
local_ip = 127.0.0.1
local_port = 9091
remote_port = 19091
# Grafana: 本地 3000 -> VPS 127.0.0.1:13000
[grafana]
type = tcp
local_ip = 127.0.0.1
local_port = 3000
remote_port = 13000
# 🆕 SSH 映射
[ubuntu_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 60022
[homarr]
type = tcp
local_ip = 127.0.0.1
local_port = 7575
remote_port = 17575
[superset]
type = tcp
local_ip = 127.0.0.1
local_port = 8777
remote_port = 18777
[tk]
type = tcp
local_ip = 127.0.0.1
local_port = 8888
remote_port = 18888
```
创建 systemd 单元 `/etc/systemd/system/frpc.service`
``` bash
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
启动:
``` bash
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc
```
如需重启
``` bash
sudo systemctl restart frpc
```
## 🧩 第 4 步VPS 上配置 Caddy 反向代理
编辑 `/etc/caddy/Caddyfile`
``` bash
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.
:80 {
# Set this path to your site's directory.
root * /usr/share/caddy
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
}
transmission.ishenwei.online {
reverse_proxy 127.0.0.1:19091
#log {
# output file /var/log/caddy/transmission.access.log
# format single_field common_log
#}
}
grafana.ishenwei.online {
reverse_proxy 127.0.0.1:13000
#log {
# output file /var/log/caddy/grafana.access.log
# format single_field common_log
#}
}
nas.ishenwei.online {
reverse_proxy 127.0.0.1:15000
}
navidrome.ishenwei.online {
reverse_proxy 127.0.0.1:14533
}
calibre.ishenwei.online {
reverse_proxy 127.0.0.1:18083
}
dashboard.ishenwei.online {
reverse_proxy 127.0.0.1:17575
}
miniflux.ishenwei.online {
reverse_proxy 127.0.0.1:18080
}
zipline.ishenwei.online {
reverse_proxy 127.0.0.1:13333
}
superset.ishenwei.online {
reverse_proxy 127.0.0.1:18777
}
tk.ishenwei.online {
reverse_proxy 127.0.0.1:18888
}
web.ishenwei.online {
reverse_proxy 127.0.0.1:10080
}
# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
```
如需重启 Caddy
``` bash
sudo systemctl reload caddy
sudo systemctl status caddy
```
或者:
``` bash
#彻底重启 Caddy 服务(强制方式)
sudo systemctl restart caddy
```
Caddy 会自动申请并更新 Let's Encrypt 证书,提供 HTTPS 访问。
如果 systemctl 无响应Caddy 卡死或崩溃)
``` bash
sudo systemctl stop caddy
sudo pkill -9 caddy # 杀掉所有残留进程 sudo systemctl start caddy
```
## 验证 Caddyfile 语法(最关键)
``` bash
sudo caddy validate --config /etc/caddy/Caddyfile
```
如果返回:
`Valid configuration`
说明语法正确,可以重载。
如果报错Caddy 会指明**哪一行有问题**,例如:
`parse error: unknown directive at line 12`
你需要根据提示修正。
## 🧩 第 5 步:测试验证
### 1⃣ 在 VPS 上
``` bash
curl http://127.0.0.1:15678
curl http://127.0.0.1:15000
curl http://127.0.0.1:19091
curl http://127.0.0.1:13000
ss -ltnp | egrep '15678|19091|13000|7000|60022'
```
```
root@racknerd-66f115a:~# ss -ltnp | egrep '15678|19091|13000|7000'
LISTEN 0 4096 *:19091 *:* users:(("frps",pid=59421,fd=10))
LISTEN 0 4096 *:13000 *:* users:(("frps",pid=59421,fd=8))
LISTEN 0 4096 *:15678 *:* users:(("frps",pid=59421,fd=9))
LISTEN 0 4096 *:7000 *:* users:(("frps",pid=59421,fd=6))
```
### 2⃣ 在浏览器中
访问:
- [https://nas.ishenwei.online](https://nas.ishenwei.online)
- [https://n8n.ishenwei.online](https://n8n.ishenwei.online)
应能通过 HTTPS 打开对应服务。
## 🧩 第 6 步:可选安全加固
### 1⃣ Caddy 基础认证
在 Caddyfile 的 `n8n.ishenwei.online` 段中加入:
``` bash
basicauth /* { admin JDJhJDE0JDN3ZXVhV2YyZG9SY2hvYzVmZ2h3QUlVblpOMU4vS1ptcENrSlhySElMb3l5dytOMkh0Tk93 }
```
> 用 `caddy hash-password` 生成密码散列。
### 2⃣ 防火墙
只放行必要端口:
``` bash
sudo ufw allow 22,80,443,7000/tcp
sudo ufw enable
```
## 🧩 第 7 步Dashboard可选
访问:
``` bash
http://192.227.222.142:7500
用户名admin 密码StrongPassword123!
```
你可以实时查看 frp 客户端的连接状态。
FRP 架构已经稳定运行HTTP 反代验证通过),接下来要实现 **通过域名 `ubuntu1.ishenwei.online` SSH 到内网的 Ubuntu (192.168.3.47:22)**。
⚠️ **重点提醒(安全性)**
SSH 穿透与 HTTP 不同,它是纯 TCP 流量,不经 CaddyCaddy 只处理 HTTP/HTTPS所以
- **Caddy 不参与 SSH 的代理**。
- **只用 frps + frpc 配置即可完成**。
- **CaddyFile 无需修改**。
## 🧭 拓扑关系
``` bash
外部SSH客户端
ubuntu1.ishenwei.online:60022 VPS公网
FRP Server (frps) on VPS
FRP Client (frpc) on 192.168.3.47
Local Ubuntu SSH (192.168.3.47:22)
```
## 🧩 VPS 端frps配置
编辑 `/opt/frp/frps.ini`
> 不需要添加新的 section这里只是定义基础参数。frps 会自动识别来自客户端的 TCP 映射。
---
## 🧩 内网 Ubuntu192.168.3.47)端 frpc 配置
编辑 `/opt/frp/frpc.ini`,在现有配置文件中追加:
``` bash
# SSH 映射
[ubuntu_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 60022
```
> - `type = tcp` 表示这是纯 TCP 代理,不走 HTTP 协议
> - `remote_port = 60022` 是 VPS 上暴露的端口(外部 SSH 连接入口)
>
## 🔧 启动并验证
在内网机器上:
```
sudo systemctl restart frpc
sudo systemctl status frpc
```
验证日志中是否出现:
`[ubuntu_ssh] start proxy success`
---
## 🌐 在外部电脑上连接 SSH
从公网(任意地方)执行:
`ssh -p 60022 user@ubuntu1.ishenwei.online`
> 注意DNS 只解析到 IP**SSH 的端口要显式指定为 `-p 60022`**。
``` bash
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 7000/tcp # frp server 端口
sudo ufw allow 7050
sudo ufw allow 60022
sudo ufw enable
sudo ufw status verbose
```
---
## 🔒 (可选)安全加固建议
1. **不要直接使用 22 或常见端口**,比如:
`remote_port = 26222`
避免被扫描。
2. **限制来源 IP**(仅 VPS 防火墙开放指定来源):
`sudo ufw allow from <your_home_ip> to any port 60022 proto tcp`
3. **使用公钥认证禁用密码登录**
- 编辑 `/etc/ssh/sshd_config`
`PasswordAuthentication no`
- 重启 SSH
`sudo systemctl restart ssh`
---
## ✅ 总结
| 组件 | 是否需要修改 | 说明 |
| -------------------- | ------------------------------------------------ | ------- |
| **Caddy** | ❌ 无需修改 | 不处理 SSH |
| **frps (VPS)** | ✅ 保持默认端口即可 | |
| **frpc (内网 Ubuntu)** | ✅ 新增 `[ubuntu_ssh]` section | |
| **DNS** | ✅ 添加 `ubuntu1.ishenwei.online -> VPS公网IP` | |
| **SSH 连接** | ✅ 使用 `ssh -p 60022 user@ubuntu1.ishenwei.online` | |
## 错误排查 #troubleshooting
### ✔ 检查Server上配置的代理服务器可能会有冲突
NAS上安装的V2RayA 会对FRP有影响需要停止代理服务器并重启FRPC
### ✔ 第 1 步:确认 frps 是否真的在监听端口(排除端口被占用/劫持)
``` bash
ss -lntup | grep 7000
ss -lntup | grep frps
```
结果:
``` bash
root@racknerd-66f115a:~# ss -lntup | grep 7000
tcp LISTEN 0 4096 *:7000 *:* users:(("frps",pid=413014,fd=6))
root@racknerd-66f115a:~# ss -lntup | grep frps
tcp LISTEN 0 4096 *:7000 *:* users:(("frps",pid=413014,fd=6))
tcp LISTEN 0 4096 *:7500 *:* users:(("frps",pid=413014,fd=3))
```
如果这里显示:
❌ 端口被 Caddy/Nginx 占用
❌ frps 未绑定 0.0.0.0
❌ frps 在 LISTEN 但不是你期望的配置文件
### ✔ 第 2 步:确定 frps 进程读取的配置是否跟你想的一样
执行:
``` bash
ps -ef | grep frps
```
你要看到类似:
``` bash
root@racknerd-66f115a:~# ps -ef | grep frps
root 413014 1 0 02:23 ? 00:00:00 /opt/frp/frps -c /opt/frp/frps.ini
root 419007 414182 0 02:57 pts/1 00:00:00 grep --color=auto frps
```
如果看到:
- 路径不对
- 配置文件不对
- 或者正运行旧版本二进制
那 frps 实际载入的 token、bind_port 等信息就不匹配。
**尤其要确认 token 是否是你以为的那个。**
👉 很多人遇到的问题是:
他们编辑了 `/opt/frp/frps.ini`,但 systemd service 其实加载另一个路径,例如 `/etc/frp/frps.ini`。
### ✔ 第 3 步:确认防火墙是否把 7000 封了
在 VPS 执行:
```
sudo iptables -L -n
sudo ufw status
sudo firewall-cmd --list-all
```
你需要确保:
- `tcp 7000` 在 **ACCEPT**
- Cloudflare 没有影响你(你用的是直连 IP不会影响
- Caddy/Nginx 没修改 nftables某些 One-key 脚本会修改)
### ✔ 第 4 步:确认没有 Caddy/Nginx 误 proxy 了 TCP 7000
检查 Caddy 配置:
``` bash
vi /etc/caddy/Caddyfile
```
**是否存在以下配置:**
`:7000 { reverse_proxy ... }`
如果有 → FRP 就没法直接监听这个端口。
### ✔ 第 5 步:确认 frps 日志是否有拒绝认证token mismatch
执行:
```
journalctl -u frps -n 100 --no-pager
```
如果你看到类似:
`authentication failed token mismatch invalid login`
那肯定是 token 和 frpc 不一致。
👉 很多人以为一样,但实际是空格、换行、编码问题导致不一致。
### ✔ 第 6 步:尝试手动 telnet 登录后观察 frps 日志变化
**非常关键的诊断动作**
你从任意 frpc 客户端执行:
``` bash
telnet 192.227.222.142 7000
```
同时在 frps VPS 执行:
``` bash
journalctl -u frps -f
```
正常情况下,你应该看到 frps 有日志反应:
- 有连接建立
- 有 login 请求
如果 frps 完全无反应:
➡ **说明请求没有到达 frps 进程 → 必然是端口被别的服务占用 / iptables 拦截 / SELinux 限制 / Caddy/Nginx 覆盖了端口**
### ✔ 第 7 步:强制重启 frps 和 frpc
在 frps 机器上:
```
systemctl restart frps
```
确认状态:
```
systemctl status frps
```
在 frpc 机器上:
```
systemctl restart frpc
systemctl status frpc
journalctl -u frpc -n 50
```
如果 frpc 日志里直接报:
`dial tcp 192.227.222.142:7000: connection reset`
➡ 防火墙问题
如果报:
`authentication failed`
➡ token 不一致
如果:
`wait until server ready`
➡ frps 端口被劫持
# Reference

View File

@@ -0,0 +1,35 @@
---
title: How to transfer Docker images and install in another Docker
source:
author: shenwei
published:
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
我在我自己工作的笔记本上安装了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了

View File

@@ -0,0 +1,129 @@
---
title: ✅ 最常用:删除旧 Portainer Container + Volume
source:
author: shenwei
published:
created:
description:
tags: [container, docker, portainer, volume]
---
#docker #container #volume #portainer
```table-of-contents
```
# ✅ 最常用:删除旧 Portainer Container + Volume
### 1. **查看现有 Portainer 容器**
```
docker ps -a | grep portainer
```
你会看到类似:
`bdadf357fb03 portainer/portainer-ce "/portainer" ...`
### 2. **停止容器**
```
docker stop portainer
```
或者:
```
docker stop bdadf357fb03
```
### 3. **删除容器**
```
docker rm portainer
```
或:
```
docker rm -f portainer
```
---
# 🧹 清理旧 Volume & Network (可选,但推荐)
### 4. **删除旧 Volume**
先查看:
```
docker volume ls | grep portainer
```
如果你看到:
`local portainer_data`
删除它:
```
docker volume rm portainer_data
```
> ⚠️ 注意:这会删除 Portainer 所有数据(用户、配置)。
> 如果你想保留数据,不要删 volume只需要在 compose 文件里加:
`external: true`
---
### 5. **删除旧 Network**
查看:
```
docker network ls | grep portainer
```
如果看到:
`portainer_network`
删除:
``` bash
docker network rm portainer_network
```
---
# 🧹 BONUS删除整个 Portainer 旧堆栈(如果是用 compose 部署的)
如果你之前是用 `docker compose` 运行的,可以直接:
``` bash
docker compose down
```
如果你的 compose 文件名不是默认 `docker-compose.yml`
``` bash
docker compose -f portainer-compose.yml down
```
---
# 🚀 最干净的重装流程
如果你想彻底重来一遍:
``` bash
docker stop portainer && docker rm portainer
docker volume rm portainer_data
docker network rm portainer_network
docker compose up -d
```
---
# 🧠 提前帮你想到:为什么会出现 WARN
你看到的两个警告完全正常,原因如下:
### ✔ **WARN 1Network 已存在但不是当前项目创建**
说明你之前用了别的 compose 文件部署过 Portainer。
解决方案:
- 要用旧 network → compose 里写 `external: true`
- 要重建 network → 删除旧 network上面已写
---
### ✔ **WARN 2Volume 已存在但属于另一个 compose 项目**
说明你以前用不同 project 名字做过 Portainer。
解决方案同上。

View File

@@ -0,0 +1,63 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [linux]
---
#linux
要判别你的 Linux 服务器是 x64也就是 x86_64还是 ARM64可以通过多种方式以下是最常用的方法
---
### 1. 使用 `uname` 命令
``` bash
uname -m
```
- 输出结果示例:
- `x86_64` → 表示 **64位 x86Intel/AMD架构**
- `aarch64` → 表示 **64位 ARM 架构**
- `armv7l` → 表示 **32位 ARM 架构**
---
### 2. 使用 `lscpu` 命令
``` bash
lscpu
```
- 会输出详细 CPU 架构信息,例如:
``` bash
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
```
- `Architecture` 字段直接告诉你 CPU 类型。
---
### 3. 查看 `/proc/cpuinfo`
```
cat /proc/cpuinfo
```
- x86_64 CPU 会有 `model name` 类似 “Intel(R) Xeon(R) CPU …”
- ARM64 CPU 会显示 `AArch64` 或 `ARMv8` 等信息。
---
### 4. 使用 `file` 命令检测可执行文件
```
file /bin/bash
```
- 输出示例:
- `/bin/bash: ELF 64-bit LSB executable, x86-64` → x64
- `/bin/bash: ELF 64-bit LSB executable, ARM aarch64` → ARM64
[[🟠Linux 运维必会的 150 个命令]]

View File

@@ -0,0 +1,179 @@
---
title: 1. 先卸载当前的挂载(如果当前还挂着的话)
source:
author: shenwei
published:
created:
description:
tags: [nas, nfs, synology, unbuntu]
---
#unbuntu #nfs #synology #nas
```table-of-contents
```
## Synology NAS配置
### 1. NAS 端新增 NFS 规则的具体步骤
1. **登录 DSM 控制面板**:打开浏览器,登录你的群晖 NAS 管理界面。
2. **进入共享文件夹设置**:点击 **“控制面板” (Control Panel)** -> **“共享文件夹” (Shared Folder)**。
3. **定位目标文件夹**:在列表中选中你的备份文件夹 `backup`(即位于 `volume2` 下的那个)。
4. **打开编辑界面**:点击上方的 **“编辑” (Edit)** 按钮。
5. **切换至 NFS 权限页签**:在弹出的窗口中,点击最右侧的 **“NFS 权限” (NFS Permissions)** 选项卡。
6. **新增规则**:点击左下角的 **“新增” (Create)**,在弹出的窗口中填入你提到的参数:
- **主机名或 IP**:输入你的 Ubuntu 服务器静态 IP例如 `192.168.3.47`)。如果想让工作室同网段设备都能访问,也可以填 `192.168.3.0/24`。
- **权限**:选择 **“可读写” (Read/Write)**。
- **Squash (最重要)**:选择 **“映射所有用户为 admin” (Map all users to admin)**。
> **技术要点**:这会将 Ubuntu 端 root 发起的备份请求,在 NAS 端统一以 `admin` 身份执行,从而绕过复杂的 Linux 权限校验。
- **安全性**:选择 **“sys”**。
- **额外勾选**:勾选下方所有的复选框,包括 **“允许来自非特权端口的连接”** 和 **“允许用户访问已挂载的子文件夹”**。
![[IMG-20251229190624379.png]]
---
### 2. 获取准确的挂载路径
保存设置后请留意“NFS 权限”页签**左下角**显示的一行小字,标明了 **“挂载路径:”**。
- 通常路径为:`/volume2/backup`。
- 请务必记住这个完整路径,稍后在 Ubuntu 命令中需要用到。
## Ubuntu Server配置
在 Linux 世界中,备份服务器到 NAS 的标准做法是使用 **NFS**。
**NFS 的优势:**
1. **原生权限支持**Samba 会丢失 Linux 的文件所有权信息,导致恢复 Docker 卷时权限报错。NFS 则能完美保留。
2. **无协议协商陷阱**:没有像 `vers=3.0` 这种复杂的方言Dialect冲突。
3. **性能更强**:在处理大量小文件(如 Docker 配置NFS 效率远高于 Samba。
#### NFS 挂载 3 步走:
1. **NAS 端配置** (参考以上)
2. **Ubuntu 挂载**
Bash
``` bash
# 安装客户端
sudo apt install nfs-common -y
# 执行挂载 (注意NFS 使用冒号连接路径)
sudo mount -t nfs 192.168.3.17:/volume2/backup /mnt/nas_backup
```
3. **验证**
Bash
``` bash
df -h | grep nas_backup
root@shenwei-HP-ZBook-01:/mnt/nas_backup# df -h | grep nas_backup
192.168.3.17:/volume2/backup 3.5T 1.9T 1.7T 54% /mnt/nas_backup
```
### 3. 实现NFS永久挂载
在 Linux 系统中,手动执行的 `mount` 命令是**临时性**的,重启后内核会重置所有挂载状态。要实现开机自动挂载,必须将配置写入系统的文件系统表文件 `/etc/fstab`。
由于你使用的是 **NFS** 协议,且考虑到笔记本在启动时网络初始化可能略慢于磁盘挂载,我们需要加入一些特定的参数来确保稳定性。
#### 1. 准备凭据(可选但推荐)
NFS 通常基于 IP 授权,不需要账号密码。如果你之前确认过手动挂载 `sudo mount -t nfs 192.168.3.17:/volume2/backup /mnt/nas_backup` 成功且无需密码,可以跳过此步。
#### 2. 修改 /etc/fstab 实现永久挂载
1. **备份原文件**(作为资深管理者,备份配置是标准操作):
Bash
```
sudo cp /etc/fstab /etc/fstab.bak
```
2. **编辑文件**
Bash
```
sudo nano /etc/fstab
```
3. **在文件末尾添加以下一行**
Plaintext
```
192.168.3.17:/volume2/backup /mnt/nas_backup nfs defaults,timeo=900,retrans=5,_netdev 0 0
```
#### 参数详解:
- **`defaults`**: 使用默认的挂载参数rw, suid, dev, exec, auto, nouser, async
- **`timeo=900`**: 设置超时时间为 90 秒(单位是 1/10 秒)。
- **`retrans=5`**: 如果超时,尝试重连 5 次。
- **`_netdev`**: **关键参数**。告诉系统这是一个网络设备,务必等到网络服务完全启动后再尝试挂载,防止开机过程因找不到网络而卡死。
---
#### 3. 测试配置(非常重要)
**千万不要直接重启!** 如果 `/etc/fstab` 写错了,系统可能无法正常启动。
执行以下命令验证:
Bash
```
# 1. 先卸载当前的挂载(如果当前还挂着的话)
sudo umount /mnt/nas_backup
# 2. 模拟开机自动挂载
sudo mount -a
# 3. 检查是否挂载成功
df -h | grep nas_backup
```
**如果 `sudo mount -a` 没有报错,且 `df` 能看到 NAS 空间,那么以后重启服务器,挂载都会自动生效。**
---
#### 4. 进阶:针对 Rsync 脚本的安全保护
在你的 `rsync` 脚本(`/usr/local/bin/rsync_backup.sh`)开头,建议加入一个**挂载检查**。防止在 NAS 掉线或由于某种原因挂载失败时,`rsync` 把备份数据写到了本地硬盘的挂载点目录(会导致笔记本硬盘迅速爆满)。
在脚本的配置区下方加入这段逻辑:
Bash
```
# 检查挂载点是否是一个有效的挂载
if ! mountpoint -q /mnt/nas_backup; then
echo "错误NAS 未挂载,备份任务取消!" >> /var/log/rsync_backup.log
# 在这里可以加入发送通知给你的逻辑
exit 1
fi
```
---
#### 5. 常见问题:重启后仍然失效?
如果在执行了上述操作后重启依然不生效,通常是因为 Ubuntu 的 `nfs-common` 服务启动慢于 `mount -a` 的执行。
- **对策**:你可以启动 `Remote File Systems` 目标服务:
Bash
```
sudo systemctl enable remote-fs.target
```
**你现在已经修改并测试过 `sudo mount -a` 了吗?如果运行这个命令有报错,请把错误信息发给我。**

View File

@@ -0,0 +1,141 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, ubuntu]
---
#docker #ubuntu
```table-of-contents
```
Installing **Docker** and **Docker Compose** on **Ubuntu** involves a few straightforward steps. It's generally best to install from Docker's official repositories to ensure you have the latest version.
---
## 🐋 Step 1: Uninstall Old Versions (If Applicable)
First, remove any existing, potentially conflicting Docker packages:
Bash
```
for pkg in docker.io docker-engine docker-ce docker.io docker-compose docker-compose-v2; do sudo apt-get remove $pkg; done
```
---
## 🛠️ Step 2: Set Up Docker's Repository
You need to set up the repository to allow `apt` to use a repository over HTTPS:
1. **Update the `apt` package index:**
Bash
```
sudo apt-get update
```
2. **Install necessary packages:**
Bash
```
sudo apt-get install ca-certificates curl
```
3. **Add Docker's official GPG key:**
Bash
```
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
```
4. **Add the repository to `apt` sources:**
Bash
```
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
---
## 🚀 Step 3: Install Docker Engine
Now that the repository is set up, you can install the Docker Engine packages:
1. **Update the `apt` package index again:**
Bash
```
sudo apt-get update
```
2. **Install the Docker packages:**
Bash
```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
(Note: The `docker-compose-plugin` installs **Docker Compose V2**, which is used via the command `docker compose` instead of `docker-compose`).
---
## ✅ Step 4: Verify the Installation
Check that the Docker Engine is running and that the installation was successful by running the test image:
Bash
```
sudo docker run hello-world
```
If successful, this command downloads a test image and runs it, printing an informational message before exiting.
---
## 👤 Step 5: Manage Docker as a Non-Root User (Recommended)
By default, running Docker commands requires `sudo`. To run Docker without `sudo`, you can add your user to the **`docker` group**:
1. **Add your user to the `docker` group:**
Bash
```
sudo usermod -aG docker $USER
```
2. **Log out and log back in** (or restart your terminal session, or run `newgrp docker`) for the changes to take effect.
3. **Verify without `sudo`:**
Bash
```
docker run hello-world
```
You should now have **Docker Engine** and **Docker Compose (V2)** installed and ready to use!
Would you like to know some basic **Docker commands** or learn how to write a simple **`docker-compose.yml`** file?

View File

@@ -0,0 +1,131 @@
---
title: 如何用指纹浏览器安全注册并订阅Claude Pro会员全攻略
source:
author: shenwei
published:
created:
description:
tags: [adspower, claude, ip, pingme]
---
#claude #pingme #ip #adspower
```table-of-contents
```
# 如何用指纹浏览器安全注册并订阅Claude Pro会员全攻略
## 概览 📝
本视频主要讲解了如何通过安装和使用指纹浏览器配合高质量代理IP在避免账号被封的情况下顺利注册并订阅AI聊天工具Claude的Pro版本。讲解层层递进细节丰富涵盖从工具下载安装、IP设置、账号注册、验证码获取到付费订阅的完整流程。整个内容注重实操与技巧确保即使是初学者也能跟着操作降低封号风险。视频内容重点突出“IP一致性与纯净度检测”“指纹浏览器隔离环境使用技巧”以及“海外虚拟信用卡支付解决方案”极具实用价值。
## Youtube视频
https://www.youtube.com/watch?v=vvD2jUZYPgI
## 章节知识点总结 ⏰
#### 指纹浏览器安装与环境配置**
- 推荐使用AdsPower指纹浏览器支持谷歌授权登录提供客户端体验完整功能。 AdsPower指纹浏览器[https://share.adspower.net]
- 创建新的浏览器环境时选择最新Chrome版本及操作系统设置用户代理。关键步骤是配置代理类型为socks5并通过系统网络设置复制本机代理地址与端口填入指纹浏览器确保代理与当地网络真实一致。
![[IMG-20251231145927286.png]]
![[IMG-20251231145927318.png]]
- 代理设置成功后用检查代理功能确认IP归属地为美国实现代理连接成功。 https://ip111.cn/
![[IMG-20251231145927365.png]]
#### IP一致性与纯净度检测技巧**
- 通过访问多个IP检测网站确认测试点国内、国外和谷歌三处IP保持高度一致保证IP稳定性。
![[IMG-20251231145927401.png]]
- 重要的IP风险评估理想纯净度为“低风险”数值越低越安全。中等风险或以上可能被封号。 https://scamalytics.com/
![[IMG-20251231145927426.png]]
- 多次测试刷新代理确定IP高纯净度后才能大大降低账号被封概率。
#### Claude账号注册与手机号验证码接收方法**
- 推荐用谷歌账号登录Claude进行注册。
- 手机验证码推荐用新兴接码平台“PingMe”支持中文界面需下载App用手机号注册并充值最低2美元。 [https://messages.pingme.tel/]
- 选择美国区Claude验证码订阅后可稳定获取短信验证码避免一次性号码限制。
```
(+1)9145775122
```
- 绑定短信验证码完成注册避免手机号重复带来的封号风险同时演示成功登录Claude 3.5 Sonnet模型确认账号正常。
```
Claude Account:
Google Login: billyshen2000@gmail.com
```
#### 多账户注册与指纹浏览器多环境管理**
- 可继续创建多套浏览器环境不同Chrome版本和操作系统分别配置独立代理维护账号隔离。
- 普通用户免费可使用5个指纹浏览器环境满足大多数需求。
- 重点强调IP稳定性及独立性防止账号关联封号。
#### Claude Pro会员订阅及支付方案【关键难点】**
- 国内信用卡无法支付推荐使用WildCard虚拟信用卡解决跨境支付难题。 [https://yeka.ai/i/UPHSP]
- 注册WildCard账号简易仅需手机号验证支持支付宝充值。
- 充值后购买Claude Pro套餐最低20美元/月),绑定信用卡信息完成升级。
- 支付流程细节详解确保用户能顺利订阅Pro服务。
## 重点术语和定义 📚
- **指纹浏览器**:一种可模拟不同设备、网络环境的多账号浏览器,隔离使用环境,减少账号关联风险。
- **Socks5代理**一种网络代理协议支持灵活的传输隧道有助于隐匿真实IP和地理位置。
- **IP纯净度**评定某IP是否安全可靠的风险等级低风险代表良好的信誉和较少异常避免被平台标记。
- **虚拟信用卡(WildCard)**:不依赖实体卡的线上信用支付工具,方便海外支付等场景。
- **验证码接收平台(PingMe)**:提供短信接码服务的应用或网站,支持接收短消息以完成注册或验证。
## 推理结构解析 ⚙️
1. **问题识别**Claude账号易被封传统注册方式难以持续使用。
2. **解决方案提出**:通过指纹浏览器创建独立环境+高纯净度美国代理,隐藏真实身份及网络特征。
3. **关键步骤拆解**
- 安装客户端及指纹浏览器环境配置。
- 代理设置与IP一致性及纯净度检测。
- 使用稳定收费接码平台接收验证码。
- 使用虚拟信用卡实现付费订阅。
4. **结论验证**注册成功且账号稳定不被封可以升级Pro套餐正常使用。
## 典型示例及应用 🌟
- 使用AdsPower指纹浏览器设置Chrome 131版本系统选Windows操作系统通过系统代理端口配置实现美国IP环境。
- 复制测试获得的IP地址至多个检测网站确认国内外IP一致且纯净度低风险成功解决多IP不匹配问题。
- 用PingMe平台接收短信避免一次性号码封号订单长期生效。
- 绑定WildCard虚拟信用卡完成支付成功开通Claude Pro会员保障AI服务使用无阻。
## 易错点解析 ⚠️
- **误区1使用本地浏览器直接访问Claude导致账号识别关联易封号。**
正确做法:必须使用指纹浏览器隔离环境操作。
- **误区2代理IP设置不一致导致IP地址在不同测试网站中不匹配从而被平台判定异常。**
正确做法确保代理全局生效且检查三处IP测试点完全一致。
- **误区3忽视IP纯净度检测使用“中等风险”或更高风险IP注册会大幅增加封号风险。**
正确做法:切换代理,确保纯净度极低,数值越低越安全。
- **误区4使用一次性接码号码注册短信验证不稳定或被拦截导致账号绑定失败。**
正确做法:用订阅制的接码平台,获取长期可靠验证码服务。
- **误区5未使用支持海外支付的虚拟信用卡导致无法充值Pro会员。**
正确做法使用WildCard等虚拟信用卡完成支付。
## 速记复习小贴士与自测题 ✅
- **复习提示(无答案)**
- 什么是指纹浏览器,它为什么能降低账号封禁风险?
- 如何测试IP一致性及纯净度为什么它们重要
- 请说出配置代理时socks5代理的关键数据来源。
- 为什么要使用PingMe平台代替传统短信接码平台
- 如何利用虚拟信用卡完成海外AI服务付费
- **自测试题(含答案)**
1. 指纹浏览器中的“新建浏览器环境”为什么不能使用本地浏览器?
-本地浏览器和指纹浏览器的环境互不干涉使用本地浏览器会暴露设备和IP特征易被关联封号。
2. IP纯净度为中等风险能否保证注册的Claude账号长期不被封
-不能中等风险IP易被平台标记导致封号应使用低风险IP。
3. 代理配置中“主机”和“端口”的来源是哪里?
- 答:从系统“代理”设置中复制本机网络代理地址和端口。
4. 为什么视频推荐使用“PingMe”而不是其他接码平台
-PingMe提供订阅制的美国地区稳定号码避免一次性号码被封且充值灵活。
5. 如何完成Claude Pro会员的支付
-使用支持海外支付的虚拟信用卡如WildCard充值后绑定信用卡信息完成订阅。
## 总结回顾 🎯
本期视频详细演示了如何借助指纹浏览器及高纯净度代理结合订阅制接码平台和虚拟信用卡实现了稳定注册、登录及订阅Claude Pro会员的全过程。重点在于环境的隔离、IP的稳定和安全性核验以及支付环节的国际化解决方案。掌握了这些步骤与技巧用户能有效降低账号封禁风险畅享高质量AI服务。该内容面向实操兼具理论与细节极具推广实用价值是用户提升AI工具使用体验的必备指南。

View File

@@ -0,0 +1,233 @@
---
title: 将 0005 (Ubuntu) 放在启动顺序的首位
source:
author: shenwei
published:
created:
description:
tags: [hp, rufus, ubuntu, zbook]
---
#ubuntu #hp #zbook #rufus
```table-of-contents
```
## 1. 准备工作
- **硬件**:一个容量至少为 **8GB** 的 U 盘。
- **软件**:下载并运行最新版的 **Rufus**。
- **数据提醒**:制作过程会清空 U 盘内的所有数据,请提前备份。
---
## 2. Rufus 设置步骤
请按照以下顺序配置 Rufus 界面:
1. **设备 (Device)**:选中你插入的 U 盘。
2. **引导类型选择 (Boot selection)**:点击右侧的“选择”,找到你电脑里的 `ubuntu-24.04.2-desktop-amd64.iso`。
3. **分区方案 (Partition scheme)**
- **选择 `GPT`**。对于 HP ZBook 这种较新的工作站,务必使用 GPT 配合 UEFI 启动。
4. **目标系统类型 (Target system)**
- 会自动变为 `UEFI (non CSM)`。
5. **文件系统 (File system)**
- 保持默认的 `FAT32`(这是 UEFI 启动的标准格式)。
6. **开始 (Start)**:点击底部按钮。
---
## 3. 关键弹窗选择
点击“开始”后Rufus 通常会弹出两个重要的提示:
- **检测到 ISOHybrid 镜像**
- **推荐选择**:“以 **ISO 镜像模式**写入”。
- _说明如果稍后无法启动才考虑重新制作并选择“DD 模式”。_
- **下载额外文件**
- 如果提示需要下载 `ldlinux.sys` 或 `ldlinux.bss`,点击“是”,让 Rufus 自动下载以确保引导成功。
---
## 4. HP ZBook 分区格式化
对于 **HP ZBook** 这种高性能工作站安装 Ubuntu 24.04,为了充分发挥其 NVMe 固态硬盘的性能并确保 UEFI 引导的稳定性,分区和格式化建议遵循以下专业标准:
### 1. 硬盘分区表 (Partition Table)
- **必须选择 GPT (GUID Partition Table)**HP ZBook 属于现代 UEFI 设备,不再建议使用过时的 MBR 分区。GPT 支持 2TB 以上硬盘,且与 UEFI 引导完美兼容。
- **在 Rufus 制作时设置**:请确保在制作启动盘时,分区方案选为 **GPT**。
### 2. 核心分区建议 (手动分区模式)
如果你在安装时选择“手动分区 (Something else)”,建议按以下规格配置
|**分区挂载点**|**建议大小**|**文件系统**|**说明**|
|---|---|---|---|
|**/boot/efi**|**512MB - 1GB**|**FAT32**|**必须项**。用于存储 UEFI 引导程序。|
|**/** (根目录)|**100GB - 200GB**|**ext4**|存放系统文件、Docker 镜像和应用程序。|
|**/home**|**剩余所有空间**|**ext4**|**强烈建议独立分区**。即使重装系统,你的 TikTok 运营数据和个人配置也能保留。|
|**swap** (交换空间)|**8GB - 32GB**|**swap**|根据内存大小决定。如果经常跑大量 Docker 容器,建议设为内存的 1 倍。|
### 3. 文件系统格式选择
- **ext4 (推荐)**:最成熟、稳定的 Linux 文件系统,适合绝大多数工作室场景。
- **ZFS / Btrfs**:虽然 Ubuntu 24.04 支持这些高级文件系统(支持快照功能),但对于 HP ZBook 上的 Docker 环境,**ext4** 的兼容性和性能表现最预测。
### 4. HP ZBook 特有的 BIOS/UEFI 设置
在格式化安装前,请进入 BIOS开机反复按 **F10**)检查:
1. **Storage (存储)**:确保 SATA 模式(如果是混合硬盘)设置为 **AHCI**,而不是 RAID/Intel RSTUbuntu 对 RST 兼容性较差)。
2. **Secure Boot (安全启动)**:建议 **关闭 (Disabled)**。虽然 Ubuntu 支持安全启动,但关闭它能避免后续安装第三方驱动(如 Nvidia 显卡、特定的备份驱动)时遇到麻烦。
3. **Fast Boot**:建议 **关闭**,以确保 U 盘能顺利引导。
### 5. 格式化时的特别提醒
- **NVMe 优化**Ubuntu 24.04 会自动识别 ZBook 的 NVMe 硬盘并进行对齐优化。手动分区时,请确保分区起始位置是默认推荐的数值(通常是 2048 扇区)。
- **保留恢复分区?**:如果你想彻底抹除 Windows请在安装向导中选择 **“Erase disk and install Ubuntu”**。这会自动为你创建最优的 GPT 分区结构,省去手动操作的麻烦。
---
## 5 引导 HP ZBook 进入安装程序
制作完成后,拔下 U 盘插到你的笔记本上,按以下步骤启动:
1. **重启电脑**:在看到 HP Logo 之前,连续按下 **F9** 键(这是 HP 典型的启动菜单快捷键)。
2. **选择引导设备**:在菜单中选择带有 **UEFI: USB Storage Device** 字样的选项。
3. **进入 GRUB 菜单**:选择第一项 `Try or Install Ubuntu`。
---
## 6. 高级建议:自动化与备份
作为工作室负责人,为了避免以后反复重装,建议你:
- **安装完成后立即执行 Rsync**:当你装好系统并配置好网络后,立即将 NAS 上的旧数据通过 `rsync` 还原回来。
- **制作“母版”镜像**:等你的 Ubuntu 系统、Docker、TikTok 运营环境全部配置完美后,参考我之前教你的方法,用 **Clonezilla** 给整个硬盘做个镜像存到 NAS 上。
## 7. 排查重启后不能进入Ubuntu的问题
### 强制将 EFI 文件复制到“默认路径”
HP BIOS 有时非常固执,它只会寻找磁盘上默认的启动文件(`/EFI/BOOT/BOOTX64.EFI`)。如果它不保存你的自定义项,我们可以通过在 Ubuntu 内将 `shimx64.efi` 伪装成默认文件来“欺骗” BIOS。
1. 通过 F9 手动进入 Ubuntu。
2. 打开终端,执行以下命令:
Bash
```
# 检查 EFI 分区挂载点
sudo mkdir -p /boot/efi/EFI/BOOT
# 将 ubuntu 的引导文件复制并重命名为 BIOS 默认寻找的文件
sudo cp /boot/efi/EFI/ubuntu/shimx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI
sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/BOOT/grubx64.efi
```
1. 重启电脑。此时 BIOS 会在找不到其他引导项时,自动加载这个“默认”路径。
### 使用 `efibootmgr` 手动写入 NVRAM
既然你是技术背景,可以直接在 Linux 系统层面对 BIOS 存储NVRAM进行强制写入这通常比在图形界面操作更有效。
1. 在 Ubuntu 终端输入:
Bash
```
# 查看当前的引导列表
sudo efibootmgr
```
2. 找到你的 Ubuntu 对应的编号(比如 `Boot0001`)。
3. 假设 Ubuntu 是 `0001`,强制设置它为首选:
Bash
```
sudo efibootmgr -o 0001
```
4. 如果列表里没有 Ubuntu手动添加一个假设硬盘是 `/dev/nvme0n1`,分区 1 是 EFI
Bash
```
sudo efibootmgr -c -d /dev/nvme0n1 -p 1 -L "Ubuntu_Force" -l "\EFI\ubuntu\shimx64.efi"
```
根据你提供的 `efibootmgr` 输出,我发现了问题的核心原因:虽然 **Boot0005 (Ubuntu)** 已经成功注册到了 NVRAM 中,但它**不在 `BootOrder` (启动顺序)** 的名单里。
目前的 `BootOrder` 只有 `0000, 0001, 0002, 0003`,这意味着 BIOS 启动时会完全忽略 `0005`。我们需要手动将 `0005` 强制加入并排在第一位。
---
### 核心修复:强制重写启动顺序
在 Ubuntu 终端root 权限下)执行以下命令:
Bash
```
# 将 0005 (Ubuntu) 放在启动顺序的首位
sudo efibootmgr -o 0005,0000,0001,0002,0003
```
**验证结果:** 再次输入 `sudo efibootmgr`,确认第一行显示的 `BootOrder` 已经变成了 `0005,0000,...`。
---
### 备用方案:防止 HP BIOS 重置顺序(伪装大法)
HP 的旧款 ZBook 有个“坏习惯”:如果它在 NVRAM 里找不到它认为“标准”的启动项,它会重置 BootOrder。我们可以把 Ubuntu 的引导文件复制到磁盘的**默认备用路径**。这样即使 BIOS 抽风忽略了 NVRAM也会因为在磁盘上找到了文件而启动。
执行以下命令:
Bash
```
# 1. 创建默认引导目录
sudo mkdir -p /boot/efi/EFI/BOOT
# 2. 将 Ubuntu 的引导程序复制并重命名为“万能默认名”
sudo cp /boot/efi/EFI/ubuntu/shimx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI
sudo cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/BOOT/grubx64.efi
```
---
### BIOS 端的最后检查
执行完上述 Linux 命令后,重启进入 BIOS (**F10**),检查以下两个细节:
1. **Fast Boot (快速启动)**:务必将其设为 **Disabled**。开启它会导致 BIOS 跳过很多 EFI 检测逻辑。
> [!NOTE] 执行了以下操作后可以正常启动!!!
1. **Legacy Support (传统支持)**:确保设置为 **Disabled** (或者选择 **UEFI Without Legacy**)。从你的输出看,你现在有大量的 `BBS` (Legacy) 启动项,这会干扰 UEFI 的识别。
---
> [!NOTE] 最终解决方案!!!
### 为什么会有这么多 `BBS` 项?
你的输出中 `Boot0000` 到 `Boot0004` 全是 `BBS` 类型的条目,这说明你的 BIOS 目前处于 **混合模式 (Hybrid)** 或 **传统模式 (Legacy)**。
- **建议**:在 BIOS 的 `Boot Options` 中,找到 **"Boot Mode"**,将其从 `Legacy` 或 `Hybrid` 切换为 **"UEFI Only"**。
- 一旦切换为 **UEFI Only**,那些无效的 `0000-0004` 就会消失BIOS 将被迫只看 `0005` (Ubuntu)。
[[🟠Ubuntu 24.04 enable SSH]]
[[🟠Ubuntu禁用合盖休眠]]
[[🟠Ubuntu Server科学上网]]
[[🟠Ubuntu用RustDesk远程登录出现不能使用Wayland登录的错误]]

View File

@@ -0,0 +1,104 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [linux, v2rayn, windows]
---
#linux #v2rayn #windows
### 通用说明
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#%E9%80%9A%E7%94%A8%E8%AF%B4%E6%98%8E)
1. 发布包中含部分 Core 文件(`Xray``sing-box`, `mihomo`),方便使用;其他 Core 需要自己去下载,[支持的核心列表](https://github.com/2dust/v2rayN/wiki/List-of-supported-cores)
2. `zip`格式包为便携版,解压缩到文件夹后直接可以运行,存储文件位置为本文件夹;可以复制多份互相独立
### Windows
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#windows)
1. 支持的系统版本
```
Windows 10+
```
#### Windows x64
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#windows-x64)
- `v2rayN-windows-64.zip` WPF实现的界面需要安装 [Microsoft .NET 8.0 Desktop Runtime]
- `v2rayN-windows-64-SelfContained.zip` WPF实现的界面
- `v2rayN-windows-64-desktop.zip` Avalonia UI 实现的界面
- 其他 Core 你可以从 [这里](https://github.com/2dust/v2rayN-core-bin/blob/master/v2rayN-windows-64-other-bins.zip) 下载后放入 bin 文件夹
#### Windows arm64
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#windows-arm64)
- [在 Windows arm64 下能使用吗?](https://github.com/2dust/v2rayN/wiki/Faq#%E5%9C%A8-windows-arm64-%E4%B8%8B%E8%83%BD%E4%BD%BF%E7%94%A8%E5%90%97)
- `v2rayN-windows-arm64.zip` WPF实现的界面需要安装 [Microsoft .NET 8.0 Desktop Runtime]
- `v2rayN-windows-arm64-desktop.zip` Avalonia UI 实现的界面
### Linux
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#linux)
1. 非`zip`格式包为安装版,存储文件位置为系统规定的用户文件中
2. deb 适用于 Debian/Ubunturpm 适用于 Fedora/Redhat
3. 支持的发行版
```
Debian 12 +
Ubuntu 22.04 +
Fedora 36 +
Redhat 9 +
```
#### Linux x64
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#linux-x64)
- `v2rayN-linux-64.zip` 执行: `chmod +x v2rayN` 普通用户运行 `./v2rayN`
- `v2rayN-linux-64.deb` 安装:`sudo apt install -y ./v2rayN-linux-64.deb`
- `v2rayN-linux-rhel-x64.rpm` 安装:`sudo dnf install -y ./v2rayN-linux-rhel-x64.rpm`
#### Linux arm64
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#linux-arm64)
- `v2rayN-linux-arm64.zip` 执行: `chmod +x v2rayN` 普通用户运行 `./v2rayN`
- `v2rayN-linux-arm64.deb` 安装:`sudo apt install -y ./v2rayN-linux-arm64.deb`
- `v2rayN-linux-rhel-arm64.rpm` 安装:`sudo dnf install -y ./v2rayN-linux-rhel-arm64.rpm`
### macOS
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#macos)
1. 非`zip`格式包为安装版,存储文件位置为系统规定的用户文件中
2. 支持的系统版本
```
macOS 12+
```
#### macOS x64
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#macos-x64)
- `v2rayN-macos-64.zip` 执行:`chmod +x v2rayN` 普通用户运行 `./v2rayN`
- `v2rayN-macos-64.dmg` 由于安装包没有签名,会提示应用已损坏;安装后需要运行:`xattr -cr /Applications/v2rayN.app`
#### macOS arm64
[](https://github.com/2dust/v2rayN/wiki/Release-files-introduction#macos-arm64)
- `v2rayN-macos-arm64.zip` 执行:`chmod +x v2rayN` 普通用户运行 `./v2rayN`
- `v2rayN-macos-arm64.dmg` 由于安装包没有签名,会提示应用已损坏;安装后需要运行:`xattr -cr /Applications/v2rayN.app`

View File

@@ -0,0 +1,525 @@
---
title: 核心目标(你要覆盖的监控面)
source:
author: shenwei
published:
created: 2025-11-11
description: 按优先级与场景划分的、能通过 Docker 部署的监控方案,并附带部署建议、关键监控项、告警示例
tags: [grafana, monitoring, prometheus]
---
#prometheus #grafana #monitoring
我给你一套按优先级与场景划分的、能通过 Docker 部署的监控方案,并附带部署建议、关键监控项、告警示例、以及两套可直接拷贝的 `docker-compose` 验证模板(一个轻量、一个较完整)。我把信息组织成清单和操作步骤,便于你直接在 NAS / Ubuntu Server 上实践。
# 核心目标(你要覆盖的监控面)
1. 主机层CPU / 内存 / 磁盘 / 网络 / I/O / inode。
2. 容器层:容器运行状态、重启次数、资源限制/使用、退出码、镜像版本。
3. 服务层应用HTTP(S) 可用性、响应码、延迟、错误率、TLS 证书到期、DNS 解析是否异常。
4. 日志:应用错误/异常、关键业务日志索引(可选全文搜索)。
5. 合规与可视化:集中 time-series 存储 + 仪表盘 + 报警/通知通道(邮件/Slack/电话/Teams
![[IMG-20251229190624400.png]]
# 推荐工具(均可 Docker 化)
按功能分组,给出用途与为何推荐(并标注官方安装/镜像文档):
### 观测 + 时序数据 / 查询 / 告警
- **Prometheus采集 + 告警规则)**:拉取 exportersnode_exporter、cAdvisor、blackbox_exporter采集指标支持 PromQL 命名与告警规则。适合做主观测时序库与告警。([Prometheus](https://prometheus.io/?utm_source=chatgpt.com "Prometheus - Monitoring system & time series database"))
- **Alertmanager**Prometheus 的告警分发):用于抑制、分组并把告警推到邮件/Slack/Webhook/PagerDuty。
### 可视化 + 日志聚合
- **Grafana**:展示 Prometheus / VictoriaMetrics / Loki 等数据源的仪表盘与告警。支持仪表盘模板与报警通知。([Grafana Labs](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/?utm_source=chatgpt.com "Run Grafana Docker image | Grafana documentation"))
- **Grafana Loki + Promtail**(如果你要日志聚合): 轻量级、与 Grafana 原生集成,适合把应用日志索引进来。
### 主机 / 容器指标(简易采集)
- **node_exporter**主机指标采集Prometheus exporter
- **cAdvisor**(容器资源/性能指标Prometheus 可抓取)
- **blackbox_exporter**(外网/内网 HTTP/TCP/ICMP/HTTPS 监测/探测,用于合成监测)。
### 合成 / 可用性 / Uptime 检查(外网/内网访问)
- **Uptime Kuma**自托管的“Uptime Robot”式工具易上手做外网或内网的合成可用性探针HTTP/TCP/DNS/TLS带历史和通知支持。推荐用于合成监测synthetic checks。([uptimekuma.org](https://uptimekuma.org/install-uptime-kuma-docker/?utm_source=chatgpt.com "Install Uptime Kuma using Docker or Docker Compose"))
### 轻量单主机快速看板(推荐做 PoC
- **Netdata**:开箱即用的详细 realtime 主机/容器监控面板(默认 19999 端口)。适合快速诊断热点,能和 Prometheus 集成做长期存储。([learn.netdata.cloud](https://learn.netdata.cloud/docs/netdata-agent/installation/docker?utm_source=chatgpt.com "Install Netdata with Docker"))
### 时序数据库替代(可选,用于更大规模)
- **VictoriaMetrics / Thanos / Cortex**:当数据量大或想要长期存储 + 高效写入时。VictoriaMetrics 配置简单,常见于 single-host 或 small-cluster 场景。
### 管理/操作视角(容器管理)
- **Portainer**:可视化管理 Docker 主机/Swarm带部分监控/日志功能(不替代 Prometheus/Grafana但便于运维快速操作
---
# 推荐的架构方案
### 标准(生产常见,适合多主机)
用途:长期监控、告警、仪表盘。
组件Prometheus + node_exporter + cAdvisor + blackbox_exporter + Grafana + Alertmanager。可选 Loki日志、VictoriaMetrics长期存储。Prometheus 抓取所有主机/容器指标Grafana 做可视化Alertmanager 负责通知。([Prometheus](https://prometheus.io/?utm_source=chatgpt.com "Prometheus - Monitoring system & time series database"))
---
# 我猜你可能没想过但挺有用的点(主动建议)
1. **合成synthetic与真实用户监控结合**Uptime Kuma 做外网/内网可用性探针 + Prometheus blackbox_exporter 做更细粒度 HTTP/TLS/DNS 探测(响应码、证书有效期、解析时延)。
2. **TLS 证书到期告警**:通过 blackbox_exporter 或直接 Prometheus exporter或在 Uptime Kuma 中)设置证书剩余天数阈值告警。
3. **DNS 解析单独监控**:外网访问不通常是 DNS 问题,单独做 DNS probeblackbox_exporter 支持)。
4. **短期与长期数据分层**Netdata 做短期高分辨率展示Prometheus + VictoriaMetrics 做长期汇总remote_write
5. **自动化接入新主机**:在新主机上用 Ansible / cloud-init 快速部署 node_exporter + cAdvisor + promtail日志并注册到 Prometheus。
6. **容器标签化 & 报表**:保证容器/服务启动时打上 `service=xxx``env=prod` 标签,便于 PromQL 分组和 SLA 报表。
---
# 推荐监控项(可直接写为 PromQL/告警条件)
核心指标与告警建议(举例):
- 主机:`node_filesystem_avail_bytes` < 10% → 磁盘告警。
- CPU5 分钟平均 CPU 使用率 > 85%(或按核数修正)→ 告警。
- 内存:`node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.15` → 内存告警。
- 容器:容器重启次数 `increase(container_restart_total[1h]) > 0` → 告警(可过滤重启策略更新产生的重启)。
- HTTP黑箱探测 `probe_success == 0` 连续 3 次 → 报警;`probe_duration_seconds` 高于阈值 → 性能警告。
- TLS证书剩余天数 < 14 → 告警。
(这些可直接放进 Prometheus 的 alert rules也可在 Grafana 转换为告警)
---
# 安全与运维注意(捷径与坑)
- 减少容器权限:尽量不要给 exporters 过高宿主机权限除非需要e.g., Netdata 需要 `/proc``/sys`、Docker socket 才能全面监控)。审慎开启 Docker socket 挂载(风险:容器拿到宿主机 root 等同权限)。([learn.netdata.cloud](https://learn.netdata.cloud/docs/netdata-agent/installation/docker?utm_source=chatgpt.com "Install Netdata with Docker"))
- 网络分区:把监控流量/端口放在管理 VLAN 或通过防火墙限定访问。
- 存储Prometheus 本地磁盘会增长,考虑长期保留要用远端存储或定期 snapshot。
- 备份Grafana 仪表盘 JSON 导出Prometheus rule 与配置放在 GitGitOps
- 证书/反向代理生产建议在反向代理Caddy/Traefik/Nginx做 TLS 终端并加 Basic/Auth 或内部 SSO。
---
# 快速落地步骤(我会按专家视角把步骤拆成可运行的命令)
1. 在一台测试机器上用上面 PoC compose 启动,验证 Netdata 与 Uptime Kuma 可访问19999 / 3001
2. 把 Prometheus compose 与 `prometheus.yml` 上线到主要监控节点,配置 `scrape_configs` 抓取 node_exporter / cadvisor / blackbox。
3. 在每台主机上用 docker-compose 或 Ansible 部署 node_exporter或使用 host network 模式),并在 Prometheus 中加入目标。
4. 在 Grafana 导入几个预置 dashboardnode_exporter、cadvisor、blackbox 面板),并在 Alertmanager 中配置告警路由Slack/邮件)。
5. 把 Uptime Kuma 的探测项(内网域名/公网域名全部建好设置通知通道Mail / Webhook 指向 Alertmanager/Grafana 或直接 Slack
---
# 参考资源(官网/文档 — 我把主要 URL 放在下面,便于你深入阅读与部署)
- Prometheus 官方: [https://prometheus.io/](https://prometheus.io/)
- Prometheus Docker 镜像Docker Hub [https://hub.docker.com/r/prom/prometheus](https://hub.docker.com/r/prom/prometheus)
- Grafana Docker 安装文档: [https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/)
---
# 我们来落地选项 **A完整的 `docker-compose` + `prometheus.yml` + alert rules**。
目标是:
在你家里NAS/Ubuntu Server用 Docker 一键启动一个完整的监控栈。
**功能覆盖**
- 主机与容器指标(`node_exporter`, `cAdvisor`
- 内外网域名健康探测(`blackbox_exporter`
- 数据采集与存储(`prometheus`
- 可视化(`grafana`
- 告警分发(`alertmanager`,可选接邮件/Slack
---
## 🧱 一、目录结构建议
请在主机上建一个目录 `/opt/monitoring/`(可换路径):
```
/opt/monitoring/
├── docker-compose.yml
├── prometheus/
│ ├── prometheus.yml
│ ├── alerts.yml
│ └── targets/
│ ├── node.yml
│ ├── cadvisor.yml
│ └── blackbox.yml
├── alertmanager/
│ └── config.yml
└── grafana/
```
---
## 🐳 二、`docker-compose.yml`
这是一个完整可运行的 Compose 文件,覆盖核心组件。
``` yaml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: always
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./prometheus/alerts.yml:/etc/prometheus/alerts.yml:ro
- ./prometheus/targets:/etc/prometheus/targets:ro
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
ports:
- "9090:9090"
depends_on:
- cadvisor
- node_exporter
- blackbox
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
- "3000:3000"
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_NAME=Main Org
- GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
- GF_SECURITY_ALLOW_EMBEDDING=true
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-storage:/var/lib/grafana
depends_on:
- prometheus
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: always
ports:
- "9093:9093"
volumes:
- ./alertmanager/config.yml:/etc/alertmanager/config.yml:ro
command:
- '--config.file=/etc/alertmanager/config.yml'
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
restart: always
network_mode: "host"
pid: "host"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
blackbox:
image: prom/blackbox-exporter:latest
container_name: blackbox
restart: always
ports:
- "9115:9115"
volumes:
prometheus-data:
grafana-storage:
```
---
## ⚙️ 三、Prometheus 配置文件 `prometheus.yml`
```yaml
global:
scrape_interval: 15s
evaluation_interval: 30s
rule_files:
- "/etc/prometheus/alerts.yml"
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']
- job_name: 'node_exporter'
file_sd_configs:
- files:
- /etc/prometheus/targets/node.yml
- job_name: 'cadvisor'
file_sd_configs:
- files:
- /etc/prometheus/targets/cadvisor.yml
- job_name: 'blackbox_http'
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- files:
- /etc/prometheus/targets/blackbox.yml
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: blackbox:9115
- source_labels: [__param_target]
target_label: instance
```
---
## 🗂 四、Targets 文件示例
### `targets/node.yml`
```yaml
- targets:
- "192.168.3.47:9100"
labels:
env: home
role: server
```
### `targets/cadvisor.yml`
```yaml
- targets:
- "cadvisor:8080"
labels:
env: home
role: docker
```
### `targets/blackbox.yml`
```yaml
- targets:
- "https://pq2435887bh.vicp.fun"
- "http://shenwei-nas.vip.cpolar.cn"
- "https://transmission.vip.cpolar.cn"
labels:
env: home
type: website
```
---
## 🚨 五、Prometheus 告警规则 `alerts.yml`
```yaml
groups:
- name: system-alerts
rules:
- alert: HostHighCPU
expr: avg(rate(node_cpu_seconds_total{mode="user"}[2m])) * 100 > 85
for: 2m
labels:
severity: warning
annotations:
summary: "高 CPU 使用率"
description: "主机 CPU 使用率超过 85%(持续 2 分钟)"
- alert: HostLowDisk
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) < 0.10
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "磁盘剩余空间低于 10%"
- alert: HostLowMemory
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.15
for: 5m
labels:
severity: warning
annotations:
summary: "内存使用率高"
description: "可用内存低于 15%"
- alert: ContainerRestarting
expr: increase(container_last_seen[5m]) == 0
for: 5m
labels:
severity: warning
annotations:
summary: "容器异常退出或未上报"
description: "5 分钟内容器未更新指标,可能异常退出"
- alert: HTTPProbeFailed
expr: probe_success == 0
for: 2m
labels:
severity: critical
annotations:
summary: "站点不可达"
description: "HTTP 探测失败:{{ $labels.instance }}"
- alert: TLSCertExpiring
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 14
for: 1h
labels:
severity: warning
annotations:
summary: "TLS 证书即将到期"
description: "证书 {{ $labels.instance }} 剩余不到 14 天"
```
---
## 📧 六、Alertmanager 配置 `config.yml`
```yaml
global:
resolve_timeout: 5m
route:
receiver: default
group_wait: 10s
group_interval: 5m
repeat_interval: 3h
receivers:
- name: default
email_configs:
- to: "youremail@example.com"
from: "monitor@example.com"
smarthost: "smtp.example.com:587"
auth_username: "monitor@example.com"
auth_password: "yourpassword"
```
> 💡 你也可以改成 Slack、Teams、Telegram 等通知方式,只要换成对应的 `*_configs` 即可。
---
## 🧩 七、Grafana 快速导入仪表盘
安装后访问 `http://localhost:3000`admin/admin 登录):
- 添加 Prometheus 数据源:`http://prometheus:9090`
- 导入官方 Dashboard
- Node Exporter Full: `1860`
- cAdvisor Container Metrics: `14282`
- Blackbox Exporter Probe: `7587`
这些 ID 可直接在 Grafana.com → Dashboards → “Import” 输入。
---
## 🚀 八、启动命令
```bash
cd /opt/monitoring
docker compose up -d
```
验证访问:
- Prometheus: [http://192.168.3.47:9090](http://192.168.3.47:9090/)
- Grafana: [http://192.168.3.47:3000](http://192.168.3.47:3000/)
- Alertmanager: [http://192.168.3.47:9093](http://192.168.3.47:9093/)
- cAdvisor: [http://192.168.3.47:8080](http://192.168.3.47:8080/)
- Blackbox exporter: [http://192.168.3.47:9115](http://192.168.3.47:9115/)
- node_exporter: [http://192.168.3.47:9100/metrics](http://192.168.3.47:9100/metrics)
## 🧠 九、扩展建议(后续可以加)
-**Loki + Promtail** 做日志收集。
-**Uptime Kuma** 作为轻量合成探针外层 UI外观好看
-**Traefik/Caddy** 把上述组件统一暴露并加 HTTPS。
-**VictoriaMetrics** 作为长时存储Prometheus remote_write

View File

@@ -0,0 +1,44 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, music, navidrome]
---
#docker #navidrome #music
``` yaml
version: '3.8'
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
user: "1026:100"
restart: unless-stopped
ports:
- "4533:4533"
volumes:
- /volume1/music:/music:ro"
- /volume1/docker/navidrome/data:/data
environment:
# 开启详细日志,便于排查流媒体传输问题
- ND_LOGLEVEL=info
# 启用转码配置界面
- ND_ENABLETRANSCODINGCONFIG=true
# 自动根据客户端需求转码下载
- ND_AUTOTRANSCODEDOWNLOAD=true
# 限制转码缓存大小,保护磁盘空间
- ND_TRANSCODINGCACHESIZE=200MB
```
## Reference:
### Navidrome Doc
https://www.navidrome.org/docs/
### Navidrome FAQ
https://www.navidrome.org/docs/faq/

View File

@@ -0,0 +1,41 @@
---
title: Install Apache Superset
source:
author: shenwei
published:
created:
description:
tags: [apache, bi, docker, mysql, superset]
link:
kanban-plugin:
aliases:
cssclasses:
---
#docker #superset #apache #mysql #bi
```
docker pull apache/superset:GHA-19524015706
```
```
docker run -d -p 8777:8088 -e "SUPERSET_SECRET_KEY=mysuperset" --name superset apache/superset:GHA-19524015706
```
```
docker exec -it superset superset fab create-admin --username admin --firstname Superset --lastname Admin --email admin@superset.com --password admin
```
```
docker exec -it superset superset db upgrade
```
```
docker exec -it superset superset load_examples
```
```
docker exec -it superset superset init
```

View File

@@ -0,0 +1,34 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, homarr]
---
#homarr #docker
docker-compose.yml
``` yaml
version: "3.9"
services:
homarr:
image: ghcr.io/homarr-labs/homarr
container_name: homarr
restart: unless-stopped
ports:
- "7575:7575"
volumes:
- /home/shenwei/Docker/homarr/appdata:/appdata
- /var/run/docker.sock:/var/run/docker.sock
environment:
- SECRET_ENCRYPTION_KEY=4a418def4be700be26672aa57a4c3d4b94abd2cf97021b5c4ecd3c1644c1f071
- ALL_PROXY=socks5://172.24.0.1:10808
```

View File

@@ -0,0 +1,40 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, jellyfin, movie, nas, synology, tv-show]
---
#jellyfin #docker #synology #nas #movie #tv-show
``` yaml
services:
jellyfin:
image: nyanmisaka/jellyfin:latest
container_name: jellyfin
# 群晖建议使用具体的 UID:GID
user: "1026:100"
ports:
- 8096:8096/tcp
- 7359:7359/udp
volumes:
- /volume1/docker/jellyfin/config:/config
- /volume1/docker/jellyfin/cache:/cache
- /volume2/movie:/media
- "/volume1/TV shows:/media2"
- /volume1/docker/jellyfin/fonts:/usr/local/share/fonts/custom:ro
environment:
- JELLYFIN_PublishedServerUrl=http://jellyfin.ishenwei.online
- TZ=Asia/Shanghai
# 核心优化:挂载硬件渲染设备以实现 Intel QuickSync 转码
devices:
- /dev/dri:/dev/dri
restart: unless-stopped
extra_hosts:
- 'host.docker.internal:host-gateway'
```

View File

@@ -0,0 +1,45 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, portainer]
---
#docker #portainer
## portainer
create docker-compose.yml
```
services:
portainer:
container_name: portainer
image: portainer/portainer-ce:lts
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
ports:
- 9443:9443
- 8000:8000 # Remove if you do not intend to use Edge Agents
volumes:
portainer_data:
name: portainer_data
networks:
default:
name: portainer_network
```
```
docker-compose run -d
```
[[🟠如何删除旧的废弃的docker container +volume]]

View File

@@ -0,0 +1,32 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, it-tools]
---
#it-tools #docker
``` yaml
version: '3.8'
services:
it-tools:
image: corentinth/it-tools:latest
container_name: it-tools
restart: unless-stopped
# 交互模式配置
stdin_open: true # 对应 -i
tty: true # 对应 -t
ports:
- "8999:80"
# 资源限制(可选建议)
deploy:
resources:
limits:
memory: 128M
```

View File

@@ -0,0 +1,36 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [docker, transmission]
---
#docker #transmission
``` yaml
version: '3.8'
services:
transmission:
image: lscr.io/linuxserver/transmission:latest
container_name: transmission
restart: unless-stopped
network_mode: bridge
ports:
- "9091:9091" # Web UI 访问端口
- "51413:51413" # Peer 监听端口 (TCP)
- "51413:51413/udp" # Peer 监听端口 (UDP)
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- USER=shenwei # 可选:设置 Web UI 用户名
- PASS=zmkm99zmkm00 # 可选:设置 Web UI 密码
volumes:
- /home/shenwei/Docker/transmission/data:/config
- /home/shenwei/Downloads:/downloads
```

View File

@@ -0,0 +1,106 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [clash, merlin-clash, rax50]
---
#rax50 #merlin-clash #clash
```table-of-contents
```
## 网件RAX50路由器刷梅林固件与科学上网插件安装教程
https://www.youtube.com/watch?v=FhHgXnLoOC0
### 概述 🔧
本视频围绕如何使用网件RAX50路由器刷入梅林固件并安装科学上网翻墙插件展开详细讲解。整体流程从登录原厂后台、下载固件、刷机、恢复设置到安装及配置科学上网插件逐步带领观众完成路由器的翻墙功能设置。讲解方式结合实操演示与官方文档指引特别强调操作细节和注意事项帮助用户建立清晰的固件刷入及翻墙插件配置知识体系。
### 核心知识点总结 ⏰
- **00:0000:52 | 网件RAX50路由器登录与原厂固件介绍**
通过电脑连接网件路由器网络浏览器输入192.168.1.1登录后台,需输入初始设置的用户名和密码。登录成功后确认路由器与本地网络正常连接,访问国内网络无障碍。
- **00:5202:21 | 固件类型与下载选择说明**
介绍两种固件类型:`.chk`为网件刷梅林的过渡固件,`.w`为梅林版本固件。前往KoolCenter固件下载服务器找到对应型号RAX50下载`.chk`固件先进行第一步刷机,然后再刷`.w`固件完成稳定版本的安装。建议使用谷歌内核浏览器操作。
- **02:2105:14 | 第一次刷机操作演示**
演示连接新设的WiFi登录后台上传`.chk`固件完成过渡刷机。成功后界面变为梅林风格,说明已刷入梅林固件。
- **05:1407:27 | 第二次刷机及恢复梅林固件出厂设置**
上传`.w`结尾的梅林固件进行第二次刷机确保稳定性。刷机后恢复梅林固件的出厂设置重新配置WiFi名称和登录密码并进行JFFS双清操作以清理旧缓存重启路由器完成大约60%刷机进度。
- **07:2708:35 | 科学上网插件安装准备**
进入梅林的软件中心,检查并更新软件中心版本,确保与在线版本同步,避免异常。原版没有任何插件,需要手动安装科学上网插件。
- **08:3515:54 | MerlinClash插件安装与策略组配置**
下载安装MerlinClash插件小猫咪插件通过Telegram鲁猫云频道获取最新插件版本。上传插件并安装成功后导入订阅地址机场节点。介绍免费机场试用过程手动及自动订阅配置文件。
配置策略组实现节点自动延迟测试与故障转移灵活切换线路如香港、台湾、美国节点等分流不同应用流量如Netflix、YouTube、国内外网站实现精准科学上网。设置定时自动更新订阅、开启守护进程保证插件稳定运行并测试Google与YouTube访问。
- **15:5419:51 | 另一款科学上网插件安装及功能对比**
安装科学上网插件GitHub版本区分Full与Lite版本根据路由器内存选择Full版本。上传插件后导入SSR等多协议订阅地址。此插件需手动节点切换无自动分流功能。两插件不可同时开启推荐使用功能更强的MerlinClash。
- **19:5120:23 | 软件中心的其他实用工具介绍**
简要介绍软件中心中其他可用插件如ROG工具箱可监测路由器温度、运行时间、内核版本等信息拓展路由器功能。
### 重点术语与定义 📚
- **梅林固件 (Merlin Firmware)**:华硕路由器第三方固件改良版,功能丰富且稳定,支持更多插件及高级网络配置。
- **过渡固件 (.chk 文件)**:用于网件路由器从原厂固件刷入梅林固件的转接版本,完成后才可刷入正式梅林固件。
- **科学上网插件**:具备翻墙功能的网络插件,通过订阅国外节点实现访问被限制网站。
- **MerlinClash插件**基于Clash的高级分流插件支持自动节点选择和策略组分流适合多设备家庭科学上网。
- **SSR订阅链接**ShadowsocksR等代理节点的配置链接用于导入科学上网插件实现节点管理和自动更新。
- **JFFS双清**:清理路由器文件系统缓存和数据,保证刷机后固件环境干净,预防残留问题。
- **故障转移**:连接故障时自动切换至备用节点,保持网络通畅的机制。
### 推理逻辑结构 🔍
1. **确认原厂路由器可正常访问后台 → 下载并刷入过渡固件(`.chk` → 完成基础梅林固件安装。**
2. **刷入正式梅林固件(`.w` → 恢复梅林出厂设置 + JFFS双清 → 确保系统干净稳定。**
3. **更新软件中心版本 → 安装科学上网插件 → 导入机场订阅链接。**
4. **设置插件节点、分流策略 → 启动守护进程确保插件稳定运行。**
5. **通过测试访问被限制网站确认翻墙成功。**
6. **区分插件优势,选择更适合的插件方案使用。**
### 典型案例举例 📝
- 通过免费机场注册获得5GB流量和7天试用套餐实际演示如何复制订阅链接并导入到MerlinClash插件中体现实用配置流程。
- 节点策略组设置案例如将Netflix节点指定为台湾线路YouTube指定为香港线路利用分流精细管理网络流量优化访问速度和稳定性。
### 容易混淆的误区 ❗
- **误区:首次刷机直接刷`.w`固件。**
正确:必须先刷`.chk`的过渡固件,再刷`.w`的正式梅林固件,二次刷机才能确保稳定。
- **误区:两个科学上网插件可以同时开启。**
正确两个插件不能同时运行选择一个即可优选支持策略组分流的MerlinClash。
- **误区:恢复出厂设置等同回到网件原厂固件。**
正确:恢复出厂设置指梅林固件的默认配置,不会恢复网件原厂系统。
- **误区:科学上网插件能自动切换节点。**
正确只有MerlinClash支持自动延迟测试及自动切换科学上网插件需手动选择节点。
### 快速复习提示与自测题 🎯
#### 提示(无答案)
- 路由器刷梅林固件,第一步刷哪个后缀的固件?
- MerlinClash插件的主要优势是什么
- 如何保证科学上网插件自动更新订阅?
- JFFS双清操作有什么作用
- 两款科学上网插件能否同时使用,为什么?
#### 练习题(含答案)
1. **问题:为什么要先刷过渡固件`.chk`**
**答案**`.chk`固件作为过渡版本,为路由器从原厂固件过渡到梅林固件做准备,直接刷`.w`固件会失败。
2. **问题MerlinClash插件如何实现流量分流**
**答案**:通过策略组配置不同节点和规则,实现基于应用、地区和服务的自动分流和节点故障转移。
3. **问题:科学上网插件支持哪些协议?**
**答案**支持SSR、V2Ray、Trojan等多个协议用户可导入相应订阅。
4. **问题什么是JFFS双清什么时候使用**
**答案**JFFS双清是清理文件系统和缓存通常刷机后执行确保固件环境干净无旧数据残留。
5. **问题:如何测试路由器是否科学上网成功?**
**答案**无需代理工具访问Google和YouTube等被屏蔽网站能成功打开说明科学上网成功。
### 总结回顾 🔎
本视频系统指导了网件RAX50路由器刷入梅林固件的全过程包括切换固件版本、恢复配置以及进行必要的系统清理操作确保固件运行流畅。之后详细介绍了两款主流的科学上网插件——功能全面的MerlinClash和较为简易的科学上网插件重点介绍了MerlinClash的策略组分流和自动节点切换功能帮助用户实现全屋电子设备共享的翻墙网络环境。附带实用操作技巧和注意事项为用户提供了一套完整、稳定、高效的路由器刷机与科学上网解决方案。

View File

@@ -0,0 +1,219 @@
---
title: 测试 Google 连接(强制走代理端口,假设 HTTP 端口是 20171
source:
author: shenwei
published:
created: 2025-03-08
description:
tags: [docker, nas, synology, v2raya, vpn]
---
#v2raya #nas #synology #vpn #docker
```table-of-contents
```
## 安装V2RayA
1. Docker Desktop pull image: **mz2017/v2raya**
2. 通过以下方法把v2raya的images load到NAS Docker里 [[🟠如何传输Docker images 并且在另一个Docker安装|🟠如何传输Docker images 并且在另一个Docker安装]]
3. 参考[v2raya官方网站](https://v2raya.org/) 里的关于[V2RayA Docker安装文档](https://v2raya.org/docs/prologue/installation/docker/)用以下命令来启动 V2RayA:
```
docker run -d \
--restart=always \
--privileged \
--network=host \
--name v2raya \
-e V2RAYA_LOG_FILE=/tmp/v2raya.log \
-e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
-e V2RAYA_NFTABLES_SUPPORT=off \
-e IPTABLES_MODE=legacy \
-v /lib/modules:/lib/modules:ro \
-v /etc/resolv.conf:/etc/resolv.conf \
-v /docker/v2raya:/etc/v2raya \
mzz2017/v2raya
```
**请注意 ==/docker/v2raya== 为实际在NAS上创建的目录其他配置不用修改**
## 启动V2RayA
http://192.168.3.17:2017/
## 配置V2RayA让NAS上的Docker可以科学上网
![[IMG-20251229190624430.png]]
![[IMG-20251229190624730.png]]
在Synology DSM环境下要验证透明代理是否对Host即NAS本机也就是负责执行 `docker pull` 的守护进程)生效,请按照以下逻辑进行排查和验证。
---
### 第一步:在 v2rayA 后台“打开开关”
仅仅运行容器是不够的你必须在Web界面配置路由规则。
1. 打开浏览器访问 `http://<NAS_IP>:2017`。
2. 进入 **设置 (Settings)** -> **透明代理 (Transparent Proxy)**。
3. **核心设置:**
- **启用 (Enable):** 开启。
- **分流模式 (Traffic Splitting):** 建议选择 **"大陆白名单 (Whitelist of Mainland China)"**。这会确保国内流量直连国外流量包括Docker Hub走代理。
- **实现方式:** 既然你在启动命令里加了 `IPTABLES_MODE=legacy`,这里通常保持默认即可。
4. 点击右上角 **保存并应用**。
> **⚠️ 风险提示:** 在NAS上开启透明代理尤其是Host模式有极小概率会导致局域网连接中断。如果你正在远程操作请确保有备用连接方案如QuickConnect或同局域网设备
---
### 第二步:验证 NAS 本机的连通性 (SSH)
SSH 登录到你的群晖 NAS按顺序执行以下测试。
**1. 测试端口监听是否正常** 先确认代理端口是通的:
Bash
```
# 测试 Google 连接(强制走代理端口,假设 HTTP 端口是 20171
curl -I -x http://127.0.0.1:20171 https://www.google.com
```
正确·结果:
``` bash
ash-4.4# curl -I -x http://127.0.0.1:20171 https://www.google.com
HTTP/1.1 200 Connection established
HTTP/2 200
content-type: text/html; charset=ISO-8859-1
content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-Yp5bWu7rNq-vtmDGkOlBXQ' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
accept-ch: Sec-CH-Prefers-Color-Scheme
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Fri, 19 Dec 2025 03:11:44 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Fri, 19 Dec 2025 03:11:44 GMT
cache-control: private
set-cookie: AEC=AaJma5vsWePrX0JcVuFI8-_KwORsyiWxthLxJF9At74ncKOuryIHfjWKpw; expires=Wed, 17-Jun-2026 03:11:44 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
set-cookie: NID=527=w38RE1jq1xO007vl-G-dXmylbeNcX6RrVZsaz16KpJm-VmBVO-dUI4hyW4bqbNK6v3PDNKsGQXeJK8d6n6V9pXHHo5ljqr9FeRMsUwX3Ou1v-hnlKhgIVvCPacBGU-DH3X9WmVgHAMe9ZFMml-RoYQYTLq7-l342kDivOJw7kfuJDnx9ovYV2mATeK11m2PCGL-AcQVDQABuivlpPR4jH22zQ7d7viAmrQ; expires=Sat, 20-Jun-2026 03:11:44 GMT; path=/; domain=.google.com; HttpOnly
set-cookie: __Secure-BUCKET=CPwD; expires=Wed, 17-Jun-2026 03:11:44 GMT; path=/; domain=.google.com; Secure; HttpOnly
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
```
- **成功:** 返回 `HTTP/1.1 200 OK` 或 `301`。
- **失败:** 检查 v2rayA 端口映射或节点连接状态。
**2. 测试透明代理是否生效 (关键步骤)** 不加 `-x` 参数,直接访问,看流量是否被劫持:
Bash
```
curl -I https://www.google.com
```
正确结果:
``` bash
ash-4.4# curl -I https://www.google.com
HTTP/2 200
content-type: text/html; charset=ISO-8859-1
content-security-policy-report-only: object-src 'none';base-uri 'self';script-src 'nonce-aSgzymp_JxooD_Xigz-OgA' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
accept-ch: Sec-CH-Prefers-Color-Scheme
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Fri, 19 Dec 2025 03:12:46 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Fri, 19 Dec 2025 03:12:46 GMT
cache-control: private
set-cookie: AEC=AaJma5sAaR7bW6DxFcTK7qYEJTzl5WO0BYlgJZwxrqpXEi_I3xcW5GckOA; expires=Wed, 17-Jun-2026 03:12:46 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
set-cookie: NID=527=kjjqA9JJyZpXTZGor0foKUDy_xoODeloa9HmubM9DXlCdPwWyNAcgkUMSlKI_ddkcWWIdnD_NqC3GZEN4Yt476PWJXPTjgJqvSSBtEbQ7fY5eM295GEKNwaykECAABE9yELqHgh-VmxRmp8ri4XUYByN11ryyVNI4wgnblCMzfwKRHnfJhCvA7g2IvEdOm2ldJ2ZM8lAQSiRY_CTheXpMZXsq_kIegSt2w; expires=Sat, 20-Jun-2026 03:12:46 GMT; path=/; domain=.google.com; HttpOnly
set-cookie: __Secure-BUCKET=CI8G; expires=Wed, 17-Jun-2026 03:12:46 GMT; path=/; domain=.google.com; Secure; HttpOnly
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
```
- **如果返回 200/301** 说明透明代理已经接管了 NAS 的出站流量。你的 `docker pull` 应该可以直接成功。
- **如果超时/无法连接:** 说明透明代理未对 Host 生效,或者 DSM 的防火墙/路由表与 v2rayA 的规则冲突(这在群晖上很常见)。
---
### 第三步:验证 Docker Pull
如果第二步成功,直接尝试拉取一个通常较慢或被墙的镜像:
Bash
```
# 使用 docker pull 测试docker-compose pull 本质也是调用的 daemon
docker pull google/pause
# 或者
docker pull busybox
```
正确结果
``` bash
ash-4.4# docker pull google/pause
Using default tag: latest
latest: Pulling from google/pause
Image docker.io/google/pause:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Already exists
f72a00a23f01: Already exists
Digest: sha256:e8fc56926ac3d5705772f13befbaee3aa2fc6e9c52faee3d96b26612cd77556c
Status: Image is up to date for google/pause:latest
docker.io/google/pause:latest
```
### 如果透明代理对 Docker Daemon 无效(常见情况)
在群晖 DSM 7.x 中Docker Daemon (`dockerd`) 的网络栈有时候不会完全遵循 v2rayA 修改的 iptables 规则。如果上面的 `docker pull` 仍然慢或失败,**不要死磕透明代理**,直接配置 Docker 守护进程走 HTTP 代理是最稳妥的方案。
**解决方案:配置 Docker Daemon 代理**
1. **编辑/创建配置目录:**
Bash
```
sudo mkdir -p /etc/systemd/system/pkg-ContainerManager-dockerd.service.d/
# 注意DSM 7.2 叫 ContainerManager旧版叫 Docker
```
2. **创建代理配置文件:**
Bash
```
sudo vi /etc/systemd/system/pkg-ContainerManager-dockerd.service.d/http-proxy.conf
```
3. **写入以下内容:**
``` bash
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:20171"
Environment="HTTPS_PROXY=http://127.0.0.1:20171"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.*,*.synology.me"
```
4. **重载并重启 Docker 服务:**
Bash
```
sudo systemctl daemon-reload
sudo systemctl restart pkg-ContainerManager-dockerd
```
### 总结
- **验证方法:** 先用 `curl -x` 测端口,再用 `curl` 测直连,最后用 `docker pull` 实战。
- **经验之谈:** 对于企业级或生产环境即使是SOHO我建议**不要**依赖 NAS Host 的透明代理来解决 `docker pull` 问题,因为这修改了系统级路由表,容易影响 NAS 其他服务。**显式配置 Docker Daemon 的 Proxy 环境变量(上面的最后一种方法)是更符合 Engineering Best Practice 的做法。**

View File

@@ -0,0 +1,232 @@
---
title: 家庭网络环境概览
source:
author: shenwei
published:
created:
description:
tags: [home-office, nas, synology, ubuntu, vps]
---
#vps #nas #synology #ubuntu #home-office
```table-of-contents
```
# 家庭网络环境概览
> 📅 文档更新日期: 2026-04-03
> 📝 更新内容: Docker 应用列表、FRP 端口映射、域名映射表
---
## 公网VPS1 (RackNerd)
| 公网IP | 公共域名 | SSH enabled? |
| --------------- | ------------------- | ------------ |
| 192.227.222.142 | vps.ishenwei.online | Yes (ssh vps1) |
### 安装的应用
| Name | Docker? | Note | Public Address |
| ---------- | ------- | ---------------------------------------------------- | ------------------------- |
| Caddy | No | 现代化 Web 服务器,自带 HTTPS 自动化证书申请,常作为前置反向代理处理业务流量。 | 通过 *.ishenwei.online 域名访问 |
| FRP Server | No | 高性能内网穿透服务端frps负责将内网 NAS 或本地开发环境的服务暴露至公网访问。端口 7000 | |
---
## Mac Mini M4 (主控节点)
| 内网IP | 公共域名 | SSH enabled |
| ------------ | ------------------- | ----------- |
| 192.168.3.189 | macmini.ishenwei.online | Yes |
### 安装的应用
| Name | Docker? | Note | Internal Address | Public Address |
| ------------- | ------ | -------------------------------------------- | -------------------------------- | ------------------------------------- |
| OpenClaw | No | AI 助手框架,星曜的运行环境 | http://192.168.3.189:8080/ | |
| vaultwarden | Yes | 轻量级 Bitwarden 服务端 | http://192.168.3.189:5151/ | https://vaultwarden.ishenwei.online/ |
| stq_nginx | Yes | STQ 项目管理系统反向代理 | http://192.168.3.189:7777/ | https://stq.ishenwei.online/ |
| stq_frontend | Yes | STQ 项目前端 | http://192.168.3.189:5173/ | |
| stq_web | Yes | STQ Web 服务 | http://192.168.3.189:8000/ | |
| stq_mariadb | Yes | STQ MySQL 数据库 | http://192.168.3.189:3306/ | |
| stq-n8n | Yes | STQ 专用 n8n 工作流 | http://192.168.3.189:62000/ | |
| portainer | Yes | Docker 容器可视化管理界面(历史版本,已废弃) | http://192.168.3.189:9000/ | 已废弃,使用各服务器本地 portainer |
### FRP 端口映射
| 名称 | 类型 | localPort | remotePort |
|------|------|------------|------------|
| macmini-ssh | tcp | 22 | 60026 |
| vaultwarden | tcp | 5151 | 15151 |
> ⚠️ 注: n8n 已迁移至 Ubuntu2Mac Mini 不再暴露 n8n 端口
---
## 内网Synology NAS DS718
| 内网IP | 公共域名 | SSH enabled |
| ------------ | ------------------- | ----------- |
| 192.168.3.17 | nas.ishenwei.online | Yes |
### 安装的应用
| Name | Docker? | Note | Internal Address | Public Address |
| ------------------------- | ------ | ------------------------------------------------ | ---------------------------------------- | ------------------------------------------------ |
| Synology NAS DSM | No | 系统的核心管理界面 | http://192.168.3.17:5000/ | https://nas.ishenwei.online/ |
| Calibre | Yes | 强大的电子书库管理工具 | http://192.168.3.17:8083/ | https://calibre.ishenwei.online/ |
| MinIO | Yes | 高性能对象存储 | http://192.168.3.17:9001/ | |
| Zipline | Yes | 轻量级文件分享与图床服务 | http://192.168.3.17:3333/ | https://zipline.ishenwei.online/ |
| navidrome | Yes | 轻量级自建音乐流媒体服务 | http://192.168.3.17:4533/ | https://navidrome.ishenwei.online/ |
| jellyfin | Yes | 媒体服务器 | http://192.168.3.17:8096/ | https://jellyfin.ishenwei.online/ |
| prometheus | Yes | 时序数据库监控系统 | http://192.168.3.17:9090/ | |
| alertmanager | Yes | 告警中心 | http://192.168.3.17:9093/ | |
| node_exporter | Yes | 硬件监控探针 | http://192.168.3.17:9100/ | |
| v2raya | Yes | V2Ray 图形化代理客户端 | http://192.168.3.17:2017/ | |
| vaultwarden (NAS版) | Yes | 密码管理器 | http://192.168.3.17:5151/ | |
| portainer | Yes | Docker 容器管理 | http://192.168.3.17:9443/ | |
| CloudDrive2 | No | 多云盘挂载工具 | http://192.168.3.17:19798/ | |
| zipline_postgres | Yes | Zipline 的后端数据库 | http://192.168.3.17:5432/ | |
| FRP Client | No | 内网穿透客户端 | /opt/frp/frp_0.65.0_linux_amd64 | |
### FRP 端口映射 (通过其他服务器暴露)
| 服务 | 来源服务器 | remotePort |
|------|-----------|------------|
| nas.ishenwei.online | VPS直连 | 15000 |
| navidrome | NAS | 14533 |
| calibre | NAS | 18083 |
| jellyfin | NAS | 18096 |
| zipline | NAS | 13333 |
| miniflux | NAS | 18080 |
---
## 内网Ubuntu Server 1
| 内网IP | 公共域名 | SSH enabled |
| ------------ | ----------------------- | ----------- |
| 192.168.3.47 | ubuntu1.ishenwei.online | Yes |
### 安装的应用
| Name | Docker? | Note | Internal Address | Public Address |
| ------------------- | ------- | ----------------------------- | ------------------------------- | ------------------------------------- |
| glances | Yes | 轻量级服务器监控工具 | http://192.168.3.47:9089/ | |
| prometheus | Yes | 时序数据库监控系统 | http://192.168.3.47:9090/ | |
| grafana | Yes | 数据可视化看板 | http://192.168.3.47:3000/ | https://grafana.ishenwei.online/ |
| alertmanager | Yes | 处理 Prometheus 告警策略 | http://192.168.3.47:9093/ | |
| blackbox | Yes | 网络探测工具 | http://192.168.3.47:9115/ | |
| node_exporter | Yes | 收集主机性能指标 | http://192.168.3.47:9100/ | |
| cadvisor | Yes | 容器监控 | http://192.168.3.47:8080/ | |
| homarr | Yes | 个人导航页面板 | http://192.168.3.47:7575/ | https://dashboard.ishenwei.online/ |
| superset | Yes | 商业智能 (BI) 平台 | http://192.168.3.47:8777/ | https://superset.ishenwei.online/ |
| tiktok_pm_nginx | Yes | TikTok 项目管理系统前端反向代理 | | |
| tiktok_pm_web | Yes | TikTok 项目管理系统 Web 服务 | http://192.168.3.47:8888/ | https://tk.ishenwei.online/ |
| tiktok_pm_worker | Yes | TikTok 项目异步任务 | | |
| transmission | Yes | BitTorrent 下载客户端 | http://192.168.3.47:9091/ | https://transmission.ishenwei.online/ |
| portainer | Yes | Docker 容器管理 | http://192.168.3.47:9000/ | https://portainer1.ishenwei.online/ |
| it-tools | Yes | 开发者在线工具箱 | http://192.168.3.47:8999/ | https://it-tools.ishenwei.online/ |
| nginx-proxy-manager | Yes | 反向代理管理 | http://192.168.3.47:81/ | |
| FRP Client | No | 内网穿透客户端 | /opt/frp/frp_0.65.0_linux_amd64 | |
### FRP 端口映射
| 名称 | 类型 | localPort | remotePort |
|------|------|------------|------------|
| ubuntu1-ssh | tcp | 22 | 60022 |
| transmission | tcp | 9091 | 19091 |
| grafana | tcp | 3000 | 13000 |
| homarr | tcp | 7575 | 17575 |
| superset | tcp | 8777 | 18777 |
| tk | tcp | 8888 | 18888 |
| ubuntu1-portainer | tcp | 9000 | 19443 |
| it-tools | tcp | 8999 | 18999 |
| stq | tcp | 5173 | 15173 |
| stq-admin | tcp | 7777 | 17000 |
| stq-n8n | tcp | 62000 | 15678 |
---
## 内网Ubuntu Server 2
| 内网IP | 公共域名 | SSH enabled |
| ------------ | ----------------------- | ----------- |
| 192.168.3.45 | ubuntu2.ishenwei.online | Yes |
### 安装的应用
| Name | Docker? | Note | Internal Address | Public Address |
| ------------------- | ------ | --------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------- |
| glances | Yes | 轻量级服务器监控工具 | http://192.168.3.45:9089/ | |
| n8n | Yes | 工作流自动化平台 | http://192.168.3.45:5678/ | |
| n8n_postgres | Yes | n8n PostgreSQL 数据库 | http://192.168.3.45:5432/ | |
| drawio | Yes | 在线图表编辑器 | http://192.168.3.45:8085/ | https://drawio.ishenwei.online/ |
| it-tools | Yes | 开发者在线工具箱(同步版本) | http://192.168.3.45:8999/ | |
| gitea | Yes | 自建 Git 服务 | http://192.168.3.45:3000/ | |
| portainer | Yes | Docker 容器管理界面 | http://192.168.3.45:8000/ | |
| md | Yes | Markdown 文档转换工具 | http://192.168.3.45:8989/ | |
| n8n-workflows-docs | Yes | n8n 工作流文档服务 | http://192.168.3.45:8001/ | |
| tiktok_pm_mariadb | Yes | TikTok 项目 MySQL 数据库 | http://192.168.3.45:3306/ | |
| tiktok_pm_nginx | Yes | TikTok 项目管理系统(DEV)前端反向代理 | | |
| tiktok_pm_web | Yes | TikTok 项目管理系统(DEV) Web 服务 | http://192.168.3.45:8888/ | https://tk-dev.ishenwei.online/ |
| tiktok_pm_worker | Yes | TikTok 项目(DEV)异步任务 | | |
| FRP Client | No | 内网穿透客户端 | /opt/frp/frp_0.65.0_linux_amd64 | |
### FRP 端口映射
| 名称 | 类型 | localPort | remotePort |
|------|------|------------|------------|
| ubuntu2-ssh | tcp | 22 | 60024 |
| tk-dev | tcp | 8888 | 18889 |
| n8n | tcp | 5678 | 15679 |
| it-tools | tcp | 8999 | 18999 |
| drawio | tcp | 8085 | 18085 |
---
## 域名映射表 (Caddy)
| 域名 | → 端口 | 映射服务器 | 服务 |
| -------------------------------- | ----- | ------- | ------------ |
| vaultwarden.ishenwei.online | 15151 | macmini | vaultwarden |
| n8n.ishenwei.online | 15679 | ubuntu2 | n8n |
| it-tools.ishenwei.online | 18999 | ubuntu1 | it-tools |
| drawio.ishenwei.online | 18085 | ubuntu2 | drawio |
| transmission.ishenwei.online | 19091 | ubuntu1 | transmission |
| grafana.ishenwei.online | 13000 | ubuntu1 | grafana |
| nas.ishenwei.online | 15000 | NAS | DSM |
| navidrome.ishenwei.online | 14533 | NAS | navidrome |
| calibre.ishenwei.online | 18083 | NAS | calibre-web |
| dashboard.ishenwei.online | 17575 | ubuntu1 | homarr |
| miniflux.ishenwei.online | 18080 | NAS | miniflux |
| zipline.ishenwei.online | 13333 | NAS | zipline |
| superset.ishenwei.online | 18777 | ubuntu1 | superset |
| tk.ishenwei.online | 18888 | ubuntu1 | tiktok_pm |
| tk-dev.ishenwei.online | 18889 | ubuntu2 | tiktok_pm_dev |
| jellyfin.ishenwei.online | 18096 | NAS | jellyfin |
| portainer1.ishenwei.online | 19443 | ubuntu1 | portainer |
| stq.ishenwei.online | 15173 | ubuntu1 | stq |
| stq-admin.ishenwei.online | 17000 | ubuntu1 | stq-admin |
| stq-n8n.ishenwei.online | 15678 | ubuntu1 | stq-n8n |
---
## 科学上网代理端口
| 服务器 | 代理地址 | 状态 |
|--------|----------|------|
| macmini | socks5://127.0.0.1:10808 | ✅ 正常 |
| ubuntu1 | socks5://127.0.0.1:10808 | ✅ 正常 |
| ubuntu2 | socks5://127.0.0.1:10808 | ✅ 正常 |
| NAS | socks5://127.0.0.1:20170 | ❌ 仅本机监听 |
---
## Cloudflare
> 域名 DNS 托管于 Cloudflare提供免费 CDN 与 SSL 证书。
![[IMG-20260403182706525.png]]

View File

@@ -0,0 +1,623 @@
---
title:
source:
author: shenwei
published:
created:
description:
tags: [frp, frpc, gatekeeper, mac-mini, macos]
---
#mac-mini #frp #frpc #macos #gatekeeper
```table-of-contents
```
- **FRP版本**0.65.0
- **CPU架构**Apple Siliconarm64
- **安装路径**`/opt/frp/frp_0.65.0_darwin_arm64`
- **下载地址**GitHub Release
- **配置文件**`frpc.toml`
- **包含 macOS Gatekeeper 处理**
此文档可以直接保存为 **README.md 或运维手册**。
---
## 一、环境信息
| 项目 | 内容 |
| ----- | ---------------------------------- |
| 系统 | macOSMac Mini M4 |
| 架构 | Apple Silicon (ARM64) |
| 软件 | FRP 0.65.0 |
| 安装目录 | `/opt/frp/frp_0.65.0_darwin_arm64` |
| 客户端程序 | `frpc` |
| 配置文件 | `frpc.toml` |
---
## 二、创建安装目录
macOS 默认 `/opt` 需要手动创建。
```bash
sudo mkdir -p /opt/frp
sudo chown -R $(whoami) /opt/frp
```
进入目录:
```bash
cd /opt/frp
```
---
## 三、下载 FRP
下载 **ARM64 版本**
```bash
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_darwin_arm64.tar.gz
```
如果没有 wget
```bash
brew install wget
```
---
## 四、解压 FRP
```bash
tar -xzf frp_0.65.0_darwin_arm64.tar.gz
```
解压后目录结构:
```
/opt/frp
└── frp_0.65.0_darwin_arm64
├── frpc
├── frps
├── frpc.toml
├── frps.toml
└── LICENSE
```
进入目录:
```bash
cd /opt/frp/frp_0.65.0_darwin_arm64
```
---
## 五、解除 macOS Gatekeeper 限制
macOS 会阻止未签名程序运行。
需要删除 quarantine 属性:
```bash
xattr -rd com.apple.quarantine .
```
验证:
```bash
xattr frpc
```
如果没有输出说明解除成功。
---
## 六、修改 frpc.toml 配置
编辑配置:
```bash
nano /opt/frp/frp_0.65.0_darwin_arm64/frpc.toml
```
示例配置:
```toml
serverAddr = "192.227.222.142"
serverPort = 7000
auth.method = "token"
auth.token = "your_token_here"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
```
参数说明:
|参数|说明|
|---|---|
|serverAddr|frps服务器地址|
|serverPort|frps监听端口|
|auth.token|认证token|
|localIP|本地服务地址|
|localPort|本地端口|
|remotePort|frps映射端口|
---
## 七、测试运行
进入目录:
```bash
cd /opt/frp/frp_0.65.0_darwin_arm64
```
启动客户端:
```bash
./frpc -c frpc.toml
```
成功日志示例:
```
login to server success
proxy added: ssh
start proxy success
```
---
## 八、后台运行方式
推荐三种方式。
---
### 方式一tmux推荐
安装 tmux
```bash
brew install tmux
```
创建会话:
```bash
tmux new -s frpc
```
启动程序:
```bash
cd /opt/frp/frp_0.65.0_darwin_arm64
./frpc -c frpc.toml
```
后台运行:
```
Ctrl + B
D
```
重新进入:
```bash
tmux attach -t frpc
```
查看会话:
```bash
tmux ls
```
---
### 方式二nohup
后台启动:
```bash
cd /opt/frp/frp_0.65.0_darwin_arm64
nohup ./frpc -c frpc.toml > frpc.log 2>&1 &
```
查看进程:
```bash
ps aux | grep frpc
```
查看日志:
```bash
tail -f frpc.log
```
停止:
```bash
pkill frpc
```
---
### 方式三launchd推荐开机自启
创建配置文件:
```bash
nano ~/Library/LaunchAgents/com.frpc.client.plist
```
配置内容:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.frpc.client</string>
<key>ProgramArguments</key>
<array>
<string>/opt/frp/frp_0.65.0_darwin_arm64/frpc</string>
<string>-c</string>
<string>/opt/frp/frp_0.65.0_darwin_arm64/frpc.toml</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/opt/frp/frp_0.65.0_darwin_arm64/frpc.log</string>
<key>StandardErrorPath</key>
<string>/opt/frp/frp_0.65.0_darwin_arm64/frpc.error.log</string>
</dict>
</plist>
```
加载服务:
```bash
launchctl load ~/Library/LaunchAgents/com.frpc.client.plist
```
启动:
```bash
launchctl start com.frpc.client
```
停止:
```bash
launchctl stop com.frpc.client
```
卸载:
```bash
launchctl unload ~/Library/LaunchAgents/com.frpc.client.plist
```
---
## 九、常用维护命令
### 查看 frpc 进程
```bash
ps aux | grep frpc
```
---
### 查看日志
```bash
tail -f /opt/frp/frp_0.65.0_darwin_arm64/frpc.log
```
---
### 重启 frpc
```bash
pkill frpc
cd /opt/frp/frp_0.65.0_darwin_arm64
./frpc -c frpc.toml
```
---
## 十、升级 FRP
升级步骤:
```
停止 frpc
下载新版本
解压
替换目录
重新运行
```
示例:
```bash
pkill frpc
cd /opt/frp
wget 新版本
tar -xzf
```
---
## 十一、最终目录结构
```
/opt/frp
└── frp_0.65.0_darwin_arm64
├── frpc
├── frps
├── frpc.toml
├── frpc.log
└── frpc.error.log
```
---
## 十二、快速启动命令
日常手动运行:
```bash
cd /opt/frp/frp_0.65.0_darwin_arm64
xattr -rd com.apple.quarantine .
./frpc -c frpc.toml
```
---
## 十三、生产环境最佳实践
建议:
### 1 统一路径
```
/opt/frp/<version>
```
方便版本切换。
例如:
```
/opt/frp/frp_0.65.0_darwin_arm64
/opt/frp/frp_0.66.0_darwin_arm64
```
---
### 2 创建软链接
```
/opt/frp/current
```
示例:
```bash
ln -sfn /opt/frp/frp_0.65.0_darwin_arm64 /opt/frp/current
```
启动时:
```
/opt/frp/current/frpc
```
升级时只需要切换 symlink。
---
### 3 日志独立
```
/opt/frp/logs
```
更利于监控。
---
如果你愿意,我可以再帮你整理一份 **Mac Mini 服务器化运维方案FRP + OpenClaw + n8n + Clash统一进程管理架构**,解决几个你现在已经遇到的问题:
- frp
- openclaw
- proxychains
- tmux
- telegram bot
- n8n
统一用 **macOS launchd + 进程依赖管理** 管理,这样你的 **Mac Mini 就可以像一台真正的 Linux server 一样稳定运行**
---
## 十四、实际案例:通过 FRP 远程 SSH 登录 Mac Mini
本案例用于 **通过 VPS 作为中转服务器,从公网 SSH 访问 Mac Mini**
架构如下:
本地 Mac Mini
│ SSH 22
frpc 客户端
│ FRP 隧道
远端 VPS (frps)
│ 60026
公网 SSH 访问
公网访问方式:
ssh 用户名@VPS_IP -p 60026
---
### 1 VPS 服务器开放防火墙端口
如果 VPS 使用 **UFW 防火墙**,需要允许 FRP 映射端口。
执行:
sudo ufw allow 60026
检查防火墙状态:
sudo ufw status
输出示例:
60026/tcp ALLOW Anywhere
说明端口已开放。
---
### 2 修改 frpc.toml 配置
编辑配置文件:
nano /opt/frp/frp_0.65.0_darwin_arm64/frpc.toml
增加如下代理配置:
[[proxies]]
name = "macmini-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 60026
配置说明:
|参数|说明|
|---|---|
|name|代理名称|
|type|TCP转发|
|localIP|本地 SSH 地址|
|localPort|本地 SSH 端口|
|remotePort|VPS 上映射端口|
---
### 3 完整 frpc.toml 示例
示例:
serverAddr = "VPS_IP"
serverPort = 7000
auth.method = "token"
auth.token = "your_token"
[[proxies]]
name = "macmini-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 60026
---
### 4 重启 frpc
重新启动客户端:
pkill frpc
cd /opt/frp/frp_0.65.0_darwin_arm64
./frpc -c frpc.toml
成功日志示例:
proxy added: macmini-ssh
start proxy success
---
### 5 测试远程 SSH
在任意公网机器执行:
ssh username@VPS_IP -p 60026
示例:
ssh billy@192.227.xxx.xxx -p 60026
成功后即可登录 Mac Mini。
---
### 6 推荐 SSH 使用方式
为了方便使用,可以在 **客户端 ~/.ssh/config** 添加配置:
nano ~/.ssh/config
增加:
Host macmini
HostName VPS_IP
Port 60026
User billy
之后直接:
ssh macmini
即可登录 Mac Mini。

View File

@@ -0,0 +1,424 @@
---
title: Ubuntu 安装 FRP 0.65.0x86_64操作笔记
source:
author: shenwei
published:
created:
description:
tags: [frp, frpc, ubuntu]
---
# Ubuntu 安装 FRP 0.65.0x86_64操作笔记
#ubuntu #frp #frpc
```table-of-contents
```
- **FRP版本**0.65.0
- **CPU架构**x86_64 (amd64)
- **安装路径**`/opt/frp/frp_0.65.0_linux_amd64`
- **配置文件**`frpc.toml`
- **服务管理**systemd
此文档可以直接保存为 **README.md 或运维手册**。
---
## 一、环境信息
| 项目 | 内容 |
| ----- | ---------------------------------- |
| 系统 | Ubuntu Server 24.04 |
| 架构 | x86_64 (amd64) |
| 软件 | FRP 0.65.0 |
| 安装目录 | `/opt/frp/frp_0.65.0_linux_amd64` |
| 客户端程序 | `frpc` |
| 配置文件 | `frpc.toml` |
| 服务管理 | systemd |
---
## 二、创建安装目录
```bash
sudo mkdir -p /opt/frp
sudo chown -R $(whoami) /opt/frp
```
进入目录:
```bash
cd /opt/frp
```
---
## 三、下载 FRP
下载 **x86_64 版本**
```bash
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
```
如果没有 wget
```bash
sudo apt update
sudo apt install -y wget
```
---
## 四、解压 FRP
```bash
tar -xzf frp_0.65.0_linux_amd64.tar.gz
```
解压后目录结构:
```
/opt/frp
└── frp_0.65.0_linux_amd64
├── frpc
├── frps
├── frpc.toml
├── frps.toml
└── LICENSE
```
进入目录:
```bash
cd /opt/frp/frp_0.65.0_linux_amd64
```
---
## 五、修改 frpc.toml 配置
编辑配置:
```bash
nano /opt/frp/frp_0.65.0_linux_amd64/frpc.toml
```
示例配置:
```toml
serverAddr = "192.227.222.142"
serverPort = 7000
[auth]
token = "your_token_here"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
```
参数说明:
|参数|说明|
|---|---|
|serverAddr|frps服务器地址|
|serverPort|frps监听端口|
|auth.token|认证token|
|localIP|本地服务地址|
|localPort|本地端口|
|remotePort|frps映射端口|
---
## 六、测试运行
进入目录:
```bash
cd /opt/frp/frp_0.65.0_linux_amd64
```
启动客户端:
```bash
./frpc -c frpc.toml
```
成功日志示例:
```
login to server success
proxy added: ssh
start proxy success
```
按 `Ctrl + C` 停止测试。
---
## 七、systemd 服务管理(推荐)
### 1 创建 systemd 服务文件
```bash
sudo nano /etc/systemd/system/frpc.service
```
### 2 配置内容
```ini
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/frp/frp_0.65.0_linux_amd64/frpc -c /opt/frp/frp_0.65.0_linux_amd64/frpc.toml
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
### 3 重新加载 systemd
```bash
sudo systemctl daemon-reload
```
### 4 启动 frpc 服务
```bash
sudo systemctl start frpc
```
### 5 设置开机自启
```bash
sudo systemctl enable frpc
```
### 6 查看服务状态
```bash
sudo systemctl status frpc
```
---
## 八、常用维护命令
### 查看 frpc 进程
```bash
ps aux | grep frpc
```
---
### 查看日志
```bash
sudo journalctl -u frpc -f
```
或查看历史日志:
```bash
sudo journalctl -u frpc --no-pager -n 50
```
---
### 重启 frpc
```bash
sudo systemctl restart frpc
```
---
### 停止 frpc
```bash
sudo systemctl stop frpc
```
---
### 禁用开机自启
```bash
sudo systemctl disable frpc
```
---
## 九、卸载 FRP
1. 停止服务:
```bash
sudo systemctl stop frpc
sudo systemctl disable frpc
```
2. 删除服务文件:
```bash
sudo rm /etc/systemd/system/frpc.service
sudo systemctl daemon-reload
```
3. 删除安装目录:
```bash
sudo rm -rf /opt/frp
```
---
## 十、升级 FRP
升级步骤:
```
停止 frpc
下载新版本
解压
替换目录
重新运行
```
示例:
```bash
sudo systemctl stop frpc
cd /opt/frp
wget https://github.com/fatedier/frp/releases/download/v0.66.0/frp_0.66.0_linux_amd64.tar.gz
tar -xzf frp_0.66.0_linux_amd64.tar.gz
# 如果需要可以更新软链接
sudo systemctl start frpc
```
---
## 十一、最终目录结构
```
/opt/frp
└── frp_0.65.0_linux_amd64
├── frpc
├── frps
├── frpc.toml
└── frps.toml
```
---
## 十二、生产环境最佳实践
### 1 统一路径
```
/opt/frp/<version>
```
方便版本切换。
例如:
```
/opt/frp/frp_0.65.0_linux_amd64
/opt/frp/frp_0.66.0_linux_amd64
```
---
### 2 创建软链接
```
/opt/frp/current
```
示例:
```bash
sudo ln -sfn /opt/frp/frp_0.65.0_linux_amd64 /opt/frp/current
```
启动时(修改 systemd 服务文件):
```ini
ExecStart=/opt/frp/current/frpc -c /opt/frp/current/frpc.toml
```
升级时只需要切换 symlink无需修改 systemd 配置。
---
### 3 日志管理
建议使用 journald 日志,可通过以下命令查看:
```bash
sudo journalctl -u frpc -f
```
---
## 十三、快速启动命令
日常手动运行(不通过 systemd
```bash
cd /opt/frp/frp_0.65.0_linux_amd64
./frpc -c frpc.toml
```
---
## 十四、故障排查
### 服务启动失败
1. 检查配置文件语法:
```bash
./frpc validate -c frpc.toml
```
2. 查看详细错误日志:
```bash
sudo journalctl -u frpc -e
```
3. 检查端口是否被占用:
```bash
sudo netstat -tlnp | grep <端口号>
```
### 无法连接 frps 服务器
1. 检查服务器地址和端口是否正确
2. 检查防火墙是否开放相应端口
3. 检查 token 是否匹配
---
## 十五、相关文档
- [Mac Mini 安装 FRP 0.65.0ARM64操作笔记](./🟣Mac%20Mini%20安装%20FRP%200.65.0ARM64操作笔记.md)
- [通过VPS+内网反向代理实现域名访问内网穿透](./通过VPS+内网反向代理实现域名访问内网穿透.md)

View File

@@ -0,0 +1,191 @@
---
title: 1 创建 Symbolic Link
source:
author: shenwei
published:
created:
description:
tags: [obsidian, openclaw, symbolic-link]
---
#symbolic-link #obsidian #openclaw
下面是一份可以直接放进 **Obsidian** 的 Markdown 笔记,用于记录 **macOS 创建 / 解除 Symbolic Link符号链接** 的操作。
## 背景
OpenClaw 默认使用隐藏目录:
```
~/.openclaw
```
该目录不方便在 **Finder 或 Obsidian** 中直接作为 Vault 使用。
解决方法是创建一个 **Symbolic Link符号链接**,把隐藏目录映射为普通目录:
```
~/openclaw
```
这样:
- OpenClaw 继续使用 `~/.openclaw`
- Obsidian 可以使用 `~/openclaw`
- 两者访问的是 **同一份数据**
---
# 1 创建 Symbolic Link
在 Terminal 执行:
```bash
ln -s /Users/weishen/.openclaw /Users/weishen/openclaw
```
或使用 `~`
```bash
ln -s ~/.openclaw ~/openclaw
```
执行后目录结构变为:
```
~/openclaw -> ~/.openclaw
```
---
# 2 验证 Symbolic Link
查看链接:
```bash
ls -l ~ | grep openclaw
```
示例输出:
```
openclaw -> /Users/weishen/.openclaw
```
查看链接指向:
```bash
readlink ~/openclaw
```
---
# 3 在 Obsidian 中使用
打开 Obsidian
```
Open folder as vault
```
选择:
```
/Users/weishen/openclaw
```
Obsidian 即可访问 OpenClaw 的 Markdown 文件。
---
# 4 解除 Symbolic Link删除映射
如果需要取消映射,只需要删除链接:
```bash
rm ~/openclaw
```
或者:
```bash
rm /Users/weishen/openclaw
```
⚠️ 该操作 **只会删除链接文件,不会删除真实目录**
---
# 5 验证解除成功
检查链接是否存在:
```bash
ls -l ~ | grep openclaw
```
如果没有输出,说明链接已经删除。
真实目录仍然存在:
```bash
ls ~/.openclaw
```
---
# 6 注意事项
不要误删真实目录:
```
rm -rf ~/.openclaw
```
该命令会 **删除 OpenClaw 数据目录**
---
# 7 推荐的长期目录结构
为了更方便管理,可以采用如下结构:
```
~/openclaw
├── agents
├── skills
├── memory
├── prompts
├── logs
└── docs
```
然后创建反向链接:
```bash
ln -s ~/openclaw ~/.openclaw
```
这样:
```
~/openclaw # 实际目录
~/.openclaw -> ~/openclaw
```
优点:
- Finder / Obsidian 可直接访问
- OpenClaw 兼容原路径
- 方便 Git 管理与备份
---
如果需要,我还可以帮你整理一套 **OpenClaw + Obsidian 的完整知识库结构Agent Memory / Skills / Prompts / Runbooks**,非常适合你现在的 **多服务器 OpenClaw Agent 管理场景**