Verification: a143cc29221c9be0

Nextcloud docker php memory limit

Nextcloud docker php memory limit

Установка и настройка системы и необходимых компонентов

Во время установки Ubuntu Server, отметить для установки SSH Server и LAMP. Выбрать автоустановку обновлений безопасности.

# Войти в режим рута
sudo -i
# Задать статический IP:
nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.7
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
dns-search workgroup

Перезагрузиться.

Зайти в систему по SSH и обновить систему целиком:

sudo -i
apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y && apt-get autoremove

Установить все необходимые компоненты и, в данном случае, механизм кэширования APCu + Redis и компоненты для автогенерации favicon:

apt-get install php-zip php-xml php-gd php-json php-curl php-mbstring php-bz2 php-intl php-mcrypt php-apcu redis-server php-redis php-imagick libmagickcore-6.q16-2-extra -y

Если нужен SMB client (для подключения внешних накопителей в Nextcloud), LDAP и Midnight Commander:

apt-get install smbclient php-ldap mc -y

Установка Nextcloud

# Скачать последнюю версию
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# Распаковать архив в корневую папку веб-сервера
tar xjf latest.tar.bz2 --strip=1 -C /var/www/html
# Удалить исходный архив (если нужно)
rm latest.tar.bz2
# Создать папку для пользовательских данных
mkdir /var/nextcloud-data
# Дать права владельца веб-серверу:
chown -R www-data:www-data /var/www/html /var/nextcloud-data
# Перезапустить Apache:
systemctl restart apache2
# Создать базу MySQL с именем "nextcloud":
mysql -u root -p -e "create database nextcloud";

Открыть браузер, зайти на веб-интерфейс (здесь: 192.168.1.7), задать логин и пароль админа, путь к папке с данными пользователей (здесь: /var/nextcloud-data) и имя БД (здесь: nextcloud). Либо настроить из командной строки:
FIXME - уточнить, можно ли тут обойтись без паролей

sudo -u www-data php /var/www/html/occ maintenance:install --database "mysql" --data-dir "/var/nextcloud-data" --database-name "nextcloud" --database-user "root" --database-pass "password" --admin-user "admin" --admin-pass "password"

Настройка

# Убрать закрывающую строку из конфига и заменить строку overwrite.cli.url на нужную.
# В sed экранирование апострофа безумное - '"'"'
sed -i '
/);/d
/overwrite.cli.url/c \'"'"'overwrite.cli.url\'"'"' => \'"'"'https://192.168.1.7\'"'"',' /var/www/html/config/config.php
 
# Настроить конфиг - "pretty URLs", кэширование, часовой пояс для логов и их ротацию (100 МБ)
echo "'htaccess.RewriteBase' => '/',
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
 'redis' => array(
      'host' => 'localhost',
      'port' => 6379,
       ),
'logtimezone' => 'Europe/Moscow',
'log_rotate_size' => 104857600,
);" >> /var/www/html/config/config.php
 
# Настроить максимальный размер файла на закачку в PHP и лимит памяти
# Проверить версию PHP и путь к используемым php.ini (php --ini), например, он может быть
# /etc/php/7.3/fpm/php.ini. Есть ещё
# /etc/php/7.3/cli/php.ini.
sed -i '
/upload_max_filesize =/c upload_max_filesize = 4G
/post_max_size =/c post_max_size = 4G
/memory_limit =/c memory_limit = 512M' /etc/php/7.3/apache2/php.ini
 
# Настроить параметры opcache
sed -i '
/opcache.enable=/c opcache.enable=1
/opcache.enable_cli=/c opcache.enable_cli=1
/opcache.memory_consumption=/c opcache.memory_consumption=128
/opcache.interned_strings_buffer=/c opcache.interned_strings_buffer=8
/opcache.max_accelerated_files=/c opcache.max_accelerated_files=10000
/opcache.revalidate_freq=/c opcache.revalidate_freq=1
/opcache.save_comments=/c opcache.save_comments=1' /etc/php/7.3/apache2/php.ini

Список часовых поясов для PHP

SSL, mod_env и mod_rewrite для pretty URLs

a2enmod ssl headers env rewrite && a2ensite default-ssl

Включить Strict transport security, Referrer Policy и Forward secrecy:

echo "
 Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"
 Header always set Referrer-Policy "no-referrer-when-downgrade"

 
