5G来了,千兆家宽也有了,但是6aidu网盘还是万年不变的100k/s!!这谁顶得住?其他网盘虽然速度可以,但是依旧存在种种限制,且文件不在自己手里,还得防和谐。自己的数据自己掌控,何不试试自己搭建私人网盘呢?毕竟数据是自己的,就得自己说了算,也不用去忍受小灵通下载速度。(P.S. 2023年5月似乎OneDriver也和谐了)
开源网盘有OwnCloud、青阳网络文件传输系统kiftd、Seafile、蓝眼云盘、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_DB=nextcloud - POSTGRES_HOST=db.clemon:5432 - POSTGRES_USER=nextclouduser - POSTGRES_PASSWORD=password - REDIS_HOST=redis.clemon - 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' environment: - JWT_SECRET=JWTSEC - DB_TYPE=postgres - DB_HOST=db.clemon - DB_PORT=5432 - DB_NAME=onlyoffice - DB_USER=onlyofficeuser - DB_PWD=password - REDIS_SERVER_HOST=redis.clemon - REDIS_SERVER_PORT=6379 - REDIS_SERVER_PASS=passwd
|
需要注意的有:
- NextCloud必须配置一个数据库,redis作为缓存建议配置
OVERWRITEHOST
和OVERWRITECLIURL
设置访问的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"
|
配置
邮件通知
邮件可以用来让其他用户接收通知、重置密码等,强烈建议配置。实测腾讯企业邮箱可以用。
证书就是企业邮箱的账号和生成的密码。
安装插件
插件直接解压到挂载的./data/apps
目录下就行了,插件可以在官方下载。
解压完成后,需要在应用里点击启用。
推荐安装Announcement center、Draw.io、Mind Map、ONLYOFFICE这几个,日常用足够。
OnlyOffice
由于OnlyOffice部署在内网,通过代理从外面访问,因此在外网需要指明其地址才可以使用。
这里挺难理解的。。。
后台任务
基本设置–>后台任务:选择AJAX就好了,用cron容器来扫描。
使用 & QA
上传文件、干啥啥都行了!如果朋友要使用给他创建个账号就行,不推荐很多人共用一个账号!
Q:
- 如果没有使用https,点击复制文件分享链接按钮会失败,不能访问剪切板issue。
- 执行OCC命令:
docker compose exec nextcloud php occ *cmds*
- 网页打开缓慢可能是反向代理配置问题
- 权限问题:容器使用
www-data
用户处理文件,但是挂载进去的文件、目录权限不一定属于这个用户。用sudo usermod -a -G `groups` www-data
将www-data
用户添加到目录所属的用户组里,然后sudo chmod -R g+rw ./data
使得目录为组内用户可读写