如何在你的 Linux 服务器上使用 Docker 安装 Nextcloud

下一云 是自托管 Google Drive 或 Dropbox 替代方案的完美解决方案。

我不会告诉你为什么应该使用 Nextcloud。 相反,我将向您展示如何使用 Docker 容器安装 Nextcloud 服务器。

本教程使用 Ngnix 反向代理设置,以便您可以使用 SSL 部署 Nextcloud 实例。 这样,您的 Nextcloud 部署 URL 将使用 HTTPS,并且您将安全地传输文件。

在本教程即将结束时,我将为 Linode 云用户分享一些技巧,以减少 Nextcloud 部署的工作量。

先决条件

在继续之前,有些事情需要处理。 这是您需要的:

  • Linux 服务器可以是物理服务器、虚拟机或云服务器。
  • 安装了 Docker 和 Docker Compose 在您的 Linux 服务器上。 如果您需要帮助,请遵循 Ubuntu 和 CentOS 上的 docker 安装指南。 同样,您可以按照 Ubuntu 和 CentOS 上的 docker-compose 安装教程进行操作。
  • 对 Docker 和 Docker Compose 有一些了解是很好的。
  • 一个域名。 与 Linux 手册中的所有其他部署一样,此部署是在使用 HTTPS 的实际域名下完成的。
  • 一些 shell 和 Linux 命令的经验,因为那里有很多动作。
  • 访问像 Sendgrid 这样的 SMTP 服务。 您将需要它来发送电子邮件通知、密码重置等。
  • 时间和耐心。

在反向代理中使用 Docker 部署 Nextcloud 服务器

让我们一步一步来看看。

第一步:设置反向代理

使用反向代理,您可以在同一台服务器上部署多个 Web 服务。 这不是可选的,因为您需要让我们为 SSL 加密容器。

有两种方法可以设置 Ngnix 反向代理。

如果您不使用 Linode,请阅读我关于如何使用 Docker 设置 nginx-reverse-proxy 的文章。

如果您使用 Linode,我建议您使用我们的 反向代理 jwilder StackScript 可以轻松部署您的服务器,并为您设置好一切。

反向代理部署应该使用单独的 Compose 文件来完成,这样您就可以重新启动或更新 Web 服务,而不会干扰您的反向代理设置。

我已经准备好了 在我们的公共 GitHub 存储库中编写文件. 由于这不是关于反向代理部署的详细文章,因此我不会详细介绍 Compose 文件的详细信息。

您可以使用 git, 或者 wget 下载文件。 如果使用 git,克隆整个存储库:

git clone https://github.com/linuxhandbook/tutorial-snippets && 
	cd tutorial-snippets/Reverse_Proxy

否则,只需下载必要的文件:

mkdir -p ~/Reverse_Proxy && cd ~/Reverse_Proxy
for file in max_upload_size.conf env.example docker-compose.yaml; do
	wget https://raw.githubusercontent.com/linuxhandbook/tutorial-snippets/main/Reverse_Proxy/${file}
done

这里有三个文件:

  • 环境。example: 将其重命名为 .env 并更改 DEFAULT_EMAIL 到您的电子邮件
  • max_upload_size.conf:此文件确保您可以上传最大为 1 GB 的文件(默认为 2 MB)。
  • docker-compose.yaml:最大的。 在下一段中简要讨论。

创建一个名为 net. 这在 docker-compose.yaml 文件中使用。

docker network create net

docker-compose 文件如下所示:

最后,部署容器

docker-compose up -d

在成功部署时,您应该在尝试访问托管此反向代理的服务器的 IP 地址时收到 503。 没关系。 您还没有在其上运行 Web 服务。

第 2 步:部署 Nextcloud

这里有两个组件:一个是数据库,另一个是 Nextcloud 本身,或者我们称之为前端。

对于后端数据库,任何基于 MySQL 的数据库都可以使用。 我要去 玛丽亚数据库,尤其是图像标签(或版本)10.5.9。

对于 Nextcloud,我将使用 21.0.0 版本,这是撰写本文时的最新版本。

因此,使用的图像是

  • mariadb:10.5.9
  • nextcloud:21.0.0

如果您将来使用本教程(从当前时间参考)并且 Nextcloud 和 MariaDB 有更新得多的版本,请使用这些版本。

骨架文件,即 compose 文件和 env 文件已经上传到 我们的公共 GitHub 存储库. 您可以在阅读说明时下载或重写它们。

我建议您下载文件,然后仔细阅读所有内容以了解发生了什么,您无需从头开始重写所有内容。

您可以克隆我们的整个 GitHub 存储库,或者只下载必要的文件。

如果您在部署反向代理时克隆了“tutorial-snippets”存储库,只需将当前目录更改为 tutorial-snippets/Nextcloud.

工作的 git 命令如下:

git clone https://github.com/linuxhandbook/tutorial-snippets && 
    cd tutorial-snippets/Nextcloud

否则,使用以下 shell 代码创建一个名为“Nextcloud”的目录并下载其中的文件。

