Создаем собственное облачное хранилище

Октябрь 2026 года - «черный» месяц для компании Яндекс. Напомню, что 8, 9 и 10 октября в результате атаки БПЛА были частично или полностью выведены из строя 3 ЦОДа компании. Работали с перебоями или не работали совсем почти все сервисы Яндекса. В том числе пострадал и Яндекс-диск. Это заставило меня задумался о том, чтобы сделать собственное облако на своем сервере.

Начинаем с создания виртуальной машины и установки на нее linux. Я выделил 4 ядра процессора и 4 гигабайта оперативной памяти. Еще один момент: при установке Debian я выбрал русский язык. Не знаю как может завершится установка Nextcloud, если выбрать язык по умолчанию (английский). Обратите особое внимание на разметку диска! Я пошел путем создания 20 гигабайтного виртуального диска с перспективой расширения до примерно 500 гигабайт, может и больше. Если Вы выберите такой же вариант, то обязательно ознакомьтесь со статьей о разметке и изменении размеров диска в linux перед установкой ОС!

После успешной установки Debian нужно сменить имя хоста. Для этого выполним пару команд и внесем изменения.

Изменяем имя хоста в файле hostname. Для того открываем файл

sudo nano /etc/hostname

и пропишем:

cloud

Hostname

Это же имя внесем в список хостов. Для этого нужно отредактировать файл hosts. Открываем его для редактирования

sudo nano /etc/hosts

и тоже прописываем:

cloud

Hosts

После этого нужно перезагрузить операционную систему.

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

Удаление nano

Теперь нужно создать базу данных. Запустим процесс создания БД командой:

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

Загрузка Nextcloud

Распакуем скачанный архив и удалим его после успешной распаковки:

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/

Распаковка и копирование 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

Правим Apache

Перезапускаем сервис apache2:

sudo systemctl restart apache2.service

Переходим по адресу http://192.168.11.19 1) в браузере, вводим необходимые данные и нажимаем Установить.

Web-установка

Это окно говорит нам, что установка прошла завершена.

Установка завершена

В принципе на этом этапе уже можно начинать пользоваться облаком в локальной сети. Но мы же не остановимся на этом, нам хочется полноценное облако с блэкджеком и … с доступом из сети Интернет. Для этого нужно настроить несколько параметров.

Приступаем! Кстати, заодно и исправим вот эти две ошибки:

Две первых ошибки

Для этого нужно исправить файл 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>

Должно получится так:

Файл default-ssl.conf

После этого включаем модуль 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

Перезапускаем 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

Вот так это должно выглядеть:

Задание для cron

Под пользователем с правами администратора (сейчас речь уже идет про web-интерфейс), в нашем случае это admin, переходим:

Параметры сервера → Administration → Основные параметры и выбираем Cron(рекомендуется). Кстати, в моем случае выбор был автоматическим.

Включаем Cron

Еще одно предупреждение:

Предупреждение opcache.interned_strings_buffer

Его можно исправить изменением значения параметра 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

После изменения значения 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:

Предупреждение про Imagemagick

sudo apt install imagemagick -y

Следующие два предупреждения исправляется в несколько этапов.

Предупреждение APCu

Сначала нужно установить пакет 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',

Вот так:

Предупреждение 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).

Предупреждение 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


1)
В Вашем случае IP-адрес может быть другим.
2)
На этом этапе мы имеем только самоподписанный сертификат, поэтому браузер будет предупреждать нас о том, что лучше не переходить на эту страницу. Исправить это можно установкой доверенного сертификата безопасности. Почитайте больше про пакет Let's Encrypt для Apache2!
3)
Лучше поменять его местами с нулевым или оставить только его.
Этот сайт использует куки. Находясь здесь, вы соглашаетесь с их хранением на вашем компьютере. Также вы подтверждаете, что прочитали и поняли нашу Политику конфиденциальности. Если вы не согласны - покиньте сайт.Больше информации о куки
  • sw/lin/cloud
  • Последнее изменение: 2026-10-23 10:55