2019年4月7日 星期日

自己的行事曆和通訊錄自己管: nextcloud 安裝、 行事曆、 備份及手機連線

Nextcloud 是 owncloud 的 fork。 它讓你自架私有雲取代 dropbox、 google drive、 google calendar、 google 通訊錄等等服務。 我自己的雲端檔案沒有用任何軟體管理, 就直接用 scp 存取。 對我而言, nextcloud 最重要的是拿來取代 google calendar (還有通訊錄; 不過目前還沒用)。

一、 安裝

比較簡單的安裝方式是 採用 snap (簡中); 但如果你原先有在用 apache2, 這會把既有的 apache2 蓋台。 本節主要參考 這一篇 的後半, 直接從官網下載 zip 檔的方式安裝, 以便與既有的 apache2 並存。

  1. 準備相依套件: apt install lamp-server^ php-zip php-mbstring php-dom php-gd php-curl 其中 lamp-server^ 尾巴的乘方符號意指 大約等同於用 tasksel 的方式去安裝這個虛擬套件 (meta package)。 安裝過程會順便安裝 mysql
  2. 理想上, 應該 用 EFF 的 certbot 把你的 http 變成 https。 不過本文偷懶省略。
  3. 啟動 apache2 的一些模組: a2enmod rewrite headers env dir mime 並重新啟動 apache2:systemctl restart apache2
  4. 執行 mysql_secure_installation 強化 mysql 保護。
  5. 以 mysql 的 root 用戶身份登入: mysql -u root -p 忘記或不知道原先的密碼? 那就 照著這篇做
  6. 在 mysql 的命令列底下:
    CREATE DATABASE nextcloud;
    CREATE USER nextcloud@localhost IDENTIFIED BY 'NC的資料庫密碼';
    GRANT ALL PRIVILEGES ON nextcloud . * TO nextcloud@localhost;
    
  7. (以 root 的身份) 到 官網 下載回最新版的 nextcloud-*.zip , 解壓縮到 /var/www/html , 會在底下產生 nextcloud/ 子目錄。 再把整個目錄改指派給 www-data 擁有。
    wget https://download.nextcloud.com/server/releases/nextcloud-版本.zip
    unzip -d /var/www/html nextcloud-版本.zip
    chown -R www-data: /var/www/html/nextcloud/
    
  8. 編輯 /etc/apache2/apache2.conf 在最後面加上這一段:
    <Directory /var/www/html/nextcloud/ >
        AllowOverride All
    </Directory>
    
    目的是要讓 /var/www/html/nextcloud/.htaccess 生效。 改完後必須重新啟動 apache2 。
  9. 從瀏覽器進入 http://localhost/nextcloud 應該要看到 nextcloud 的初始設定畫面。 填入自選的管理員帳號密碼等等、 再填入先前設定的 mysql 資料庫帳密, 完成設定!

日後如果忘記管理員的密碼, 甚至忘記他的帳號, 可以這樣查帳號名稱及改密碼:

sudo -u www-data php /var/www/html/nextcloud/occ user:list
sudo -u www-data php /var/www/html/nextcloud/occ user:resetpassword 管理員帳號

這裡的重點是要以 www-data 的身份 (或是用 ps aux | grep apache2 查到的身份) 執行 occ 這個 php 程式。 關於 occ 指令, 詳見官網文件, 例如 修改密碼

二、 行事曆外掛

  1. 從瀏覽器登入 nextcloud, 再從右上角的設定選單叫出 "Apps" 頁面。
  2. 按 ctrl-F 搜尋 「calendar」 找到 calendar 外掛並安裝。
  3. 安裝並使用 nextcloud 的行事曆 裝好之後, 上排選單會多出一個行事曆功能如右圖。
  4. 進入行事曆, 左側有一個行事曆清單, 預設已有一個 "Personal"; 你可按加新增更多個行事曆, 例如命名為 「公司」、 「飯團」、 「家人」 等等, 並選不同的顏色。 每當點選右側日曆新增一個事件時, 可以選擇要把這個事件加到哪個行事曆去。

