Featured image of post 使用Nextcloud和docker自建个人云网盘

使用Nextcloud和docker自建个人云网盘

使用nextcloud和docker在自己的电脑或服务器上自建个人云网盘

简介

Nextcloud是一个开源的网络硬盘工具,个人用户可以使用Nextcloud在自己的私有服务器上搭建属于自己的云网盘。

Nextcloud同时提供服务器端和客户端的软件,既支持Windows、Linux、macOS这些桌面级操作系统,也支持安卓和iOS这些移动级操作系统,因此个人用户搭建私有云网盘之后使用非常便捷。

Docker是一个创建容器的工具,可以将操作系统层虚拟化,为某个或某些软件的运行隔离出一个独立的环境,避免软件的依赖和运行环境的冲突等问题,可以非常方便地在服务器上部署某些软件。

Nextcloud

前提

  • docker和docker compose
  • 域名(二级域名即可)
  • acme.sh (生成SSL证书)
  • nginx (反向代理)

准备工作

安装docker和docker-compose

  1. Debian系系统可直接使用apt安装docker:

    1
    
    sudo apt-get install docker-ce
    
  2. 安装docker-compose:

    1
    
    sudo apt-get install docker-compose
    

    docker-compose使用一个名为docker-compose.yml的文件来“合成”一个docker容器,docker-compose.yml中是合成这个docker容器的配方。

准备域名

在自己购买域名的网站上或者自己域名的管理网站上创建一个二级域名并配置域名解析,具体过程可参见“个人网站的建立过程(一):购买个人域名并配置动态域名解析”

例如我有一个主域名jinli.cyou,于是我为个人云网盘创建了一个"cloud.jinli.cyou"的二级域名。然后在阿里云的域名管理平台上进行了域名和IP地址的绑定。

使用acme.sh生成SSL证书

网上很多教程都使用Let’s Encrypt来生成SSL证书,但由于我之前在搭建这个网站时已经下载了acme.sh工具,因此这里我使用了acme.sh来为"cloud.jinli.cyou"生成证书。具体过程可参见个人网站的建立过程(二):使用Hugo框架搭建个人网站

过程如下:

  1. 找到你的域名管理账户的Access key。可以使用之前的,也可以重新获取,然后将Access key到处为系统变量Ali_KeyAli_Secret

  2. 使用下面的命令生成证书:

    1
    
    acme.sh --issue --dns dns_ali -d your.domain.com
    
  3. 使用下面的命令将证书复制到你的nextcloud目录下,例如我在nextcloud安装目录下新建了一个文件夹cert来存放证书文件:

    1
    2
    3
    
    acme.sh --install-cert -d your.domain.com \
            --key-file /media/nextcloud/cert/key.pem \
            --fullchain-file /media/nextcloud/cert/cert.pem 
    

nginx反向代理配置

因为我之前在建立本网站时就安装了nginx,所以这里我使用了nginx作为反向代理工具(尽管Nextcloud网站上主要是以Apache为例进行安装说明的)。

在nginx的配置目录下创建一个新的配置文件nextcloud.conf作为云网盘的反向代理配置文件,文件内写入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {  
    listen 443 ssl http2;  
    listen [::]:443 ssl http2;  
  
    server_name cloud.jinli.cyou;  
  
    ssl_certificate /media/nextcloud/cert/cert.pem;  
    ssl_certificate_key /media/nextcloud/cert/key.pem;  
    client_max_body_size 0;  
    underscores_in_headers on;  
  
    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;  
        add_header Front-End-Https on;  
  
        proxy_headers_hash_max_size 512;  
        proxy_headers_hash_bucket_size 64;  
  
        proxy_buffering off;  
        proxy_redirect off;  
        proxy_max_temp_file_size 0;  
        proxy_pass http://127.0.0.1:7080;  
    }  
}

这里我使用7080端口作为Nextcloud的服务端口,对用户上传文件对大小不做限制。SSL证书存放在上一步指定的位置。

配置完成后重启nginx服务使修改生效:

1
sudo service nginx restart

安装Nextcloud

配置docker-compose

由于我们在上面已经生成了SSL证书并配置了nginx,因此在docker中我们只需要配置nextcloud和数据库两个容器即可。这里的数据库我们选择使用mariadb。

在Nextcloud安装根目录下创建docker-compose.yml文件,写入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
version: '3' 
  
