背景

用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora。由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号、密码啥的),所以不敢往各种云服务上放,还是想着数据由自己来管着。

自己管数据的话,就是数据存储到哪里的问题,有很多朋友是折腾nas(Network Attached Storage:网络附属存储),相当于是搞一个家用的服务器,一般24小时开机,对外提供各种协议的服务(如webdav、ftp、sftp、http等),随时可以往这个服务器上上传东西,或者是下载东西。理论上来说,任意的硬件,只要能刷上一个操作系统,部署上各种服务,就是一台nas;但目前这个东西,已经发展成了一个专业的设备,比如你如果拿一个废旧电脑来做nas,那电脑芯片一般是基于x86架构的,比较耗电,放在家里24小时开机就有点不划算,所以很多nas都是arm架构,当然,为了追求性能,也有x86架构的,也更贵就是了。

我个人还没买过nas设备(qiong啊),所以把数据存到nas但我手里有一台云服务器,就是普通的1核2G那种,拿来存储自己的数据也是足够的,因此,我一直以来的方案是,在云服务器上自建了git服务,本地的笔记就用git来管理,新增或修改后就push到云服务器上,做个备份。

这种的好处在于,虽然文件存放在云服务器上,但是是由git管理的,如果黑客攻进去了,也不一定能发现我的原始文件。

我之前也想过在手机上看这些笔记(主要是看,不在手机上写),但我发现,由于我的破iphone 11一直没升级(系统是ios 13.5,为啥不升呢,升了怕卡),可以选择的app相当有限,其实就是想找个git客户端就行,但支持连接自建git的,并支持渲染markdown格式的笔记的,且能在ios13.5上跑的,之前找过一次,还真是没找到。

最近研究了下这块,我发现,之前思想确实太局限了,为啥一定要用git协议做同步呢,http、ftp、sftp、smb等,哪个不能用?

说下这两天研究的webdav方案吧。

webdav协议

官网:http://www.webdav.org/

官方简介:WebDAV stands for "Web-based Distributed Authoring and Versioning". It is a set of extensions to the HTTP protocol which allows users to collaboratively edit and manage files on remote web servers.

WebDAV扩展了HTTP协议,允许用户协作,对远程web服务器上的文件进行编辑和管理。

大家可能会想到restful,毕竟restful就是用各种HTTP Method来标识接口的意图(如对资源的增删改查,用GET/PUT/POST/DELETE这几个Method来标识),WebDAV和它有点类似,但更偏向于文件协作,因为WebDAV中扩展了很多HTTP METHOD,如下:

  • COPY, copy a resource

  • MOVE, move a resource

  • MKCOL, create a collection, for example, a folder

  • PROPFIND, retrieve properties stored as XML

  • PROPPATCH, change and/or remove properties

  • LOCK, put a lock on a resource

  • UNLOCK, remove a lock from a resource

可以看到,包含了一些指令,如果要拷贝一个资源,不需要下载下来,再上传,只需要使用COPY即可;另外,还有LOCK和UNLOCK,可以用于锁定资源,避免多人修改同一个文件时出现冲突(这几年慢慢出现了腾讯文档这样的多人协作的在线文档,和这里的理念类似)。