# Set Forward Secrecy
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder on
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
" >> /etc/apache2/sites-available/default-ssl.conf

Перенаправить HTTP на HTTPS

nano /etc/apache2/sites-available/000-default.conf

VirtualHost *:80>
ServerName www.yourdomain.com
Redirect / https://www.yourdomain.com/
VirtualHost>
systemctl restart apache2

Настроить Pretty URLs

nano /etc/apache2/apache2.conf
 
# В разделе  изменить параметр AllowOverride None на AllowOverride All
# Выйти из редактора.
 
# Обновить файл .htaccess:
sudo -u www-data php /var/www/html/occ maintenance:update:htaccess
 
# Перезапустить Apache:
systemctl restart apache2

Переключить фоновые задачи на выполнение кроном

Выключить ненужные ссылки

config/config.php:

# Выключить ссылку на сброс пароля
'lost_password_link' => 'disabled',
# Remove link “Get your own free account”
'simpleSignUpLink.shown' => false,

Настроить аутентификацию через LDAP

Обновление

# Автоматически:
sudo -u www-data php /var/www/html/updater/updater.phar
 
# Вручную:
# Скачать последний релиз
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# Распаковать скачанный архив в папку установки
tar xjf latest.tar.bz2 --strip=1 -C /var/www/html
# Дать права владельца веб-серверу:
chown -R www-data:www-data /var/www/html
# Включить режим обслуживания
sudo -u www-data php /var/www/html/occ maintenance:mode --on
# Запустить процесс обновления
sudo -u www-data php /var/www/html/occ upgrade
# Выключить режим обслуживания
sudo -u www-data php /var/www/html/occ maintenance:mode --off

https://docs.nextcloud.com/server/latest/admin_manual/maintenance/update.html

Экспресс-обновление со сменой шлюза

ip route change default via 192.168.1.254 dev eth0
apt update && apt upgrade -y && apt autoremove -y
sudo -u www-data php /var/www/html/updater/updater.phar --no-interaction
ip route change default via 192.168.1.1 dev eth0

Обновление на след. мажорный релиз

# Нужно переключиться на бета-канал обновлений, обновляться, а затем переключиться обратно.
sed -i 's/stable/beta/' /var/www/html/config/config.php
sudo -u www-data php /var/www/html/updater/updater.phar --no-interaction
sed -i 's/beta/stable/' /var/www/html/config/config.php
sudo -u www-data php /var/www/html/updater/updater.phar --no-interaction

Настройка кэширования через сервер Redis

Как-то раз произошла ситуация - невозможно было стереть файл с сервера или обновить его, файл был заблокирован:

file is locked
Error transferring bva.dyndns.info/cloud/remote.php/dav/files/user/123.txt - server replied: Locked («123.txt» is locked)

В соответствующем howto советуют обнулить таблицу блокировок в базе mysql, а чтобы ситуация не повторялась, рекомендуют поставить кэширующий сервис Redis. Так как у меня уже был APCu, было решено поставить Redis для блокировок, а APCu оставить для локального кэша.

В Ubuntu это ставится просто, а в Armbian в репозитории отсутствуют соответствующие пакеты, так что пришлось их собирать из исходников.

Установить Redis

Информация устарела, в репозиториях для процессоров ARM появились собранные пакеты.
Теперь достаточно выполнить команду
apt-get install redis-server php-redis

Сборка из исходников

Настройка Nextcloud и разблокировка файлов

Конфиг Nextcloud в части кэширования нужно привести к следующему виду:

'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
 'redis' => array(
      'host' => 'localhost',
      'port' => 6379,
       ),
# Перевести Nextcloud в режим обслуживания:
sudo -u www-data php /var/www/html/occ maintenance:mode --on
# Зайти в базу "cloud" и очистить блокировки:
mysql -u root -p cloud
DELETE FROM oc_file_locks WHERE 1;
quit
# Вывести Nextcloud из режима обслуживания:
sudo -u www-data php /var/www/html/occ maintenance:mode --off
# Перезапустить Apache:
systemctl restart apache2

Дополнительные материалы

Сертификаты

#Сделать папочку для сертификатов
mkdir /etc/ssl/certs/nextcloud
# самоподписанный сертификат на 10 лет без запроса пароля
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/nextcloud/nextcloud.key -out /etc/ssl/certs/nextcloud/nextcloud.crt
nano /etc/apache2/sites-available/default-ssl.conf
SSLCertificateKeyFile /etc/ssl/certs/nextcloud/nextcloud.key
SSLCertificateFile /etc/ssl/certs/nextcloud/nextcloud.crt
#SSLCACertificateFile /etc/ssl/certs/nextcloud/nextcloud-int.crt

