这篇文章主要介绍一下如何给docker安装的nextcloud添加其他功能。
按照官方的介绍:https://github.com/nextcloud/docker#adding-features
以及官方给出的例子:https://github.com/nextcloud/docker/tree/master/.examples
可以看出来,nextcloud的官方镜像只是一个“最小镜像”。很多nextcloud的附加功能都没有事先部署在镜像里面。由此可见当我们需要nextcloud支持更多功能的时候,就得构建自己的私有镜像了。这里我构建了一个镜像,解决了一些问题并添加了以下功能:
1.ocdownloader+aria2离线下载
2.视频文件/pdf文件/svg文件缩略图生成
3.外部存储支持s3对象存储(smbclient)
首先准备一下工作目录:
mkdir /opt/nextcloud && cd /opt/nextcloud
在目录内新建一个dockerfile:
nano Dockerfile
写入如下内容:
FROM nextcloud:stable-apache ENV NEXTCLOUD_UPDATE=1 RUN set -ex && \ apt -y update && \ apt -y --no-install-recommends install \ python-is-python3 \ procps \ smbclient \ imagemagick \ libmagickcore-6.q16-6-extra \ ghostscript \ ffmpeg \ curl \ supervisor \ aria2 && \ curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl && \ chmod a+rx /usr/local/bin/youtube-dl && \ mkdir /var/log/supervisord /var/run/supervisord /var/run/aria2c && \ touch /var/run/aria2c/aria2c.sess && \ rm -rf /var/lib/apt/lists/* COPY aria2c.daemon /var/run/aria2c RUN set -ex && \ chown -R www-data:www-data /var/run/aria2c COPY supervisord.conf / COPY start.sh / RUN set -ex && \ chmod +x /start.sh CMD ["/start.sh"]
准备dockerfile内指定的启动脚本:
nano start.sh
写入如下内容:
#!/bin/bash if [ $ARIA2_RPC_SECRET ];then sed -i "s#rpc-secret=imlala#rpc-secret=$ARIA2_RPC_SECRET#g" /var/run/aria2c/aria2c.daemon else echo "ARIA2_RPC_SECRET default value: imlala" fi sed -i '/disable ghostscript format types/,+6d' /etc/ImageMagick-6/policy.xml /usr/bin/supervisord -c /supervisord.conf
准备supervisor的配置文件:
nano supervisord.conf
写入如下配置:
[supervisord] nodaemon=true logfile=/var/log/supervisord/supervisord.log pidfile=/var/run/supervisord/supervisord.pid childlogdir=/var/log/supervisord/ logfile_maxbytes=50MB logfile_backups=10 loglevel=error [program:apache2] stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 command=apache2-foreground [program:aria2] stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 user=www-data command=aria2c --conf-path=/var/run/aria2c/aria2c.daemon
最后准备一份aria2的配置文件:
nano aria2c.daemon
写入如下配置:
continue=true enable-rpc=true rpc-listen-all=true rpc-secret=imlala console-log-level=warn log-level=notice file-allocation=trunc max-connection-per-server=16 max-concurrent-downloads=100 bt-force-encryption=true bt-max-peers=0 bt-enable-lpd=true check-integrity=true enable-dht=true enable-peer-exchange=true follow-torrent=true seed-time=0 min-split-size=25M check-certificate=false save-session=/var/run/aria2c/aria2c.sess save-session-interval=2 input-file=/var/run/aria2c/aria2c.sess force-save=true dht-file-path=/var/run/aria2c/dht.dat disable-ipv6=true bt-tracker=udp://tracker.opentrackr.org:1337/announce,udp://tracker.moeking.me:6969/announce,http://p4p.arenabg.com:1337/announce
现在编写一个compose:
nano docker-compose.yml
写入如下配置:
version: '3.5' services: db: image: mariadb:10.5 restart: unless-stopped environment: - MARIADB_ROOT_PASSWORD=password - MARIADB_DATABASE=nextcloud - MARIADB_USER=imlala - MARIADB_PASSWORD=password volumes: - nextcloud_db:/var/lib/mysql command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW redis: image: redis:alpine restart: unless-stopped app: build: . restart: unless-stopped depends_on: - db - redis environment: - ARIA2_RPC_SECRET=password - NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com - OVERWRITEHOST=cloud.example.com - OVERWRITEPROTOCOL=https - PHP_MEMORY_LIMIT=2048M - PHP_UPLOAD_LIMIT=5120M - REDIS_HOST=redis - MYSQL_HOST=db - MYSQL_DATABASE=nextcloud - MYSQL_USER=imlala - MYSQL_PASSWORD=password ports: - 127.0.0.1:8080:80 volumes: - nextcloud:/var/www/html - nextcloud_aria2:/var/run/aria2c cron: image: nextcloud:stable-apache restart: unless-stopped depends_on: - db - redis volumes: - nextcloud:/var/www/html entrypoint: /cron.sh volumes: nextcloud: nextcloud_db: nextcloud_aria2:
这个compose的配置是根据我之前这篇文章内的配置修改而来:https://lala.im/8072.html
原来的这个配置是直接把nextcloud的主存储配置为对象存储,但是我后来发现ocdownloader这个插件并不支持对象存储,下载的文件不能直接下载到对象存储的bucket里面。。。所以没办法还是只能把nextcloud的主存储配置为默认的本地存储,然后安装smbclient来支持nextcloud的外部存储功能,再通过外部存储这个插件来实现对象存储。这样实现的对象存储,在nextcloud里面只显示一个目录,我们通过ocdownloader下载的文件还是先下载到本地,然后可以手动把文件移动到这个对象存储的目录里面。
镜像里面加了一个环境变量:ARIA2_RPC_SECRET,用于设置初始的aria2rpc密码,这个变量只在第一次设置的时候生效,如果不设置这个变量,那么默认的rpc密码就是imlala。另外还加了一个命名卷:nextcloud_aria2,目的是存储aria2的配置文件和进度保存文件。后续要修改aria2相关的配置可以在这个卷里面找到aria2的配置文件进行修改,比如上面通过环境变量设置的rcp密码。
现在构建镜像:
docker-compose build --pull
如果构建过程中没有错误的话,镜像构建完成后,在docker的镜像列表中会多出一个你构建的镜像:
root@moonbridge:/opt/nextcloud# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nextcloud_app latest 2af7a0ae938a 6 days ago 1.38GB nextcloud stable-apache 7a4c5f609608 12 days ago 942MB
可以看到加了许多功能后的镜像大小也变的很大,这也是官方不愿意加很多额外功能的原因之一。
现在只需要up即可:
docker-compose up -d
在nextcloud的应用商店安装ocdownloader插件后,按照下图设置:
这个插件有点沙雕的地方在于这些默认设置必须要你先清除一遍,再重新输上去用鼠标点一下空白区域才能生效,一定要看到它上面有显示已保存才行:
测试下载:
之前说到的视频文件/pdf文件/svg文件缩略图生成功能,容器内已经有相应的环境了,要想启用还需要修改nextcloud的配置。建议通过下面这种调用occ命令行工具的方式来修改:
docker-compose exec --user www-data app php occ config:system:set enable_previews --value=true --type=boolean docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 0 --value="OC\\Preview\\Movie" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 1 --value="OC\\Preview\\MarkDown" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 2 --value="OC\\Preview\\PNG" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 3 --value="OC\\Preview\\JPEG" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 4 --value="OC\\Preview\\GIF" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 5 --value="OC\\Preview\\BMP" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 6 --value="OC\\Preview\\MP3" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 7 --value="OC\\Preview\\TXT" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 8 --value="OC\\Preview\\PDF" docker-compose exec --user www-data app php occ config:system:set enabledPreviewProviders 9 --value="OC\\Preview\\SVG"
外部存储也是可以正常工作的:
我看不懂但大受震撼:idea: