banner
二階堂春希

春希のブログ

山雨欲来风满楼,故攻八面以铸无双。 孤战非所望,俗安不可期。
tg_channel
telegram
twitter
github

用 NixOS 在本地搭建 Nextcloud

之前的文章中,我們已經安裝了適用於伺服器的 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 中找到這些應用的名稱。

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 沒有應用商店。

你可以設置 appstoreEnabletrue 來啟用應用商店。

  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 ];

維護#

剛剛搭建沒多久,所以還沒有遇到什麼維護上的問題。如果有問題,我會在這裡更新。

對於大問題,我可能會單獨寫一篇文章,在解決問題的那篇博文放上這個博文的鏈接,在這裡放上指向解決方案的鏈接。

如果想要及時收到更新,可以在區塊鏈上關注我的博客。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。