閒着無聊搭了一個 Nextcloud

2019-09-12

又是那句老話,我一年多前就瞭解了 Nextcloud 這個東東, 但一直沒有心思去搗騰。直到上週,萌狼給我展示了他的 Nextcloud 後, 我計劃自己也搭建一個。

順帶提下,全世界絕大多數的人都在使用雲盤,或雲存儲的服務,如,Google Drive,OneDrive 以及 Dropbox 等。這些服務提供商都會給出不同存儲空間和相應的收費標準,或者連接設備數量的限制,個人數據或隱私會存在被服務提供商「監聽」的風險等等。而 Nextcloud 類似與 Dropbox,但它是一套自由且開源的軟件,它可讓任何人自行架設與操作而不必像服務提供商那樣地收取費用,也沒有空間容量或連接設備數量的限制。更重要的一點,數據始終是自己在掌握着。建在 VPS 上需要購買空間,但自由度始終比主流雲服務提供商的大。可讓任何人自行架設與操作而不必像服務提供商那樣地收取費用,也沒有空間容量或連接設備數量的限制。 建在 VPS 上需要購買空間,但自由度始終比主流 搭建第一步先看官方文檔文檔給出「性能好地,穩定地」運行 Nextcloud 服務的推薦是「Ubuntu 18.04 LTS + MySQL 5.x + Apache 2.4 with mod_php or php-fpm + php 7.2」。購買好 VPS(官方建議大於 512 RAM)後,下一步就是安裝啦。

首次登錄到服務器常規動作:apt-get update && apt-get upgrade

繼續參照官方文檔,官方給出了安裝 Ubuntu 18.04 LTS 服務器的過程,分別給出了一鍵安裝腳本,Snap package 安裝以及 Debian packages 安裝。個人不喜歡 snap 所以就不用它了,一鍵安裝固然方便,但沒有親手一步步搭建的感覺,所以最後用較「繁瑣」但我喜歡的方式。


apt-get install apache2 mysql-server libapache2-mod-php7.2
apt-get install php7.2-gd php7.2-json php7.2-mysql php7.2-curl php7.2-mbstring
apt-get install php7.2-intl php-imagick php7.2-xml php7.2-zip

安裝好 Apache 和 Mysql 後去啓動它們。


systemctl start apache2 
systemctl enable apache2
systemctl start mysql.service
systemctl enable mysql.service

下一步是給 Nextcloud 設置好 Mysql 啦。mysql_secure_installation 設置好密碼和安全選項。mysql 進入到數據庫。

新建一個數據庫來存儲 Nextcloud 的數據,以及 Nextcloud 的用戶。爲了方便,這裡數據庫名字和用戶都用 nextcloud。


CREATE DATABASE nextcloud;
CREATE USER nextcloud IDENTIFIED BY 'your_passphrase';
GRANT USAGE ON *.* TO nextcloud@localhost IDENTIFIED BY 'your_passphrase';
GRANT ALL privileges ON nextcloud.* TO nextcloud@localhost;
FLUSH PRIVILEGES;

再下一步安裝 Nextcloud 啦。官方有給出壓縮包,下載到服務器,解壓後會得到一整個文件夾,將它移動到或者拷貝到 /var/www 下, 也可以選擇放在 /var/www/html/ 下,這會覆蓋 Apache 的文件了。官方建議是第一種方式


wget https://download.nextcloud.com/server/releases/nextcloud-16.0.4.tar.bz2

tar -xvf nextcloud-16.0.4.tar.bz2
cp -r nextcloud /var/www

去到 /var/www/nextcloud/,見到文件都是 nobodynogroup


drwxr-xr-x 14 nobody nogroup  4096 Aug 14 18:59 ./
drwx------  5 root   root     4096 Sep 12 08:14 ../
drwxr-xr-x 32 nobody nogroup  4096 Aug 14 18:59 3rdparty/
drwxr-xr-x 42 nobody nogroup  4096 Aug 14 18:56 apps/
-rw-r--r--  1 nobody nogroup 12063 Aug 14 18:56 AUTHORS
drwxr-xr-x  2 nobody nogroup  4096 Aug 14 18:56 config/
-rw-r--r--  1 nobody nogroup  3805 Aug 14 18:56 console.php
-rw-r--r--  1 nobody nogroup 34520 Aug 14 18:56 COPYING
drwxr-xr-x 23 nobody nogroup  4096 Aug 14 18:59 core/
-rw-r--r--  1 nobody nogroup  4986 Aug 14 18:56 cron.php
-rw-r--r--  1 nobody nogroup  2388 Aug 14 18:56 .htaccess
-rw-r--r--  1 nobody nogroup   156 Aug 14 18:56 index.html
-rw-r--r--  1 nobody nogroup  3172 Aug 14 18:56 index.php
drwxr-xr-x  6 nobody nogroup  4096 Aug 14 18:56 lib/
-rw-r--r--  1 nobody nogroup   283 Aug 14 18:56 occ
drwxr-xr-x  2 nobody nogroup  4096 Aug 14 18:56 ocm-provider/
drwxr-xr-x  2 nobody nogroup  4096 Aug 14 18:56 ocs/
drwxr-xr-x  2 nobody nogroup  4096 Aug 14 18:56 ocs-provider/
-rw-r--r--  1 nobody nogroup  2951 Aug 14 18:56 public.php
-rw-r--r--  1 nobody nogroup  5139 Aug 14 18:56 remote.php
drwxr-xr-x  4 nobody nogroup  4096 Aug 14 18:56 resources/
-rw-r--r--  1 nobody nogroup    26 Aug 14 18:56 robots.txt
drwxr-xr-x 12 nobody nogroup  4096 Aug 14 18:59 settings/
-rw-r--r--  1 nobody nogroup  2232 Aug 14 18:56 status.php
drwxr-xr-x  3 nobody nogroup  4096 Aug 14 18:56 themes/
drwxr-xr-x  2 nobody nogroup  4096 Aug 14 18:56 updater/
-rw-r--r--  1 nobody nogroup   101 Aug 14 18:56 .user.ini
-rw-r--r--  1 nobody nogroup   362 Aug 14 18:59 version.php