FIXME

sed -i '
/SSLCertificateKeyFile/c SSLCertificateKeyFile /etc/ssl/certs/nextcloud/nextcloud.key
/SSLCertificateFile/c SSLCertificateFile /etc/ssl/certs/nextcloud/nextcloud.crt' /etc/apache2/sites-available/default-ssl.conf

Импорт контактов из файла vcf

Проблема: выгруженный файл vcf с мобильника на Android 4.4 не загружается в приложение «Контакты» в Nextcloud.

Решение:

  1. Открыть файл в программе tcode (в Windows), чтобы строки с кодировкой Quoted Printable перекодировались в нормальный русский текст. Это можно сделать и из командной строки:

    tcode input.vcf /auto output.vcf
  2. Убрать из всего файла строки ;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE

  3. Строки VERSION:2.1 заменить на VERSION:3.0

  4. Сохранить файл в кодировке UTF-8.

Ссылка на выгруженные контакты мобильным приложением

https://path-to-nextcloud-site.com/apps/files/?dir=/.Contacts-Backup

Полезные плагины

Плагин для Outlook

https://download.nextcloud.com/outlook/ Ставить нужно плагин той же разрядности, что и у Офиса (не системы в целом).

Cкачать свежую версию:

# ((Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
# ? {$_.Displayname -match 'Microsoft Office' -and $_.InstallLocation -match "\w"} |
# select -expand installlocation -First 1) -split '\\')[1] -match 'x86'
 
$offx64 = gci "$env:ProgramFiles\Microsoft Office\outlook.exe" -Recurse
$offx86 = gci "${env:ProgramFiles(x86)}\Microsoft Office\outlook.exe" -Recurse
$u = "https://download.nextcloud.com/outlook/"
$f = (curl $u).links |? href -like "20*" | select -Last 1 -expand href
$uf = $u + $f
if ($offx64) {
$plugx64 = (curl $uf).links |? href -like "*64*.msi" | select -expand href
$url64 = $uf + $plugx64
curl $url64 -OutFile "$env:userprofile\Downloads\$plugx64"
}
if ($offx86) {
$plugx86 = (curl $uf).links |? href -like "*86*.msi" | select -expand href
$url86 = $uf + $plugx86
curl $url86 -OutFile "$env:userprofile\Downloads\$plugx86"
}
# Путь к файлам перевода:
${env:ProgramFiles(x86)}\Nextcloud Outlook\Resources\Translations

Перевод на русский:

Автоудаление файлов

Снежок

Полезные команды

Включить превью офисных форматов:

nano /var/www/html/config/config.php
'preview_libreoffice_path' => '/usr/bin/libreoffice',

Удалить пользователя username вместе с его каталогом:

u=username
sudo -u www-data php /var/www/html/occ user:delete $u && rm -rf /var/nextcloud-data/$u

Решение проблем

Failed to connect to www.nextcloud.com

В логах куча сообщений:
GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect to www.nextcloud.com port 80: Connection timed out

Сайт nexcloud.com реально бывает недоступен. Workaround - отключить проверку на наличие интернета:

echo "'has_internet_connection' => false," >> /var/www/html/config/config.php

Или не обращать внимания.

Some files have not passed the integrity check

После обновления - ошибка подписи файлов:
Some files have not passed the integrity check. Further information on how to resolve this issue can be found in the documentation. (List of invalid files… / Rescan…)

Помимо выполнения рекомендаций, убедиться, что core/signature.json актуальный.

Поломались "красивые" ссылки (без index.php)

Specified key was too long; max key length is 767 bytes

При обновлении Nexcloud ошибка:
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ENGINE = InnoDB ROW_FORMAT = compressed': SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Решение:

mysql -u root -p cloud
 
MariaDB [cloud]> set global innodb_large_prefix=on;
MariaDB [cloud]> set global innodb_file_format=Barracuda;
quit
 
sudo -u www-data php /var/www/html/occ maintenance:repair
sudo -u www-data php /var/www/html/occ upgrade

The database is missing some indexes

Проверка в админке пишет: The database is missing some indexes

Решение:

