NextCloud: личное облачное хранилище

Материал основан на следующей статье:

https://antoshabrain.blogspot.com/2021/12/docker-nextcloud-postgres-redis-amd64.html

Бесплатный.

Умеет шифровать данные.

Умеет синхронизировать файлы и папки.

Умеет работать по протоколу сетевой файловой системы WebDAV.

Обладает большим количеством плагинов и дополнений. Есть, например плагин для хранения и структурирования ссылок под названием Bookmarks. Плагин аудиоплеер. Плагин для ведения базы паролей. Плагин для редактирования контактов - имена, номера телефонов, почта, дополнительные поля с быстрым поиском. Даже книга с рецептами присутствует).

Кроссплатформенный. Изначально работает в браузере, а также существуют клиенты под Windows, Linux, MacOS, Android, iOS. Скачать клиент под необходимое ПО можно отсюда.

Имеет очень гибкую систему управления пользователями и группами. Такой функционал очень пригодится бизнесу, можно разграничивать разные отделы и иметь полный контроль над всем.

При установке дополнения появляется возможность делиться файлами через веб-ссылки.

Пошаговая установка

В качестве базового образа для развертывания NextCloud будем использовать: https://hub.docker.com/r/linuxserver/nextcloud.

Это связано с тем, что официальный образ имеет проблемы с доступом в интернет.

Создаем необходимые директории для NextCloud на сервере.

  • для хранения конфигурационных файлов (например, папка config)
  • для хранения данных (например, папка data)
sudo mkdir -p /app/nextcloud/nextcloud/{config,data} #команда для создания нескольких директорий одной командой

Переходим в директорию nextcloud:

cd /app/nextcloud/

И создаем файл docker-compose.yml:

vi docker-compose.yml

Примерное содержимое файла:

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: postgres:latest
    container_name: postgres-nextcloud #имя контейнера
    restart: unless-stopped
    volumes:
      - db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=name_db #наименование БД
      - POSTGRES_USER=user_db #имя пользователя
      - POSTGRES_PASSWORD=password #пароль

  app:
    image: lscr.io/linuxserver/nextcloud:latest
    container_name: nextcloud #имя контейнера
    restart: unless-stopped
    ports:
      - 443:443 #указать нужный порт
    links:
      - db
    environment:
      - TZ=Etc/UTC
    volumes:
      - /path/to/data:/data #/home/disk_data/nextcloud
      - /path/to/config:/config #./nextcloud/apps

Запускаем контейнер:

sudo docker-compose up -d

Теперь необходимо перейти в браузере по адресу сервера с указанием порта из docker-compose.yml. Если всё сделано правильно, можно увидеть стартовую страницу NextCloud. Необходимо создать аккаунт администратора придумав имя и пароль.

Каталог с данными /Data оставляем по умолчанию.

Так как мы хотим использовать PostgreSQL, то нам нужно явно указать это. Для этого нажимаем Storage & database (Хранилище и база данных).

Откроется окно с дополнительными настройками.

Выбираем пункт PostgreSQL. Нам необходимо вписать туда свои данные, которые находятся в файле docker-compose.yml.

Внимательно проверяем корректность заполненных данных.

По желанию включаем или выключаем пункт Install recommended apps (Установить рекомендуемые приложения).

Нажимаем кнопку Finish setup (Завершить установку).

Добавление доверенного домена в Nextcloud:

Необходимо отредактировать файл /path/to/config/www/nextcloud/config/config.php (/path/to/config - тот путь, который указывали в docker-compose.yml). В этом файле изменить

array (
    0 => 'ip-address:port',
  ),

добавив необходимый домен или ip-адрес. Отсчёт идет с 0.

После установки для проверки корректной работы Nextcloud и БД можно остановить контейнер и затем его запустить. Если все корректно работает, то никаких ошибок не будет.
sudo docker-compose down
sudo docker-compose up -d

FAQ

На медленных машинах ошибка 504 Gateway Time-out

Необходимо отредактировать файл config/nginx/site-confs/default (/path/to/config - тот путь, который указывали в docker-compose.yml). В этом файле изменить область location ~ \.php(?:$|/) добавив:

fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
fastcgi_connect_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

cURL error 28: Operation timed out after ****** milliseconds

Необходимо отредактировать файл /path/to/config/www/nextcloud/lib/private/Installer.php (/path/to/config - тот путь, который указывали в docker-compose.yml). В этом файле изменить curl’s timeout в следующем месте:

// Download the release
$tempFile = $this->tempManager->getTemporaryFile('.tar.gz');
$timeout = $this->isCLI ? 0 : 120; // Нужно поставить большее время
$client = $this->clientService->newClient();

Изменить 120 (секунд) на большее значение или удалить условие и оставить его всегда равным 0 (неограниченно, но, возможно, не лучшая идея).

cURL error 28: SSL connection timeout

Для исправления этой ошибки необходимо изменить параметр MTU для WireGuard до 1500.

Чтобы это сделать нужно в параметрах конфигурации сервера WireGuard указать следующее:

[Interface]
Address = ###.###.###.###/##
MTU = 1500
...

И это же нужно сделать и для клиента WireGuard, на котором установлен NextCloud:

[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxx
MTU = 1500
...

Could not connect to Appstore: cURL error 28

Для исправления этой ошибки необходимо отредактировать файл /path/to/config/www/nextcloud/lib/private/App/AppStore/Fetcher/Fetcher.php (/path/to/config - тот путь, который указывали в docker-compose.yml). В этом файле изменить $options = ['timeout' ⇒ 60,]; в следующем месте:

/**
 * Fetches the response from the server
 *
 * @param string $ETag
 * @param string $content
 *
 * @return array
 */
protected function fetch($ETag, $content) {
        $appstoreenabled = $this->config->getSystemValueBool('appstoreenabled', true);
        if ((int)$this->config->getAppValue('settings', 'appstore-fetcher-lastFailure', '0') > time() - self::RETRY_AFTER_FAILURE_SECONDS) {
                 return [];
         }
 
         if (!$appstoreenabled) {
                 return [];
         }
 
         $options = [
                 'timeout' => 600, // По умолчанию стоит 60, нужно поставить больше
         ];
 
         if ($ETag != '') {
                 $options['headers'] = [
                         'If-None-Match' => $ETag,
                 ];
         }

Ошибка при синхронизации: Can't update non-existing placeholder info

Для исправления этой ошибки необходимо удалить .sync*-файлы, после выхода из nextcloud-desktop-client

Убираем надпись Режим технического обслуживания

Для этого необходимо отредактировать файл /path/to/config/www/nextcloud/config/config.php (/path/to/config - тот путь, который указывали в docker-compose.yml).

Находим строку 'maintenance' = true,

Изменяем параметр на false, получается: 'maintenance' = false.

Internal Server Error после перезапуска контейнера

Для этого необходимо проверить docker-compose.yml, а именно volumes для хранения конфигурации БД. Если данные не сохраняются после перезапуска контейнера, теряется доступ к БД, что приводит к появлению ошибки.