搭建私人的云笔记_使用webdav服务
转载注明来源: 本文连接 来自osnosn的博客,写于 2019-10-10.php
手机上有不少云笔记app,大多支持云存储。但是把笔记放在别人的服务器上,总以为不太安全。因此想把云笔记存在本身家。html
有不少开源的云笔记,好比蚂蚁笔记(Leanote),nextcloud-note,
但是创建起来都比较麻烦,固然功能也是很强的。
leanote是golang写的,要mango数据库支持。nextcloud-note须要安装nextcloud云盘系统,须要php+mysql支持。mysql
网上搜了一下,nginx
- Android,有几款笔记支持webdav同步,好比"一本日记"(要付费),"可乐记"(免费),"易码"(免费)。
- 苹果,只找到一款免费的。收费的就不少了。"Notebooks for iPhone"(免费), "Notebooks Write and Organize"(收费)
因此尝试本身建个webdav服务器。git
尝试 NextCloud
nextcloud 支持webdav协议。
买了台迷你pc(x86架构),装CentOS7,安装nginx,php-fpm,mariadb,而后装nextcloud,而后在nextcloud中装notepad插件。
手机端app:github
- nextcloud-note,挺好的,支持markdown。支持多层目录。但只支持配置一个服务器地址。或者说,app只支持一个帐号。不能多帐号共存。
- nextcloud,云盘,也不错,支持文件,图片,通信录同步。支持多帐号共存。
- nextcloud 的 webdav 对易码的支持也很好。
- nextcloud 云盘的安卓版 APP 自己就能够备份手机通信录(打包为一个文件,上传到云盘目录)
- 易码,支持markdown,支持多帐号共存。(这个云笔记,我很推荐)
- nextcloud 对 DAVdroid(DAVx5)2.6.3 支持很好。配置好帐号后,通信录,日历,我的提醒 就均可以同步了。
用了一段时间,发现云盘我基本上没什么需求,为了用个云笔记,建了这么个大东西,感受挺浪费。golang
看了看leanote
也挺复杂的,还要装mango数据库。放弃。web
尝试只建个webdav服务
apache2,nginx,lighttpd 都支持webdav。
apache2 比较臃肿,放弃。
因此只尝试 nginx 和 lighttpd 。
若是从源码安装,不管什么系统,不管 nginx 或 lighttpd 都能装好webdav服务。
如下是尝试使用系统的预编译包安装和配置。sql
CentOS7 上
- 从epel源安装nginx,为1.12.2版。(yum install)
- 发现有http_dav_module,但缺失http_dav_ext. 致使PROPFIND指令不支持。
- 从nginx-stable源安装nginx,1.16.1版,(yum install)
- 也是有http_dav_module,没有http_dav_ext。
- 从epel源装lighttpd,是1.4.54版,(yum install)
- 配置好后出错
Sorry, no sqlite3 and libxml2 support include
,发现编译时缺乏--with-webdav-props
参数。致使PROPFIND指令没有按要求返回XML内容,而是返回了0字节。
- 配置好后出错
Armbian
手上还有台斐讯N1盒子,刷了armbian。debian10(buster)版。docker
- 装nginx,1.14.2,(apt install)
- 有http_dav_module 和 http_dav_ext 。
- PUT,DELETE,MOVE,PROPFIND 支持OK。
- 不知道 COPY,OPTION 支持如何,由于没用到。
- 不过有bug,nginx要求MKCOL指令跟的目录名,必须以'/' 除号结尾。而易码app在建立目录时,目录名末尾不带除号。
- 因此,易码能用,只是要事先手动把目录建立好。易码保存和更新笔记,没问题。
- 手动
mkdir mynote/ mynote/assets/
每一个目录中要有assets
目录,易码用assets
来存放附件。
- 手动
- 装lighttpd,1.4.53,(apt install)
- 有lighttpd-mod-webdav模块。
- PUT,DELETE,MKCOL,PROPFIND 支持OK。
- 不知道 COPY,OPTION 支持如何,由于没用到。
- 有bug。但MOVE指令老是返回400 Bad request. (lighttpd独立运行在80或88,或经过nginx的proxy_pass到88口,MOVE指令都返回400)
- 因此,易码能同步获取更新,能建立新笔记。但不能修改旧笔记(会出错)。
openwrt18.06
- lighttpd, lighttpd-mod-auth, lighttpd-mod-webdav, (opkg install)
- 支持ssl,webdav,props。应该对webdav支持完整。不过我没试过。
nginx 的 webdav 配置 (debian里的nginx对webdav支持还行,可用)
yum install nginx 或者 apt install nginx 。 在vhost的 server { ... } 中,加上如下一段。则在 http(s)://youdomain.doman/dav/
中打开webdav。
location ^~ /dav/ { dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS; # 上传文件的最大容量限制,0为不限制 client_max_body_size 20M; create_full_put_path on; dav_access user:rw group:rw all:r; auth_basic "Authorized Users Only"; auth_basic_user_file $document_root/dav/.htaccess.pw.basic ; satisfy any; }
.htaccess.pw.basic 用 htpasswd 命令建立。(yum install apache2-utils/apt install apache2-utils) 若是使用"易码",则手动创建存放笔记的目录,同时在这个目录中建立"assets"目录。 若是用其余支持webdav的云笔记,则本身去肯定,云笔记须要建立什么目录。 由于页面认证用的是basic,因此不建议用http,不安全。建议用https (ssl)。 ssl 的配置自行上网搜索。 nginx 运行在非标准端口(好比http/8001,https/8443),webdav的功能不影响,也能工做。
lighttpd 的 webdav 配置
centos : yum install lighttpd (配置后有问题,放弃)
armbian : apt install lighttpd lighttpd-mod-webdav (最终发现bug,没再使用它) lighttpd-enable-mod auth webdav
修改 /etc/lighttpd/lighttpd.conf
server.document-root = "/var/www/lighttpd" # 设置web的根目录 server.port = 88 # http 的端口,缺省为 80 # lighttpd 的运行身份,通常不修改,就用缺省设置 server.username = "www-data" server.groupname = "www-data" #添加如下段落 $HTTP["url"] =~ "^/note($|/)" { webdav.activate = "enable" webdav.is-readonly = "disable" auth.backend = "plain" auth.backend.plain.userfile = "/etc/lighttpd/webdavuser" auth.require = ( "" => ( "method" => "basic", "realm" => "Access DAV", "require" => "valid-user" ), ) }
建立目录 mkdir -p /var/www/lighttpd/note
修改目录的owner chown www-data.www-data note
,(www-data为lighttpd的运行身份) 建立帐号文件 touch /etc/lighttpd/webdavuser
设置帐号文件的权限 chown root.www-data webdavuser; chmod 640 webdavuser
webdavuser文件为纯文本文件,一行一个帐号。用户名和密码之间用冒号隔开。
test:123456 user:password
systemctl restart lighttpd
设置完成,http://xxx.xxx.xxx:88/note/ 目录就开启了webdav。
让 webdav 运行在 ssl 上
由于页面认证用的是basic,因此不建议用http,不安全。建议用https (ssl)。
- 方法一,配置 lighttpd 的 ssl 。自行上网搜索。
- 方法二,nginx 配置好 ssl 的支持,而后用 nginx 作反向代理。 在nginx的配置文件中的 server { ... } 中加入,
location ^~ /note/ { allow all; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_pass http://127.0.0.1:88/note/; }
注意,loction后的路径(note)要和proxy_pass中的路径相同。
- 方法三,apache2 配置好 ssl 支持,apache2 也支持反向代理。请自行上网搜索。
最后,把ssl的web,443口在路由器上作个映射(需公网ipv4)。
若是80和443标准端口不能用,也能够把https映射到8443这种非标准端口。
或者在路由器上容许转发(ipv6)。路由器支持ipv6就行。宽带运营商都已经提供ipv6了。国内三大手机运营商的4G网都有ipv6支持。
再配置个动态域名。
就能够设置"易码"app,添加webdav服务器。开心的写你的云笔记。
其余搭建webdav的方法:
-
GO: parkomat
- 不少 golang 依赖包难如下载。
- 终于 build 成功。amd64的执行文件约9.7MB. 集成了DNS解析服务+web服务+webdav服务。
- dns 解析配置简单,功能不错,能够用来负责解析一个域名(记录很少的话)。这样就不用装bind。
- web,作个静态网站彷佛也不错。
- webdav,易码访问显示"400 Bad Request", parkomat 显示 "prop must not be empty"
-
C语言: WebDAV-Daemon 1.1
- 配置比较麻烦
- 在项目目录中
make
以后, 把build目录中的rap和webdavd两个文件,复制到 /root/webdavd目录中。 - 把package-with/share复制到/root/webdavd目录中。
- 把package-with/pam.conf复制为/etc/pam.d/webdavd
- 写config.conf文件
<?xml version="1.0" encoding="utf-8" ?> <server-config xmlns="http://couling.me/webdavd"> <server> <listen> <port>83</port> <encryption>none</encryption> </listen> <chroot-path>/root/webdavd/data</chroot-path> <mime-file>/etc/mime.types</mime-file> <rap-binary>/root/webdavd/rap</rap-binary> <pam-service>webdavd</pam-service> <static-response-dir>/root/webdavd/share</static-response-dir> <error-log>/root/webdavd/error.log</error-log> <access-log>/root/webdavd/access.log</access-log> </server> </server-config>
- 执行
./webdavd config.conf &
- 问题:
- MKCOL 命令能成功建立目录,但返回内容彷佛不标准,不被"易码"接受。
- MOVE 命令执行失败。
- 帐号认证,缺省使用系统用户。若是要文件认证,则须要改pam文件,须要学习pam模块。
- chroot-path只能指定为
~
或绝对路径
,不支持相似~/data
的格式。
-
GO: Simple Go WebDAV server 3.0.0
- 有binary包下载,直接就能用。有arm的包。
- 不会配置。老是返回"400 Bad Request"
-
go-webdav 0.2.0
go build cmd/webdav-server/main.go
而后copy出来测试。- 没有认证机制,"易码" 返回 "Not valid DAV response"
-
webdavserver 1.0.3
- go build 失败,好多依赖包下载不了。
- 终于 build 成功。amd64的执行文件约 8MB.
- 易码访问,显示"400 Bad Request"。
-
GO: The simple webdav server 0.3.0
- 有amd64的binary包,没有arm64的。
- 易码访问出错 "prop must not be empty"
-
phpEasyVCS
- 用"易码"访问 测试页面 http://phpeasyvcs.sourceforge.net/demo/webdav.php ,失败。返回403错误。放弃。
-
phpdav (对webdav支持好)
- github上最后更新时间为 2019-5-13
- 代码中无用户认证机制。如要用户认证,则需依赖nginx或apache的认证。因此也不支持多用户。
- PUT,DELETE,MKCOL,MOVE,PROPFIND 支持OK。对"易码"支持很好。
- 不知道 COPY,OPTION 支持如何,由于没用到。
- 只须要sqlite3支持,不须要其余数据库。
- 有一点小bug,不过不太影响。
- PUT 指令时,
Undefined index: Request-Body-File in /..xxx../handlers/Put.php on line 70
- 做者只试过装在网站的 root。不过我费了好大劲才装到二级目录。
- 项目的php文件放置的路径,不能包含下划线( _ )。
- 浏览器访问,当访问的路径末尾不带/时,页面左上角的"上级目录"会跳两层,连接不正确。
- PUT 指令时,
- 安装配置:
- 从github中把全部文件copy到本地目录。好比 /mydir/phpdav/ (这个路径中不能包含下划线)
- 保留 conf/ handlers/ library/ logs/ models/ interface/, 其余的没有用,可删。
- mkdir -p logs/phpdav/debug; #这个目录中会生成log文件,不知道有什么用。
- chown apache.apache logs/phpdav/debug;
- chown apache.apache library/db/sqlite;
- mv interface/ mydav/; #下文以及配置文件中,全部的"mydav"必须同样。
- 安装nginx,php72-fpm,配置方法本身搜索。
- php72 须要 php72-pdo, php72-sqlite3, php72-mbstring, php72-xml, 几个包。
- 修改 conf/config.ini.php 中
$cloud_root='/mydir/dav-data'
- mkdir -p /mydir/dav-data/mydav; chmod apache.apache /mydir/dav-data/mydav;
- nginx的两个配置文件 phpdav.conf, php72-fpm.conf 以下。
- 把
include phpdav.conf;
写入 nginx.conf 中的 server {..} 内,location / {..} 以前,便可。 - 这样就把 webdav 配置在 mydav 目录。经过访问
http://127.0.0.1/mydav/
便可。
# php72-fpm.conf location ~ \.php(?:$|\/) { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info if_not_empty; fastcgi_param SERVER_SOFTWARE phpdav-1.0; fastcgi_param REQUEST_ID $request_id; fastcgi_param REQUEST_BODY_FILE $request_body_file; }
# phpdav.conf location ^~ /mydav { root /mydir/phpdav; index index.php; include php7-fpm.conf; rewrite ^/(.*)$ /mydav/index.php last; }
更多其余搭建webdav的方法:
- GO: 教你搭建超简单的WebDAV服务, parkomat
- caddy: 超简单方法为H大PADAVAN增长WEBDAV功能
- docker: 搭建我的 webdav 服务器
- PHP: 多是最简单的PHP搭建WebDAV(无需数据库); phpEasyVCS
- PHP: 我我的用php开发了一个webdav协议的通讯软件,望支持; 挂载说明; phpdav
- PY2: Tiny Python WebDav Server