静看光阴荏苒
不管不顾不问不说也不念

给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"

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

赞(5)
未经允许不得转载:荒岛 » 给Docker安装的Nextcloud添加离线下载等功能
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    我看不懂但大受震撼:idea:

    橘子2年前 (2021-10-11) Google Chrome 81.0.4044.88 Google Chrome 81.0.4044.88 Windows 7 x64 Edition Windows 7 x64 Edition回复

分享创造快乐

广告合作资源投稿