下一云 是自托管 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,它要求提供数据库信息,如主机名、端口、数据库用户名密码。
在那里也可以看到一个类似的复选框。 我建议您取消选中此框,然后从应用列表中安装您以后需要的任何应用。

有关更多后期部署技巧,请阅读我的同事 Avimanyu 撰写的这篇很棒的文章:
就是这样。 我希望这个详细的教程可以帮助您使用 Docker 安装 Nextcloud 服务器。 如果您有任何问题或建议,请在评论部分告诉我,我很乐意为您提供帮助。