同樣地, 搜尋 「contacts」 可以找到並安裝通訊錄外掛。

三、 匯出/備份行事曆與通訊錄

把任何資料託付給任何軟體處理之前, 一定要先確認資料可以要得回來。 每個人 -- 特別是電算中心主任或其他軟體採購決策人士 -- 都都需要知道 我的野蠻工讀生 如何用高昂的 下賊船的代價 綁架了我的文件。 這是台灣人一直學不會的事, 以致今日 line 成為國安要害。 小格的長期讀者們不會犯這個錯, 當然要問: 進了 nextcloud 的資料, 要怎麼把它下載回來?

(以 ckhung 這個用戶而言, 上傳至 nextcloud 的一般檔案, 就放在 /var/www/html/nextcloud/data/ckhung/files 目錄底下, 所以沒有匯出的問題, 備份也很簡單。 但是行事曆跟通訊錄呢? 透過這兩個外掛敲進去的日期/時間/事件/姓名/電話/... 放在資料庫裡。 在網頁介面上, 每個行事曆右側的選單裡, 都有一個 Download 的功能。 那如果想寫入 cron 裡面定時備份呢?

  1. 請到 calcardbackup 下載程式。
  2. 解壓縮後, 把裡面的 calcardbackup 這個 shell script 複製到 /usr/sbin 底下, 並且 chown www-data:www-data /usr/sbin/calcardbackup ; chmod 544 /usr/sbin/calcardbackup
  3. 抓回 我的範例設定檔, 放在 /etc/calcardbackup.conf 。
  4. 建立一個存放備份檔的空目鎑:
    mkdir /var/backups/nextcloud
    chown www-data:www-data /var/backups/nextcloud
    chmod 700 /var/backups/nextcloud
    
  5. 完成! 以後每次執行 sudo -u www-data calcardbackup -c /etc/calcardbackup.conf /var/www/html/nextcloud 就會在 /var/backups/nextcloud 底下建立一個壓縮檔, 裡面包含 .vcf 副檔名的 vCard 格式通訊錄檔, 及幾個 .ics 副檔名的 iCalendar 格式 行事曆檔。 兩者都是文字檔。
  6. 當然, 必須把上面的指令寫進 crontab 裡面, 才會每隔一段時間定時自動備份。
  7. 建議自行修改 /etc/calcardbackup.conf , 可以修改的包含 date_extension (檔名中的日期格式)、 delete_backups_older_than (刪掉太舊的備份檔)、 ... 等等。

備份檔解開來之後的 .ics 可以從網頁介面上的 「import calendar」 上傳回去。

四、 手機連線

再來當然就是要能夠從手機連線囉。

安裝 app 之前先講一下概觀。 自由軟體的世界跟專屬軟體世界當中那些 「企圖綁架你的資料的公司」 希望你認識的世界很不一樣。 想跟 FB 連線? 你一定要安裝 FB 的 app。 想用 line 通訊? 你一定要安裝 line 的 app。 但是! 想看網頁, 該用誰家的 app? 想收發 e-mail, 該用誰家的 app? 想發簡訊, 該買那一牌的手機、 該向哪一家電信公司租服務? 答案是: 沒有唯一的標準答案。 因為網頁採用開放的 http 標準; e-mail 採用開放的 smtp 或 pop3 標準, 所以伺服器端可以有各種不同的軟體; 客戶端也是, 有很多自由軟體跟不同商家的專屬軟體都可以用。 採用開放的標準, 讓自由軟體與各家專屬軟體可以自由競爭, 這才是健康的網路生態。 崇尚壟斷市場大廠 (甚至連大學都跳進去助紂為虐鼓吹壟斷) 的社會、 欠缺這種 「多元公平競爭」 概念的社會, 很有可能終有一天會被 一黨獨大的政府 一家獨大的公司統治。 (其實是每個壟斷面向被統治一次, 所以會有好幾個主人。)

幾個名詞之間的關係 手機 (或其他客戶端裝置) 要跟 nextcloud 的行事曆連線時, 採用的是 CalDAV 協定。 CalDAV 是 WebDAV 協定 的擴充; 它所傳送的檔案格式則是 iCal。 類似地, 手機要跟 nextcloud 的通訊錄連線時, 採用的是 CardDAV 協定。 CardDAV 也是 WebDAV 的擴充; 它所傳送的檔案格式則是 vCard。 右邊的示意圖是說: 如果你是一位軟體工程師, 你想要寫一支 CalDAV 連線程式, 那麼你必須對 WebDAV 跟 iCal 這兩個標準都要先有一點認識。

所以呢, 雖然兩年前寫的這篇 手機連線 owncloud 私有雲行事曆 可能仍然適用, 為了讓大家了解多元社會的意義, 今天還是換個 app 重寫一次好了。

以下的下載並安裝 apps, 要從 google play 也可以啦; 但我會強烈建議從 f-droid 市集 更好。 我們需要 DAVx5 跟 Etar 這兩個 apps。 這些軟體之間的關係長這樣: nextcloud <==> DAVx5 <==> (android) <==> Etar 。 所以 Etar 完全不需要設定; 需要設定的是讓 DAVx5 能夠存取 nextcloud。

  1. 在 DAVx5 裡面按 + 符號以便新增一個帳號。 (意思是說你可以從好幾個不同的 nextcloud DAV servers 同步好幾個行事曆)
  2. 選取 「用網址和帳號登入」。
  3. 填網址的時候, 把網頁介面行事曆右側選單裡的 「link」 抄過來。 其實不必全抄, 只需要抄到 /dav/ 為止, 像這樣: http://伺服器/nextcloud/remote.php/dav/ 從那裡, 伺服器就會把 ckhung (你登入的用戶) 的所有行事曆及通訊錄清單列給 DAVx5 看。
  4. 最後要幫這個新帳號取一個名字。 例如我的手機若與 abc.cyut.edu.tw 跟 xyz.com.tw 兩個網站連線, 那麼我會把這兩個帳號分別取名為 ckhung@abc 及 ckhung@xyz 。 如果老婆位於 pqr.com.tw 的行事曆要分享給我, 那就命名為 wife@pqr 。
  5. 某個帳號裡的行事曆清單 點進其中一個帳號, 確認隸屬於這個帳號的每個行事曆及通訊錄都已打勾。 打完勾後應該會自動跟伺服器同步; 如果沒有, 可以按右上角 「重新整理」 的按鈕手動同步, 如右圖。
  6. 其實如果從 Etar 的左上角選單進入設定, 也會看到 DAVx5 所管理的所有連線帳號, 及每個帳號裡的各個行事曆是否已啟用。

完成了! 從此以後你不再需要 google calendar 及 google contacts 也可以方便地透過雲端讓電腦和手機的行事曆及通訊錄同步。 自己的行事曆和通訊錄自己管。 或者, 如果你自己不會, 也找不到信任的朋友來讀這篇幫你架 nextcloud 伺服器, 那就 加入軟體自由協會, 成為會員、 申請 slat 的 nextcloud 帳號, 再從手機上用 DAVx5 跟 Etar 連線, 把你的個資分散到不同的伺服器去, 不要落在同一家大公司的手中。

[補充: 如果打錯密碼太多次, 系統會延遲 30 秒核對密碼。 這個訊息從瀏覽器上面看得到, 但從 DAVx5 的畫面看不見。 也就是說, 如果 DAVx5 連線時密碼打錯, 後來會一看到伺服器好像沒有反應一樣。 當你找出正確的密碼之後, 請換一個管道登入, 例如原先用 wifi 那就改用手機數據上網, 或反過來。]

[2020/7/20 發現一篇好文: 用Syncthing跨系統跨軟體同步行事曆]

1 則留言:

  1. 有時會想為什麼同步問題會那麼麻煩,還要自己開著一台 server 。之前看過一篇部落格文章,如果可以用手機當 server 其實不錯,反正現在手機幾乎不關機的。如果手機和電腦合體,接上螢幕鍵盤就變電腦,就從根本解決了二端的同步問題。

    https://thomask.sdf.org/blog/2019/01/25/imagine-having-only-one-computer.html

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。