Установка полноценного Nextcloud в LXC контейнер в Proxmox#
В этом руководстве я подробно объясню, как установить NextCloud на Ubuntu 24.04 LTS без Docker, на полноценный стек Apache, MariaDB и PHP. Это подробное пошаговое руководство, с упором на повышении производительности и безопасности системы. Вариант, который я покажу сегодня, выдержит нагрузки даже малосреднего офиса, не говоря уже про домашнее использование.
Но прежде всего я хотел бы поблагодарить своих спонсоров на бусти. Ребята, огромное, большое вам спасибо за то что помогаете развитию этого канала. Канал живет исключительно с вашей помощью. А Ваша помощь идет исключительно на развитие этого канала. Ну а те кто не в курсе, на бусти, для спонсоров, я выкладываю ролики раньше, до месяца раньше, чем они появляются в открытом доступе, поэтому: если вам нравится контент, который выходит на этом канале; вы хотите поддержать развитие этого канала; может быть вы просто хотите посмотреть что-то пораньше, то ссылка на бусти и все остальные контакты, телеграмм, запасные каналы на отечественных площадках, будут в описании.
У меня на youtube канале уже есть два ролика, посвященных непосредственно особенностям установки Nextcloud AIO и Nextcloud в докере. В том числе есть ролики про установку и связку OnlyOffice с Nextcloud, а также галереи Memories. Этот ролик будет финальным в серии Nextcloud.
Ссылки на другие варианты установки Nextcloud AIO#
В этом ролике установим полноценный Nextcloud, но с определенными особенностями. Однако сначала, по законам жанра, я должен рассказать неофитам, что такое Nextcloud
Nextcloud - это самостоятельная платформа для совместной работы, предназначенная для повышения производительности с помощью интегрированных сервисов, таких как Files, Talk, Groupware и Office. Он предлагает функциональность, аналогичную Dropbox, Office 365 или Google Drive, при использовании с офисными пакетами, такими как Collabora Online или OnlyOffice.
Поэтому когда вы слышите, что Nextcloud замена коммерческих облачных хранилищ, посмотрите на этого человека снисходительно, мол, “молодой ищо, ничего не понимает”. Некстклауд давно перешел тут границу нормальности, когда это было просто облачное хранилище. Сейчас это конкурент таким решениями как Google Workspace и Office365.
Теперь поговорим об особенностях сегодняшней установки.
В роликах про установку полноценного Nextcloud вы увидите, как люди ставят все в вирутальную машину у внешнего хостера, устанавливают туда потом certbot, устанавливают nginx или ngrok, выпускают ssl сертификат.
Все это мы делать не будем. Почему?
У нас есть свой обратный прокси. И пользоваться мы будем им.
Устанавливать мы все будем в LXC контейнер. Сейчас суровые админы должны закричать на меня, мол, что ты делаешь, так нельзя. Нельзя. В продакшене нельзя, а дома можно.
Почему LXC? Потому что мы туда можем прокинуть встроенное в процессор видеоядро, и при этом еще можно будет это же видеоядро использовать и в других контейнерах. Как прокидывается видеоядро смотрите предыдущий ролик у меня на канале.
как пробросить igpu в непривелигерованный контейнер LXC в Proxmox#
У меня уже создан lxc контейнер, и обратный прокси настроен на выпуск сертификата на айпи по которому находится наш контейнер и порт 80. Также я предполагаю, что вы знаете как настраивать конкретно ваш, именно ваш, обратный прокси.
Ниже приведено пошаговое руководство по установке NextCloud на Ubuntu 24.04 LTS. Оно состоит из 14 шагов (этапов). Каждый этап является обязательным для завершения, прежде чем перейти к следующему шагу. Визуализация нижепривиденной интрукции в видео в начале статьи.
Все, вступление закончилось.
Поехали
Шаг 1: Подготовка системы.#
- Обновление пакетов Ubuntu Packages:
sudo su
apt update && apt upgrade -y
Иногда Apache немоитвированно и непоследовательно ругается на отсутствие пакетов локализации, поэтому установим их следующей командой
dpkg-reconfigure locales
Шаг 2: Установка Apache2 и PHP Modules.#
- Установка Apache2:
apt install apache2 -y
- Установка зависимостей:
Это обычный и обязательный для установки перечь пакетов, кроме последних трех. Но они тоже вам обязательно потребуются, если вы хотите нормальную работу Nextcloud с фото/видео, и если вы захотите подключаться самбы шары.
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 -y
- Активируем необходимые модули Apache:
a2enmod env rewrite dir mime headers setenvif ssl
- Теперь перезапустить и активируем Apache, а потом проверим, что Apache работает как надо.
systemctl restart apache2
systemctl enable apache2
systemctl status apache2
- Проверяем, что все необходимые модули Apache загружены:
apache2ctl -M
Шаг 3: Установка и настройка базы данных MariaDB#
- Устанавливаем необходимый пакет:
apt install mariadb-server -y
- Логинимся в нашу базу данных. Пусть вас не смущает, то команда вроде говорит о другой БД:
mysql
- Теперь мы с вами одной командой создаем базу данный с названием ncloud, юзера для БД и его пароль ‘admin123’. Вы должны поменять эти значения на свои:
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, а также задаем нужные права на папку, где будет установлен Nextcloud#
- Скачиваем и разархивируем проследний релиз Nextcloud в папку /var/www/html:
Путь, куда мы установили Nextcloud, потому что в последующем все команды, которые мы будем использовать должны указывать в папку, где у нас установлен Nextcloud
cd /var/www/html
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
- Удаляем уже ненужный нам архив:
rm -rf latest.zip
- Поменяем права на директорию с Nextcloud на нашего HTTP пользователя:
chown -R www-data:www-data /var/www/html/nextcloud/
Шаг 5: Установка Nextcloud с помощью командной строки#
- Запустите следующую команду для установки nextcloud. Это командой мы устанавливаем Nextcloud и одновременно создаем администратора Nextcloud и его пароль, а также указываем на уже созданную базу данных MariaDB и данные ее администратора. (используйте ваши данные)
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 доступен только с localhost, будет вам выдавать ошибку “Access through untrusted domain”. Поэтому давайте сразу разрешим доступ по доменному имени и внесем все необходимые данные о нашем обратном прокси и т.д.:
sudo nano /var/www/html/nextcloud/config/config.php
'trusted_proxies' =>
array (
0 => 'ip на котором сидит ваш обратный прокси', # можно указывать целые подсети, которым можно доверять, но лучше почитайте официальную документацию
),
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'некслауд.мойдомен.ru',
),
'overwritehost' => 'некслауд.мойдомен.ru',
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://некслауд.мойдомен.ru',
'default_phone_region' => 'RU',
'allow_local_remote_servers' => true, # эта строчка нужна, если вы будете прикручивать какие то сервисы, которые по локальной сети подключаются по самоподписанным сертификатам, например Authentik
- Теперь нам надо сконфигурировать сервер Apache, чтобы он загружал Nextcloud из директории /var/www/html/nextcloud и мы сразу скажем Nextcloud, что у нас все в порядке с безопасностью, потому что сам по себе Nextcloud не в курсе, что у нас где-то там есть обратный прокси, который уже выпустил нормальный ssl сертификат для 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
- Сейчас наш Nextcloud уже доступен по поддоменному имени, перейдя по которому вам достаточно ввести логин и пароль администратора.
Шаг 6: Установка и настройка PHP-FPM в связке с Apache#
- Устанавливаем PHP-FPM: #ну и проверяем актуальную версию
apt install php8.3-fpm
- Проверяем, что PHP-FPM запущен, его версию, и что создан Socket:
service php8.3-fpm status
php-fpm8.3 -v
ls -la /var/run/php/php8.3-fpm.sock
- Отключаем медленные и поэтому не нужные нам mod_php and 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 file. Вы можете задать свои значения в зависимости от вашего окружения. Ниже значения, которые вы можете использовать.
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
- Вместо того, чтобы менять руками каждое значение, искать где какая строка находится, мы с вами сделаем все одно командой, как настоящие продвинутые линуксойды. Кроме того, что это поднимет нам ЧСВ, это еще и сэкономит нам время.
#Если выпонимаете, чего вы хотите добиться, то воспользоваться соответствующим калькулятором - PM калькулятор
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, так как это скажет серверу применять PHP-FPM, а не php. Как это сделать показано в видео в начеле этого поста
```
<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 в процессе внесения изменений в php.#
- Создаем файл info.php :
Это необходимо для отслеживания установки и применения изменений PHP-FPM, OPCache, APCu.
bash cd /var/www/html/nextcloud
nano info.php
<?php phpinfo(); ?>
Теперь вы можете перейти по соответствующему адресу [URL]/info.php. для проверики работы PHP-FPM. У вас появится меню “Server API FPM/FastCGI”
Шаг 8: Активируем OPCache в PHP#
- Активируем OPCache в PHP:
Opcache - это кэш-движок для PHP. Он хранит предварительно компилируемый бит-код скриптов в общей памяти, поэтому анализ PHP-скриптов по каждому из запросов не потребуется. Это увеличивает объем исполняемых файлов PHP и повышает производительность загрузки веб-сайта. Opcache включен по умолчанию.
Проверяем его работу перейдя по вышеуказанному адресу [URL]/info.php.
OPcache JIT (Just-In-Time compilation) — это технология, добавленная в PHP начиная с версии 8.0, которая позволяет ускорить выполнение PHP-кода за счёт динамической компиляции байткода в машинный код. Чем JIT отличается от обычного OPcache? OPcache кэширует байткод PHP (промежуточное представление после парсинга), ускоряя повторное выполнение скриптов. JIT компилирует этот байткод в машинный код, который может выполняться напрямую процессором, минуя интерпретацию PHP, поэтому это очень поможет в увеличении производительности вашего облака.
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 (Alternative PHP Cache User) — это PHP-расширение, которое предоставляет простой и быстрый кеш данных в оперативной памяти, доступный только внутри одного процесса PHP (обычно — в рамках одного веб-сервера). APCu кеширует переменные пользователя (массивы, строки, числа и т.д.) между запросами; работает в оперативной памяти — доступ почти мгновенный; не сохраняет данные на диск; используется для ускорения повторно используемых данных, которые не часто меняются.
- Включаем APCu in PHP следующим образом:
Устанавливаем пакет
apt install php8.3-apcu
Редактируем ini файл
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 support Enabled”
- Настроим Nextcloud на использование APCu для кэширования:
nano /var/www/html/nextcloud/config/config.php
'memcache.local' => '\OC\Memcache\APCu',
Шаг 10: Установка и настройка Redis Cache#
Redis (REmote DIctionary Server) — это супербыстрый кэш и хранилище данных в памяти (RAM), которое: хранит данные как пары ключ-значение; поддерживает различные структуры данных (строки, списки, множества, хеши, битмапы, и т.д.); может использоваться как кеш, брокер сообщений, хранилище сессий, и даже как БД (ограниченно).
- Устанавливаем и настраиваем Redis Cache
В Nextcloud Redis используется для локального и распределенного кэширования, а также транзационной блокировки файлов. Мы использовали APCu для локального кэширования, который быстрее, чем Redis. Мы будем использовать Redis для блокировки файлов. Механизм блокировки файлов в Nextcloud блокирует файлы во время обычной работы, чтобы избежать их поверждения.I
- Установим Redis Server and расширение Redis php
apt install redis-server php-redis -y
- Запускаем и активируем Redis service.
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 user в группу 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
- Можно проверить работает ли у нас Redis в PHP, но у меня работает
nextcloud-ubuntu-24.04-redis
Redis is Installed for Nextcloud
https://help.nextcloud.com/t/installing-redis-for-memcache/162599/6
- Включаем функцию красивых ссылок 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
Ваш Nextcloud готов к использованию, созданию юзеров и установки, и настройки приложений из внутреннего магазина
Но внизу я привел другие команды, которые нужны для финальной настройки Nextcloud Более подробно в видео
- Другие важные команды для работы
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