自建网盘-nextcloud
步骤/目录:
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见 官方文档 。