给Docker安装的Nextcloud添加离线下载等功能

这篇文章主要介绍一下如何给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"

外部存储也是可以正常工作的:

全部为采集文章,文中的 联系方式 均不是 本人 的!

发表评论