在之前的文章中,我們已經安裝了適用於伺服器的 NixOS。本文將在此基礎上搭建 Nextcloud。
博主在搭建 Nextcloud 時遇到了很大困難,主要原因是無法發送郵件、NixOS 官方文檔簡陋。所以我甚至寫了一個更好的 Nextcloud NixOS Wiki。在折騰完 Nextcloud+NixOS 之後,試一試提交上去換掉現在的 Wiki。
實際上你不需要按照博客的做法一步一步來,你完全可以直接下載我配置好的 configuration.nix
,然後按照自己的需求做修改。
為什麼是 Nextcloud#
Nextcloud 是一個開源的雲存儲服務,可以用於搭建私有雲。它的功能非常強大,可以用於文件存儲、日曆、筆記、聊天等等。雖然 Nextcloud 使用了過時的 PHP,但因為它的功能實在是強大,找不到比較好的替代品,所以還是選擇了 Nextcloud。
除了Nextcloud之外,博主還嘗試了這些開源雲存儲服務:
- pydio:功能同樣強大,但是沒有 Nix 包,NixOS 安裝起來比較麻煩。
- Seafile:足夠強大的替代品,有 Nix 包,但是缺少文檔,部署比較麻煩。
- ownCloud:Nextcloud 的前身,功能不夠強大,而且更新不穩定。
- cloudreve:功能不夠強大,只能存儲文件,而且沒有 Nix 包。
本地搭建 Nextcloud 的基本流程#
安裝 Nextcloud 包#
安裝 Nextcloud 非常簡單,只需要修改 /etc/nixos/configuration.nix
文件,在 environment.systemPackages
中添加 nextcloud
即可。
environment.systemPackages = with pkgs; [
nextcloud26
];
注意:Nextcloud 的 Nix 包是
nextcloud
+ 版本號,而不是nextcloud
。
先不要著急運行 nixos-rebuild switch
,現在還沒有配置 Nextcloud。
初次配置#
NixOS 手冊中給出了這樣的配置:
{
services.nextcloud = {
enable = true;
hostName = "nextcloud.tld";
config = {
dbtype = "pgsql";
dbuser = "nextcloud";
dbhost = "/run/postgresql"; # nextcloud will add /.s.PGSQL.5432 by itself
dbname = "nextcloud";
adminpassFile = "/path/to/admin-pass-file";
adminuser = "root";
};
};
services.postgresql = {
enable = true;
ensureDatabases = [ "nextcloud" ];
ensureUsers = [
{ name = "nextcloud";
ensurePermissions."DATABASE nextcloud" = "ALL PRIVILEGES";
}
];
};
# ensure that postgres is running *before* running the setup
systemd.services."nextcloud-setup" = {
requires = ["postgresql.service"];
after = ["postgresql.service"];
};
networking.firewall.allowedTCPPorts = [ 80 443 ];
}
這段配置的含義是:
- 啟用 Nextcloud 服務
- 指定域名為
nextcloud.tld
- 指定數據庫為 PostgreSQL,並給出了數據庫的具體配置
- 指定了服務的啟動順序
- 開放了 80 和 443 端口
- 指定存放 Nextcloud 管理員的密碼文件為
/path/to/admin-pass-file
/path/to/admin-pass-file
不是一個實際的路徑,而是一個佔位符,需要我們自己指定。按照 NixOS 的要求,這個文件必須可以被 nextcloud
用戶訪問。但經過博主測試,發現這個文件所在的目錄也需要能夠被 nextcloud
用戶訪問。因此,我們需要將這個文件放在 /nextcloud
目錄下,然後將 /nextcloud
目錄的權限設置為 777
。
將 /path/to/admin-pass-file
改為 /nextcloud/nextcloud-admin-pass
,然後
# 以root用戶運行
cd /
mkdir nextcloud
chown nextcloud nextcloud/
chmod 777 nextcloud/
cd nextcloud
vim nextcloud-admin-pass
# 寫入密碼
nixos-rebuild switch
由於是本地測試環境,暫時將 nextcloud.tld
修改為 nextcloud.nixos
(因為博主的局域網有自建的 dns 服務器,如果你沒有,建議改成地址)。
在完成構建之後,訪問 http://nextcloud.nixos/
,就可以看到類似下圖的 Nextcloud 的安裝界面了。
不同版本的 Nextcloud 的安裝界面可能不同,但是大同小異。
輸入 service.nextcloud.config.adminuser
中指定的用戶名和 /nextcloud/nextcloud-admin-pass
中指定的密碼,就可以完成安裝了。
在 nix 配置文件中安裝 Nextcloud 的應用(簡易用法)#
上述配置部署的 nextcloud 只安裝了寥寥幾個應用,但 Nextcloud 是一個強大的平台,可以通過安裝應用極大地拓寬功能。在 Nextcloud 的應用商店中,可以找到並安裝很多應用,但是在 NixOS 中,使用 Nix 包管理器安裝應用是一個更好的選擇。
NixWiki中提供了安裝應用的示例,例如
services.nextcloud = {
enable = true;
[...]
package = pkgs.nextcloud26;
extraApps = with pkgs.nextcloud26Packages.apps; {
inherit mail news contacts;
};
extraAppsEnable = true;
};
這段配置安裝了 mail、news 和 contacts 三個應用。但是這些應用的名稱在 Nextcloud 的應用商店中是找不到的,不過我們可以在 NixWiki 的 Some apps
中找到這些應用的名稱。
本文發布時,這些應用的名稱如下:
[
"bookmarks",
"calendar",
"contacts",
"deck",
"keeweb",
"mail",
"news",
"notes",
"onlyoffice",
"polls",
"tasks",
"twofactor_webauthn"
]
顯然這些應用是不夠用的,不過,還有其他的方法安裝應用。
在 nix 配置文件中安裝 Nextcloud 應用商店中的應用#
NixWiki 還給出了在 nix 配置文件中,通過 Nextcloud 應用商店安裝應用的方法,例如
services.nextcloud = {
enable = true;
[...]
extraApps = {
mail = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud-releases/mail/releases/download/v1.14.1/mail-v1.14.1.tar.gz";
sha256 = "sha256-sQUsYC3cco6fj9pF2l1NrCEhA3KJoOvJRhXvBlVpNqo=";
};
contacts = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud-releases/contacts/releases/download/v4.2.2/contacts-v4.2.2.tar.gz";
sha256 = "sha256-eTc51pkg3OdHJB7X4/hD39Ce+9vKzw1nlJ7BhPOzdy0=";
};
};
extraAppsEnable = true;
};
這段配置安裝了 mail 和 contacts 兩個應用。我們可以在 Nexcloud 應用商店 中找到應用的下載鏈接,然後將其添加到配置文件中。
注意:通過這種方法安裝的應用需要手動更新。在版本更新時,你需要再次手動填寫新的下載鏈接。(當然,也可以使用 Nextcloud 內的應用商店更新)
博主安裝了這些應用
services.nextcloud = {
enable = true;
package = pkgs.nextcloud26;
[...]
extraApps = {
contacts = pkgs.nextcloud26Packages.apps.contacts;
mail = pkgs.nextcloud26Packages.apps.mail;
calendar = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud-releases/calendar/releases/download/v4.3.4/calendar-v4.3.4.tar.gz";
sha256 = "0pj1h86kdnckzfrn13hllgps4wa921z4s24pg5d2666fqx89rwrv";
};
notes = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud-releases/notes/releases/download/v4.7.2/notes.tar.gz";
sha256 = "0klqf8dixrrb8yp8cc60ggnvhmqb3yh9f6y1281jn8ia5jml622v";
};
camerarawpreviews = pkgs.fetchNextcloudApp rec {
url = "https://github.com/ariselseng/camerarawpreviews/releases/download/v0.8.1/camerarawpreviews_nextcloud.tar.gz";
sha256 = "1n1395m81m81klxzxd03ww07m0xjp0blbmx23y457k62j3kkr0m2";
};
drawio = pkgs.fetchNextcloudApp rec {
url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v2.1.1/drawio-v2.1.1.tar.gz";
sha256 = "0frizrgkbmc3mhhap7cq45z43l4whzkszx7v0v0q2ylmq8sbxszm";
};
registration = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud-releases/registration/releases/download/v2.1.0/registration-v2.1.0.tar.gz";
sha256 = "07dqc670qmdb3c8jjnj7azxxspjhiv6m9nrj960y3rjabyzy25m9";
};
music = pkgs.fetchNextcloudApp rec {
url = "https://github.com/owncloud/music/releases/download/v1.8.3/music_1.8.3_for_nextcloud.tar.gz";
sha256 = "1kajm5ppp63g42xdvkmv0glw7snsc2fi7pcra1sg4kd005ffz42d";
};
bookmarks = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud/bookmarks/releases/download/v13.0.1/bookmarks-13.0.1.tar.gz";
sha256 = "0xx331bgly91y8ncxk36ha3ncrr2xlivblfi7rix6ffkrdx73yb9";
};
};
}
你可以使用
nix-prefetch-url --unpack <url>
命令獲取 tar.gz 包的 sha256 值。
儘管格式和有些文檔中有差異,但是這種方法也是可以工作的。
注意 camerarawpreviews
等名稱必須與 tar.gz 包的名稱一致,否則無法安裝。
如果你的設置正確,在管理設置 -> 概覽中,應該沒有報錯。
常見問題的解決方案#
Nix 把 Nextcloud 安裝到哪去了?#
根據源碼,默認的安裝路徑是 /var/lib/nextcloud
,數據目錄是 /var/lib/nextcloud/data
。
找不到日誌#
默認情況下,NixOS 將 Nextcloud 的日誌輸出模式修改成了
'log_type' => 'syslog',
'loglevel' => '2',
在這種情況下,Nextcloud 的日誌會輸出到守護進程的日誌中,可以使用 journalctl -t Nextcloud
查看。
有意思的是,似乎 'loglevel' => '2'
是無效配置。Nextcloud 內部的 Warning, Error, 甚至 Fatal 都被視為 Debug 輸出。所以可能需要將 'loglevel' => '2'
改成 'loglevel' => '0'
。
services.nextcloud = {
[...]
logLevel = 0;
};
如果需要,可以附加參數 -f
實時查看日誌。
應用商店在哪裡?#
默認情況下,NixOS 安裝的 Nextcloud 沒有應用商店。
你可以設置 appstoreEnable
為 true
來啟用應用商店。
services.nextcloud = {
[...]
appstoreEnable = true;
};
無法發送郵件#
由於設計缺陷,無法通過 Nix 文件直接配置郵件發送,必須使用 extraConfig
來配置。
services.nextcloud = {
[...]
extraOptions = {
mail_smtpmode = "smtp";
smtpsecure = "ssl";
mail_sendmailmode = "smtp";
mail_from_address = "nextcloud";
mail_domain = "example.com";
mail_smtphost = "smtp.example.com";
mail_smtpport = "465";
mail_smtpauth = 1;
mail_smtpname = "[email protected]";
mail_smtppassword = "password";
};
};
以上配置來源於 config.php
文件,你可以在一個全新的 Nextcloud 實例中找到這些配置。
在本地搭建測試伺服器時,似乎無論採用什麼設置也不能發送郵件,但是在雲伺服器上(如 AWS)卻可以正常發送郵件。這個問題似乎是由於本地網絡環境導致的,我沒有找到解決方案。
Nix 配置文件示例#
這裡給出IPFS 鏈接
需要注意,一些設置使用了佔位符代替,所以不要直接使用這個配置文件。
主要的修改有:
services.nextcloud = {
enable = true;
hostName = "nextcloud.nixos";
config = {
dbtype = "pgsql";
dbuser = "nextcloud";
dbhost = "/run/postgresql"; # nextcloud will add /.s.PGSQL.5432 by itself
dbname = "nextcloud";
adminpassFile = "/path/to/your/nextcloud/adminpass.txt"; # Replace with your own path
adminuser = "root";
};
package = pkgs.nextcloud26;
extraApps = {
contacts = pkgs.nextcloud26Packages.apps.contacts;
mail = pkgs.nextcloud26Packages.apps.mail;
calendar = pkgs.fetchNextcloudApp rec {
url = "https://github.com/nextcloud-releases/calendar/releases/download/v4.3.4/calendar-v4.3.4.tar.gz";
sha256 = "0pj1h86kdnckzfrn13hllgps4wa921z4s24pg5d2666fqx89rwrv";
};
# More configuration can be found in My IPFS share
};
extraOptions = {
# Replace below with your own mail server settings
mail_smtpmode = "smtp";
smtpsecure = "ssl";
mail_sendmailmode = "smtp";
mail_from_address = "system";
mail_dmoain = "example.com";
mail_smtphost = "smtp.example.com";
mail_smtpport = "465";
mail_smtpayth = 1;
mail_smtpname = "[email protected]";
mail_smtppassword = "password";
};
};
services.postgresql = {
enable = true;
ensureDatabases = [ "nextcloud" ];
ensureUsers = [
{ name = "nextcloud";
ensurePermissions."DATABASE nextcloud" = "ALL PRIVILEGES";
}
];
};
systemd.services."nextcloud-setup" = {
requires = ["postgresql.service"];
after = ["postgresql.service"];
};
networking.firewall.allowedTCPPorts = [ 80 443 465 587 ];
維護#
剛剛搭建沒多久,所以還沒有遇到什麼維護上的問題。如果有問題,我會在這裡更新。
對於大問題,我可能會單獨寫一篇文章,在解決問題的那篇博文放上這個博文的鏈接,在這裡放上指向解決方案的鏈接。
如果想要及時收到更新,可以在區塊鏈上關注我的博客。