sudo -u www-data php /var/www/html/occ db:add-missing-indices
# В докере:
docker exec -u www-data nc php occ db:add-missing-indices

Обновление прошло неуспешно, PHP грузит систему на 100%, сайт в неотключаемом maintenance mode

Отключить регулярную задачу в crontab.

# Проверить, включен ли apc cli:
php -i | grep apc.enable
  apc.enable_cli => Off => Off
  apc.enabled => On => On
# Если нет, то включить
echo "apc.enable_cli=1" >> /etc/php/7.4/cli/php.ini
# Перейти в каталог NC (обязательно!) и запустить апгрейд заново
cd /var/www/html/cloud
sudo -u www-data php occ upgrade

Включить регулярную задачу в crontab.

https://help.nextcloud.com/t/nextcloud-21-update-needed/108714/25

Your installation has no default phone region set

sudo -u www-data php /var/www/html/occ config:system:set default_phone_region --value="RU"
# Докер
docker exec -u www-data nc php occ config:system:set default_phone_region --value="RU"

Last background job execution ran 15 hours ago. Something seems wrong

Запустить принудительно

sudo -u www-data php -f /var/www/html/cloud/cron.php

PHP Fatal error: Out of memory (allocated 3533701120) (tried to allocate 36864 bytes) in /var/www/html/lib/private/AppFramework/Utility/SimpleContainer.php on line 133

Update 02.07.’21

Den Keyserver auf “keyserver.ubuntu.com” umgestellt.

Update 23.02.’21

Wie Julius mich darauf hingewiesen hat setze ich das Tutorial auf “nicht valid”, da die Version mittlerweile nicht mehr zu laden ist. Anhand der Updates für Nextcloud sollte man die passende Version installieren können.

Update 22.03.’20

Update auf v18.0.2 bei der Fehlerbehebung in der docker-compose.yml

Update 12.02.’20

Upgrade auf php7.4 und Version 18.0.0 im Zuge der Anpassung an Traefik v2.1.

Update 03.10.’19

Das Tutorial hab ich auf Version 17.0.0 von Nextlcoud angepasst und dabei den “msmtp-Install”-Block oben in den persistenten Teil des Dockerfiles gezogen…

Verzeichnisse anlegen und Config-Dateien laden

Wir legen unterhalb von “/root/docker” ein Verzeichnis “nextcloud-php74-apache” an, in dem wir die Config-Dateien und das “Dockerfile” herunterladen bzw. erstellen. Das “Dockerfile” ist die Steuerdatei, in der Instruktionen stehen, wie das Image “gebaut” werden soll.

Die meisten Docker Images gibt es in verschiedenen Ausführungen. Beispielsweise mit php 7.0, 7.2 oder 7.4. Oder dem Webserver apache oder fpm. Damit wir auf den ersten Blick sehen, welches Image wir bauen möchten, gebe ich diese Bezeichnungen mit in den Verzeichnisnamen. Sollte einmal php 7.5 herauskommen, legen wir dafür ein neues Verzeichnis an und sind in der Lage, zwei Images parallel zu erstellen, bis wir sicher sind, dass die neue php 7.5 Version auch vernünftig funktioniert…

Achtung: die “wget” Befehlszeilen sind sehr lang und erstrecken sich hier über mehrere Zeilen. Diese sind aber bitte komplett per Copy/Paste kopieren und im Terminal jeweils in einer einzigen Kommandozeile auszuführen…

Im Unterverzeichnis “config” sammeln wir ein paar Config-Dateien für Serverdienste, die im Nextcloud Container laufen werden.

Die “entrypoint.sh” und “cron.sh” Dateien müssen wir noch “ausführbar” machen, also “+x” für “executable”. Da dies die einzigen beiden “.sh”-Dateien sind, stellen wir einfach alle “.sh”-Datein mit “*.sh” auf +x…

mkdir -p ~/docker/nextcloud-php74-apache/config

wget -qNP ~/docker/nextcloud-php74-apache/config https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/config/apache-pretty-urls.config.php https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/config/apcu.config.php https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/config/apps.config.php https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/config/autoconfig.php https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/config/redis.config.php https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/config/smtp.config.php

wget -qNP ~/docker/nextcloud-php74-apache https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/cron.sh https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/entrypoint.sh https://raw.githubusercontent.com/nextcloud/docker/master/18.0/apache/upgrade.exclude

