Nextcloud AIO搭建

利用Docker更方便地托管Nextcloud

写在前面


早前曾经写过一篇Nextcloud搭建过程,当时是在宿主机上直接部署,需要安装各种组件,最后还要自己进行性能调优,过程相当繁琐

针对这些问题,官方提供了All-in-One (AIO)的docker镜像,集成了搭建所需要的所有组件,可以完全使用docker容器部署,也不用再自己进行各种优化,省去了很多繁琐的步骤

使用AIO进行搭建的一个问题就是对宿主机配置要求略高,建议至少有两个vCPU,内存3GB以上,当然配置越高体验越好(尤其是内存)

搭建


首先确保系统已经安装了docker,docker-compose和nginx

启动主容器(AIO控制面板容器)


新建一个目录用来配置主容器,创建docker-compose.yml文件并写入下面内容

services:
  nextcloud-aio-mastercontainer:
    image: nextcloud/all-in-one:latest
    init: true
    restart: always
    container_name: nextcloud-aio-mastercontainer
    volumes:
      - nextcloud_aio_mastercontainer:/mnt/docker-aio-config
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - 8080:8080
    environment:
      - APACHE_PORT=11000
      - APACHE_IP_BINDING=127.0.0.1
      - NEXTCLOUD_UPLOAD_LIMIT=100G
      - NEXTCLOUD_MEMORY_LIMIT=1024M


volumes:
  nextcloud_aio_mastercontainer:
    name: nextcloud_aio_mastercontainer

然后执行docker-compose up -d启动容器

配置域名和反向代理


准备一个访问nextcloud的域名,例如cloud.example.com,然后使用certbot申请证书

certbot certonly --standalone --agree-tos -d cloud.example.com

新建一个nginx配置文件为nextcloud.conf并写入下面内容(注意替换为自己的域名和证书路径)

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 80;
    listen [::]:80;

    if ($scheme = "http") {
        return 301 https://$host$request_uri;
    }

    listen 443 ssl http2;      # for nginx versions below v1.25.1
    listen [::]:443 ssl http2; # for nginx versions below v1.25.1 - comment to disable IPv6

    # listen 443 ssl;      # for nginx v1.25.1+
    # listen [::]:443 ssl; # for nginx v1.25.1+ - keep comment to disable IPv6

    # http2 on;                                 # uncomment to enable HTTP/2        - supported on nginx v1.25.1+
    # http3 on;                                 # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+
    # quic_retry on;                            # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+
    # add_header Alt-Svc 'h3=":443"; ma=86400'; # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+
    # listen 443 quic reuseport;       # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+ - please remove "reuseport" if there is already another quic listener on port 443 with enabled reuseport
    # listen [::]:443 quic reuseport;  # uncomment to enable HTTP/3 / QUIC - supported on nginx v1.25.0+ - please remove "reuseport" if there is already another quic listener on port 443 with enabled reuseport - keep comment to disable IPv6

    server_name cloud.example.com;

    location / {
        proxy_pass http://127.0.0.1:11000$request_uri;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Accept-Encoding "";
        proxy_set_header Host $host;

        client_body_buffer_size 512k;
        proxy_read_timeout 86400s;
        client_max_body_size 50000m;

        # Websocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    # If running nginx on a subdomain (eg. nextcloud.example.com) of a domain that already has an wildcard ssl certificate from certbot on this machine,
    # the <your-nc-domain> in the below lines should be replaced with just the domain (eg. example.com), not the subdomain.
    # In this case the subdomain should already be secured without additional actions
    ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;
}

然后执行systemctl restart nginx加载nginx配置

安装Nextcloud AIO


完成上面配置后,访问https://ip:8080即可进入AIO控制面板,准备安装

image.png

复制最下面的密码后,进入Open Nextcloud AIO Login

image.png

进入下面页面后,输入前面准备好的域名,例如cloud.example.com

image.png

根据自己的情况,选择要安装的容器

image.png

时区选择Asia/Shanghai

image.png

然后下载安装就可以了

image.png

稍等一会,等所有容器启动成功后就安装完成了,使用提供的管理员用户名和密码就可以登录了

image.png

搭建完成,接下来可以愉快的使用了

一些额外的说明


解决"Security & setup warnings displays the “missing default phone region” after initial install"问题


执行下面这条指令即可

docker exec --user www-data nextcloud-aio-nextcloud php occ config:system:set default_phone_region --value="CN"

可以根据自己的情况将CN替换为其他国家代码

使用OCC指令


执行docker exec --user www-data -it nextcloud-aio-nextcloud php occ your-command

your-command替换为你想执行的命令即可

备份问题


以我自己为例,因为我需要向Nextcloud备份数据,备份脚本通常是使用rclone直接利用Nextcloud自带的Webdav服务向其拷贝数据,但直接拷贝过去后,Nextcloud并不会自动索引新的内容,因此需要用OCC扫描文件并更新索引

具体地,需要在备份脚本最后加入一条指令,让远程Nextcloud服务器执行相关的OCC指令,这里可以使用ssh的功能来实现(ssh可以实现登录到宿主机并执行相关指令):

ssh -i /root/.ssh/private.key -p <port> -t [email protected] 'docker exec --user www-data -it nextcloud-aio-nextcloud php occ files:scan --path=admin/files/BackupDir'

关于OCC扫描文件并同步数据的使用方法可以参考这里

移除Nextcloud AIO


注意!执行下面操作将彻底移除Nextcloud AIO实例和所有的数据,不要轻易执行

  1. 从控制面板停止所有的容器
  2. 执行docker stop nextcloud-aio-mastercontainer停止主容器
  3. 如果nextcloud-aio-domaincheck容器仍在允许,需要手动停止docker stop nextcloud-aio-domaincheck
  4. 执行docker ps --format {{.Names}}检查是否所有AIO容器均已经停止,如果仍有,则手动停止
  5. 执行docker ps --filter "status=exited"查看已停止的容器
  6. 执行docker container prune移除所有停止的容器
  7. 执行docker network rm nextcloud-aio移除docker网络
  8. 执行docker volume ls --filter "dangling=true"查看未使用的卷
  9. 执行docker volume prune --filter all=1移除未使用的卷,如果使用自定路径保存数据则需要手动删除
  10. 执行docker volume ls --format {{.Name}}查看是否已全部删除AIO相关的卷
  11. 执行docker image prune -a移除未使用的镜像,完成

写在最后


整体来说,使用docker搭建相对比较方便,个人使用的话,在我3C4G的机器上运行挺流畅的,不使用情况下内存占用2G多一点,但个别情况(比如加载大量图片的时候)会有CPU和内存全部吃满的时候

发表了43篇文章 · 总计78.96k字
·
Built with Hugo
主题 StackJimmy 设计