Установка полноценного Nextcloud в LXC контейнер в Proxmox#
Если вам понравилась настоящая статья, то можете поддержать автора став спонсором на бусти (ссылка в разделе контакты).
Ссылки на другие варианты установки#
В этом видео я покажу, как с нуля установить Nextcloud — без Docker, на полноценный стек Apache, MariaDB и PHP. Безопасно и стабильно, стильно и молодежно. А также этот вариант, который я покажу сегодня, выдержит нагрузки даже малосреднего офиса, не говоря уже про домашнее использование.
Но прежде всего я хотел бы поблагодарить своих спонсоров на бусти. Ребята, огромное, большое вам спасибо за то что помогаете развитию этого канала. Канал живет исключительно с вашей помощью. А Ваша помощь идет исключительно на развитие этого канала. Ну а те кто не в курсе, на бусти, для спонсоров, я выкладываю ролики раньше, до месяца раньше, чем они появляются в открытом доступе, поэтому: если вам нравится контент, который выходит на этом канале; вы хотите поддержать развитие этого канала; может быть вы просто хотите посмотреть что-то пораньше, то ссылка на бусти и все остальные контакты, телеграмм, запасные каналы на отечественных площадках, будут в описании.
У меня на канале уже есть два ролика, посвященных непосредственно особенностям установки Nextcloud AIO и Nextcloud в докере. В том числе есть ролики про установку и связку OnlyOffice с Nextcloud, а также галереи Memories. Этот ролик будет финальным в серии. Но это не точно.
В этом ролике установим полноценный Nextcloud, но с определенными особенностями. Однако сначала, по законам жанра, я должен рассказать неофитам, что такое Nextcloud. Nextcloud — это самостоятельный облачный сервис с открытым исходным кодом, который позволяет хранить, синхронизировать и совместно использовать файлы, а также расширять функциональность за счёт встроенных приложений: календарей, видеозвонков, заметок, редакторов документов и т.д. Поэтому когда вы слышите, что Nextcloud замена коммерческим облачным хранилищам, посмотрите на этого человека снисходительно, мол, молодой ты ищо, ничего не понимаешь, салага. Некстклауд давно перешел тут границу нормальности, когда это было просто облачное хранилище. Сейчас это конкурент таким решениями как Google Workspace и аналоги.
Теперь поговорим об особенностях сегодняшней установки. Официальных сборок Некстклада всего две. Это то, что мы установим сегодня и Nextcloud AIO (там по моему вообще один человек все это собирает). Все остальное это коммюнити. В роликах про установку полноценного Nextcloud вы обычно видите, как люди ставят все в ВМ, устанавливают туда потом certbot, устанавливают nginx или ngrok, выпускают ssl сертификат. Все это мы делать не будем. Почему? У нас есть свой обратный прокси и пользоваться мы будем именно им. Устанавливать мы все будем в LXC контейнер. Сейчас суровые админы должны закричать на меня, мол, что ты делаешь, так нельзя. Нельзя, в продакшене нельзя, а дома можно. Почему LXC? Потому что мы туда можем прокинуть встроенное в процессор видеоядро, и при этом еще можно будет это же видеоядро использовать и в других контейнерах. Как прокидывается видеоядро смотрите предыдущий ролик у меня на канале.
У меня уже создан lxc контейнер, и обратный прокси настроен на выпуск сертификата на айпи по которому находится наш контейнер и порт 80. Я предполагаю, что вы знаете как настраивать конкретно ваш обратный прокси. Все, вступление закончилось.
Поехали.
Шаг 1: Обновляем систему.#
- Обновляем пакеты и настраиваем кодировку:
sudo su
apt update && apt upgrade -y
dpkg-reconfigure locales
Шаг 2: Устанавливаем Apache2 и PHP Modules.#
- Устанавливаем Apache2:
apt install apache2 -y
- Устанавливаем зависимости:
apt install php php-common libapache2-mod-php php-bz2 php-gd php-mysql php-curl php-mbstring php-imagick php-zip php-common php-curl php-xml php-json php-bcmath php-xml php-intl php-gmp zip unzip wget smbclient libmagickcore-6.q16-7-extra ffmpeg intel-media-va-driver-non-free ffmpeg va-driver-all ocl-icd-libopencl1 intel-opencl-icd vainfo intel-gpu-tools -y
- Активируем необходимые модули Apache:
a2enmod env rewrite dir mime headers setenvif ssl
- Перезапускаем, включаем и проверяем работоспособность Apache.
systemctl restart apache2
systemctl enable apache2
systemctl status apache2
- Проверяем загрузку модулей Apache:
apache2ctl -M
Шаг 3: Устанавливаем и конфигурируем MariaDB сервер#
- Install mariadb-server package:
apt install mariadb-server -y
- Заходим в MariaDB:
mysql
- Создаем базу данных и пользователя для Nextcloud и задаем необходимые разрешения пользователю:
CREATE USER 'ncloud'@'localhost' IDENTIFIED BY 'admin123';
CREATE DATABASE ncloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON ncloud.* TO 'ncloud'@'localhost';
FLUSH PRIVILEGES;
quit;
- Перезапускаем и активируем MariaDB:
systemctl restart mariadb
systemctl enable mariadb
- Проверяем, что MariaDB запущенна:
systemctl status mariadb
Шаг 4: Загружаем, разархивируем и задаем разрешения Nextcloud#
- Загружаем и разархивируем в папку /var/www/html:
cd /var/www/html
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
- Удалем ненужный архив:
rm -rf latest.zip
- Задаем права на папку:
chown -R www-data:www-data /var/www/html/nextcloud/
Шаг 5: Устанавливаем Nextcloud из командной строки#
- Запускаем приведенную ниже команду для инсталяции nextcloud (нужно внести свои данные конечно)
cd /var/www/html/nextcloud
sudo -u www-data php occ maintenance:install --database \
"mysql" --database-name "ncloud" --database-user "ncloud" --database-pass \
'admin123' --admin-user "admin" --admin-pass "password"
- Nextcloud разрешает доступ только с локального хоста, это может привести к ошибке «Доступ через недоверенный домен». Нам нужно разрешить доступ к Nextcloud, используя IP-адрес или доменное имя
sudo nano /var/www/html/nextcloud/config/config.php
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'nextcloud.your_domain.ru', // we Included the Sub Domain
),
'overwritehost' => 'nextcloud.your_domain.ru',
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://nextcloud.your_domain.ru',
'trusted_proxies' =>
array (
0 => '192.168.0.0/16',
1 => '172.16.0.0/12',
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,
- Настройте Apache для загрузки Nextcloud из папки /var/www/html/nextcloud:
nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/nextcloud
<Directory /var/www/html/nextcloud>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ServerName nextcloud.yourdomain.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>
- Перезапускаем Apache:
systemctl restart apache2
- Теперь перейдите в браузер и введите http://[ip или полное доменное имя] сервера. Появится страница входа в Nextcloud, показанная ниже.
Шаг 6: Установка и настройка PHP-FPM с Apache#
- Установка PHP-FPM: #проверьте актуальную версию
apt install php8.3-fpm
- Проверьте, запущен ли PHP-FPM, его версию и создан ли сокет:
service php8.3-fpm status
php-fpm8.3 -v
ls -la /var/run/php/php8.3-fpm.sock
- Отключите mod_php и модуль prefork:
a2dismod php8.3
a2dismod mpm_prefork
- Активируйте PHP-FPM:
a2enmod mpm_event proxy_fcgi setenvif
a2enconf php8.3-fpm
- Перезапустите Apache, чтобы перезагрузить все модули и конфигурации:
systemctl restart apache2
Теперь, чтобы настроить размер загружаемого файла и производительность, нам нужно изменить некоторые параметры php.ini, перечисленные ниже в файле /etc/php/8.3/fpm/php.ini. Вы можете задать собственные значения в зависимости от вашей среды.
upload_max_filesize = 64M
post_max_size = 96M
memory_limit = 512M
max_execution_time = 600
max_input_vars = 3000
max_input_time = 1000
- Проверьте текущее значение:
grep -E "upload_max_filesize|post_max_size|memory_limit|max_execution_time|max_input_vars|max_input_time" /etc/php/8.3/fpm/php.ini
- Вместо ручного внесения изменений вы можете выполнить следующую команду для немедленного внесения изменений. Это сэкономит время.
sed -i 's/^upload_max_filesize.*/upload_max_filesize = 64M/; s/^post_max_size.*/post_max_size = 96M/; 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.3/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.3/fpm/php.ini
Теперь нам нужно обновить конфигурации пула PHP-FPM в /etc/php/8.3/fpm/pool.d/ www.conf. Ниже приведены некоторые оптимальные значения, но вам следует задать свои собственные значения.
pm.max_children = 64
pm.start_servers = 16
pm.min_spare_servers = 16
pm.max_spare_servers = 32
- Проверим текущии значения:
grep -E "pm.max_children|pm.start_servers|pm.min_spare_servers|pm.max_spare_servers" /etc/php/8.3/fpm/pool.d/www.conf
- Измените все значения одновременно с помощью следующей команды:
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.3/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.3/fpm/pool.d/www.conf
- Теперь перезапустите PHP-FPM, чтобы применить все изменения:
service php8.3-fpm restart
Теперь вставьте приведенный ниже код в файл конфигурации сайта Apache по умолчанию /etc/apache2/sites-enabled/000-default.conf, он укажет Apache передать обработку PHP-файла PHP-FPM.
<FilesMatch ".php$">
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
- После предоставления кода конфигурация сайта Apache по умолчанию будет выглядеть так, как показано ниже::
nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/nextcloud
<Directory /var/www/html/nextcloud>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch ".php$">
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
ServerName nextcloud.your_domain.ru
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
- Теперь перезапустите Apache, чтобы изменения вступили в силу:
systemctl restart apache2
Шаг 7: Создайте страницу info.php для проверки функций PHP (опционально. После завершения проверки, файл надо удалить)#
Создайте страницу info.php, она покажет нам, включены ли PHP-FPM, OPCache, APCu в PHP..
cd /var/www/html/nextcloud
nano info.php
<?php phpinfo(); ?>
Теперь перейдите по адресу [URL]/info.php. Если PHP-FPM включён в PHP, будет показано «Server API FPM/FastCGI».
Шаг 8: Включите OPCache в PHP#
- Включите OPCache в PHP: Проверьте, запущен ли он, с помощью файла [URL]/info.php, который мы создали ранее.
JIT-компиляция (Just-In-Time) Opcache — важная функция. JIT-компиляция повышает производительность PHP, компилируя код в машинный язык во время выполнения, а не интерпретируя его при каждом запуске. Это может значительно повысить производительность ресурсоёмких задач. Поэтому её включение будет очень эффективным для повышения производительности Nextcloud.
nano /etc/php/8.3/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
- Перезапустите PHP-FPM, чтобы изменения вступили в силу:
service php8.3-fpm restart
Шаг 9: Включите APCu в PHP#
- Включить APCu в PHP:
apt install php8.3-apcu
nano /etc/php/8.3/fpm/conf.d/20-apcu.ini
extension=apcu.so
apc.enable_cli=1
Теперь перезапустите PHP-FPM и Apache.
systemctl restart php8.3-fpm
systemctl restart apache2
Теперь проверьте [URL]/info.php еще раз, он покажет «Поддержка APCu включена» (“APCu support Enabled”).
- Настройте Nextcloud на использование APCu для кэширования памяти:
nano /var/www/html/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',
Шаг 10: Установка и настройка Redis Cache#
Установка и настройка Redis Cache В Nextcloud Redis используется для локального и распределенного кэширования, а также для транзакционной блокировки файлов. Для локального кэширования мы использовали APCu, который быстрее Redis. Redis будет использоваться для блокировки файлов. Механизм транзакционной блокировки файлов Nextcloud блокирует файлы, предотвращая их повреждение во время нормальной работы.
Установите Redis Server и расширение Redis php
apt install redis-server php-redis -y
- Запустите и включите службу Redis.
systemctl start redis-server
systemctl enable redis-server
systemctl status redis-server
- Настройте Redis для использования Unix Socket вместо портов
nano /etc/redis/redis.conf
port 0
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
- Добавьте пользователя Apache в группу Redis
usermod -a -G redis www-data
- Настройте Nextcloud для использования Redis для блокировки файлов
nano /var/www/html/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,
],
- Включите блокировку сеанса Redis в PHP
nano /etc/php/8.3/fpm/php.ini
redis.session.locking_enabled=1
redis.session.lock_retries=-1
redis.session.lock_wait_time=10000
- Перезапустите Redis, PHP-FPM и Apache
systemctl restart redis-server
systemctl restart php8.3-fpm
systemctl restart apache2
- Вы можете проверить, включены ли функции в PHP
nextcloud-ubuntu-24.04-redis
Redis is Installed for Nextcloud
https://help.nextcloud.com/t/installing-redis-for-memcache/162599/6
Я предполагаю, что вы используете traefik в качестве обратного прокси-сервера, и вам не нужен certbot. Поэтому мы добавили соответствующие значения в /etc/apache2/sites-enabled/000-default.conf.
Включаем Pretty URL’s:
nano /var/www/html/nextcloud/config/config.php
'htaccess.RewriteBase' => '/',
Эта команда обновит файл .htaccess для переадресации
sudo -u www-data php --define apc.enable_cli=1 /var/www/html/nextcloud/occ maintenance:update:htaccess
- Другие необходимые команды
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:repair --include-expensive
sudo -u www-data php /var/www/html/nextcloud/occ db:add-missing-indices
sudo -u www-data php /var/www/html/nextcloud/occ config:system:set maintenance_window_start --type=integer --value=1
sudo crontab -u www-data -e
*/5 * * * * php -f /var/www/html/nextcloud/cron.php
sudo -u www-data php /var/www/html/nextcloud/occ files:scan --all
sudo -u www-data php /var/www/html/nextcloud/occ app:update --all