chmod +x ~/docker/nextcloud-php74-apache/*.sh

Dies waren die Vorbereitungen. Jetzt erstellen wir das “Dockerfile”, die Steuerdatei für den Zusammenbau des Images.

Nicht erschrecken: Das Ding ist ziemlich umfangreich und “erschlägt” einen gerne, wenn man es zum ersten Mal sieht. Zerlegt in seine Einzelbestandteile ist das Konstrukt aber verdammt logisch und nimmt dem Ganzen seinen Schrecken…

Und bis auf einige wenige Änderungen ist diese Datei auch 1:1 vom originalen Dockerfile übernommen worden.

nano ~/docker/nextcloud-php74-apache/Dockerfile
### NEXTCLOUD DOCKERFILE
###
##START
FROM php:7.4-apache

# entrypoint.sh and cron.sh dependencies - persistant!
RUN set -ex; \
    \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        rsync \
        bzip2 \
        busybox-static \
### msmtp Installation
        msmtp \
        msmtp-mta \
        bsd-mailx \
        mailutils \
    ; \
    rm -rf /var/lib/apt/lists/*; \
    \
    mkdir -p /var/spool/cron/crontabs; \
    echo '*/15 * * * * php -f /var/www/html/cron.php' > /var/spool/cron/crontabs/www-data

# install the PHP extensions we need
# see https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html
RUN set -ex; \
    \
    savedAptMark="$(apt-mark showmanual)"; \
    \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        libcurl4-openssl-dev \
        libevent-dev \
        libfreetype6-dev \
        libicu-dev \
        libjpeg-dev \
        libldap2-dev \
        libmcrypt-dev \
        libmemcached-dev \
        libpng-dev \
        libpq-dev \
        libxml2-dev \
        libmagickwand-dev \
        libzip-dev \
        libwebp-dev \
        libgmp-dev \
    ; \
    \
    debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
    if [ ! -e /usr/include/gmp.h ]; then ln -s /usr/include/$debMultiarch/gmp.h /usr/include/gmp.h; fi;\
    docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp; \
    docker-php-ext-configure gmp; \
    docker-php-ext-configure ldap --with-libdir="lib/$debMultiarch"; \
    docker-php-ext-install -j "$(nproc)" \
        exif \
        gd \
        intl \
        ldap \
        opcache \
        pcntl \
        pdo_mysql \
        pdo_pgsql \
        zip \
        gmp \
    ; \
    \
