Создаем собственное облачное хранилище
Теория
Октябрь 2026 года - «черный» месяц для компании Яндекс. Напомню, что 8, 9 и 10 октября в результате атаки БПЛА были частично или полностью выведены из строя 3 ЦОДа компании. Работали с перебоями или не работали совсем почти все сервисы Яндекса. В том числе пострадал и Яндекс-диск. Это заставило меня задумался о том, чтобы сделать собственное облако на своем сервере.
Практика
Установка Nextcloud
Начинаем с создания виртуальной машины и установки на нее linux. Я выделил 4 ядра процессора и 4 гигабайта оперативной памяти. Еще один момент: при установке Debian я выбрал русский язык. Не знаю как может завершится установка Nextcloud, если выбрать язык по умолчанию (английский). Обратите особое внимание на разметку диска! Я пошел путем создания 20 гигабайтного виртуального диска с перспективой расширения до примерно 500 гигабайт, может и больше. Если Вы выберите такой же вариант, то обязательно ознакомьтесь со статьей о разметке и изменении размеров диска в linux перед установкой ОС!
После успешной установки Debian нужно сменить имя хоста. Для этого выполним пару команд и внесем изменения.
Изменяем имя хоста в файле hostname. Для того открываем файл
sudo nano /etc/hostname
и пропишем:
cloud
Это же имя внесем в список хостов. Для этого нужно отредактировать файл hosts. Открываем его для редактирования
sudo nano /etc/hosts
и тоже прописываем:
cloud
После этого нужно перезагрузить операционную систему.
sudo systemctl reboot
После перезагрузки проверяем, что имя хоста изменилось. Команда
hostname -f
должна вывести значение cloud.
Приступим к установке необходимых пакетов:
sudo apt update && sudo apt upgrade -y
sudo apt install apache2 mariadb-server libapache2-mod-php php-gd php-mysql \ php-curl php-mbstring php-intl php-gmp php-xml php-imagick php-zip zip vim -y
После установки пакетов, в том числе и моего любимого vim, я удалю nano. Это совершенно необязательная процедура.
sudo apt autoremove --purge nano -y
Теперь нужно создать базу данных. Запустим процесс создания БД командой:
sudo mysql
И выполним несколько команд:
Создаем пользователя ncadmin с паролем password:
CREATE USER 'ncadmin'@'localhost' IDENTIFIED BY 'password';
Создаем базу данных с именем nextcloud, если таковой не существует:
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Предоставляем пользователю ncadmin все возможные привилегии на все объекты со стороны базы данных nextcloud:
GRANT ALL PRIVILEGES ON nextcloud.* TO 'ncadmin'@'localhost';
Перечитываем таблицы привилегий и применяем внесенные изменения:
FLUSH PRIVILEGES;
Готово!
quit;
Значения
ncadmin password nextcloud указаны для примера. Можете изменить значения на свои, особенно настоятельно рекомендуется сделать это для password!
База данных и пользователь для нее успешно созданы, приступаем с загрузке установщика Nextcloud.
wget https://download.nextcloud.com/server/releases/latest.zip
Распакуем скачанный архив и удалим его после успешной распаковки:
unzip latest.zip
rm latest.zip
Скопируем распакованное в директорию /var/www:
sudo cp -r nextcloud /var/www
Сменим владельца скопированной директории и его содержимого на www-data:
sudo chown -R www-data:www-data /var/www/nextcloud
После этого можно удалить ранее распакованную директорию (ту, что осталась у нас в домашнем каталоге) командой
rm -R nextcloud/
Теперь нужно поправить файл 000-default.conf в директории /etc/apache2/sites-available. Необходимо поменять строку DocumentRoot /var/www/html на DocumentRoot /var/www/nextcloud.
sudo vim /etc/apache2/sites-available/000-default.conf
Перезапускаем сервис apache2:
sudo systemctl restart apache2.service
Переходим по адресу http://192.168.11.19 1) в браузере, вводим необходимые данные и нажимаем Установить.
Это окно говорит нам, что установка прошла завершена.
В принципе на этом этапе уже можно начинать пользоваться облаком в локальной сети. Но мы же не остановимся на этом, нам хочется полноценное облако с блэкджеком и … с доступом из сети Интернет. Для этого нужно настроить несколько параметров.
Приступаем! Кстати, заодно и исправим вот эти две ошибки:
Для этого нужно исправить файл default-ssl.conf и включить модуль ssl для apache. Отредактируем файл default-ssl.conf. Откроем его для редактирования:
sudo vim /etc/apache2/sites-available/default-ssl.conf
и внесем следующее:
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
Должно получится так:
После этого включаем модуль ssl:
sudo a2enmod ssl
«Включаем» отредактированный файл default-ssl.conf (после этого можно будет переходить на наше облако по протоколу HTTPS):
sudo a2ensite default-ssl.conf
Включим еще пару модулей:
sudo a2enmod rewrite
sudo a2enmod headers
Отключаем переход по HTTP:
sudo a2dissite 000-default.conf
и перезапускаем сервис apache:
sudo systemctl restart apache2
Теперь настроим облако так, чтобы можно было переходить на него из сети Интернет. 2)
У меня заранее создана A-запись для домена cloud.nikkutuzov.ru. Так что приступим к настройке.
Напомню, что у меня проксирующий web-сервер на nginx! Переходим на виртуальную машину с nginx и создаем конфигурационный файл cloud.nikkutuzov.ru:
sudo nano /etc/nginx/sites-available/cloud.nikkutuzov.ru
со следующим содержанием:
server {
listen 80;
listen [::]:80;
server_name cloud.nikkutuzov.ru;
}
После этого перезапускаем nginx:
sudo systemctl restart nginx.service
Получим сертификат для нового домена cloud.nikkutuzov.ru:
sudo certbot --nginx -d cloud.nikkutuzov.ru
После успешного завершения работы certbot нужно изменить созданный ранее файл cloud.nikkutuzov.ru:
sudo nano /etc/nginx/sites-enabled/cloud.nikkutuzov.ru
и привести его в такой вид:
server {
server_name cloud.nikkutuzov.ru;
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
location / {
proxy_pass https://192.168.11.19;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
fastcgi_read_timeout 1800s;
}
ssl_certificate /etc/letsencrypt/live/cloud.nikkutuzov.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/cloud.nikkutuzov.ru/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = cloud.nikkutuzov.ru) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name cloud.nikkutuzov.ru;
return 404; # managed by Certbot
}
Вот так это выглядит у меня:
Перезапускаем nginx:
sudo systemctl restart nginx.service
Теперь можно переходить в браузере уже по адресу https://cloud.nikkutuzov.ru. Но тут же натыкаемся на вот такую ошибку:
Нужно ввести домен в доверенные. Открываем файл:
sudo vim /var/www/nextcloud/config/config.php
и добавляем новый доверенный домен: 3)
1 => 'cloud.nikkutuzov.ru',
На этом установка полностью завершена. Облако полноценно работает как в локальной сети, так и в сети Интренет по протоколу HTTPS. Если Вы настраивали в точности как у меня (с обратным прокси), то настоятельно рекомендую на этом этапе ознакомится со статьей про передачу реального IP-адреса клиента. В противном случае Вы ,возможно, столкнетесь с недоступностью облака, если в него попытаются войти перебором логинов/паролей.
Если же Вы настраиваете без обратного прокси или только для использования в локальной сети, то переходите к исправлениям ошибок. Об этом - ниже.
Устранение ошибок и предупреждений после установки
Первым делом нас встречают три ошибки базы данных:
Для их исправления нужно в файл 50-server.cnf добавить несколько строк. Открываем файл для редактирования:
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
и добавляем в блок mariadbd три строки:
innodb_log_file_size = 256M slow_query_log = ON long_query_time = 2
Должно получится так:
После этого нужно перезапустить mariadb.service:
sudo systemctl restart mariadb.service
Следующие две ошибки исправляются в файле php.ini.
- Первая ошибка:
Открываем и редактируем этот файл:
sudo vim /etc/php/8.4/apache2/php.ini
находим memory_limit = 128M и меняем на: memory_limit = 1G.
Как-то так:
- Вторая ошибка:
находим output_buffering = 4096 и меняем на: output_buffering = Off.
Вот так:
После этого нужно перезапустить сервис apache:
sudo systemctl restart apache2.service
Продолжим! Следующим этапом устраним проблемы с неработающим планировщиком Cron в Nextcloud. Команда cron.php должна запускаться от имени пользователя веб-сервера каждые 5 минут. В нашем случае этим пользователем является www-data. Запускаем crontab от него, то есть от имени www-data:
sudo crontab -u www-data -e
и добавим строчку:
*/5 * * * * /usr/bin/php -f /var/www/nextcloud/cron.php
Вот так это должно выглядеть:
Под пользователем с правами администратора (сейчас речь уже идет про web-интерфейс), в нашем случае это admin, переходим:
Параметры сервера → Administration → Основные параметры и выбираем Cron(рекомендуется). Кстати, в моем случае выбор был автоматическим.
Еще одно предупреждение:
Его можно исправить изменением значения параметра opcache.interned_strings_buffer в файле php.ini. Открываем этот файл командой:
sudo vim /etc/php/8.4/apache2/php.ini
находим opcache.interned_strings_buffer=8, раскомментируем (если он закомментирован) и меняем на opcache.interned_strings_buffer=32.
Вот так:
После изменения значения opcache.interned_strings_buffer нужно перезапустить apache:
sudo systemctl restart apache2.service
Вот это предупреждение исправляется изменением содержимого файла config.php.
Открываем файл config.php:
sudo vim /var/www/nextcloud/config/config.php
и добавляем строку:
'maintenance_window_start' => 1,
Примечание: значение указывается в часах (от
0 до 23 включительно) по Всемирному координированному времени (UTC). Тяжёлые задачи будут выполняться в течение четырех часов после указанного часа. Если вам всё равно, когда они запустятся, можно указать 100.
Это предупреждение устраняется установкой пакета imagemagick:
sudo apt install imagemagick -y
Следующие два предупреждения исправляется в несколько этапов.
Сначала нужно установить пакет php-apcu:
sudo apt install php-apcu -y
Затем включить модуль:
sudo phpenmod -v 8.4 -s ALL apcu
Добавить в файл config.php:
sudo vim /var/www/nextcloud/config/config.php
следующую строку:
'memcache.local' => '\OC\Memcache\APCu',
Вот так:
И перезапустить после этого apache:
sudo systemctl restart apache2.service
Это предупреждение исправляется добавлением одной строки во все тот же файл config.php:
Открываем:
sudo vim /var/www/nextcloud/config/config.php
Добавляем:
'default_phone_region' => 'RU',
Например вот в это место:
Не забываем перезапустить apache:
sudo systemctl restart apache2.service
Предупреждение о MIME
убираем однократным выполнением следующей команды:
sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive
А вот это предупреждение мы устраним редактированием файла default-ssl.conf (если используется протокол HTTPS) или 000-default.conf (в случае использования протокола HTTP).
В моем случае используется HTTPS:
sudo vim /etc/apache2/sites-available/default-ssl.conf
Для обоих протоколов добавляемая строка будет одинаковой:
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
После внесения изменений необходимо перезапустить apache:
sudo systemctl restart apache2.service
Установку считаю полностью завершенной. Можно начинать пользоваться собственным, независимым и просто классным облаком. В последнем обязательно убедитесь по мере использования Nextcloud. Спасибо, что дочитали до конца.
— Николай Кутузов 2026-10-22 22:46


































