轉(zhuǎn)自我的個(gè)人博客https://blognas.hwb0307.com脑奠。歡迎關(guān)注众眨!
前言
雖然我們前面介紹了圖床之類的Docker應(yīng)用,但其實(shí)云盤服務(wù)
才是更加貼近大眾生活的Docker應(yīng)用谍珊。
Nextcloud
是一個(gè)類似于百度網(wǎng)盤恬叹、阿里云盤的服務(wù)退个,可以通過docker容器的方式搭建在自己的個(gè)人服務(wù)器或NAS上,有安卓和IOS客戶端南蓬。我不知道有沒有人在VPS上布署nextcloud纺非。一般都是NAS用戶吧!有中文界面赘方。我個(gè)人一般是用于進(jìn)行手機(jī)照片的云同步烧颖,同時(shí)還儲(chǔ)存一些小文件,并且偶爾可以分享文件給朋友窄陡,此時(shí)朋友下載文件的速度不像免費(fèi)百度云那樣受到限制炕淮。
Nextcloud
除了基本的文件云同步和云儲(chǔ)存的功能外,其實(shí)還有很多進(jìn)階功能跳夭,以后有機(jī)會(huì)再開系列博文來(lái)描述它的使用吧涂圆。
本篇博文主要講述如何通過docker來(lái)安裝Nextcloud
,并且借助NPM進(jìn)行ssl證書的申請(qǐng)和自動(dòng)續(xù)期优妙。安裝docker應(yīng)用往往不是難事乘综,難就難在如何方便地獲得https,而這個(gè)和個(gè)人信息安全密切相關(guān)的主題在多數(shù)教程中均少有提及套硼。
Nextcloud的特別之處還在于:Nextcloud僅僅提供特色功能卡辰。它的性能提升往往依賴其它應(yīng)用,比如MYSQL和Redis;它的拓展性往往依賴強(qiáng)大的插件九妈。如果你用默認(rèn)的方法安裝docker nextcloud反砌,那么它的性能會(huì)受到較大的限制。
如果你可以熟練使用原生Nginx萌朱,可參考這位大佬的方案:使用docker-compose搭建nextcloud+Nginx+MySQL+Redis宴树。我請(qǐng)了杜比的ZoniNG
大佬測(cè)試,這個(gè)博客的方案是有效的晶疼,只是數(shù)據(jù)庫(kù)權(quán)限的設(shè)置方法要變通一下酒贬。由于我對(duì)于原生Nginx的配置并不熟悉,所以并沒有采用他的方案翠霍。對(duì)于新手而言锭吨,他的設(shè)置過于復(fù)雜。本回的安裝方法是一種對(duì)Nextcloud性能有較大提升并且較為簡(jiǎn)便的方法寒匙。原理上零如,唯一不同的是我們采用Nextcloud原生app,即使用Apache進(jìn)行80端口映射锄弱,而不是像大佬那樣采用Nginx+Nextcloud:fpm
的方法考蕾。
最后提醒一下:這個(gè)方法配置的Nextcloud對(duì)內(nèi)存的占用還是比較大的。如果你覺得安裝完卡頓的話会宪,可以到htop看看是不是Nextcloud的問題肖卧。這里我大致展示一下(不知道是不是和Nextcloud有關(guān)):
不知長(zhǎng)期使用會(huì)怎么樣,現(xiàn)階段感覺對(duì)其它應(yīng)用沒有明顯的不良影響狈谊。
其它關(guān)于nextcloud的其它信息喜命,可以訪問:
- 官方網(wǎng)站:https://nextcloud.com/
- 官網(wǎng)github倉(cāng)庫(kù)(docker鏡像):https://github.com/nextcloud/docker
另外,**如果有使用非443端口的NAS的童鞋在安裝Nextcloud中有任何問題的河劝,歡迎評(píng)論區(qū)留言壁榕。**我什么坑都踩過!
測(cè)試環(huán)境
我是在VPS里演示Nextcloud
安裝的:
uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
docker --version # Docker version 20.10.5, build 55c4c88
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f
準(zhǔn)備工作
# 工作目錄請(qǐng)按需修改
work=~/docker/nextcloud && mkdir -p $work && cd $work
# 防火墻
sudo ufw allow 7602/tcp comment 'nextcloud' && sudo ufw reload
sudo ufw allow 6379/tcp comment 'nextcloud' && sudo ufw reload
# 提前拉取鏡像
docker pull nextcloud:latest
docker pull mariadb:latest
docker pull redis
配置yml文件
添加一個(gè)docker-compose文件:
vim $work/docker-compose.yml
添加以下內(nèi)容:
---
version: '3.2'
networks:
default:
name: nextcloud
services:
app:
image: nextcloud:latest
restart: unless-stopped
volumes:
- ./app:/var/www/html
environment:
- MYSQL_PASSWORD=nextcloud_password # 按需修改
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
ports:
- 7602:80 # 按需修改
networks:
- default
cache:
image: redis
restart: unless-stopped
expose:
- "6379" # 可用此默認(rèn)赎瞎。因?yàn)檫@是暴露而不是映射
volumes:
- ./cache:/data
command: redis-server --requirepass 'redis_password' # 按需修改
networks:
- default
db:
image: mariadb:latest
restart: unless-stopped
# 下面的command與官網(wǎng)略有不同牌里。它將有助于避免MYSQL數(shù)據(jù)庫(kù)的4047報(bào)錯(cuò)。
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1 --skip-innodb-read-only-compressed
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=nextcloud_password_root # 按需修改
- MYSQL_PASSWORD=nextcloud_password # 按需修改
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
networks:
- default
上線服務(wù)
cd $work && docker-compose up -d
配置NPM
ddns-go或者域名托管商后臺(tái)解析好域名nextcloud.exampledomain.com
务甥。
添加一個(gè)Proxy Host牡辽,反代地址是http://172.17.0.1:7602
〕伲可用泛域名的SSL證書态辛。
在Advanced
中添加以下記錄以增強(qiáng)兼容性。詳見官網(wǎng)配置關(guān)于反代的說(shuō)明挺尿。
location /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
完整配置圖如下所示:
NPM有443端口時(shí)的Nextcloud配置
觀察Nextcloud的客戶端日志奏黑,當(dāng)出現(xiàn):
Initializing finished
New nextcloud instance
即可直接登陸網(wǎng)站:https://nextcloud.exampledomain.com
進(jìn)行設(shè)置炊邦。
我隨便設(shè)置一個(gè)帳戶。這個(gè)可以自定義熟史!
admin
GoK*@s$&3%oXiQTewxoE*v*5@Q*a!D7WGLQDbwFt!NTiaQ!P6DUf5v
如圖所示:
有些人不安裝推薦應(yīng)用馁害。我這里就直接安裝試試看。國(guó)內(nèi)環(huán)境安裝速度也還行蹂匹。你也可以不點(diǎn)碘菜,反正你需要的話以后可以自己裝嘛!最后限寞,耐心地等待初始化的完成吧忍啸。
很快就成功了。有443端口就是簡(jiǎn)單昆烁!
最后吊骤,為了讓redis
生效,我們需要配置$work/app/config/config.php
:
sudo vim $work/app/config/config.php
添加以下內(nèi)容:
//'memcache.local' => '\\OC\\Memcache\\APCu' // 用本地式緩存使用APCu // 注釋這行
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis', // 分布式緩存使用Redis
'memcache.locking' => '\\OC\\Memcache\\Redis', // 啟用Redis緩存的文件鎖
'redis' => array(
'host' => 'cache', // 這里和mariadb的邏輯相同静尼,填寫容器links時(shí)映射的主機(jī)名
'port' => 6379,
'password' => 'redis_password' // 這是之前在配置docker-compose時(shí)配置的redis密碼
),
'filelocking.enabled' => 'true',
然后重啟docker-nextcloud服務(wù):
cd $work && docker-compose down && docker-compose up -d
NPM無(wú)443端口時(shí)的額外配置
當(dāng)初我在NAS安裝Nextcloud的時(shí)候,沒有443端口传泊,安裝Nextcloud非常地費(fèi)勁鼠渺!有時(shí)跳轉(zhuǎn)的時(shí)候,地址欄的<NPM-443端口>
可能會(huì)消失掉眷细。
經(jīng)過一翻折騰拦盹,我發(fā)現(xiàn)用非443端口使用Nextcloud還要進(jìn)行一些額外的配置。相關(guān)的教程非常的少溪椎,真的惡心普舆!市面上很多Up主也是直接在自己的NAS里安裝Nextcloud,但他們往往是在局域網(wǎng)中使用Nextcloud校读,不會(huì)配https沼侣。然而作為一個(gè)云盤,沒有https能忍嗎歉秫?
又或者他們只在VPS中演示怎么安裝蛾洛。如上所述,如果你有443端口雁芙,這些問題根本不可能出現(xiàn)轧膘。
下面我們對(duì)于無(wú)443端口的NAS給另外一些配置上的建議。
首先兔甘,上線服務(wù)后不要登陸網(wǎng)站并注冊(cè)用戶谎碍。我們修改$work/app/config/config.php
文件的內(nèi)容:
sudo vim $work/app/config/config.php
在文件中添加以下內(nèi)容:
如果內(nèi)容已經(jīng)有默認(rèn)值,則添加或更改記錄即可洞焙。比如
trusted_domains
蟆淀。自己看著辦拯啦!每一行最后的
,
號(hào)一定不可以省略!
//'memcache.local' => '\\OC\\Memcache\\APCu' // 用本地式緩存使用APCu // 注釋這行
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis', // 分布式緩存使用Redis
'memcache.locking' => '\\OC\\Memcache\\Redis', // 啟用Redis緩存的文件鎖
'redis' => array(
'host' => 'cache', // 這里和mariadb的邏輯相同扳碍,填寫容器links時(shí)映射的主機(jī)名
'port' => 6379,
'password' => 'redis_password' // 這是之前在配置docker-compose時(shí)配置的redis密碼
),
'filelocking.enabled' => 'true',
'trusted_domains' =>
array (
0 => '<nextcloud.exampledomain.com>', // 這一般是可以識(shí)別提岔,不用改
),
'overwritehost' => '<nextcloud.exampledomain.com>:<NPM-443端口>', // 按需修改
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'http://<nextcloud.exampledomain.com>:<NPM-443端口>', # 這里有個(gè)逗號(hào)不要忘記
為什么要特別地設(shè)置config.php
文件的相關(guān)參數(shù)呢?如果訪問地址帶端口號(hào)且屬于反向代理笋敞,nextcloud往往無(wú)法正確地識(shí)別碱蒙,此時(shí)nextcloud內(nèi)部將阻止此地址對(duì)nextcloud進(jìn)行訪問。因此夯巷,我們需要提前對(duì)overwritehost
變量進(jìn)行特別聲明赛惩。overwriteprotocol
和overwrite.cli.url
是為了強(qiáng)制https訪問,這里也順便加上以防NPM的設(shè)置不生效(還沒試過刪除會(huì)不會(huì)影響登陸)趁餐。
如圖所示(如果沒有設(shè)置管理員帳戶喷兼,有些參數(shù)和值是沒有;但我們要設(shè)置的幾個(gè)參數(shù)的樣式是類似的):
重啟服務(wù)后雷,讓config.php
的改動(dòng)生效:
cd $work && docker-compose down && docker-compose up -d
觀察nextcloud客戶端的日志(也可以用Portainer
看):
docker logs -f nextcloud_app_1 # 有時(shí)候是nextcloud-app-1
當(dāng)log出現(xiàn)Command line: 'apache2 -D FOREGROUND'
的字樣時(shí)季惯,說(shuō)明nextcloud已經(jīng)重啟成功。
此時(shí)可以訪問https://<nextcloud.exampledomain.com>:<NPM-443端口>
創(chuàng)建管理員帳戶臀突。后面的操作和VPS一樣勉抓。設(shè)置完管理帳戶后,可以自動(dòng)登陸或者訪問https://<nextcloud.exampledomain.com>:<NPM-443端口>
登陸后臺(tái)使用nextcloud候学。
如果你不小心注冊(cè)了帳戶再來(lái)修改config.php
藕筋,在日志中很可能會(huì)有這種報(bào)錯(cuò):
[access_compat:error] [pid 32] [client <你的電腦ip>] AH01797: client denied by server configuration: /var/www/html/data/htaccesstest.txt
這全是由于地址原因?qū)е碌膆taccess不過關(guān)。**所以端口號(hào)的問題真的很煩梳码!**這個(gè)時(shí)候你可以重新注冊(cè)一個(gè)帳戶隐圾。這個(gè)時(shí)候的系統(tǒng)就會(huì)有2個(gè)用戶。它們的權(quán)限區(qū)別我以后再了解一下掰茶。
后臺(tái)任務(wù)
Nextcloud的官話暇藏,自己感受一下:為了優(yōu)化性能,正確配置后臺(tái)任務(wù)非常重要符匾。對(duì)于較大的實(shí)例叨咖,推薦配置為 ‘Cron’。詳情請(qǐng)參考相關(guān)文檔啊胶。
根據(jù)使用docker-compose搭建nextcloud+Nginx+MySQL+Redis大佬文章的建議:由于nextcloud內(nèi)部的文件和配置會(huì)在用戶操作過程中產(chǎn)生變化甸各,所以需要啟用一個(gè)定時(shí)任務(wù)去定期整理和歸檔這些數(shù)據(jù)到數(shù)據(jù)庫(kù)或者應(yīng)用到配置中。問了ZoniNG
大佬焰坪,這個(gè)也是必要的趣倾,說(shuō)是屬于php的優(yōu)化。
如果你不配置某饰,可能在設(shè)置——管理——基本設(shè)置
會(huì)有這種警告:
首先儒恋,使用docker ps -a
查看nextcloud的容器ID善绎。如果你按本教程,一般是nextcloud_app_1
或者是nextcloud-app-1
诫尽。
打開crontab的配置進(jìn)行編輯:
sudo vim /etc/crontab
加入如下內(nèi)容:
# run nextcloud cron task every 5 min
*/5 * * * * root docker exec -u 33 nextcloud_app_1 php -f /var/www/html/cron.php 2>&1 /dev/null
這里我留個(gè)小問題:root
可否換成test_user
(就是你自己用的非root用戶)禀酱?歡迎大家在評(píng)論區(qū)留下自己的答案!
Beta: Redis測(cè)試
個(gè)人推測(cè)牧嫉,不知道沒有redis的時(shí)候是否會(huì)這樣
這里有一個(gè)簡(jiǎn)單的方法可以測(cè)試Redis有沒有生效剂跟。你在上傳很多圖片后,可以在此頁(yè)面快速往下滑動(dòng):
與此同時(shí)酣藻,可調(diào)用htop
觀察:
可看到數(shù)據(jù)被大量地調(diào)用曹洽。同時(shí)可以發(fā)現(xiàn)頁(yè)面的刷新還是蠻快的。
小結(jié)
對(duì)于VPS用戶來(lái)說(shuō)辽剧,Nextcloud的安裝非常容易送淆,基本上沒有什么難度。對(duì)于NAS用戶來(lái)說(shuō)就比較折騰怕轿;但是偷崩,如果成功安裝,Nextcloud就非常有用了撞羽!
另外环凿,我覺得非443端口使用的時(shí)候Nextcloud慢吞吞的。不知道是不是自己的NAS配置太差(蝸牛星際)放吩。我在VPS上用還是非常流暢的。希望有NAS用戶安裝Nextcloud時(shí)給多些反饋羽杰!
更多進(jìn)階使用渡紫,可以看看使用docker-compose搭建nextcloud+Nginx+MySQL+Redis。我覺得這個(gè)才是完全體(羨慕)考赛。
關(guān)于對(duì)Nextcloud的深度使用可以看我后續(xù)的更新惕澎。敬請(qǐng)期待嘍!
附:Nextcloud團(tuán)隊(duì)的合體照
參考資料
- 官方docker鏡像:https://hub.docker.com/_/nextcloud
- 使用Docker快速部署NextCloud
- Docker:Nextcloud 網(wǎng)盤的安裝
- 官方docker-compose.yml示例:https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/docker-compose.yml
- https://www.linuxserver.io/blog/2019-04-25-letsencrypt-nginx-starter-guide里面包含nextcloud的配置
- Nextcloud Nginx Proxy Manager in 10 Minutes!:我的docker-compose腳本主要是根據(jù)該視頻進(jìn)行改進(jìn)的颜骤。
- 另一種不錯(cuò)的方案:Nextcloud with a MariaDB along with Nginx Proxy Manager and DuckDns Using A Portainer Stack
- 使用docker-compose搭建nextcloud+Nginx+MySQL+Redis
- Nextcloud fpm running on docker with nginx on host always returns 404 page
- How to fix Nextcloud 4047 InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE
- 官網(wǎng):關(guān)于Nextcloud反向代理的說(shuō)明
本文使用 文章同步助手 同步