5G来了,千兆家宽也有了,但是6aidu网盘还是万年不变的100k/s!!这谁顶得住?其他网盘虽然速度可以,但是依旧存在种种限制,且文件不在自己手里,还得防和谐。自己的数据自己掌控,何不试试自己搭建私人网盘呢?毕竟数据是自己的,就得自己说了算,也不用去忍受小灵通下载速度。(P.S. 2023年5月似乎OneDriver也和谐了)

开源网盘有OwnCloud青阳网络文件传输系统kiftdSeafile蓝眼云盘NextCloud等选择。Seafile支持企业级协作,功能也极为丰富;Kiftd较为简洁,适合单人共享文件;而NextCloud流传较为广泛,支持插件,功能也极为丰富。我个人的网盘就选择了NextCloud,使用OnlyOffice处理文档等。

部署

Docker

直接上docker!

由于App较多,不能一个App就起一个数据库,所以这里的数据库是位于另一台虚拟机里的,所有App统一使用,方便维护。

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
version: '3'

services:
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: always
ports:
- "8080:80"
volumes:
- ./data:/var/www/html:z
environment:
# POSTGRES数据库配置
- POSTGRES_DB=nextcloud
- POSTGRES_HOST=db.clemon:5432
- POSTGRES_USER=nextclouduser
- POSTGRES_PASSWORD=password
# redis配置
- REDIS_HOST=redis.clemon
# - REDIS_PORT=6379
- REDIS_HOST_PASSWORD=cjw7360
# 代理配置
- OVERWRITEPROTOCOL=https
- OVERWRITEHOST=nextcloud.app.domain.com
- OVERWRITECLIURL=https://nextcloud.app.domain.com:8883
- TRUSTED_PROXIES=192.168.99.0/24 10.0.0.0/24
- NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.app.domain.com:8883 app.clemon:8080
cron:
image: nextcloud:latest
restart: always
volumes:
- ./data:/var/www/html:z
entrypoint: /cron.sh
depends_on:
- nextcloud
onlyoffice:
image: onlyoffice/documentserver:latest
container_name: onlyoffice
restart: always
expose:
- '8090:80'
# volumes:
# - /var/www/onlyoffice/Data
# - /var/log/onlyoffice
# - /var/lib/onlyoffice/documentserver/App_Data/cache/files
# - /var/www/onlyoffice/documentserver-example/public/files
# - /usr/share/fonts
environment:
- JWT_SECRET=JWTSEC
# postgres配置
- DB_TYPE=postgres
- DB_HOST=db.clemon
- DB_PORT=5432
- DB_NAME=onlyoffice
- DB_USER=onlyofficeuser
- DB_PWD=password
# redis配置
- REDIS_SERVER_HOST=redis.clemon
- REDIS_SERVER_PORT=6379
- REDIS_SERVER_PASS=passwd

需要注意的有:

  • NextCloud必须配置一个数据库,redis作为缓存建议配置
  • OVERWRITEHOSTOVERWRITECLIURL设置访问的URI,辅助前端正确跳转
  • 如果代理层启用了https,需要设置环境变量OVERWRITEPROTOCOL让后端跳转协议为https,否则登陆后自动向http跳转
  • cron任务用来扫描文件。。跑着就是了(没看懂官方说明有啥用)
  • 挂载的Vol后面有个z,代表容器间共享的卷
  • 官方的compose file还启动了RabbitMQ,这个应该是用在NextCloud集群上的,单机不部署没问题

代理

安装NextCloud的主机在路由器上设置本地域名为app.clemon,traefik作为对外服务的统一出口。

由于我是电信要的公网IP,80和443都是没法用的,所以只能通过其他端口提供服务。public入口为8883端口,这里和http共用同一个,设置redirectScheme中间件将http流量转发到https。

这里还有个NAT回流的问题,如果在内网通过公网域名访问可能是不行的,需要配置网关路由器的NAT回流才能在内网用公网域名访问。

代理的OnlyOffice要通过onlyoffice_headers设置协议头才能正常访问
nextcloud_redirect中间件中的http还是https要根据是否开启了tls来写,保证上下一样(应该也可以用正则分组)

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
http:
routers:
nextcloud_http:
middlewares:
- "redirect_https"
rule: "Host(`nextcloud.app.example.com`)"
entrypoints: "public"
service: "nextcloud_svc"
nextcloud:
service: "nextcloud_svc"
middlewares:
- "nextcloud_redirect"
- "nextcloud_headers"
- "nextcloud_buffer"
entrypoints: "public"
rule: "Host(`nextcloud.app.example.com`)"
tls:
certResolver: "default_le"


middlewares:
onlyoffice_headers:
headers:
customRequestHeaders:
X-Forwarded-Proto: 'https'
redirect_https:
redirectScheme:
scheme: "https"
port: "8883"
permanent: true
nextcloud_headers:
headers:
customFrameOptionsValue: SAMEORIGIN
framedeny: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 15552000
nextcloud_buffer:
buffering:
maxRequestBodyBytes: 2147483648
nextcloud_redirect:
redirectRegex:
permanent: true
regex: "https://(.*)/.well-known/(?:card|cal)dav"
replacement: "https://${1}/remote.php/dav"
compress:
compress: {}

services:
nextcloud_svc:
loadBalancer:
passHostHeader: true
servers:
- url: "http://app.clemon:8080"
office_svc:
loadBalancer:
servers:
- url: "http://app.clemon:8090"

配置

邮件通知

邮件可以用来让其他用户接收通知、重置密码等,强烈建议配置。实测腾讯企业邮箱可以用。

image-20230511153437298

证书就是企业邮箱的账号和生成的密码。

安装插件

插件直接解压到挂载的./data/apps目录下就行了,插件可以在官方下载。

解压完成后,需要在应用里点击启用。

image-20230511154024668

推荐安装Announcement center、Draw.io、Mind Map、ONLYOFFICE这几个,日常用足够。

OnlyOffice

由于OnlyOffice部署在内网,通过代理从外面访问,因此在外网需要指明其地址才可以使用。

7261CD0E-F512-4AD7-8820-C9E64DE08E3C_1_201_a

这里挺难理解的。。。

后台任务

基本设置–>后台任务:选择AJAX就好了,用cron容器来扫描。

使用 & QA

上传文件、干啥啥都行了!如果朋友要使用给他创建个账号就行,不推荐很多人共用一个账号!

Q:

  • 如果没有使用https,点击复制文件分享链接按钮会失败,不能访问剪切板issue
  • 执行OCC命令:docker compose exec nextcloud php occ *cmds*
  • 网页打开缓慢可能是反向代理配置问题
  • 权限问题:容器使用www-data用户处理文件,但是挂载进去的文件、目录权限不一定属于这个用户。用sudo usermod -a -G `groups` www-datawww-data用户添加到目录所属的用户组里,然后sudo chmod -R g+rw ./data使得目录为组内用户可读写