步骤/目录:
1.背景介绍
2.拉取nextcloud镜像
3.nextcloud的基本配置
4.其它问题
    (1)外部存储写入权限

本文首发于个人博客https://lisper517.top/index.php/archives/1848/,转载请注明出处。
本文的目的是使用nextcloud搭建私人网盘,类似一个私人的百度云盘。
本文写作日期为2024年8月17日,在Ubuntu 22.04LTS系统演示。

1.背景介绍

目前市面上主流的网盘有百度、阿里、夸克、天翼、115等,但是最大的问题是基本都要买VIP才能有较快的下载速度,而且一些私有的敏感文件也不宜放在公共网盘上,比如你的公司和百度在同一个项目中竞标,那总不能把标书放在百度网盘里,万一泄露了。本文将使用nextcloud搭建私有网盘。除了nextcloud,还可选择owncloud、sealife等。

2.拉取nextcloud镜像

在2024年6月左右,docker官方对中国ip采取了封禁的措施(据说是由于中华有为。诶,美团实在是太坏了),所以目前大陆无法安装docker、docker-compose,也无法从docker官方仓库拉取镜像。解决方法见 这篇文章 ,这里摘取重要的说。

(1)安装docker

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#添加阿里云的Docker GPG密钥
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#配置阿里云的Docker APT源
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
docker -v
docker-compose -v

(2)更换docker源或者翻越

目前无法从docker官方仓库拉取镜像(据说是由于华晨宇,详情见 github项目 ,华晨宇手机可能无法打开),所以只能换为国内docker镜像仓库,或者翻越,笔者建议直接翻越,更简单一些(见 Docker实践——如何查阅wiki百科及V2Ray 。但是这篇文章中使用的v2rayA也是docker,所以还是要先改docker源)。

更换docker源的操作具体如下:

vim /etc/docker/daemon.json

写入:

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://registry.docker-cn.com",
    "https://dockerhub.azk8s.cn",
    "https://mirror.ccs.tencentyun.com",
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.m.daocloud.io",
    "https://noohub.ru",
    "https://huecker.io",
    "https://dockerhub.timeweb.cloud",
    "https://dockerhub.icu",
    "https://docker.anyhub.us.kg",
    "https://docker.1panel.live"
  ],
  "features": {"containerd-snapshotter": true},
  "log-driver": "json-file",
    "log-opts": {
      "max-size": "20m",
      "max-file": "3"
    }
  }
}

registry-mirrors 里列举了一些国内能连的镜像,但是最近也被封禁的厉害,说不定什么时候就连不上了(所以尽量翻越,更省事)。
"features": {"containerd-snapshotter": true} 则是开启容器快照功能,目的是使得拉取镜像时能断点续传(参考 github问题 ),但是这个选项需要更换docker引擎,之前的镜像都要重下,所以最好是一开始就使用这个设置。
最后的log则是设置了一下log文件的大小,防止docker的log塞满硬盘。

最后更新设置,重启docker:

systemctl daemon-reload
systemctl restart docker
docker info
#输出结果
......
......
 Registry Mirrors:
  https://hub-mirror.c.163.com/
  https://mirror.baidubce.com/

(3)拉取nextcloud

docker pull nextcloud

2.nextcloud的安装

参考 nextcloud的官方镜像网址

mkdir -p /docker/nextcloud/data/nextcloud
mkdir -p /docker/nextcloud/data/mysql
cd /docker/nextcloud
vim docker-compose.yml

写入如下内容:

services:
  nextcloud_mysql:
    image: "mysql"
    container_name: "nextcloud_mysql"
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=mysql的root密码
      - MYSQL_USER=mysql用户名
      - MYSQL_PASSWORD=mysql用户的密码
      - MYSQL_DATABASE=nextcloud
    restart: always

  nextcloud:
    image: "nextcloud"
    container_name: "nextcloud"
    ports:
      - 80:80
    environment:
      MYSQL_USER: mysql用户
      MYSQL_PASSWORD: mysql用户的密码
      MYSQL_DATABASE: nextcloud
      MYSQL_HOST: nextcloud_mysql
      NEXTCLOUD_ADMIN_USER: NC管理员用户名
      NEXTCLOUD_ADMIN_PASSWORD: NC管理员密码
      NEXTCLOUD_TRUSTED_DOMAINS: 你为nextcloud准备的域名
    volumes:
      - "你为nextcloud准备的路径:/var/www/html"
    depends_on:
      - nextcloud_mysql
    restart: always

实际存储的网盘文件在 /var/www/html/data 下,最好为nextcloud准备一个大一点的硬盘。

如果想简单一点,可以只写:

services:
  nextcloud:
    image: "nextcloud"
    container_name: "nextcloud"
    ports:
      - 80:80
    volumes:
      - "./data/nextcloud:/var/www/html"
    restart: always

但是后面就要登录后手动设置。

最后运行即可:

cd /docker/nextcloud
docker-compose config
docker-compose up

3.nextcloud的基本配置

nextcloud的镜像分为fpm版和apache版,apache版就是自带了网页服务(无HTTPS加密,需要套一层反代),和typecho一样。 docker pull nextcloud 默认下载apache版,然后自己配置一下反代(笔者使用IPv6+DDNS,用NPM管理,见 IPv6与DDNS可视化管理Nginx-Nginx Proxy Manager )。

如果刚才你使用了最简yml,这里就需要登录网页端,设置管理员及密码,使用的数据库(默认sqlite不用其它配置,但提醒sqlite勿用于生产环境),使用的域名。

除了网页客户端,nextcloud还有PC、MAC、安卓端(谷歌商店)、iOS端,可自行下载。

4.其它问题

(1)外部存储写入权限

nextcloud默认把文件存储到宿主机上,但有时宿主机空间不够。笔者的解决方法是宿主机连接局域网内的Samba,并把宿主机上的smb文件夹映射到docker-nextcloud(但是最后碰到了无解的目录权限问题)。在nextcloud容器的yml文件中增加一行映射:

volumes:
      - "你为nextcloud准备的路径:/var/www/html"
      - "你为nextcloud准备的扩展存储:/external_storage"

网页登录nextcloud,左键单击右上角头像,选择 应用 - 您的应用 ,下拉找到 External storage support ,把它启用。然后在头像处选择 管理设置 - 外部存储目录名称 是该连接的名称(可以随便写), 增加存储 选择本地, 地点/external_storage 即可, 可用于 选择 All people ,或者你也可以指定一个用户组。

此时nextcloud已经可以读取外部存储目录内的文件,但没有写入权限。进行如下操作:

docker exec -it nextcloud bash
cd /external_storage
ls -al

显示:

total 4
drwxr-xr-x 2 root root    0 Aug 28 03:07 .
drwxr-xr-x 1 root root 4096 Aug 28 02:56 ..

docker挂载卷是挂到root名下的,但nextcloud是执行在www-data用户下的(宿主机ubuntu为www-data,宿主机centos则是apache)。所以需要把目录权限改一下,可以进入容器改,也可以在yml中改(参考 stackoverflow问题 。):

command: >
      bash -c 'chown -R www-data:www-data /external_storage
      && /entrypoint.sh apache2-foreground'

如果你的外接存储是在宿主机上,到这一步应该就可以了。但是笔者的外接存储是局域网内的smb分享给宿主机,宿主机又映射到docker-nextcloud,所以这个目录无法更改所属的用户及用户组,又没办法将www-data添加到root组里,因此这个问题目前应该是无解的。你可以在把 /external_storage 这个外部存储改成只读(因为它事实上就是只读)。如果有需要上传的文件,可以通过nextcloud网页暂时上传到宿主机,在宿主机上运行一个脚本,比如每天凌晨4点将宿主机上的部分文件复制到samba中:

crontab -e
0 4 * * * /usr/bin/cp /docker/nextcloud/data/nextcloud/data/nextcloud用户名/files/smb_sync/* 你为nextcloud准备的扩展存储

然后通过nextcloud网页将宿主机上的文件手动删除。唯一的缺点是网页无法删除扩展存储中的文件。

如果你不想用脚本,恐怕只能用nextcloud而非docker-nextcloud。安装nextcloud后配置samba见 官方文档

标签: none

添加新评论