目標
建立一個 Nextcloud,並包含以下功能
- LDAP 登入
- 讀寫 NFS 資料
- 可以同時上傳多個單檔超過 5GB 的檔案
安裝 Nextcloud
先 Git clone Docker 版本的 Nextcloud
https://github.com/nextcloud/docker
使用的範本是 /.examples/docker-compose/insecure/mariadb/fpm
先更新一下 db.env
MYSQL_PASSWORD=PASSWD
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
以及 docker-compose.yml 的 MYSQL_ROOT_PASSWORD
使用 root 執行 PHP-FPM
接著由於要掛載 NFS 資料,若掛載的是已經存有很多檔案和各種權限的資料,不想遇到權限不足的問題,可以用 root 身份執行 Nextcloud,多人開放環境可自行決定是否設定
docker-compose.yml app 區段加入
privileged: true
command: /entrypoint.sh php-fpm -R
接著啟動所有 Container
docker-compose up -d
進入到 app container 修改檔案
docker exec -it fpm_app_1 sh
打開 /usr/local/etc/php-fpm.d/www.conf,將下列字串的 www-data 改成 root
user = root
group = root
回到 Host,restart app
docker-compose restart app
Nextcloud 啟用外部儲存空間
先到 Nextcloud 的應用程式啟用 External storage support
接著進入 app container,安裝以下套件
docker exec -it fpm_app_1 sh
apk add --no-cache procps ffmpeg imagemagick supervisor $PHPIZE_DEPS samba-dev samba-client nfs-utils
pecl install smbclient
docker-php-ext-enable smbclient
apk add --no-cache nfs-utils cifs-utils
NFS
測試 mount
mount -t nfs [NFS_IP]:/vol/ML_Data /mnt/ML_Data nfs -o nolock
ls -al /mnt/ML_Data
umount /mnt/ML_Data
更新 /etc/fstab
[NFS_IP]:/vol/ML_Data /mnt/ML_Data nfs defaults 0 0
defaults表示 rw,suid,dev,exec,auto,nouser,async
可以修改 /entrypoint.sh 設定開機自動掛載
mount -a
設定 Nextcloud
接下來就到後台的外部儲存空間,新增一個本機的空間,路徑就是對應前面設定在 /etc/fstab 的路徑
LDAP
進入 app container,安裝以下套件
docker exec -it fpm_app_1 sh
apk add ldb-dev libldap openldap-dev
docker-php-ext-install ldap
docker-php-ext-enable ldap
到 Nextcloud 設定 LDAP,主要就是輸入正確的 User DN 和密碼,Base DN 就可以自動偵測帶出來
UserDN: cn=mowd,cn=Users,dc=example,dc=com
Base DN: dc=example,dc=com
加大單檔上傳限制
進入 app container,安裝以下套件
docker exec -it fpm_app_1 sh
修改 /var/www/.user.ini,加入以下幾行
upload_max_filesize=20G
post_max_size=20G
max_input_time 3600
max_execution_time 3600
upload_tmp_dir=/tmp
進入 web container
docker exec -it fpm_web_1 sh
修改 /etc/nginx/nginx.conf,修改以下設定
client_max_body_size 20G;
fastcgi_request_buffering off;
並新增
fastcgi_connect_timeout 60;
fastcgi_send_timeout 1800;
fastcgi_read_timeout 1800;
restart app and web
docker-compose restart app
docker-compose restart web
其他疑難雜症
MariaDB 障礙排除
Error
[ERROR] mysqld: Aria recovery failed. Please run aria_chk -r on all Aria tables and delete all aria_log.######## files
[ERROR] Plugin 'Aria' init function returned error.
[ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed.
....
[ERROR] Could not open mysql.plugin table. Some plugins may be not loaded
[ERROR] Failed to initialize plugins.
[ERROR] Aborting
修復方法
docker-compose run db bash -c 'aria_chk -r /var/lib/mysql/**/*'
docker-compose run db bash -c 'rm /var/lib/mysql/aria_log.*'
Internal Server Error
先確定 Redis 是否有在執行,若正常,則可嘗試在 app container 執行以下指令
sudo -u www-data php /var/www/occ maintenance:mode --on
chown -R www-data:www-data /var/www/
chmod -R 770 /var/www/
sudo -u www-data php /var/www/occ maintenance:repair
sudo -u www-data php /var/www/occ db:add-missing-columns
sudo -u www-data php /var/www/occ db:add-missing-indices
sudo -u www-data php /var/www/occ maintenance:update:htaccess
sudo -u www-data php /var/www/occ maintenance:mode --off
最後再 restart app container
Error when assembling chunks, status code 504
確認有照「加大單檔上傳限制」這段進行,以及 /tmp 必須要足夠大,必要的話可以在上傳時觀察
watch -n1 ls -alh /tmp
以及
watch -n1 df -h
Unable to write to stream
確定磁碟空間是否滿了
Nextcloud All In One
後來才發現有這個 All In One 的 Repository,應該可以少裝很多需要手動安裝的東西,未來可以試試看
https://github.com/nextcloud/all-in-one