services:  
  
  db:  
    image: mariadb  
    container_name: nextcloud-mariadb  
    networks:  
      - nextcloud_network  
    volumes:  
      - ./db:/var/lib/mysql  
      - /etc/localtime:/etc/localtime:ro  
    environment:  
      - MYSQL_ROOT_PASSWORD=PASSWORD1  
      - MYSQL_PASSWORD=PASSSWORD2  
      - MYSQL_DATABASE=nextcloud  
      - MYSQL_USER=nextcloud  
    restart: unless-stopped 
  
  app:  
    image: nextcloud:latest  
    container_name: nextcloud-app  
    networks:  
      - nextcloud_network  
    ports:  
      - 7080:80  
    depends_on:  
      - db  
    volumes:  
      - ./nextcloud:/var/www/html  
      - ./app/config:/var/www/html/config  
      - ./app/custom_apps:/var/www/html/custom_apps  
      - ./app/data:/var/www/html/data  
      - ./app/themes:/var/www/html/themes  
      - /etc/localtime:/etc/localtime:ro  
    environment:  
      - VIRTUAL_HOST=your.cloud.domain.name  
    restart: unless-stopped  
  
networks:  
  nextcloud_network:

这里需要

  1. 把“MYSQL_ROOT_PASSSWORD”和“MYSQL_PASSWORD”改为你自己设置的数据库密码,也可以把“MYSQL_DATABASE”和“MYSQL_USER”的名字改掉。
  2. 把“VIRTUAL_HOST”里的域名改成自己的云网盘域名。

用docker-compose生成容器

在Nextcloud安装根目录下执行如下命令来生成容器:

1
sudo docker-compose up -d

安装和初始化Nextcloud

完成上述步骤后就可以从浏览器访问自己的云网盘啦!在浏览器内输入云网盘的网址,例如我的是https://cloud.jinli.cyou。就会进入如下页面:

Nextcloud Install

这里需要

  1. 创建一个管理员账号,把用户名和密码记下来。
  2. 点开"Storage & databases",将默认的数据库“SQLite”改为“MySQL/MariaDB”,然后填入数据库的用户、名字、密码,最后一栏(默认"localhost")处应该填数据库的地址。由于我们在上面的docker-compose.yml文件中定义的数据库容器服务是db,而且将它与Nextcloud的容器放在同一个网络中,因此这里的地址应该填db,这样Nextcloud容器就可以通过这个名字访问到数据库容器了。如果你的docker-compose.yml文件中定义的数据库容器服务不是db,那么这里就需要填入你定义的数据库容器服务名。

最后点击“Finish Setup”就可以安装Nextcloud了,这可能会需要数分钟。安装完成后就可以用管理员账户登录进Nextcloud啦!

添加新用户等后续设置

以管理员身份登录进NextCloud后,点击右上角的管理员账户头像,在下拉菜单中可以看到“Users”选项。点击这个选项,就可以添加用户组和新用户了。

问题解决

file/directory is locked 错误

在某次上传一个文件失败后,想重新上传但一直失败,就想把整个文件夹删除,但删除时提示“file/directory is locked”,无法删除。 这个问题是因为Nextcloud的锁定机制导致的。可以通过以下步骤解决:

  1. 进入Nextcloud容器的命令行:

    1
    
    sudo docker exec -it nextcloud-app bash
    

    这时你应该在/var/www/html目录下,里面应该有一个occ文件,它是Nextcloud的命令行工具。

  2. 进入维护模式

    1
    
    ./occ maintenance:mode --on
    
  3. 安装MySQL客户端:

    1
    
    apt-get update && apt-get install -y mariadb-client
    
  4. 连接到数据库:

    1
    
    mysql -h db -u ${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}
    

    这里的${MYSQL_USER}${MYSQL_PASSWORD}是你在docker-compose.yml中设置的数据库用户名和密码。

  5. 删除锁定记录:

    1
    
    DELETE FROM oc_file_locks;
    
  6. 退出MySQL:

    1
    
    exit;
    
  7. 再退出维护模式:

    1
    
    ./occ maintenance:mode --off
    

最后回到Nextcloud的网页端,刷新页面就可以看到之前被锁定的文件夹已经可以删除了。

注意:网上还有另一种解决方案,是进入Nextcloud容器后,使用命令./occ files:scan --all来扫描所有文件,使用这个命令的确可以消除锁定,但会刷新所有文件的最后修改时间,导致所有文件的修改时间都变成了当前时间,如果你想保留文件的原始修改时间,那么就不要使用这个命令。

Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 09, 2025 00:00 UTC
comments powered by Disqus