↓ Перейти к основному содержимому
  1. Posts/
  2. Nextcloud/

Nextcloud в Proxmox: Полная установка в LXC без Docker

··2948 слов·14 минут· loading · loading · ·
Stilicho2011
Автор
Stilicho2011
Пишу о homelab, self-hosting, автоматизации и open-source решениях
Оглавление
Nextcloud - This article is part of a series.
Part : This Article

Установка полноценного Nextcloud в LXC контейнер в Proxmox
#

Если вам понравилась настоящая статья, то можете поддержать автора став спонсором на бусти (ссылка в разделе контакты).


В этом видео я покажу, как с нуля установить Nextcloud - без Docker, на полноценный стек Apache, MariaDB и PHP. Безопасно и стабильно, стильно и молодежно. Вариант, который я покажу сегодня, выдержит нагрузки даже малосреднего офиса, не говоря уже про домашнее использование.

Но прежде всего я хотел бы поблагодарить своих спонсоров на бусти. Ребята, огромное, большое вам спасибо за то что помогаете развитию этого канала. Канал живет исключительно с вашей помощью. А Ваша помощь идет исключительно на развитие этого канала. Ну а те кто не в курсе, на бусти, для спонсоров, я выкладываю ролики раньше, до месяца раньше, чем они появляются в открытом доступе, поэтому: если вам нравится контент, который выходит на этом канале; вы хотите поддержать развитие этого канала; может быть вы просто хотите посмотреть что-то пораньше, то ссылка на бусти и все остальные контакты, телеграмм, запасные каналы на отечественных площадках, будут в описании.

У меня на youtube - канале уже есть два ролика, посвященных непосредственно особенностям установки Nextcloud AIO и Nextcloud в докере. В том числе есть ролики про установку и связку OnlyOffice с Nextcloud, а также галереи Memories. Этот ролик будет финальным в серии. Но это не точно.

Ссылки на другие варианты установки
#

В этом ролике установим полноценный Nextcloud, но с определенными особенностями. Однако сначала, по законам жанра, я должен рассказать неофитам, что такое Nextcloud. Nextcloud - это облачный сервис с открытым исходным кодом, который позволяет хранить, синхронизировать и совместно использовать файлы, а также расширять функциональность за счёт встроенных приложений: календарей, видеозвонков, заметок, редакторов документов и т.д. Поэтому когда вы слышите, что Nextcloud замена коммерческим облачным хранилищам, посмотрите на этого человека снисходительно, мол, молодой ты ищо, ничего не понимаешь, салага. Некстклауд давно перешел тут границу нормальности, когда это было просто облачное хранилище. Сейчас это конкурент таким решениям, как Google Workspace и аналоги.

Теперь поговорим об особенностях сегодняшней установки. Официальных сборок Некстклауда всего две. Это то, что мы установим сегодня и Nextcloud AIO (там, по-моему, вообще один человек все собирает). Всё остальное - это заслуга коммюнити. В роликах про установку полноценного Nextcloud вы обычно видите, как люди ставят все в ВМ, устанавливают туда потом certbot, устанавливают nginx или ngrok, выпускают ssl сертификат. Все это мы делать не будем. Почему? У нас есть свой обратный прокси и пользоваться мы будем именно им. Устанавливать мы все будем в LXC контейнер. Сейчас суровые админы должны закричать на меня, мол, что ты делаешь, так нельзя. Нельзя. В продакшене нельзя. Дома можно. Почему LXC? Потому что мы туда можем прокинуть встроенное в процессор видеоядро, и при этом еще можно будет это же видеоядро использовать и в других контейнерах. Как прокидывается видеоядро, смотрите ролик у меня на канале.

У меня уже создан lxc контейнер, и обратный прокси настроен на выпуск сертификата на айпи, по которому находится наш контейнер, и порт 80. Я предполагаю, что вы знаете, как настраивать конкретно ваш обратный прокси. На этом вступление закончилось.

Поехали.

Note

Текст статьи с момента выхода видео немного дополнен: контейнер теперь непривилегированный (unprivileged) LXC, data-директория может лежать на NFS-шаре вместо локального диска, PHP обновлён до 8.5, а в качестве базы данных, как и в видео, по умолчанию используется MariaDB - но добавлен и альтернативный вариант с внешним PostgreSQL, если он у вас уже развёрнут отдельно. Общая логика установки та же, что и в ролике, часть путей и версий пакетов - актуализирована.

Шаг 1. Пробрасываем NFS-шару в LXC до установки Nextcloud
#

Этот шаг нужен, только если данные Nextcloud (data-директория) должны лежать не на локальном диске контейнера, а на отдельном NFS-хранилище - например, если диск под LXC небольшой, а фото и файлы предполагается копить в объёме. Если вас устраивает локальный диск контейнера, как в видео, - шаг можно пропустить и сразу переходить к следующему.

Сделать это нужно до установки Nextcloud, чтобы data-директория сразу создавалась на шаре, а не на локальной файловой системе контейнера, откуда её потом пришлось бы переносить.

  1. В конфиге контейнера (/etc/pve/lxc/<CTID>.conf на хосте Proxmox) или через GUI: Контейнер → Resources → Add → Mount Point - выбрать нужный NFS-storage, указать точку монтирования внутри LXC, например:

    mp0: <storage-id>:<volume-или-путь>,mp=/var/www/nextcloud/data
  2. Решить вопрос с UID/GID. Если контейнер непривилегированный, www-data внутри контейнера (UID 33) наружу, на стороне Proxmox-хоста, мапится в сдвинутый UID 100033 - и NFS-сервер должен понимать, кому в итоге принадлежат файлы. Два рабочих варианта:

    • Вариант А - lxc.idmap в конфиге контейнера, чтобы конкретно UID/GID 33 не сдвигался при проходе через границу контейнера:
      lxc.idmap: u 0 100000 33
      lxc.idmap: u 33 33 1
      lxc.idmap: u 34 100034 65502
      lxc.idmap: g 0 100000 33
      lxc.idmap: g 33 33 1
      lxc.idmap: g 34 100034 65502
    • Вариант Б - ничего не трогать в идентификаторах контейнера, а заранее выставить chown 100033:100033 на директорию с данными прямо на стороне NFS-сервера.
  3. После монтирования проверить права уже внутри самого контейнера:

    mkdir -p /var/www/nextcloud/data
    chown www-data:www-data /var/www/nextcloud/data

Шаг 2. Обновляем систему
#

Обновляем пакеты и настраиваем кодировку:

sudo apt update && sudo apt upgrade -y
sudo dpkg-reconfigure locales

Шаг 3. Устанавливаем Apache2 и PHP-модули
#

Устанавливаем Apache2:

sudo apt install apache2 -y

Устанавливаем зависимости - в списке сразу оба драйвера БД, php-mysql (для MariaDB, как в видео) и php-pgsql (на случай, если выберете альтернативу с PostgreSQL на следующем шаге), лишний из них ничему не мешает:

sudo apt install php php-common libapache2-mod-php php-bz2 php-gd php-mysql php-pgsql \
php-curl php-mbstring php-imagick php-zip php-xml php-json php-bcmath \
php-intl php-gmp zip unzip wget smbclient libmagickcore-7.q16-10-extra ffmpeg -y

Активируем нужные модули Apache:

sudo a2enmod env rewrite dir mime headers setenvif ssl

Перезапускаем, включаем автозапуск и проверяем работоспособность Apache:

sudo systemctl restart apache2
sudo systemctl enable apache2
sudo systemctl status apache2

Проверяем загрузку модулей:

sudo apache2ctl -M

Шаг 4. База данных: MariaDB (как в видео) или внешний PostgreSQL
#

Основной вариант - MariaDB внутри того же контейнера
#

Устанавливаем пакет:

sudo apt install mariadb-server -y

Заходим в MariaDB:

sudo mysql

Создаём базу данных и пользователя для Nextcloud, задаём права:

CREATE USER 'ncloud'@'localhost' IDENTIFIED BY 'ВАШ_ПАРОЛЬ';
CREATE DATABASE ncloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON ncloud.* TO 'ncloud'@'localhost';
FLUSH PRIVILEGES;
quit;

Перезапускаем и включаем автозапуск MariaDB:

sudo systemctl restart mariadb
sudo systemctl enable mariadb

Проверяем, что служба запущена:

sudo systemctl status mariadb
Tip

Альтернатива - внешний PostgreSQL. Если вместо локальной MariaDB хочется вынести базу на отдельный, уже развёрнутый сервер PostgreSQL (например, тот же, что используется под другие сервисы) - шаг выглядит иначе, MariaDB в этом случае вообще не ставим:

  1. Login/Group Role (пользователь БД) в pgAdmin: правый клик на Login/Group Roles → Create → Login/Group Role → General → Name: ncloud → Definition → Password: задать пароль → Privileges → включить Can login? (обязательно).
  2. Database: правый клик на Databases → Create → Database → General → Database: nextcloud → Owner: выбрать ncloud - он автоматически получит все права на эту базу.
  3. Проверить кодировку - на вкладке General/Advanced должна быть UTF8 (Nextcloud требует именно её).
  4. Проверить на стороне Postgres-сервера: listen_addresses в postgresql.conf должен слушать не только localhost (grep listen_addresses /etc/postgresql/*/main/postgresql.conf, при необходимости - * и systemctl restart postgresql), а pg_hba.conf должен разрешать подключение с IP-адреса контейнера Nextcloud. Плюс правило firewall на TCP-порт 5432 между контейнером Nextcloud и сервером Postgres.

Команда установки Nextcloud на шаге 6 в этом случае тоже будет отличаться - см. врезку там же.

Шаг 5. Загружаем Nextcloud
#

cd /var/www/
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
rm -rf latest.zip
chown -R www-data:www-data /var/www/nextcloud/

Шаг 6. Устанавливаем Nextcloud из командной строки
#

Для основного варианта с MariaDB:

cd /var/www/nextcloud
sudo -u www-data php occ maintenance:install --database \
"mysql" --database-name "ncloud" --database-user "ncloud" --database-pass \
'ВАШ_ПАРОЛЬ' --data-dir "/var/www/nextcloud/data" \
--admin-user "stilicho" --admin-pass "ВАШ_АДМИН_ПАРОЛЬ"
Tip

Если вместо MariaDB выбрали альтернативу с внешним PostgreSQL (шаг 4) - команда почти та же, но с pgsql вместо mysql и обязательным --database-host:

cd /var/www/nextcloud
sudo -u www-data php occ maintenance:install --database \
"pgsql" --database-host "IP_ИЛИ_ХОСТ_POSTGRES" --database-name "nextcloud" \
--database-user "ncloud" --database-pass \
'ВАШ_ПАРОЛЬ' --data-dir "/var/www/nextcloud/data" \
--admin-user "stilicho" --admin-pass "ВАШ_АДМИН_ПАРОЛЬ"

Если на шаге 1 подключали NFS-шару под data, --data-dir в обоих вариантах указан явно на путь, где она смонтирована - если этого не сделать, Nextcloud создаст data на локальном диске контейнера, и потом придётся переносить её руками.

Шаг 7. Правим config.php
#

nano /var/www/nextcloud/config/config.php
'trusted_domains' =>
array (
  0 => 'localhost',
  1 => 'next.stilicho.ru',
),
'overwritehost' => 'next.stilicho.ru',
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://next.stilicho.ru',
'trusted_proxies' =>
array (
  0 => '172.16.0.0/12',
  1 => '192.168.0.0/16',
  2 => '10.0.0.0/8',
  3 => 'fc00::/7',
  4 => 'fe80::/10',
  5 => '2001:db8::/32',
),
'default_phone_region' => 'RU',
'allow_local_remote_servers' => true

Шаг 8. Настраиваем Apache (первичный VirtualHost)
#

nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/nextcloud

        <Directory /var/www/nextcloud>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

        ServerName next.stilicho.ru
        <IfModule mod_headers.c>
          Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
        </IfModule>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Шаг 9. Переключаемся на PHP-FPM
#

apt install php8.5-fpm
service php8.5-fpm status
php-fpm8.5 -v
ls -la /var/run/php/php8.5-fpm.sock
a2dismod php8.5
a2dismod mpm_prefork
a2enmod mpm_event proxy_fcgi setenvif
a2enconf php8.5-fpm
systemctl restart apache2

Настройки PHP под большие файлы
#

sed -i 's/^upload_max_filesize.*/upload_max_filesize = 16G/; s/^post_max_size.*/post_max_size = 16G/; s/^memory_limit.*/memory_limit = 512M/; s/^max_execution_time.*/max_execution_time = 600/; s/^;max_input_vars.*/max_input_vars = 3000/; s/^max_input_time.*/max_input_time = 1000/' /etc/php/8.5/fpm/php.ini

или для очень больших файлов:

sed -i 's/^upload_max_filesize.*/upload_max_filesize = 16G/; s/^post_max_size.*/post_max_size = 16G/; s/^memory_limit.*/memory_limit = 2048M/; s/^max_execution_time.*/max_execution_time = 3600/; s/^;max_input_vars.*/max_input_vars = 3600/; s/^max_input_time.*/max_input_time = 3600/' /etc/php/8.5/fpm/php.ini

Настройки пула PHP-FPM
#

sed -i 's/^pm.max_children = .*/pm.max_children = 64/; s/^pm.start_servers = .*/pm.start_servers = 16/; s/^pm.min_spare_servers = .*/pm.min_spare_servers = 16/; s/^pm.max_spare_servers = .*/pm.max_spare_servers = 32/' /etc/php/8.5/fpm/pool.d/www.conf

или:

sed -i 's/^pm.max_children = .*/pm.max_children = 70/; s/^pm.start_servers = .*/pm.start_servers = 20/; s/^pm.min_spare_servers = .*/pm.min_spare_servers = 20/; s/^pm.max_spare_servers = .*/pm.max_spare_servers = 60/' /etc/php/8.5/fpm/pool.d/www.conf
service php8.5-fpm restart
Warning

Gateway Timeout при массовой одновременной загрузке. Если заливать много данных сразу с нескольких источников (например, телефон + компьютер одновременно), все pm.max_children воркеров могут оказаться заняты параллельно (каждая загрузка + генерация превью/blurhash на файл держит воркер), и Apache начнёт отдавать 502/504 Gateway Timeout. Быстрое решение - сбросить зависшую очередь:

systemctl restart php8.5-fpm

Проверить количество активных процессов:

ps aux | grep php-fpm | wc -l

Если число близко к pm.max_children - это подтверждает перегрузку, а не поломку конфигурации. При регулярных таких пиках можно поднять pm.max_children ещё выше (следить за free -h, чтобы не уйти в своп) либо просто разводить крупные загрузки по времени.

Обновляем VirtualHost под FPM
#

nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/nextcloud

        <Directory /var/www/nextcloud>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

        <FilesMatch ".php$">
          SetHandler "proxy:unix:/var/run/php/php8.5-fpm.sock|fcgi://localhost/"
        </FilesMatch>

        ServerName next.stilicho.ru
        <IfModule mod_headers.c>
          Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
        </IfModule>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
systemctl restart apache2

Проверка FPM через info.php (удалить после проверки!)
#

cd /var/www/nextcloud
sudo nano info.php
<?php phpinfo(); ?>

Открыть https://next.stilicho.ru/info.php - должно показать «Server API: FPM/FastCGI».

Шаг 10. OPCache
#

nano /etc/php/8.5/fpm/conf.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=12000
opcache.memory_consumption=512
opcache.save_comments=1
opcache.revalidate_freq=60
opcache.jit=on
opcache.jit = 1255
opcache.jit_buffer_size = 256M
service php8.5-fpm restart

Шаг 11. APCu
#

apt install php8.5-apcu
nano /etc/php/8.5/fpm/conf.d/20-apcu.ini
extension=apcu.so
apc.enable_cli=1
apc.shm_size=128M

apc.shm_size по умолчанию 32M - для инстанса с Memories/recognize и большой библиотекой файлов этого мало, кэш быстро переполняется (появится предупреждение в «Проверке безопасности и параметров»). Ставим сразу 128M, при необходимости можно поднять выше.

systemctl restart php8.5-fpm
systemctl restart apache2

Проверить на info.php - «APCu support Enabled».

nano /var/www/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',

Шаг 12. Redis (кэш + блокировка файлов)
#

apt install redis-server php-redis -y
systemctl start redis-server
systemctl enable redis-server
nano /etc/redis/redis.conf
port 0
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
usermod -aG redis www-data
nano /var/www/nextcloud/config/config.php
'filelocking.enabled' => 'true',
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => [
     'host'     => '/var/run/redis/redis.sock',
     'port'     => 0,
     'dbindex'  => 0,
     'password' => '',
     'timeout'  => 1.5,
],
nano /etc/php/8.5/fpm/php.ini
redis.session.locking_enabled=1
redis.session.lock_retries=-1
redis.session.lock_wait_time=10000
systemctl restart redis-server
systemctl restart php8.5-fpm
systemctl restart apache2

Шаг 13. Pretty URLs
#

ffmpeg уже установлен в шаге 3, повторно ставить не нужно.

nano /var/www/nextcloud/config/config.php
'htaccess.RewriteBase' => '/',
sudo -u www-data php --define apc.enable_cli=1 /var/www/nextcloud/occ maintenance:update:htaccess

Шаг 14. Финальные occ-команды
#

sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
sudo -u www-data php /var/www/nextcloud/occ config:system:set maintenance_window_start --type=integer --value=1
sudo crontab -u www-data -e
*/5  *  *  *  * php -f /var/www/nextcloud/cron.php
sudo -u www-data php /var/www/nextcloud/occ recognize:download-models
sudo -u www-data php /var/www/nextcloud/occ memories:places-setup
sudo -u www-data php /var/www/nextcloud/occ memories:index
sudo -u www-data php /var/www/nextcloud/occ files:scan --unscanned --all

Шаг 15. notify_push
#

Сначала ставим само приложение notify_push из App Store - вместе с ним ставятся готовые бинарники под разные архитектуры:

sudo -u www-data php /var/www/nextcloud/occ app:install notify_push

Копируем бинарник под свою архитектуру (для x86_64/amd64):

cp /var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push /usr/local/bin/
chown root:root /usr/local/bin/notify_push
chmod 755 /usr/local/bin/notify_push

Если архитектура ARM (например, для мини-ПК на ARM) - путь будет apps/notify_push/bin/aarch64/notify_push. Проверить доступные варианты: ls /var/www/nextcloud/apps/notify_push/bin/.

nano /etc/systemd/system/notify_push.service
[Unit]
Description=Push daemon for Nextcloud clients
Documentation=https://github.com/nextcloud/notify_push
After=network.target redis.service php8.5-fpm.service apache2.service
Requires=redis.service

[Service]
Environment=PORT=7867
Environment=NEXTCLOUD_URL=https://next.stilicho.ru

ExecStart=/usr/local/bin/notify_push /var/www/nextcloud/config/config.php

User=www-data
Group=www-data

Type=notify

Restart=always
RestartSec=5

NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full
ProtectHome=read-only

[Install]
WantedBy=multi-user.target

mariadb.service убран из After= - в этой схеме БД внешняя, локального сервиса СУБД в этом контейнере нет.

systemctl daemon-reload
systemctl start notify_push
systemctl enable notify_push
systemctl status notify_push
nano /var/www/nextcloud/config/config.php
'push' => array(
    'base_endpoint' => 'https://next.stilicho.ru/push',
),
sudo -u www-data php /var/www/nextcloud/occ notify_push:setup http://127.0.0.1:7867

Если написать команду без адреса - wizard часто выдаёт default port(7867) is in use, так как сервис уже запущен (это не ошибка, а нормальное состояние - просто укажите адрес явно, как выше).

Проверить итоговое состояние в любой момент:

sudo -u www-data php /var/www/nextcloud/occ notify_push:self-test

Все пункты должны быть зелёными, кроме using unencrypted http for push server - это ожидаемо для связки localhost + внешний HTTPS через Traefik, не критично.

Шаг 16. trusted_proxies и forwarded_for_headers (финальная правка под реальную топологию)
#

Раз перед LXC стоит Traefik (и, возможно, ещё один узел до него) - одного trusted_proxies недостаточно: без forwarded_for_headers Nextcloud не знает, из какого заголовка брать реальный IP клиента, и видит вместо него IP самого Traefik. Это приводит к ложным срабатываниям защиты от перебора паролей (все клиенты «выглядят» как один и тот же IP).

nano /var/www/nextcloud/config/config.php
'trusted_proxies' =>
array (
  0 => '172.16.0.0/12',
  1 => '192.168.0.0/16',
  2 => '10.0.0.0/8',
  3 => 'fc00::/7',
  4 => 'fe80::/10',
  5 => '2001:db8::/32',
  6 => '127.0.0.1',
  7 => '::1',
),
'forwarded_for_headers' => ['HTTP_X_FORWARDED_FOR'],
systemctl restart apache2
systemctl restart php8.5-fpm

Если после этого в nextcloud.log всё ещё виден IP прокси, а не реального клиента - сбросить текущую блокировку по IP прокси:

sudo -u www-data php /var/www/nextcloud/occ security:bruteforce:reset IP_ПРОКСИ

Доверенный прокси для Traefik (важно для notify_push и общей корректности)
#

Если в статической конфигурации Traefik используется trustedIPs (например, YAML-anchor со списком Cloudflare-диапазонов) - добавить туда IP внутренних узлов цепочки (например, входной прокси перед основным Traefik), иначе X-Forwarded-For будет обрезаться, и notify_push (и сам Nextcloud) не увидят реальный IP:

entryPoints:
  web:
    address: ":80"
    forwardedHeaders:
      trustedIPs: &trustedIps
        # ...существующие диапазоны (например Cloudflare)...
        - 192.168.x.x/32   # внутренний узел перед Traefik - подставить свой IP
        - 127.0.0.1/32
  websecure:
    address: ":443"
    forwardedHeaders:
      trustedIPs: *trustedIps

Перезапустить Traefik после правки.

Шаг 17. Memories (фото/видео) + go-vod транскодирование
#

sudo -u www-data php /var/www/nextcloud/occ app:install memories

Для видео-транскодирования (HLS) отдельно ставить go-vod не нужно - на bare-metal (без Docker) Memories сам скачивает и запускает встроенный бинарник, если на хосте есть ffmpeg (уже установлен в шаге 3). Включить: Настройки → Администрирование → Memories → Video streaming → Enable transcoding.

Реверс-геокодирование (по данным OpenStreetMap, использует нативную поддержку геометрии Postgres):

sudo -u www-data php /var/www/nextcloud/occ memories:places-setup

Шаг 18. Preview Generator (фоновая генерация превью)
#

sudo -u www-data php /var/www/nextcloud/occ app:install previewgenerator
sudo -u www-data php /var/www/nextcloud/occ config:app:set previewgenerator squareSizes --value="32 256"
sudo -u www-data php /var/www/nextcloud/occ config:app:set previewgenerator widthSizes --value="256 384 512 1024 2048 4096"
sudo -u www-data php /var/www/nextcloud/occ config:app:set previewgenerator heightSizes --value="256 384 512 1024 2048 4096"
sudo -u www-data php /var/www/nextcloud/occ preview:generate-all
Warning

Известный баг на версии 34.0.3.x (актуально на момент настоящей редакции статьи): preview:generate-all/pre-generate падают с ошибкой Ambiguous column: file_id на PostgreSQL (и на MariaDB тоже). Баг подтверждён и уже исправлен в исходниках (stable34), но фикс попадёт только в 34.0.4, которая на момент установки ещё не вышла финальным релизом. Пока не вышла - фоновая пре-генерация не работает, превью создаются по требованию при первом открытии файла (медленнее, но не критично). Обновиться командой occ upgrade нельзя, пока Nextcloud сам не увидит новую версию - нужно вручную скачать новый архив с download.nextcloud.com и заменить файлы (rsync --exclude=config --exclude=data), когда 34.0.4 выйдет.

Добавить в тот же cron, что и cron.php (шаг 14):

sudo crontab -u www-data -e
*/10  *  *  *  * php -f /var/www/nextcloud/occ preview:pre-generate

Проблема: превью HEIC-фото (iPhone) не генерируются
#

Если среди файлов есть фото с iPhone в формате .HEIC, в nextcloud.log может сыпаться примерно такое (особенно если параллельно включено приложение recognize):

Ошибка core ImagickException
Decoder plugin generated an error: Unspecified (7.0) `/путь/к/файлу.HEIC' @ error/heic.c/IsHEIFSuccess/202
Предупреждение recognize
Failed to generate preview of <id> with dimension 1024 with gdlib: Could not load image for preview with gdlib

Диагностика - зайти на сервер и попробовать декодировать файл напрямую, в обход Nextcloud/PHP:

sudo apt install imagemagick -y
identify -list format | grep -i heic

Если формат в списке присутствует (обычно с пометкой r--, то есть только чтение) - делегат в принципе есть, но декодирование всё равно может падать. Проверить конкретный файл:

identify -verbose '/путь/к/файлу.HEIC' 2>&1 | head -30

Если вылетает та же ошибка IsHEIFSuccess - причина почти наверняка в отсутствующем HEVC-декодере для libheif. Дело в том, что HEIC с iPhone кодируется кодеком HEVC (H.265), а пакет libheif1 из репозитория Ubuntu по умолчанию тянет только плагины для AV1 (libheif-plugin-aomdec/aomenc, нужны для AVIF) - декодера HEVC среди них нет:

dpkg -l | grep -i heif

Проверить и поставить недостающий декодер:

apt-cache search libheif-plugin
sudo apt install libheif-plugin-libde265 -y

Либо, чтобы не гадать с конкретными вариантами кодирования у разных моделей iPhone, поставить сразу все плагины пакетом:

sudo apt install libheif-plugins-all -y

Проверить, что файл теперь читается (без ошибок, с корректными размерами):

identify '/путь/к/файлу.HEIC'

Перезапустить веб-стек и перегенерировать превью:

sudo systemctl restart php8.5-fpm apache2
sudo -u www-data php /var/www/nextcloud/occ preview:generate-all
Note

php-imagick использует системную libmagickcore, которая в свою очередь динамически подгружает libheif1 - переустанавливать сам imagemagick/php-imagick не нужно, достаточно доустановить недостающий плагин-декодер и перезапустить PHP-FPM.

Nextcloud - This article is part of a series.
Part : This Article

Related

Установка Nextcloud AIO: простое и мощное облако в Docker

··1474 слов·7 минут· loading · loading
Пошаговая инструкция по установке и настройке Nextcloud AIO для развертывания личного облачного сервера. Рассмотрены установка через Docker, настройка пользователей, хранилища и веб-интерфейса, а также интеграция с мобильными устройствами.

Установка Hugo + тема Blowfish с нуля: подробная инструкция

··2445 слов·12 минут· loading · loading
Разворачиваю Hugo Extended и тему Blowfish с чистого листа: от подготовки LXC и установки Hugo до создания сайта, подключения темы, настройки структуры контента и первой production-сборки.

Gotify: свой собственный сервер push-уведомлений для гипервизора и не только

·2190 слов·11 минут· loading · loading
Устанавливаю Gotify в Docker и настраиваю push-уведомления от Proxmox VE, CrowdSec и Komodo - отдельный канал для инфраструктурных событий, без единого сообщения в общем чате Telegram.