我本地有两个webdav客户端,下面先展示一个通过nextcloud(https://docs.nextcloud.com/desktop/3.13/installing.html),在本地新建文件:test-0701.txt时的网络报文:

以下 是响应:

我本地用的raidrive windows客户端,准备演示下lock功能,发现没找到。查了文档,只有专业版才支持

https://docs.raidrive.com/options/filelock/

所以,这边就看看官方文档的示例吧:

http://www.webdav.org/specs/rfc4918.html#n-example---simple-lock-request

针对锁定,文档中还规定了锁的模式,排他锁或者是共享锁,可以看上图,就是排他锁。

http://www.webdav.org/specs/rfc4918.html#exclusive-lock

各种传输协议的简单理解

简单查了一下,nas对外支持的协议,一般有这么几种:

  • NFS(Network File System),客户端一般是unix/linux系统;当然,我也搜了下“nfs client windows”,发现win7就有NFS client,https://learn.microsoft.com/en-us/windows-server/storage/nfs/nfs-overview

  • AFP(Apple Filing Protocol),客户端一般是Mac系统

  • CIFS/SMB(Server Message Block),SMB 最早是微软为自己需求设计的专用协议,用来实现微软主机之间的文件共享与打印共享,并不支持在 Linux 上运行,也就是说windows系统作为smb协议,只能访问另一台windows;后来,被技术大佬Andrew Tridgwell进行逆向,开发了samba,包含服务端(samba)和客户端(smbclient ),可以在linux/unix上运行,这样的话,windows、linux/unix主机之间就可以自由地通过smb协议进行网络交互了;

    该协议的主要client应该还是windows主机,因为nas支持了NFS,在linux上完全可以用走NFS协议;

    https://www.samba.org/samba/docs/current/man-html/smbclient.1.html

  • FTP(File Transfer Protocol)/SFTP(Secure File Transfer Protocol),这两个就不多说了,后者是基于SSH对文件传输进行安全增强;

  • WebDAV,基于HTTP或HTTPS,可以充分利用目前互联网上的各种web基础设施,也不容易被防火墙拦截

  • http/https,这个就不提了,最基础的。

在上述几种协议中,FTP系列、WebDAV、http/https,应该是拥有最广泛的客户端实现,因此,如果是要通过app访问nas的话,选择这几种流行的协议进行传输,可以有最广泛的选择度。

在FTP和WebDAV之间进行选择,其实就是对FTP和http进行选择,基本上,http是优势明显,可以参考如下链接:

https://stackoverflow.com/questions/11216884/which-file-access-is-the-best-webdav-or-ftp

我这里也看了下,我ios中一个app,作为一款客户端支持的各种协议:

webdav服务端

这个就多了去了,各种商业产品,各种开源产品,商业产品就不说了,我说说我目前知道的开源产品。

我目前在自己云服务器上,搭建了一套NextCloud服务端,它可以私有化部署,就像我这样。

官网:https://nextcloud.com/install/#instructions-server

Nextcloud这种算是网盘类软件,我对网盘类软件的理解是,我在本地的文件是什么样,你在网盘的UI上呈现出来也是什么样,通过另一个client拉取下来的文件,还是和我之前的文件一样的,文件名、文件格式等不要给我改了,说白了就是文件存储、对象存储。

同类的软件,我知道的还有:Owncloud (其实和NextCloud是同一作者)、Seafile、filerun

https://www.reddit.com/r/selfhosted/comments/rwo7qo/nextcloud_vs_owncloud_vs_seafile/

还有一种软件,比如Joplin,是一款笔记软件,支持多端(pc、ios、安卓),多端间用webdav同步,我以为这款很适合我。结果,joplin不能识别我用typora写的markdown笔记(joplin windows端可以导入markdown笔记,但导入后,已经是由joplin管理的另一个新的文件了,我再去typora修改原始文件,在joplin中也不会有任何变化。joplin也支持设置使用typora来编辑,但主要还是不喜欢它用自己的格式来管理我的文件)。

所以,后面我发现,这种网盘同步类软件更适合我,不会改我的原始文件,它只需要负责多端间同步就行。

另外,我们程序员广为使用的apache、nginx都是支持webdav的,像nginx的话,默认没有开启那个模块,需要单独弄一下。

webdav-服务端-nextcloud

一开始是按照官方文档来弄,选的是docker镜像all-in-one的镜像,结果后面遇到个什么错,没搞起来,以后再试试。

https://github.com/nextcloud/all-in-one#how-to-use-this

后面网上找了另一种方案,这里记录下,要先把docker安装上(包括docker-compose):

mkdir -p /path/to/nextcloud;

新建文件,docker-compose.yml:

内容如下,注意自己改下密码,ip啥的:

version: '3'

services:
app:
image: nextcloud
restart: always
networks:
nextcloud_network:
ports:
- "8080:80"
volumes:
- /path/to/nextcloud/data:/var/www/html
- /path/to/nextcloud/config:/var/www/html/config
environment:
- NEXTCLOUD_ADMIN_USER=admin --用户名可以改下
- NEXTCLOUD_ADMIN_PASSWORD=1qaz@WSX#EDC --自己改一下密码
- NEXTCLOUD_TRUSTED_DOMAINS=外网ip:8080
- MYSQL_HOST=db
- MYSQL_PASSWORD=db_password
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=db_user
- OVERWRITEPROTOCOL=http
- LANG=zh_CN.UTF-8
depends_on:
- db db:
image: mariadb
restart: always
networks:
nextcloud_network:
environment:
- MYSQL_ROOT_PASSWORD=db_root_password
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=db_user
- MYSQL_PASSWORD=db_password
volumes:
- /path/to/mysql/data:/var/lib/mysql networks:
nextcloud_network:

然后就可以启动了:

docker-compose up -d

启动后,大概是这样两个容器:

启动完成后,在浏览器中,http://ip:8080端口访问即可,剩下都是图形化操作,还比较简单了。

访问时,可能会报一个trusted_domain的问题,我是修改了config.php:

[root@VM-0-6-centos config]# pwd
/path/to/nextcloud/config 修改config.php:
'trusted_domains' =>
array (
0 => 'localhost',
1 => '1.1.1.1:8080',
),

另外,目前这个是http的,不是很安全,所以大家可以先尽量选择可信的webdav客户端,比如nextcloud在多端都有应用,https的我也还没研究,后续再看下这块,暂时没时间了。

webdav-服务端-nginx

这里只简单说一下。

需要重新编译nginx源码,加入webdav和webdav扩展模块。

扩展模块的源码从这里下载:

https://github.com/arut/nginx-dav-ext-module/releases

比我这里使用的,最后的编译命令为:

--sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-http_dav_module --add-module=/root/upload/nginx-1.21.3/nginx-dav-ext-module-3.0.0

就是新增了:

--with-http_dav_module --add-module=/root/upload/nginx-1.21.3/nginx-dav-ext-module-3.0.0

编译完成后,拷贝覆盖已有的nginx二进制文件。

我这边的nginx二进制在/usr/local/nginx/nginx,覆盖前需要先备份

cp objs/nginx /usr/local/nginx/nginx -f

然后贴一份我的配置文件,仅供参考:

 server {
listen 80;
server_name localhost; access_log logs/80access.log main; location /work-file {
root /root/; client_body_temp_path /var/client_temp;
client_max_body_size 50m; auth_basic "webdav";
auth_basic_user_file /root/upload/nginx-1.21.3/passwd.txt; autoindex on; dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; create_full_put_path on;
dav_access group:rw all:r;
}
}

密码文件的生成有多种方式,我也是网上查了下:

[root@VM-0-6-centos nextcloud]# openssl passwd '1111111'
CjBujI/Rj1tcI passwd.txt(用户名:密码):
webdav:CjBujI/Rj1tcI

webdav-pc 客户端

我这边使用的有nextcloud windows客户端、raidrive。raidrive感觉非常强大,支持的云端存储,基本上全包含了。

webdav-ios客户端

我由于操作系统版本是13.5的,可选范围有限,所以只是简单分享下。

可以直接在app store搜搜webdav关键字,如果某款软件支持这个协议,不至于不在描述中提一下吧。

具体的app就不说了,有广告嫌疑,我发现个问题,很多webdav 客户端app,可以支持远程连接webdav,但是不会把webdav服务端的数据拉到本地来保存,而是在线的那种,和web系统一样,点开某个目录,才会加载那个目录下文件,点开某个文件,才会去加载内容;所以也就不支持在全部文件中进行关键字搜搜,笔记多的话,还是不好找。

所以,我个人后续应该还是会安装Nextcloud这种云盘类的app(目前操作系统版本原因,装不了),但我想,至少会把数据全部同步到本地,数据同步到本地,才会有可能支持全文检索。

总结

等后续换了手机,我就打算整nextcloud全家桶先试试,想要的功能就是app上能跨文件全文搜索,就满足了。

目前手机上安装的app,都是不能全文搜索的;而我也找到了一款某个大佬写的一个app(支持从自建的git拉取markdown进行展示),但是大佬没做本地的全文搜索。

所以目前两个方案,在我手机端的效果差不多,甚至git方案的话,还能离线使用,还要优于webdav方案。

另外,nextcloud的服务端,有点耗内存,这样的话,云服务器都不能干别的事了,所以目前就用我的git方案算了,还完全没有内存消耗。

但是通过这么折腾,至少对于nas这套东西,了解了不少,以后想折腾的时候再弄吧。

webdav协议及我的笔记方案(私有部署)的更多相关文章

  1. TCP/IP协议原理与应用笔记17:IP编址(重点)

    1. IP地址(通用标识符) 对于同一个网络设备(主机或路由器)的不同网络连接,需要不同的IP地址进行标识 2. 主机标识符 主要有下面三种方式的主机标识方式: (1)Name:是什么,可读性强(了解 ...

  2. 影片自由,丝滑流畅,Docker容器基于WebDav协议通过Alist挂载(百度网盘/阿里云盘)Python3.10接入

    使用过NAS(Network Attached Storage)的朋友都知道,它可以通过局域网将本地硬盘转换为局域网内的"网盘",简单理解就是搭建自己的"私有云" ...

  3. Tomcat6配置webdav协议

    Tomcat6默认是支持webdav协议的,只是webapps目录中不带例子而已.要添加支持很简单,在webapps目录中建立webdav目录,在webdav目录中建立WEB-INF目录,加入web. ...

  4. TCP/IP协议原理与应用笔记18:构成子网和超网

    1. 引言: (1)类别IP编址(Classful IP)的缺陷 • 固定的3种IP网络规模      C类地址:少于255台主机的网络      B类地址:介于255~65535台主机的网络     ...

  5. WebDav协议基于HTTP 1

    首先第一篇提供配置WebDav的方式 网上找了两篇比较好的配置方式分别适用于Win7 Win2003,而且都经过测试配置可以正常使用 原文中保留了引用地址,这个纯属为了要尊重别人的劳动成果 在第二篇中 ...

  6. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  7. Typora+PicGo+Gitee笔记方案

    前言:需要学习的知识太多,从一开始就在寻找一款能让我完全满意的编辑器,然而一直都没有令我满意的.在前两天Typora新版本更新后,总算是拥有了一套我认为很完美的笔记方案:使用Typora编写markd ...

  8. 管理WEB服务器文件的WebDAV协议&HTTP大跃进--QUIC与HTTP30&WEB安全攻击概述

    管理WEB服务器文件的WebDAV协议 WebADV协议 WEBDAV追加方法 WeDAV请求示例 HTTP大跃进--QUIC与HTTP30 QUIC&HTTP3.0 HTTP2.0的问题 队 ...

  9. (转)ZooKeeper 笔记(1) 安装部署及hello world

    ZooKeeper 笔记(1) 安装部署及hello world   先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.or ...

  10. ActionBarSherlock学习笔记 第一篇——部署

    ActionBarSherlock学习笔记 第一篇--部署          ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...

随机推荐

  1. CF620E New Year Tree (线段树维护 dfs 序)

    CF620E New Year Tree 题意:给出一棵 n 个节点的树,根节点为 1.每个节点上有一种颜色 ci​.m 次操作.操作有两种: 1 u c:将以 u 为根的子树上的所有节点的颜色改为 ...

  2. 一个可一键生成短视频的AI大模型,亲测可用

    大家好,我是 Java陈序员. 自从 OpenAI 发布 Sora 文本生成视频模型后,文本生成视频的 AI 技术引起了无数圈内圈外人士的关注和实验. 今天,给大家介绍一个大模型,可一键生成短视频. ...

  3. 一:大数据架构回顾-Lambda架构

    "我们正在从IT时代走向DT时代(数据时代).IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好&q ...

  4. C#/C++ 通过ODBC连接OceanBase Oracle租户

    概述 近期我们项目正处于将Oracle数据库迁移到OceanBase Oracle租户模式的阶段.考虑到我们项目采用了C++和C#混合开发,并且使用了多种技术,因此存在多种数据库连接方式.然而,针对C ...

  5. Critical Expression

    什么是Critical Expression 所谓Critical Expression就是一个表达式依赖的值,必须出现在这个表达式前面.比如: times (label-$) db 0 ;times ...

  6. WEB服务与NGINX(6)-location使用详解

    目录 1. location的详细用法 1.1 精确匹配 1.2 区分大小写 1.3 不区分大小写 1.4 匹配URI开始 1.5 测试location的优先级 1.6 location的生产使用示例 ...

  7. IIS 部署 Python 环境

    1.安装IIS 勾选特殊CGI程序2.Python 环境 (环境变量配置)3.如果没有pip命令 先下载安装pip python setup.py install4.pip install wfast ...

  8. Js实现任意位置缩放图片,深入理解背后原理

    前言 本文将用一个简单的例子详细讲解如何用原生JS一步步实现完整的任意位置缩放图片功能,无任何第三方依赖,指针事件 进行多端统一的事件监听,干货满满. 完整代码 为提升阅读体验,正文中代码展示有部分省 ...

  9. H264 H265 分析小工具

    1.在调试 H264 H265 编码的流数据的时候,有时候需要打印没有nalu的类型和数量,自己写了一个小工具 使用方式: p.p1 { margin: 0; font: 22px Menlo; co ...

  10. NOIP模拟96

    T1 树上排列 解题思路 是一个一眼切的题目... 看到题目第一眼就是 Deepinc 学长讲的可重集,无序 Hash . 直接套上一颗线段树再加上树剖, \(nlog^2n\) 直接过,好像也可以树 ...