爲了後面能夠在瀏覽器上訪問 Nextcloud 且進行圖形化操作。需要變更所有權,即將 Nextcloud 目錄的所有權更改為 HTTP 用戶。


chown -R www-data:www-data /var/www/nextcloud/

操作到上步爲止,重啓一下 Apache 後,在流浪器輸入 IP 地址就能出現 Nextcloud 的界面了。要注意的是,這裡不要註冊 admin account,因爲沒有添加 SSL/TLS,都是以明文傳輸到網絡

畢竟搭建 Nextcloud 是存放資料,一切都以安全考慮啦。那怎麼操作呢?Let’s Encrypt 提供免費的 CA 能夠讓網頁套上 HTTPS (SSL/TLS)。在設置前,先給 IP 指向一個域名。我是在個人域名的基礎上添加一個子域名指向 VPS 的 IP。域名解析完成後,回到 VPS 上操作,安裝 certbot


apt-get install certbot python-certbot-apache

在運行 certbot 前,需要在 Apache 的配置文件 /etc/apache2/sites-available/000-default.conf 修改一些地方:默認下,ServerName 是註釋掉,需要取消註釋並改爲剛才解析成功的域名,另外在 DocumentRoot 改成 Nextcloud 文件夾的位置,即 /var/www/nextcloud/


<VirtualHost *:80>
    ServerName YOUT DOMAIN NAME
    ServerAdmin YOUR EMAIL ACCOUNT
    DocumentRoot /var/www/nextcloud
</VirtualHost>

修改後運行 certbot --apache,根據指引去操作就能夠一個證書,之後在瀏覽器上就會出現綠色的鎖,那麼就已經套上了 HTTPS。

接下來,創建 admin account(它就是妳的登錄帳號和密碼),Data Folder 默認是指向 /var/www/html/data,但是先前並沒有在 /var/www/html/ 創建 data 文件夾,這個 data 文件夾是之後來存儲個人傳輸的數據,可以把它想成是個 cloud drive 的根目錄。data 文件夾的位置可以任意位置創建,只要最後做好指向就行。那麼這裡就在默認文章創建一個 data 文件夾。


mkdir /var/www/html/data
chown -R www-data:www-data /var/www/html/data

Database 那裡輸入之前創建的 Database 和 user 和 密碼。再按 Finish setup,等一陣之後如果進入到新的界面表明 Nextcloud 搭建成功!

最後去完善一些安全設置。點進 Adminstration 的 Overview 那裡,如果見到 Security & setup warnnings 的話,就需要一個個修復好咯。以黃色顯示的通常有兩條:

  1. The PHP memory limits is below the recommended value of 512 MB
  2. The "Strict-Transport-Security" HTTP beader is not set to at least "15552000" seconds. For enhanced security, it is recommended to enable HSTS as described in the security tips.

第一條的解決方法是去到 /etc/php/7.2/apache2/php.ini 下,將 memroy_limit 的參數改成 512M。第二條則在 /etc/apache2/sites-available/000-default-le-ssl.confServerName 下添加 <IfModule mod_headers.c> 相關設定


<VirtualHost *:80>
    ServerName YOUT DOMAIN NAME

    <IfModule mod_headers.c>
        Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
    </IfModule>

    ServerAdmin YOUR EMAIL ACCOUNT
    DocumentRoot /var/www/nextcloud
</VirtualHost>

然後,在命令行輸入 a2enmod headers,再重啓 Apache 讓修改的設定能夠運行起來。

那麼,完成以上步驟後,Nextcloud 的黃色 Warnings 就(大概)處理完,剩下的可以問谷歌來解決或者詳細看官方文檔……。


2019 年 9 月 21 日更新

Nextcloud 配置完,不妨在 Nextcloud Security Scan 上輸入網址來檢測安全性。如果是 A+ 那暫時可以放心了,但需要定期進行服務器更新,若不是就要及時處理喔。此外,搭建 Nextcloud 的服務器也需要進行安全設置以更好地保護個人數據。

可以使用 iptables 去制定規則來實現:


iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

iptables-save > /etc/iptables/rules.v4