mkdir -p ~/Nextcloud && cd ~/Nextcloud
for file in env.example docker-compose.yaml; do
    wget https://raw.githubusercontent.com/linuxhandbook/tutorial-snippets/main/Nextcloud/${file}
done

复制 env.example 文件到 .env . 稍后您将针对环境变量编辑此文件。 保留原始文件只是为了备份,没有别的。

cp env.example .env

现在,让我看一下服务定义:

1. NC数据库

NCDatabase 服务看起来像这样:

NCDatabase:
	image: "mariadb:10.5.9"

	volumes:
		- "NCMariaDB:/var/lib/mysql"

	environment:
		- MYSQL_ROOT_PASSWORD
		- MYSQL_RANDOM_ROOT_PASSWORD
		- MYSQL_DATABASE
		- MYSQL_USER
		- MYSQL_PASSWORD

	restart: "on-failure"
	networks: ["common"]

这是数据库服务,如前所述,它使用 mariadb:10.5.9 图像作为它的蓝图。

对于持久存储,我使用了一个名为 NCMariaDB,它安装在 /var/lib/mysql,MariaDB 存储其数据的地方。

环境变量使用 .env 文件,我一会儿再说。

我喜欢 on-failure 重启政策,但您可以自由选择 unless-stopped 或者 always. 您可能想阅读更多关于 Docker 中的重启策略的信息。

common 网络在此和前端服务之间是通用的,它的存在是为了确保这些容器之间可以进行通信。

环境变量

这是一个基于 Docker 的部署,你必须设置一些环境变量。 现在打开这个 .env 在您喜欢的文本编辑器中创建文件并开始更改值,如下所示:

MYSQL_ROOT_PASSWORD 或者 MYSQL_RANDOM_ROOT_PASSWORD: 任意设置 MYSQL_RANDOM_ROOT_PASSWORD 为 1 或为 MariaDB 设置一个强根密码。 采用 openssl 生成随机密码。

MYSQL_DATABASE & MYSQL_USER: 有一些默认设置,但您可以根据需要更改这些设置。 将它们分别设置为您首选的数据库名称和用户名。

MYSQL_PASSWORD: 用户密码 (MYSQL_USER) 将有权访问主 MariaDB 数据库 (MYSQL_DATABASE)。

MYSQL_HOST:这是数据库容器的服务名称。 如果您不打算更改 Compose File 中的服务名称,请保持原样。

2. NC前端

这是 Nextcloud 前端服务。 这项服务与上一项服务一样简单。 看一看:

NCFrontend:
	image: "nextcloud:21.0.0"

	volumes: 
	  - "NCData:/var/www/html"

	environment:
		- LETSENCRYPT_HOST
		- VIRTUAL_HOST
		- TRUSTED_PROXIES
		- OVERWRITEPROTOCOL
		- MYSQL_DATABASE
		- MYSQL_USER
		- MYSQL_PASSWORD
		- MYSQL_HOST
		- SMTP_HOST
		- SMTP_PORT
		- SMTP_NAME
		- SMTP_PASSWORD
		- MAIL_FROM_ADDRESS
		- NEXTCLOUD_TRUSTED_DOMAINS
		- NEXTCLOUD_ADMIN_USER
		- NEXTCLOUD_ADMIN_PASSWORD

	depends_on:
		- "NCDatabase"
	networks: ["net", "common"]

使用的图像是 nextcloud:21.0.0,正如我之前所说,是撰写本文时的最新版本。

为了确保您的数据安全,并且不会在简单的容器重启的不幸事件中丢失数据,数据必须被持久化。 Nextcloud 将其数据/信息保存在 /var/www/html所以这个位置是使用一个名为 NCData.

depends_on 数组是一个有趣的。 它确保在当前服务启动之前首先部署值,即其中提到的服务。

在这里,我确保数据库在 Nextcloud 本身之前启动,以避免任何连接问题。

您可能仍会在日志中看到一些问题,因为成功的容器启动并不表示容器内的预期进程也已成功启动。 他们可能需要更多时间。 在我们的例子中,mysqld 需要更多时间来启动,这就是为什么您可能会在日志中看到一些错误,直到最终成功连接。

有两个网络。 第一个是 net,这也是反向代理部署的一部分。 这是必要的,因为反向代理需要能够与代理服务(即 Nextcloud)进行通信。 这 common network 是为了让 nextcloud 和数据库容器能够成功通信。

Docker Compose 在 Compose 文件中为其所有服务创建一个默认网络。 但是由于 NCFrontend 服务已经连接到网络网络,Docker Compose 不会再创建默认网络,这就是为什么你必须创建一个像“common”这样的自定义网络来实现通信。

环境变量

打开 .env 文件(与您用于 MariaDB 的文件相同)在您最喜欢的文本编辑器中并开始更改值,如下所示:

LETSENCRYPT_HOST, VIRTUAL_HOST & NEXTCLOUD_TRUSTED_DOMAINS:将这些设置为您要在其上托管 Nextcloud 实例的域/子域。

