這篇主要紀錄我在實體主機安裝 Nextcloud 的過程,同時規劃利用 Linode 的 Object Storage 在相對低成本條件下加大儲存空間。 整體方案是純雲端架構,會需要租用一台 Computing Instance + Storage。當然這個方法也完全適用本地安裝,你也可以使用其他平台, 如 AWS EC2 + S3。而我選用 Linode 的原因單純是因為相對 AWS 較便宜,這部分的比較我放在文章最後面討論,有興趣的朋友可以參考一下。
使用環境 #
硬體最低需求 #
- CPU: 任意 64-bits CPU
- RAM: 128 MB
Note:
- 官方建議記憶體至少 512 MB。
- 如果要使用內建升級軟體,記憶體最低需求為 256 MB。
- 32-bits CPU 有支援,不過日期範圍會有限制。
作業系統 & 軟體 #
- 粗體字為官方推薦
平台 選項 作業系統 - Ubuntu 20.04
- Ubuntu 22.04 (推薦)
- Red Hat Enterprise Linux 9(推薦)
- Red Hat Enterprise Linux 8
- Debian 12
資料庫 - MySQL 8.0 / 8.4 or MariaDB 10.6 / 10.11
- PostgreSQL 12/13/14/15/16
網頁伺服器 - Apache 2.4
- Nginx
PHP Runtime - 8.2
- 8.3
上面列舉常見組合,要確認目前使用平台是否支援,請見
詳細需求
我使用的版本如下:
- Ubuntu 22.04
- MariaDB 10.11
- Nginx
- PHP Runtime 8.2
安裝 #
NextCloud 檔案 #
先到官網下載最新版的軟體
全新主機記得先更新
sudo apt update && apt upgrade
將 Nextcloud 檔案複製到 /var/www
,並將擁有者改成 www-data
。
sudo apt install unzip
unzip latest.zip
sudo cp -r nextcloud /var/www/
sudo chown -R www-data:www-data /var/www/nextcloud
安裝必要套件 #
- PHP
加入套件來源
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
安裝必要套件
sudo apt install php8.2 php8.2-imagick php8.2-cli php8.2-common php8.2-mysql php8.2-fpm php8.2-gd php8.2-curl php8.2-zip php8.2-xml php8.2-mbstring php8.2-bz2 php8.2-intl php8.2-bcmath php8.2-gmp
在我安裝的時候官方推薦版本還是 8.2,但撰寫文章當下已經升級成 8.3, 你可以直接升到 8.3 進行安裝,只是記得往後有遇到版本號碼的地方記得要填對!
資料庫 #
安裝資料庫 #
sudo apt install mariadb-server
初次設定 #
初次設定指令
sudo mysql_secure_installation
- Root 密碼
Enter current password for root (enter for none):
我們尚未設定資料庫 root 密碼,直接按 Enter
跳過
- 詢問切換成
unix socket authentication
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
本機已有設定好的 root 帳號,不切換
- 設定資料庫 root 密碼
Set root password? [Y/n] n
因為我們可以使用 Ubuntu 上的帳密,不用特別設定 root 密碼。
之後的設定可以一路 Y
到底。
設定資料庫 #
進入資料庫 Shell
sudo mariadb
- 設定
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on nextcloud.* to 'username'@'localhost';
FLUSH PRIVILEGES;
上面的設定為:
- 建立一個新的使用者,替換
username
和password
- 建立資料庫,我將名稱設定為 nextcloud,你可以任意更換
- 提供 nextcloud 資料庫所有權限給剛剛建立的使用者
- 更新紀錄
sudo systemctl start mariadb
sudo systemctl enable mariadb
啟用並註冊資料庫服務,好處是重啟電腦後服務會自動啟用
Proxy #
於 /etc/nginx/conf.d/
下面新增一個新域名的設定檔,例如:nextcloud.conf
- 基本設定檔
upstream php-handler {
server unix:/var/run/php/php8.2-fpm.sock;
}
# Set the `immutable` cache control options only for assets with a cache busting `v` argument
map $arg_v $asset_immutable {
"" "";
default ", immutable";
}
server {
listen 80;
server_name <DOMAIN orIP>;
# Prevent nginx HTTP Server Detection
server_tokens off;
root /var/www/nextcloud;
index index.php index.html /index.php$request_uri;
# 必要區塊,php 程序要處理的部分,沒加入會一直下載 index.php or 500 Error
location ~ \.php(?:$|/) {
# Required for legacy support
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice
fastcgi_param front_controller_active true; # Enable pretty urls
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_max_temp_file_size 0;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
- 注意
php8.X-fpm.sock
版本號碼 - 上面基本設定檔為進入網頁端設定的最低需求,為獲得最佳使用體驗,請參考下面指示!
SSL #
不需要加密的人 (如內網或 Cloudflare 彈性加密等),可以跳過 SSL
因為我預計採全端加密,原始伺服器先申請憑證
- 利用 Certbot 申請憑證
如果還沒安裝Certbot
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
我們是使用 Nginx,輸入
sudo certbot --nginx
首次設定會要你輸入電子郵件(日後憑證更新有問題會寄信通知你),接著選擇你的域名產生新的憑證,
Certbot會自動幫你把必要的設定寫入 .conf
裡。
下面我們可以補上完整設定,請參考 Nextcloud
官方範例
(標題為 Nextcloud in the webroot of NGINX
裡面的內容)
如果你不了解 Nginx 設定檔也不要緊,跟隨下面指示:
- 打開
官方範例
- 執行過 CertBot 後應該會在設定檔裡面看到兩個區塊,80 & 443
- 主要修改 443 部分,設定檔只保留原本 SSL 相關 (Certbot 寫入的那幾行會留下
# managed by Certbot
的註解,保留這些) - 剩下的全部複製過去 (注意
root /var/www/nextcloud;
這行在官網範例裡位在 ssl 前面,留意有沒有漏掉)
如果你是跳過 SSL 的也可以設定,將上述第4點貼在
80
區塊內。
啟動 Nextcloud #
先確定 php-fpm 安裝狀態
php-fpm8.2 --version
沒問題註冊自啟動
sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm
設定 Nextcloud #
上面步驟完成後,我們可以開始設定 Nextcloud。
打開瀏覽器,輸入你的域名
或IP
(如果未加密),進入初始設定畫面
- 設定管理員帳號密碼
- 填入你剛剛新增資料庫的帳密
- 點選
安裝
Mysql / Mariadb 預設 port 為 3306
安裝完成後他會推薦你一些應用程式,我目前使用低成本的主機,選太多功能可能會拖慢性能,所以直接跳過。 如果你資源夠的話可以選擇開。
原則上就大功告成啦!
性能最佳化 #
到目前為止本體的安裝已經完成了喔!原則上你已經可以開始使用了,
不過打開管理設定你會看到一些警告,下面步驟是為了進一步將這些警告訊息清除,
同時增加 Nextcloud 的性能。
增加 PHP 記憶體 & 檔案大小上限 #
- 編輯
/etc/php/8.2/fpm/php.ini
- 找到
memory_limit
,預設記憶體為 128 MB,將他調高為 512 (更高也可以) - 找到
upload_max_filesize
,預設 2M,根據需求調整成你要的大小
- 編輯
/etc/php/8.2/fpm/pool.d/www.conf
將 clear_env = no
註解移除。
String Buffer #
opcache.interned_string_buffer
達上限,請設定大於 8 的數值
一樣編輯 /etc/php/8.2/fpm/php.ini
,找到 opcache.interned_string_buffer
,把註解拿掉並改成一個大於 8 的數字
設定完後重啟服務
sudo systemctl reload php8.2-fpm
HSTS #
HTTP Strict Transport Security,現代網站幾乎都會將 http 重新轉向 https (用 CertBot 申請證書時幫你設定的行為就是), 不過重定向有中間人攻擊的風險。Nextcloud 會希望你設定 HSTS,但奇怪的是官方 Nginx 範例並未主動加入這行😅 。而他的設定也不難,打開 Nginx 設定檔,加入
add_header Strict-Transport-Security "max-age=15552000" always;
Redis #
- 安裝與測試
sudo apt install redis-server
redis-server -v
- 安裝必要套件
sudo apt install php8.2-redis
php8.2 --ri redis
如果上面測試有問題
sudo phpenmod redis
- 更改 Nextcloud 設定檔
編輯 /var/www/nextcloud/config/config.php
,後面加上
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'localhost',
'port' => 6379,
),
設定定期維護週期 #
編輯 /var/www/nextcloud/config/config.php
'maintenance_window_start' => 17,
'default_phone_region' => 'TW',
時間以 UTC 計時
手機號碼 #
編輯 /var/www/nextcloud/config/config.php
'default_phone_region' => 'TW',
背景工作 #
設定使用者 www-data
的工作 (初次設定會問你偏好的編輯器)
sudo crontab -u www-data -e
加入下面設定
*/5 * * * * php8.2 -f /var/www/nextcloud/cron.php
表示每 5 分鐘執行一次
以上是我整理過去常遇到的警告,不過每個人的環境不一樣, 你可能會遇到其他警告,不過大部分 Google 一下都可以解決?
與外部空間連接 #
這邊示範要如何跟外部空間連動,以 Linode Object Storage 當例子。
點開列表 + 應用程式
-> 您的應用程式
往下滑,找到 External storage support
,預設是未啟用,
點選啟用,他會自己安裝必要檔案並啟動。
現在我們要先設定一個新的 Bucket 讓 Nextcloud 可以讀寫,假設你已經啟用 Object Storage,
你可以新增一個 Bucket,接著點選 Access Keys
-> Create Access Key
填入 label 名字,Region 選你 Bucket 所在的位置,下面 Limited Access
打開,這把 Key 就只能存取自己的 Bucket。
下面權限選擇讀/寫。
建立完 Access Key 後,他會出現 Access Key & Private Key,記得將他存好!
下面就可以回到 Nextcloud 的管理介面,剛剛啟用功能完成後頁面重新整理,左邊列表應該就會出現外部儲存空間的選項。
資料夾名稱為在 Nextcloud 顯示的名字,外部儲存空間選 Amazon S3
,驗證選 存取金鑰
。Linode Bucket 的網址應該會長成:
<Bucket Name>.<Region>.linodeobjects.com
,把 Bucket Name
填入第一欄,<Region>.linodeobjects.com
填入第二欄,區域名稱就填入 <Region>
,最下面填入你剛剛拿到的 Access Key 和 Private Key,
右邊可以控制哪些 Nextcloud 的使用者可以存取這個空間。都設定完按儲存,如果都設定正確左邊狀態會顯示綠色勾勾。
碎碎念時間 #
以下就是純粹個人的廢話,只想關注技術的人可以看到這就好XD
關於計費討論 #
使用 VPS 最重要的一個部分是控制成本,取用平台服務很容易,但一不小心錢錢會噴飛。 我去年有寫一篇在 AWS 噴錢的故事,所以我後來的結論是個人用途 AWS 大部分情況不適合,Linode 相對更友善一點。 Linode 收費上不能說一定是最便宜,但最大好處是他的收費是有上限的,成本比較好控制,而且給的優惠比較多。
- Compute Instance
Linode 最低規格為 Nanode 1 GB
- 1-vCPU
- 1 GB RAM
- 25 GB Disk
- 同時提供每月 1 TB 網路傳輸流量(流量小於 1T 免費)
- 月租 5 USD (最高上限)
- Object Storage
- 最低 250 GB
- 每月 500 GB Out-bound 流量
- 月租 5 USD (最高上限)
順帶一提,如果 Instance 跟 Storage 一起買的話,你的全球網路流量上限會變成 Instance 的 1T + Storage 的 500G, 等於每月有 1.5T 的免費流量。
要注意的是,Linode 的 Object Storage 有最低平攤成本,假設你租了最低規格 250 GB,
結果你通通沒有裝任何資料,開一個月後還是會扣 5 美。所以開了就是想辦法把它塞滿就對了
而 AWS 不管是容量還是網路流量都是以每 GB 為單位計價,資料量越大,跟 Linode 的價差就會越高, 所以我最終選用 Linode。
其實 AWS EC2 舊制的成本也不高,但自 2024/02/01 起所有 Public Ipv4 引入新計費標準, 所有使用的 IP 位置只要占用就要收費,每小時 0.005 USD,相當於每月會固定多出 3.6 美的成本, 所以後來決定就不進這個
火坑平台了。
- AWS Lightsail (更新比較方案)
其實就是 Shared 資源的方案,近幾年才推出的,帳面上跟我現在 Linode 的套餐方案幾乎一模一樣,其實我也有試過,
這邊講一個讓我直接棄坑的理由:內建 Object Storage 無法單獨提供外部服務,這個結果也不難理解,
AWS 不會沒事推一個跟自家 S3 打架的方案,基本上能調用這個空間的服務只有在他預設 Market Place 上有標明可預載的服務,
例如 WordPress,而 Nextcloud 並未包還在內,自然無法掛載空間。再來其實他的還有很多嘈點,
像是流量說有 2TB,但 in/out 都會計入,
所以等價於 Linode 的 1TB (Linode Inbound 不計入流量),看起來能成為優點的大概是那個 40GB 的 SSD 跟 2vCPU,
不過後來看到這篇
作者實際使用一個月的心得,只能說沒有比較沒有傷害(那個限制 CPU 用量是三小,還有那個 I/O 性能…),
看完忽然覺得 Linode 根本 VPS 界的活菩薩。
總結 #
這篇教學是我目前撰寫過最長的一篇,我也很訝異我把它完成了,因為在此之前我在思考的問題是:我是否要自架私有雲?
單純以成本考量,任一雲端品牌完勝自架。曾經想過離開學校後要不就挑一個看得順眼的給他租下去,反正不算貴。
現在還是選擇自架純粹就是它是一個最具挑戰性的方案,簡單來說就是手濺拉。就當作是未來如果遇到非跳槽不可的理由時,
有一個替代方案可選。