# pecl will claim success even if one install fails, so we need to perform each install separately
    pecl install APCu; \
    pecl install memcached; \
    pecl install redis; \
    pecl install imagick; \
    \
    docker-php-ext-enable \
        apcu \
        memcached \
        redis \
        imagick \
    ; \
    \
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
    apt-mark auto '.*' > /dev/null; \
    apt-mark manual $savedAptMark; \
    ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \
        | awk '/=>/ { print $3 }' \
        | sort -u \
        | xargs -r dpkg-query -S \
        | cut -d: -f1 \
        | sort -u \
        | xargs -rt apt-mark manual; \
    \
    apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
    rm -rf /var/lib/apt/lists/*
#
# set recommended PHP.ini settings
# see https://docs.nextcloud.com/server/12/admin_manual/configuration_server/server_tuning.html#enable-php-opcache
RUN { \
        echo 'opcache.enable=1'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=50000'; \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.save_comments=1'; \
        echo 'opcache.revalidate_freq=1'; \
    } > /usr/local/etc/php/conf.d/opcache-recommended.ini
#
## File Upload auf 4G und Memory-Limits auf 1024M hochschieben. PHP Execution Timeout auf 60m (3600s)
RUN     { \
        echo 'file_uploads = On'; \
        echo 'upload_max_filesize = 4G'; \
        echo 'post_max_size = 4G'; \
        echo 'memory_limit = 1024M'; \
        echo 'max_execution_time = 3600'; \
        echo 'default_socket_timeout = 3600'; \
        } > /usr/local/etc/php/conf.d/upload-limits.ini; \
    \
    echo 'apc.enable_cli=1' >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \
    \
    mkdir /var/www/data; \
    chown -R www-data:root /var/www; \
    chmod -R g=u /var/www

VOLUME /var/www/html

RUN a2enmod rewrite remoteip headers;\
    {\
        echo RemoteIPHeader X-Real-IP ;\
        echo RemoteIPTrustedProxy 10.0.0.0/8 ;\
        echo RemoteIPTrustedProxy 172.16.0.0/12 ;\
        echo RemoteIPTrustedProxy 192.168.0.0/16 ;\
    } > /etc/apache2/conf-available/remoteip.conf;\
    a2enconf remoteip

ENV NEXTCLOUD_VERSION 18.0.2

RUN set -ex; \
    fetchDeps=" \
        gnupg \
        dirmngr \
    "; \
    apt-get update; \
    apt-get install -y --no-install-recommends $fetchDeps; \
    \
    curl -fsSL -o nextcloud.tar.bz2 \
        "https://download.nextcloud.com/server/releases/nextcloud-${NEXTCLOUD_VERSION}.tar.bz2"; \
    curl -fsSL -o nextcloud.tar.bz2.asc \
        "https://download.nextcloud.com/server/releases/nextcloud-${NEXTCLOUD_VERSION}.tar.bz2.asc"; \
    export GNUPGHOME="$(mktemp -d)"; \
# gpg key from https://nextcloud.com/nextcloud.asc
    gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \
    gpg --batch --verify nextcloud.tar.bz2.asc nextcloud.tar.bz2; \
    tar -xjf nextcloud.tar.bz2 -C /usr/src/; \
    gpgconf --kill all; \
    rm -r "$GNUPGHOME" nextcloud.tar.bz2.asc nextcloud.tar.bz2; \
    rm -rf /usr/src/nextcloud/updater; \
    mkdir -p /usr/src/nextcloud/data; \
    mkdir -p /usr/src/nextcloud/custom_apps; \
    chmod +x /usr/src/nextcloud/occ; \
    \
    apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false $fetchDeps; \
    rm -rf /var/lib/apt/lists/*

### msmtp CONFIG Block
## "sendmail"-Pfad auf "ssmtp" umbiegen
RUN    { \
        echo 'sendmail_path = /usr/bin/msmtp -t -C /etc/msmtprc'; \
    } > /usr/local/etc/php/conf.d/sendmail.ini
## msmtp und SMTP-Postfach konfigurieren
RUN { \
        echo '# Set defaults.'; \
        echo 'defaults'; \
        echo 'logfile /var/log/msmtp.log'; \
        echo '# Enable or disable TLS/SSL encryption.'; \
        echo 'tls on'; \
        echo 'tls_starttls on'; \
        echo 'tls_certcheck off'; \
        echo '# Setup mail to send emails via SMTP'; \
        echo 'account mail'; \
        echo 'host mein.mailserver.de'; \
        echo 'port 587'; \
        echo 'auth login'; \
        echo 'user mail@mein.mailserver.de'; \
        echo 'from mail@mein.mailserver.de'; \
        echo 'password supergeheimesmailpasswort'; \
        echo '# Set a default account'; \
        echo 'account default : mail'; \
} > /etc/msmtprc \
&& chmod 600 /etc/msmtprc && chown www-data:www-data /etc/msmtprc

COPY *.sh upgrade.exclude /
COPY config/* /usr/src/nextcloud/config/

ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]
##EOF

Puh, was für ein Brummer ^^

Schauen wir uns die Blöcke mal genauer an:

Zeile 4: Das Grundlegende Image, auf dem unser Nextcloud-Image aufbaut, ist das “php:7.4-apache”, das ein Debian-10 Image mit Apache und php in der aktuellen 7.4er Version enthält. Dieses Image wird zuerst geladen. Alle folgenden Instruktionen im Dockerfile erweitern dieses Image dann um die jeweiligen Funktionen und Programme, bis am Schluss unser fertig modifiziertes Nextcloud Image dabei heraus kommt.

Zeilen 6-13: Es werden “rsync”, “bzip2” und “busybox-static” nachinstalliert.

Zeilen 15-20: Hier installieren wir msmtp mit seinen Hilfsprogrammen, damit wir später direkt aus Nextcloud heraus Mails verschicken können. Anschließend, um Platz zu sparen, wird die apt-Liste gelöscht.

Zeilen 22+23: Oh, das hab ich bis jetzt übersehen… Was für eine clevere Lösung, dem Image einen Cron-Automatismus einzupflanzen!
Ich teste das gerade parallel mit dem WordPress Image… Wenn das funktioniert, werde ich diese Funktion dort auch benutzen. Der Grund dafür ist, dass bei diesen komplexen Anwendungen auch Hintergrundprozesse ausgeführt werden müssen. Wie zum Beispiel das “Leeren des Papierkorbs”. Da kümmert sich ein Script darum, das aber irgendwie “angestoßen” werden muss. Und das ist bei Nextcloud offenbar das selbe Problem wie bei WordPress: Sind nur wenige, vereinzelte Zugriffe von außen auf die Anwendung, ist dieses Verfahren sehr unzuverlässig. Darum löst man das Dilemma hier über einen Cronjob, der automatisch alle 15 Minuten intern über das “Betriebssystem” des Containers mittels php dieses Cron-Script aufruft und damit die Verarbeitung anstößt. Wie gesagt, sehr pfiffig. Da muss man auch erst drauf kommen…
Nachtrag: Nein, ist sie nicht :/

Zeilen 25-48: Hier werden Bibliotheken für diverse Hilfsprogramme nachgeladen. Anhand des Namens kannst Du schön erkennen, wofür die jeweils gut sind.

Zeilen 50-66: Jetzt werden eine Reihe von PHP-Erweiterungen geladen und installiert.

Zeilen 68-80: Über pecl (php extension community library) werden noch vier Ergänzungen zur PHP-Umgebung installiert. Die sind für Caching und Bild-Manipulation zuständig.
Änderung gegenüber Original: Hier habe ich die Versionsnummern entfernt. Es wird also immer die aktuellste Version gezogen.

Zeilen 81-93: Die nicht mehr benötigten Hilfsprogramme werden, um Platz zu sparen, wieder entfernt. Diese waren nur zur Installation der PHP-Module nötig.

Zeilen 95-104: Das “opcache” Modul wird konfiguriert.

Zeilen 106-114: Diese Ergänzung fügen wir jetzt ein: Wir erhöhen die Limits für die maximale Dateigröße auf 4 GB, das Memory Limit auf 1 GB und die maximale Ausführungszeit (große Dateien brauchen auch länger zum Hochladen!) auf eine Stunde (3600 Sekunden).

Zeile 116: Das “APC User Cache” Modul wird aktiviert.

Zeilen 118-120: Das Verzeichnis “/var/www/data” wird angelegt und vorbereitet.

Zeile 122: Das Volume “/var/www/html” wird der Docker-Engine zur Verarbeitung übergeben.

Zeilen 124-131: Die Apache Module “rewrite”, “remoteip” und “headers” werden aktiviert. Das “headers” Modul fügen wir hinzu, das ist normalerweise aus. Brauchen wir aber, weil wir später mit Traefik zusätzliche Header hinzufügen möchten.
Das “remoteip” Modul tauscht die IP von unserem Reverse-Proxy gegen die “echte” IP des Besuchers aus. Dazu werden unsere eigenen Docker- und lokalen Netzwerke deklariert und in einer Config-Datei gespeichert. Anschließend wird das Modul neu konfiguriert.

Zeile 133: Die Version von Nextcloud, die anschließend geladen soll, wird hier eingestellt. Sollte es eine neuere Version von Nextcloud geben, müssen wir die Versionsnummer an dieser Stelle anpassen und dann das Image erneut bauen.

Zeilen 135-160: Nextcloud wird jetzt aus den offiziellen Quellen heruntergeladen und in unser Image entpackt. Anschließend werden die Installationsdateien und nicht mehr benötigte Hilfsprogramme entfernt.

Zeilen 162-187: Für das von uns eingefügte Setup von “msmtp” (Mailversand) erzeugen wir eine Config-Datei dafür. Diese Zeilen musst Du an Deine Installation anpassen:
Zeile 178: Der Hostname von Deinem Mailserver, auf dem Du das Mailkonto für den Versand angelegt hast.
Zeilen 181+182: Hier gehört zwei Mal die volle E-Mail Adresse von Deinem Mailkonto eingetragen.
Zeile 183: Das Passwort des Mailaccounts, damit die Mails auch verschickt werden können. Die Anweisung ‘password’ bleibt stehen, Du ersetzt nur “supergeheimesmailpasswort” durch Dein eigenes Mail Passwort…

Zeilen 189-193: Das Image wird noch um ein paar Dateien ergänzt, die wir ganz am Anfang per “wget” heruntergeladen haben. Der Entrypoint wird gesetzt und zum Abschluss kommt der Befehl, der Apache hochlaufen lässt, wenn wir den Container starten.