手机上有很多云笔记app,大多支持云存储。可是把笔记放在别人的服务器上,总觉得不太安全。所以想把云笔记存在自己家。
有很多开源的云笔记,比如蚂蚁笔记(Leanote),nextcloud-note, 可是建立起来都比较麻烦,当然功能也是很强的。 leanote是golang写的,要mango数据库支持。nextcloud-note需要安装nextcloud云盘系统,需要php+mysql支持。
网上搜了一下,
Android,有几款笔记支持webdav同步,比如"一本日记"(要付费),"可乐记"(免费),"易码"(免费)。 苹果,只找到一款免费的。收费的就很多了。"Notebooks for iPhone"(免费), "Notebooks Write and Organize"(收费) 软件自行搜索。 所以尝试自己建个webdav服务器。
尝试 NextCloud nextcloud 支持webdav协议。 买了台迷你pc(x86架构),装CentOS7,安装nginx,php-fpm,mariadb,然后装nextcloud,然后在nextcloud中装notepad插件。 手机端app:
nextcloud-note,挺好的,支持markdown。支持多层目录。但只支持配置一个服务器地址。或者说,app只支持一个账号。不能多账号共存。 nextcloud,云盘,也不错,支持文件,图片,通讯录同步。支持多账号共存。 nextcloud 的 webdav 对易码的支持也很好。 nextcloud 云盘的安卓版 APP 本身就可以备份手机通讯录(打包为一个文件,上传到云盘目录) 易码,支持markdown,支持多账号共存。(这个云笔记,我很推荐) nextcloud 对 DAVdroid(DAVx5)2.6.3 支持很好。配置好账号后,通讯录,日历,个人提醒 就都可以同步了。 用了一段时间,发现云盘我基本上没什么需求,为了用个云笔记,建了这么个大东西,感觉挺浪费。
看了看leanote 也挺复杂的,还要装mango数据库。放弃。
尝试只建个webdav服务 apache2,nginx,lighttpd 都支持webdav。 apache2 比较臃肿,放弃。 所以只尝试 nginx 和 lighttpd 。 如果从源码安装,无论什么系统,无论 nginx 或 lighttpd 都能装好webdav服务。 以下是尝试使用系统的预编译包安装和配置。
CentOS7/8 上 从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。 CentOS7 , CentOS8 的预编译 nginx 都有 http_dav_module, 都缺失了 http_dav_ext。 从epel源装lighttpd,是1.4.54版,(yum install, centos7) 配置好后出错 Sorry, no sqlite3 and libxml2 support include,发现编译时缺少 --with-webdav-props 参数。导致PROPFIND指令没有按要求返回XML内容,而是返回了0字节。 debian-10/Armbian 手上还有台斐讯N1盒子,刷了armbian。debian10(buster)版。
装nginx,1.14.2,(apt install) 有http_dav_module 和 http_dav_ext 。 PUT,DELETE,MOVE,PROPFIND 支持OK。 不知道 COPY,OPTION 支持如何,因为没用到。 不过有bug,nginx要求MKCOL指令跟的目录名,必须以'/' 除号结尾。而易码app在创建目录时,目录名末尾不带除号。 MKCOL 的问题,可以通过配置 rewrite 解决。 所以,易码能用,只是要事先手动把目录创建好。易码保存和更新笔记,没问题。 手动 mkdir mynote/ mynote/assets/ 每个目录中要有assets目录,易码用assets来存放附件。 最终可以完美支持易码。 x86/64 debian-10 的预编译 nginx,完全和 armbian 的 debian10 一样。支持很好。 装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) 好像是 1.4.53 的 bug, 1.4.54 就修复了。 所以,易码能同步获取更新,能创建新笔记。但不能修改旧笔记(会出错)。 openwrt-19.07 lighttpd-1.4.54 opkg install lighttpd lighttpd-mod-auth lighttpd-mod-authn_file lighttpd-mod-webdav 配置: document-root指向别的目录。其他配置参考本文后面的内容。 "易码"访问,能创建目录,创建新笔记,修改笔记,删除笔记。但不能同步获取笔记的更新,返回 "Not a valid DAV response" 原因是 PROPFIND "目录"(不带/结尾) 重定向 到 "目录/" 的返回码是200 而非 301,易码不能识别。 配置中加入 rewrite 可以解决。 opkg install lighttpd-mod-rewrite,然后配置中加入 url.rewrite-if-not-file=( "^/dav/(.*)$" => "/dav/$1/" ) 最终可以完美支持易码。 nginx-1.17.7 opkg install nginx-all-module (基础包nginx,没有webdav支持) 配置: root指向别的目录。其他配置参考本文后面的内容。 "易码"能用,只是要事先手动把目录创建好。MKCOL指令要求以'/'结尾,表现和 debian10 中的预编译 nginx 一样。 MKCOL 的问题,可以通过配置 rewrite 解决。 最终可以完美支持易码。 nginx 的 webdav 配置 (debian-10里的nginx对webdav支持很好) centos7/8 : (缺少"http_dav_ext",导致PROPFIND不支持,放弃) debian-10/armbian : nginx (支持很好) openwrt-19 : nginx-all-module (支持很好)
yum install nginx 或者 apt install nginx 。 在vhost的 server { ... } 中,加上以下一段。则在 http(s)://youdomain.doman/dav/ 中打开webdav。
location ^~ /dav/ { if ($request_method = MKCOL) { # 解决 MKCOL 需要以'/'结尾 rewrite ^(.*[^/])$ $1/ break; } 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的功能不影响,也能工作。
关于MKCOL需要以'/'结尾的问题 参考: Nginx WebDAV模块配置简述 , 修复Nginx的WebDAV功能 , 修复Nginx的WebDAV功能 if ($request_method = MKCOL) { rewrite ^(.*[^/])$ $1/ break; } lighttpd 的 webdav 配置 配置文档: Documentation Overview
centos7/8 : yum install lighttpd (缺少"--with-webdav-props",导致PROPFIND有问题,放弃) debian-10/armbian : apt install lighttpd lighttpd-mod-webdav (MOVE指令有问题, 等升级到1.4.54再说, 暂时放弃) openwrt-19 : lighttpd (支持很好)
启用两个module: lighttpd-enable-mod auth webdav 修改 /etc/lighttpd/lighttpd.conf
server.document-root = "/var/www/lighttpd" # 设置web的根目录 server.port = 88 # http 的端口,缺省为 80
server.username = "www-data" server.groupname = "www-data"
#添加以下段落 $HTTP["url"] =~ "^/note($|/)" { webdav.activate = "enable" webdav.is-readonly = "disable" webdav.sqlite-db-name = "/..../webdav.db" auth.backend = "plain" auth.backend.plain.userfile = "/etc/lighttpd/webdavuser" auth.require = ( "" => ( "method" => "basic", "realm" => "Access DAV", "require" => "valid-user" ), ) # rewrite,是针对openwrt19.07中的 重定向问题。debian-10 不用此项配置。 url.rewrite-if-not-file=( "^/dav/(.*)$" => "/dav/$1/" ) } 创建目录 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 就配置 lighttpd 的 ssl。用 nginx 就配 nginx 的 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中的路径相同。
方法三,lighttpd 配置好 ssl 支持,加上 mod_proxy 支持反向代理。请自行上网搜索。 方法四,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文件
83 none /root/webdavd/data /etc/mime.types /root/webdavd/rap webdavd /root/webdavd/share /root/webdavd/error.log /root/webdavd/access.log 执行 ./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文件放置的路径,不能包含下划线( _ )。 浏览器访问,当访问的路径末尾不带/时,页面左上角的"上级目录"会跳两层,链接不正确。 安装配置: 从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/ 即可。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; }
location ^~ /mydav { root /mydir/phpdav; index index.php; include php7-fpm.conf; rewrite ^/(.*)$ /mydav/index.php last;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。