TRUSTED_PROXIES:网络的子网,由反向代理和此前端共享。 您可以使用以下命令获取子网(确保 jq 已安装)

docker inspect -f '{{ json .IPAM.Config }}' net | jq -r .[].Subnet

OVERWRITEPROTOCOL: overwriteprotocol 参数用于设置代理的协议。 当我们使用 HTTPS 时,将其设置为 HTTPS。

SMTP 配置是可选的。 对于本文,我将使用 SendGrid 作为 example. 有关以下环境变量的更合适的值,请参阅您的 SMTP 服务器文档。

SMTP_HOST & SMTP_PORT: SMTP 服务器地址和它将监听的端口,对于 SendGrid,它是 smtp.sendgrid.net 和端口 587,用于自动 TLS。

SMTP_NAME & SMTP_PASSWORD: 用于认证的用户名和密码。 对于 SendGrid,用户名的值非常一致。 这是 apikey. 对于密码,它将是您的 API 密钥。

MAIL_FROM_ADDRESS: 的价值 From SMTP 标头。 将此设置为类似 [email protected].

NEXTCLOUD_ADMIN_USER & NEXTCLOUD_ADMIN_PASSWORD:而不是第一次使用 Web UI 来创建 admin 用户,您可以通过这些变量在部署阶段创建该权限。 将这些设置为您的 admin 用户的用户名和密码。 如果您离开它,系统会在您首次启动 Nextcloud 时提示您创建一个帐户。

我在这个网络中定义了两个内部卷, NCMariaDB 对于 MariaDB 和 NCData 对于 Nextcloud。 是否保留这些内部或外部取决于您。

许多人会说将这些保留在内部是有风险的,因为您很容易犯错误使用 docker-compose down -v 并连同容器一起移除卷。 同时,使用外部卷,您可能会犯以下错误: docker volume prune 并删除您的所有数据。

决定哪一个对你更安全。 如果您决定将它们设为外部,请打开 Compose 文件并更改 volumes 定义如下:-

volumes:
  NCMariaDB:
    external: true
  NCData:
    external: true

之后,创建卷:

for volume in NCMariaDB NCData; do
  docker volume create ${volume}
done

网络

这里没有多少。 您会注意到定义了两个网络。 一种用于前端和反向代理,另一种用于前端和后端能够通信。

数据库容器和 nextcloud 前端有一个名为“common”的公共网络,这使得这两个容器能够相互通信。 您可以将其设为内部,这将限制数据库容器访问公共互联网,但我不确定有什么优势[s] 你可能会从中得到。

如果你想这样做,它应该是这样的:

networks:
	net:
		external: true
	common:
		internal: true

最后,部署 Nextcloud

没有别的事可做。 只需运行以下命令

docker-compose up -d

将提取并部署必要的图像。

部署后,您的服务器上应该总共运行四个容器。

[email protected]:~$ docker ps -a
CONTAINER ID   IMAGE                                           COMMAND                  CREATED       STATUS       PORTS                                      NAMES
1dce1c7909fe   jrcs/letsencrypt-nginx-proxy-companion:latest   "/bin/bash /app/entr…"   7 hours ago   Up 7 hours                                              reverse_proxy_LetsencryptCompanion_1
d29719999132   jwilder/nginx-proxy:latest                      "/app/docker-entrypo…"   7 hours ago   Up 7 hours   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   reverse_proxy_NginxProxy_1
cd719cb2a677   nextcloud:21.0.0                                "/entrypoint.sh apac…"   7 hours ago   Up 7 hours   80/tcp                                     nextcloud_NCFrontend_1
60dff2062aa5   mariadb:10.5.9                                  "docker-entrypoint.s…"   7 hours ago   Up 7 hours   3306/tcp                                   nextcloud_NCDatabase_1

如果之前有容器运行,您可能还会运行更多容器。 底线是这个 Nextcloud 部署由四个容器组成,nginx 容器、letsencrypt 伴侣容器、mariadb 容器,最后是实际的 nextcloud 容器。

部署后

在结束本文之前,我想提一提您在部署后可能想知道的一件事。

首先打开您的浏览器并转到托管此 Nextcloud 实例的域(VIRTUAL_HOST)。 如果您没有设置 admin 使用撰写文件的用户

由于数据库环境变量是通过公共共享的 .env 文件,您不会看到更常见的 Web 安装 UI,它要求提供数据库信息,如主机名、端口、数据库用户名密码。

在那里也可以看到一个类似的复选框。 我建议您取消选中此框,然后从应用列表中安装您以后需要的任何应用。

Nextcloud 的应用列表

有关更多后期部署技巧,请阅读我的同事 Avimanyu 撰写的这篇很棒的文章:

就是这样。 我希望这个详细的教程可以帮助您使用 Docker 安装 Nextcloud 服务器。 如果您有任何问题或建议,请在评论部分告诉我,我很乐意为您提供帮助。