搭建私人的雲筆記_使用webdav服務
轉載注明來源: 本文鏈接 來自osnosn的博客,寫於 2019-10-10.
手機上有很多雲筆記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 上
- 從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)版。
- 裝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