通过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 加密。

posted @ 2023-06-30 09:22  fmcdr  阅读(4054)  评论(0编辑  收藏  举报