通过docker安装NextCloud,并配置Nginx反向代理
原本在Debian Bullseye上安装了nextcloud,安安稳稳地用了一年。近一段时间,Debian 12 (Bookworm)发布了,就手欠把系统给升级了。系统内置的php被升级到了 8.x,结果Nextcloud跑不起来了,因为它只支持 php-7.4 (好像)。单独给 php 降级是可行的,但是服务器本身有一些需要调整的地方,于是借这个机会又重新折腾了一次。最大的变化是,我把服务器弄成了kvm服务器,把Nextcloud给挪到了VPS里了。如此这般,原本混杂在一台机器上的服务都分离了。
为了避免因为组件升级再次导致服务器挂掉,我决定不再实机安装,而是使用比较时髦的容器技术:docker 来安装 nextcloud。下面把步骤简单记述一下。具体的操作其实与下面的步骤并不严格一致,因为这篇文章是事后写的。
一、安装Docker
docker自己维护了针对不同发行版的官方源,通常建议从docker的源进行安装。
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# 下载并导入docker的gpg公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gp
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 添加 docker 的官方源
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 刷新源
sudo apt-get update
# 安装docker相关的包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 测试安装
sudo docker run hello-world
二、安装 MariaDB
docker run -d \
--name=nextcloud_db \
--restart=always \
-e MYSQL_ROOT_PASSWORD=xxxxxxxxx \
-p 3306:3306 \
-v /data/nextcloud/db:/var/lib/mysql \
mariadb
选项解释:
-
--name=nextcloud_db: 指定MariaDB实例的名字叫做 nextcloud_db
-
-e MYSQL_ROOT_PASSWORD=xxxxxxxxx: 设定一个环境变量
MYSQL_ROOT_PASSWORD
,用于设定 MariaDB 的 root 密码 -
-p 3306:3306: 将宿主机的 3306 端口映射到容器的 3306 端口
-
-v /data/nextcloud/db:/var/lib/mysql: 将宿主机的
/data/nextcloud/db
目录映射到容器的/var/lib/mysql
目录,数据库实际上存储在宿主机的/data/nextcloud/db
目录里面
三、安装 NextCloud
docker run -d \
--name=nextcloud \
--link nextcloud_db:db \
-p 8080:80 \
-v /data/nextcloud:/var/www/html \
--restart=always \
nextcloud
选项解释:
-
--name 指定实例的名字叫做 nextcloud
-
--link 将
db
链接到另外一个实例nextcloud_db
,就是上一步中安装的 MariaDB 实例。在初始化 nextcloud 安装的时候,在指定数据库主机的时候,不能填入localhost
或其它IP,只能填入db
,就是由这个选项所定义的。 -
-p 将宿主机的 8080 端口映射到容器的 80 端口,容器内的 apache 实际上在 80 端口上监听
-
-v 将宿主机的
/data/nextcloud
映射为容器的/var/www/html
目录,在初始化安装时,默认的安装位置就是/var/www/html
,保持默认值不变,实际上 nextcloud 会被安装到宿主机的/data/nextcloud
目录中,可以从宿主机直接访问并修改。
安装完 nextcloud 后,编辑 /data/nextcloud/config/config.php
,找到trusted_domains
数组,将自己的域名添加到其中,看起来类似于:
array (
0 => '192.168.1.x:8080',
1 => 'your.domain',
),
为了让桌面客户端能够正常通过反向代理进行登陆,还需要在下面添加两行:
array (
0 => '192.168.1.x:8080',
1 => 'your.domain',
),
'overwriteprotocol' => 'https',
'overwritehost' => 'your.domain',
四、访问主域名,开始初始化
浏览器打开 http://your.domain:8080 ,开始初始化设定:
安装目录 /var/www/html
不要改
数据库选择 MySQL/MariaDB
数据库用户名: root
数据库密码: <MYSQL_ROOT_PASSWORD>
数据库名称: nextcloud
数据库服务器: db
五、安装并配置反向代理
安装 Nginx 和 certbot:
apt install nginx certbot python3-certbot-nginx
在 /etc/nginx/conf.d
目录中新建一个最小化的站点配置,最重要的是指定域名。
server {
server_name your.domain;
listen 80;
listen [::]:80;
......
}
确保能够通过域名从外网访问到 nginx 后,运行 certbot 自动申请 letsencrypt 证书。
certbot --nginx -d your.domain
申请成功后,certbot 会修改刚刚新建的站点配置文件,加上了证书相关的配置,并且强制所有 HTTP 请求自动跳转到 HTTPS。
再次编辑该站点配置文件,将其中的 location /
修改成下面的样子:
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $server_name;
client_max_body_size 8G;
proxy_pass http://127.0.0.1:8080;
}
对该站点的访问全部被转发到本机的 8080 端口,即容器内正在监听 80 端口的 apache 进程。而客户端与服务器的联系全部经过 HTTPS 加密。