使用Docker-compose安裝NextCloud,并部署Collabora作為office服務(wù)
在csdn也同步發(fā)布了,csdn上markdown格式顯示效果更好些
https://blog.csdn.net/u013568040/article/details/123648666
使用docker-compose可以更快速的構(gòu)建nextcloud需要的各個服務(wù)
2個子域名,分別用于Collabora Office和Nextcloud,且兩個域名均擁有合法SSL證書,通過備案后在云服務(wù)商申請免費(fèi)證書即可,證書授權(quán)一年。
例如:
nextcloud.eeeeeee.com用于訪問Nextcloud,collabora.eeeeeeee.com用于部署Collabora Office
nginx的 SSL 證書可用騰訊云或阿里云每年授權(quán)一次的免費(fèi)證書,就不用那個什么letsencrypt搞什么自動續(xù)簽了,
docker-compose.yml
version: '3'
services:
? db:
? ? image: mariadb:10.5
? ? container_name: nextcloud-db
? ? restart: always
? ? command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
? ? volumes:
? ? ? - ./mariadb/db:/var/lib/mysql
? ? environment:
? ? ? - MYSQL_DATABASE=nextcloud
? ? ? - MYSQL_ROOT_PASSWORD=sd21111111111111111w
? ? ? - MYSQL_USER=nextcloud
? ? ? - MYSQL_PASSWORD=GXDw1111111111111111112
? ? ports:
? ? ? - 3306:3306
? redis:
? ? image: redis:alpine
? ? container_name: nextcloud_redis
? ? restart: always
? ? expose:
? ? ? - 6379
? cron:
? ? image: nextcloud:apache
? ? restart: always
? ? volumes:
? ? ? - ./nextcloud_cron:/var/www/html
? ? entrypoint: /cron.sh
? ? depends_on:
? ? ? - db
? ? ? - redis
? nextcloud:
? ? image: nextcloud:apache
? ? container_name: nextcloud_web
? ? restart: always
? ? volumes:
? ? ? - ./nextcloud:/var/www/html
? ? environment:
? ? ? - NEXTCLOUD_ADMIN_USER=eeeee
? ? ? - NEXTCLOUD_ADMIN_PASSWORD=L111231
? ? ? - NEXTCLOUD_TRUSTED_DOMAINS='nextcloud.eeeeeeeee.com'
? ? ? - REDIS_HOST=redis
? ? ? - VIRTUAL_HOST=nextcloud.eeeeeee.com
? ? ? - TZ=Aisa/Shanghai
? ? ? - MYSQL_DATABASE=nextcloud
? ? ? - MYSQL_ROOT_PASSWORD=sdeeeeew
? ? ? - MYSQL_USER=nextcloud
? ? ? - MYSQL_PASSWORD=GXeeeeee
? ? ? - MYSQL_HOST=db
? ? ? - UID=0
? ? ? - GID=0
? ? ? - UPLOAD_MAX_SIZE=10G
? ? ? - APC_SHM_SIZE=1024M
? ? ? - OPCACHE_MEM_SIZE=512
? ? ? - CRON_PERIOD=15m
? ? depends_on:
? ? ? - db
? ? ? - redis
? ? links:
? ? ? - db
? ? cap_add:
? ? ? - MKNOD
? ? networks:
? ? ? - cloud_net
? ? ? - default
? proxy:
? ? image: nginxproxy/nginx-proxy:alpine
? ? container_name: nextcloud_proxy
? ? restart: always
? ? ports:
? ? ? - 80:80
? ? ? - 443:443
? ? volumes:
? ? ? - ./nginx/certs:/etc/nginx/certs:ro
? ? ? - ./nginx/vhost.d:/etc/nginx/vhost.d
? ? ? - ./nginx/html:/usr/share/nginx/html
? ? ? - /var/run/docker.sock:/tmp/docker.sock:ro
? ? ? - ./nginx/conf.d:/etc/nginx/conf.d
? ? networks:
? ? ? - cloud_net
? cloud_collabora:
? ? image: collabora/code:6.4.14.3
? ? container_name: cloud_collabora
? ? environment:
? ? ? - domain=nextcloud\.eeeeeeeeeeeeeeee\.com
? ? ? - username=yaeeeee
? ? ? - password=qingfeeeeeeeeeeeu
? ? ? - dictionaries=de en es zh
? ? cap_add:
? ? ? - MKNOD
? ? ports:
? ? ? - 9980:9980
? ? restart: always
? ? volumes:
? ? ? - ./collabora/coolwsd.xml:/etc/coolwsd/coolwsd.xml
? ? networks:
? ? ? - cloud_net
networks:
? cloud_net:
docker-compose.yml文件中涉及到的容器及參數(shù)配置
mariadb是完全兼容mysql的
command:是一個隔離級別的東西,不知道干嘛的,官方文檔里并沒寫
volumes:為了不把其他目錄搞亂,我比較喜歡把文件掛在當(dāng)前目錄下,我在?/home/dc/nextcloud/?文件夾下執(zhí)行安裝命令,文件都會創(chuàng)建在這個下面。
volumes,作用是,將宿主機(jī)的目錄掛載到docker容器中,這樣操作文件時,不用登錄docker容器了,直接在宿主機(jī)操作就可以了。
如果你使用的是windows版本的docker, 建議買個linux的云服務(wù)器,騰訊云雙十一的時候都不貴的。
environment:這里設(shè)置了root賬戶的密碼,還有給nextcloud使用的賬戶密碼和數(shù)據(jù)庫
? db:
? ? image: mariadb:10.5
? ? container_name: nextcloud-db
? ? restart: always
? ? command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
? ? volumes:
? ? ? - ./mariadb/db:/var/lib/mysql
? ? environment:
? ? ? - MYSQL_DATABASE=nextcloud
? ? ? - MYSQL_ROOT_PASSWORD=sd4eeeeee
? ? ? - MYSQL_USER=nextcloud
? ? ? - MYSQL_PASSWORD=Geeeeeee
? ? ports:
? ? ? - 3306:3306
image:這里我選用的是nextcloud:apache鏡像,因?yàn)閍pache的更能看明白一點(diǎn)
environment:
NEXTCLOUD_ADMIN_*****?配置項(xiàng)里面nextcloud的管理員賬號密碼。這里如果不設(shè)置,應(yīng)該也可以在初始化的時候設(shè)置;
REDIS_HOST直接用redis,可能因?yàn)槲覀儐⒘艘粋€名字是redis的容器;
VIRTUAL_HOST這個應(yīng)該是給ngnix用的,就用nextcloud的域名就可用;
MYSQL_*****這個是數(shù)據(jù)庫相關(guān)設(shè)置,和db容器的一致就可以聯(lián)上;
UID GID是nextcloud操作文件時的用戶權(quán)限,可用id命令查詢用戶的uid和gid,我用的是root用戶的id。id權(quán)限不足回導(dǎo)致上傳文件只有文件名不能正常寫入文件;
其余的各種上限的配置就按著寫就夠用了;
cap_add: - MKNOD這個也是一個容器權(quán)限相關(guān)的設(shè)置,控制容器對宿主機(jī)文件的操作,MKNOD允許容器使用mknod(2)創(chuàng)建特殊文件;
? nextcloud:
? ? image: nextcloud:apache
? ? container_name: nextcloud_web
? ? restart: always
? ? volumes:
? ? ? - ./nextcloud:/var/www/html
? ? environment:
? ? ? - NEXTCLOUD_ADMIN_USER=yanglijun
? ? ? - NEXTCLOUD_ADMIN_PASSWORD=eeeeeeeeeeeeeeeeeeeeeeeeewew
? ? ? - NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.weqeq
? ? ? - REDIS_HOST=redis
? ? ? - VIRTUAL_HOST=nextcloud.sevewnqweq
? ? ? - TZ=Aisa/Shanghai
? ? ? - MYSQL_DATABASE=nextcloud
? ? ? - MYSQL_ROOT_PASSWORD=sd42YGwqewqewqewqw
? ? ? - MYSQL_USER=nextcloud
? ? ? - MYSQL_PASSWORD=GXwqewqewqwqu
? ? ? - MYSQL_HOST=db
? ? ? - UID=0
? ? ? - GID=0
? ? ? - UPLOAD_MAX_SIZE=10G
? ? ? - APC_SHM_SIZE=1024M
? ? ? - OPCACHE_MEM_SIZE=512
? ? ? - CRON_PERIOD=15m
? ? depends_on:
? ? ? - db
? ? ? - redis
? ? links:
? ? ? - db
? ? cap_add:
? ? ? - MKNOD
? ? networks:
? ? ? - cloud_net
? ? ? - default
volumes: - 宿主機(jī):容器?需要在阿里云把證書下載并放在 ./nginx/certs/
? proxy:
? ? image: nginxproxy/nginx-proxy:alpine
? ? container_name: nextcloud_proxy
? ? restart: always
? ? ports:
? ? ? - 80:80
? ? ? - 443:443
? ? volumes:
? ? ? - ./nginx/certs:/etc/nginx/certs:ro
? ? ? - ./nginx/vhost.d:/etc/nginx/vhost.d
? ? ? - ./nginx/html:/usr/share/nginx/html
? ? ? - /var/run/docker.sock:/tmp/docker.sock:ro
? ? ? - ./nginx/conf.d:/etc/nginx/conf.d
? ? networks:
? ? ? - cloud_net
cloud_collabora:office預(yù)覽服務(wù)
這里我也試了好幾個office預(yù)覽的服務(wù),包括onlyoffice占用內(nèi)存會特別多,微軟官方的officeOline2013,部署太麻煩了,最終選擇了collabora,并且nextcloud還有直接可用的插件,內(nèi)置的插件對中文支持不好,所以就用這個單獨(dú)部署的了。這個單獨(dú)部署的是支持中文的。
environment:
domain一定要設(shè)置正確(哪個網(wǎng)站上要用collabora就設(shè)置那個網(wǎng)站的地址,不是設(shè)置collabora在用的域名),否則在collabora預(yù)覽的時候會一直初始化然后就沒有然后了。
如果要讓這個Collabora Office同時服務(wù)于多個域名的話,需要在兩個不同域名之間加上|,例如:
domain=cloud\\.nextcloud\\.com\|second\\.nexcloud\\.com
username和password是collabora管理后臺的賬號密碼,管理后臺的訪問地址是https://collabora.seeeeeeee.com/loleaflet/dist/admin/admin.html
如果瀏覽器打不開新開一個瀏覽器就好了
cap_add: - MKNOD這個設(shè)置用于讓collabora能夠正常寫緩存
? cloud_collabora:
? ? image: collabora/code:6.4.14.3
? ? container_name: cloud_collabora
? ? environment:
? ? ? - domain=nextcloud\.eeeee\.com
? ? ? - username=eeeeeeeeeeeeee
? ? ? - password=qieeeeeeeeeeeeeeeeeee
? ? ? - dictionaries=de en es zh
? ? cap_add:
? ? ? - MKNOD
? ? ports:
? ? ? - 9980:9980
? ? restart: always
? ? volumes:
? ? ? - ./collabora/coolwsd.xml:/etc/coolwsd/coolwsd.xml
? ? networks:
? ? ? - cloud_net
backups:定期備份Nextcloud文件和數(shù)據(jù)庫
(暫時沒部署)
backups:
? ? image: christophetd/duplicacy-autobackup:v1.0
? ? container_name: backups
? ? restart: always
? ? environment:
? ? ? BACKUP_NAME: "${BACKUP_NAME}"
? ? ? BACKUP_LOCATION: "b2://${B2_BUCKET}"
? ? ? BACKUP_SCHEDULE: "${BACKUP_SCHEDULE}"
? ? ? BACKUP_ENCRYPTION_KEY: "${BACKUP_ENCRYPTION_KEY}"
? ? ? B2_ID: "${B2_ID}"
? ? ? B2_KEY: "${B2_KEY}"
? ? volumes:
? ? ? - "${DATA_DIR}:/data"
在docker-compose.yml文件所在目錄,運(yùn)行以下命令:
docker-compose up -d
我在配置完成后,把nextcloud的端口關(guān)了,nextcloud服務(wù)默認(rèn)是運(yùn)行在80端口的(在容器內(nèi)的80端口),初次安裝可用ports把80端口露出來。
命令完成后,就可以用http://宿主機(jī)IP:端口,來訪問nextcloud了。
如果運(yùn)行docker-compose,提示權(quán)限不夠,解決方法:
chmod +x /usr/local/bin/docker-compose
訪問首頁,進(jìn)行初始化設(shè)置,就不用在這里設(shè)置了
進(jìn)入mysql:
mysql -u root -p
建立數(shù)據(jù)庫
create database nextcloud;
建立數(shù)據(jù)庫用戶
create user '你的數(shù)據(jù)庫用戶名'@'%' identified by '你的數(shù)據(jù)庫密碼';
將數(shù)據(jù)庫用戶與數(shù)據(jù)庫關(guān)聯(lián)起來,并允許所有IP訪問此數(shù)據(jù)庫
GRANT ALL PRIVILEGES ON 你的數(shù)據(jù)庫用戶名 TO '你的數(shù)據(jù)庫用戶名@'%' IDENTIFIED BY '你的數(shù)據(jù)庫密碼' WITH GRANT OPTION;
刷新權(quán)限信息
flush privileges;
參數(shù)解釋:
nextcloud,代表對這個數(shù)據(jù)庫有效,如果換成*.* ,代表對任意數(shù)據(jù)庫任意表有效
‘%’ 允許任意IP訪問數(shù)據(jù)庫,如果換成’localhost’代表只允許本機(jī)訪問
如果doker-compose.yml添加了redis服務(wù),需要編輯nextcloud的php配置文件來啟用服務(wù),配置文件路徑是./nextcloud/config/config.php
? 'memcache.local' => '\OC\Memcache\Redis',
? 'memcache.distributed' => '\OC\Memcache\Redis',
? 'memcache.locking' => '\OC\Memcache\Redis',
? 'redis' => array(
? ? 'host' => 'redis',? #如果是在本機(jī)就是localhost,如果是docker,要和Redis的名一致
? ? 'port' => 6379,
? ? ),
應(yīng)用商店是在墻外的,如果服務(wù)器聯(lián)網(wǎng)不科學(xué),是無法訪問到的,即使額能訪問到也沒法安裝成功應(yīng)用。
國內(nèi)有一個非常優(yōu)秀的鏡像可用使用,地址 https://www.orcy.net/ncapps/v1/
配置文件路徑是/docker/nextcloud/config/config.php,修改配置文件,在最后添加
注意最后也是有逗號的
? 'appstoreenabled' => true,
? 'appstoreurl' => 'https://www.orcy.net/ncapps/v1/',
如果域名不受信任,即使指向了nextcloud的服務(wù)地址,也是無法打開的,需要在配置文件./nextcloud/config/config.php,修改配置文件,找到trusted_domains,在下面的數(shù)組中按編號新增自己的域名,如果是帶端口的端口也要寫上,有IP的IP也要寫
'trusted_domains' =>
? array (
? ? 0 => 'localhost',
? ? 1 => 'nextcloud.eeeeeeeeeeeeee.space',
? ? 2 => 'collabora.eeeeeeeeeeeeeeee.space',
? ),
管理員后臺【概覽】頁提示【您的安裝沒有設(shè)置默認(rèn)的電話區(qū)域…】
編輯 Nextcloud config 目錄中的 config.php 文件,在文件最下方, ); 前添加如下代碼
注意,每行代碼后需添加英文逗號。
'default_phone_region' => 'CN',
掛載外部存儲提示"smbclient" 未安裝。無法掛載 “SMB / CIFS”, “SMB / CIFS 使用 OC 登錄信息”。
https://qingflow.com/tag/37253/app/c3ab1815/list/1?applyId=53805827
進(jìn)入Nextcloud容器:
docker exec -it nextcloud_web /bin/bash
apt 更新可用軟件包列表:
apt update
用apt安裝:
apt install smbclient libsmbclient-dev
pecl install smbclient
docker-php-ext-enable smbclient
重啟Docker服務(wù)即可
https://www.himstudy.net/%e8%a7%a3%e5%86%b3nextcloud%e6%8f%90%e7%a4%baphp-imagick%e6%a8%a1%e5%9d%97%e4%b8%8d%e6%94%af%e6%8c%81svg%e7%9a%84%e9%97%ae%e9%a2%98/
管理員后臺【概覽】頁提示“此實(shí)例中的 php-imagick 模塊不支持 SVG。為了獲得更好的兼容性,建議安裝它。
首先進(jìn)入容器中
docker exec -it nextcloud_web /bin/bash
輸入“apt install libmagickcore-”,然后雙擊tab鍵,會顯示以“l(fā)ibmagickcore-”開頭的組件列表。
然后繼續(xù)敲入完整的安裝命令,安裝“l(fā)ibmagickcore-6.q16-6-extra”組件。
apt install libmagickcore-6.q16-6-extra
安裝完畢重啟docker,然后問題就搞定了。
鏈接教程中是說要重啟apache2,如果有安裝php-fpm,需一并重啟,筆者是php7.4-fpm,如下:
service apache2 restart
service php7.4-fpm restart
再次刷新管理后臺【概覽】頁,問題解決。
另一種在容器外直接操作的方法(不記得是否驗(yàn)證過):
https://techoverflow.net/2021/08/17/how-to-fix-docker-nextcloud-module-php-imagick-in-this-instance-has-no-svg-support-for-better-compatibility-it-is-recommended-to-install-it/
docker-compose exec nextcloud_web apt -y update
docker-compose exec nextcloud_web apt -y install libmagickcore-6.q16-6-extra
弄完以后,我測試發(fā)現(xiàn)填寫完用戶名及密碼之后,點(diǎn)擊登錄無法跳轉(zhuǎn)到主頁。但是刷新一下又是登錄狀態(tài)了,最后上網(wǎng)查了下,這是因?yàn)閣eb使用https反向代理了http導(dǎo)致的。只需要在配置文件(/config/config.json)中加上一條信息就可以了。
'overwriteprotocol' => 'https',
這個網(wǎng)頁上傳應(yīng)該會遇到,因?yàn)镹ginx做了限制。
首先,映射出Nginx的配置文件:
-v /volume1/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
然后修改一下,添加一個參數(shù)就可以了:
client_max_body_size 2048M; # 自行調(diào)整大小