📌 Цель
- Смонтировать S3-бакет
baket-name(Selectel) в/mnt/nextcloud - Включить POSIX-доступ для управления правами
chmod/chown - Проверить доступность для пользователя
www-data(Nextcloud) - Подготовить к использованию как
data-директорию или внешнее хранилище
🔐 1. Получение лицензии CunoFS
- Перейди на сайт: https://cunofs.com
- Перейдите по ссылке https://cuno.io/register/ и укажи :
- Название компании (можно любое)
- Цель использования (например: Nextcloud + S3)
- Получи письмо со ссылкой на
.run-файл и лицензионным ключом. - Ключ нужно будет ввести при установке cuno.
🧱 2. Установка CunoFS
wget https://github.com/cunoFS/cunoFS/releases/latest/download/cuno_amd64_glibc_deb.run
chmod +x cuno_amd64_glibc_deb.run
sudo ./cuno_amd64_glibc_deb.run
Скрипт выведет соглашение вводим : y
Please type y to accept, n otherwise: y
После выедет сообщение о том что нужно установить cudo:
Creating directory cuno_1.2.7_amd64_glibc_deb Verifying archive integrity... 100% All good. Uncompressing CUNO v1.2.7 100% Extraction complete. Please install cuno_1.2.7_amd64_glibc.deb with apt.
После распаковки устанавливаем:
cd cuno_*_amd64_glibc_deb
sudo apt install ./cuno_*.deb
В конце установки спросит :
###### Welcome to cunoFS ###### cunoFS License Manager - This utility will help you activate cunoFS. Please select an option: 1. Activate a free 14-day trial of cunoFS Professional now, no sign up required 2. Activate your license 3. Skip activation (cunoFS will not work until you activate) Please select 1, 2 or 3 and submit (press enter/return):
Если вы получили лицензионный ключ на e-mail нужно выбрать 2 и ввести полученный ключь активации:
Please select 1, 2 or 3 and submit (press enter/return): 2 Please enter a license key or the full path to a license file:
Успешная установка
License type: Personal
Start date: 2025-Jun-07
Expiration date: 2099-Jan-01
1. Load cunoFS by running:
$ cuno
2. Try it out by exploring some public datasets!
> Check out images from the James Webb Space Telescope on AWS S3:
(cuno) $ ls s3://stpubdata/jwst/public/
> Or investigate satellite images on Google Cloud Storage:
(cuno) $ ls gs://gcp-public-data-landsat/
> Or even take a look at COVID-19 pandemic data on Azure:
(cuno) $ ls az://pandemicdatalake/public/curated/
3. For instructions on how to set up cunoFS for your environment, access private buckets,
and more, see the documentation at https://cuno-cunofs.readthedocs-hosted.com
Processing triggers for man-db (2.12.0-4build2) ...
Processing triggers for libc-bin (2.39-0ubuntu8.4) ...
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
N: Download is performed unsandboxed as root as file '/root/cuno_1.2.7_amd64_glibc_deb/cuno_1.2.7_amd64_glibc.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
Сообщение:
N: Download is performed unsandboxed as root as file '/root/cuno_1.2.7_amd64_glibc_deb/cuno_1.2.7_amd64_glibc.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
— не критическая ошибка, это предупреждение от apt о том, что он не может проверить .deb из-за ограничений прав доступа. Оно не мешает установке и появляется, когда ты устанавливаешь .deb из каталога, доступного только root.
Способ установки если не удалось из root:
mv /root/cuno_1.2.7_amd64_glibc_deb/cuno_1.2.7_amd64_glibc.deb /tmp/ sudo apt install /tmp/cuno_1.2.7_amd64_glibc.deb
Проверь версию:
cuno --version
Выведет:
CUNO v1.2.7 (c78d9341df)
Шпаргалка Cuno:
| 📦 Управление учётными данными (credentials) | |
| sudo -u www-data cuno creds import credentials.txt | Импорт файла с S3-ключами |
| sudo -u www-data cuno creds list | Показать все учётные данные и связки бакетов |
| sudo -u www-data cuno creds pair s3://baket-name-1 credentials.s3c | Привязать бакет к учётным данным |
| sudo -u www-data cuno creds unpair s3://baket-name-1 | Отвязать бакет от учётных данных |
| sudo -u www-data cuno creds purge credentials.s3c | Удалить импортированные учётные данные |
| sudo -u www-data cuno creds setposix s3://baket-name-1 true | Включить POSIX-режим для бакета (если поддерживается) |
| sudo -u www-data cuno creds info s3://baket-name-1 | Получить информацию о бакете |
| 🔗 Монтирование и демонтаж | |
| sudo -u www-data cuno mount –posix –root s3://baket-name-1 /mnt/nextcloud | Монтировать бакет с POSIX-правами |
| sudo -u www-data cuno mount –unmount /mnt/nextcloud | Размонтировать путь |
| sudo -u www-data fusermount3 -u /mnt/nextcloud | Альтернативный способ размонтирования |
| sudo -u www-data cuno -o uid=33 -o gid=33 -o filemode=0644 -o dirmode=0755 mount -o allow_other –root s3://baket-name-1 /mnt/nextcloud | Задать владельца и права по умолчанию при монтировании |
| 👥 Работа с пользователями | |
| sudo -u www-data cuno mount … | Запуск монтирования от имени пользователя |
| sudo -u www-data touch /mnt/nextcloud/file.txt | Проверка прав записи |
| sudo -u www-data cuno creds list | Показать все учётные данные и связки бакетов от пользователя www-data |
| sudo -u www-data cuno creds purge credentials.s3c | Удалить импортированные учётные данные |
🔐 2. Создание файла учётных данных для пользователя www-data
Создай файл credentials.txt в домашнем каталоге www-data:
nano /var/www/credentials.txt
aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY endpoint = https://s3.ru-1.storage.selcloud.ruregion=ru-1
Пример для Yandex или Selectel может быть endpoint https://storage.yandexcloud.net или https://s3.storage.selcloud.ru . Регион обязателен для Selectel
Сохрани (в nano : ctrl-O, ctrl-X) и задай права:
sudo chown www-data:www-data/var/www/credentials.txtsudochmod 0600 /var/www/credentials.txt
Так же нужно создать скрытую папку .config
sudo mkdir -p/var/www/.config/ sudo chown www-data:www-data/var/www/.config/
📥 3. Импорт в CunoFS
sudo -u www-data cuno creds import /var/www/credentials.txt
Увидишь:
- Examining credential file.. - Importing credential file into CUNO's credentials store... - Detecting available buckets/containers.. Detected buckets: 2 - Attempting to pair 2 buckets/containers.. Paired 2/2 buckets: [+] s3://baket-name-1 [+] s3://baket-name-2
🔐 Важно: разрешение FUSE для других пользователей
Для использования -o allow_other в CunoFS:
sudo nano /etc/fuse.conf
Найдите строку:
#user_allow_other
И раскомментируйте её (уберите #):
user_allow_other
Сохраните файл (Ctrl + O, Enter, Ctrl + X). Без этой настройки монтирование с allow_other завершится ошибкой.
⚙️ 4. Включение POSIX-доступа на бакете
Например если нужно установить на монтируемую папку /mnt/nextcloud другие права . По умолчанию права устанавливаются 0777. Но после монтирования права не устанавливаются . С данной проблемой так и не разобрался.
💡 Советы
- Права в POSIX-режиме хранятся в объектном хранилище (в скрытых объектах), и их можно менять обычными Unix-командами (
chmod,chown,chgrp). - Установка
-o dirmode=0755работает только при первом монтировании без POSIX-режима, либо если POSIX-метаданных ещё не было.
sudo -u www-data cuno creds setposix s3://baket-name-1 true
Это позволит использовать chown, chmod и POSIX-права на вложенные папки /mnt/nextcloud.
Если при выполнении:
sudo -u www-data cuno creds setposix s3://baket-name-1 true
вы получаете ошибку:
NotImplemented: A header you provided implies functionality that is not implemented.
— это означает, что ваш S3-провайдер (например, SelCloud) не поддерживает установку тегов на бакеты.
В этом случае пропустите эту команду и просто укажите флаг --posix при монтировании:
sudo -u www-data cuno mount --posix -o allow_root -o allow_other --root s3://baket-name-1 /mnt/nextcloud
⚠️ Ограничение: POSIX-метаданные будут храниться локально на машине, а не в бакете. Это означает, что на других серверах при монтировании тех же данных POSIX-права не сохранятся. Но мы и не рассматриваем подключение бакета еще где то .
✅ Если не получается поменять права на корневую папку монтирования: Пересоздать бакет (если он пустой)
Если вы только тестируете и можете позволить себе очистить бакет:
- Удалите бакет или папку.
- Создайте заново.
- Смонтируйте с нужными
-o filemodeи-o dirmode.
📂 5. Монтирование S3-бакета как локальной POSIX ФС
Создай точку монтирования:
sudo mkdir -p /mnt/nextcloud
Выполни монтирование:
sudo -u www-data cuno -o filemode=0644 -o dirmode=0755 mount --posix -o allow_root -o allow_other --root s3://baket-name-1 /mnt/nextcloud
Вывод:
Setting fusermount3 (fum3) options for POSIX enforcement: -o allow_other -o default_permissions -o noatime Done.
Проверь:
ls -la /mnt/nextcloud
👤 6. Проверка доступа от имени www-data
Назначь владельца:
sudo chown -R www-data:www-data /mnt/nextcloud
Проверь доступность:
sudo -u www-datatouch/mnt/nextcloud/test_www.txt
🔄 7. Размонтирование при необходимости
cuno unmount /mnt/nextcloud
Или:
fusermount3 -u /mnt/nextcloud
🧪 8. Использование в Nextcloud
🔸 Основное data-хранилище (для новой установки)
- При установке укажи
/mnt/nextcloudкакdata-директорию - Убедись, что у пользователя
www-dataесть права
📌 Важные замечания
- POSIX-права сохраняются внутри бакета, в скрытых служебных объектах — используй только CunoFS для доступа
- Не рекомендуется изменять содержимое бакета извне
- UID/GID должны быть одинаковыми на всех серверах, если доступ идёт с нескольких машин
🛠 9. Автоматическое монтирование через systemd
🔸 Шаг 1. Создай systemd unit-файл
sudo nano /etc/systemd/system/cuno-nextcloud.mount.service
Вставь следующее:
[Unit]
Description=Mount CunoFS bucket for Nextcloud
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=www-data
ExecStart=/bin/bash -c '/usr/bin/cuno mount --posix -o allow_root -o allow_other --root s3://cloud-hws-ru-1 /mnt/nextcloud'
ExecStop=/usr/bin/fusermount3 -u /mnt/nextcloud
RemainAfterExit=true
Restart=on-failure
TimeoutSec=30
[Install]
WantedBy=multi-user.target
🧠 Убедись, что путь к cuno — корректный (which cuno покажет его, чаще всего /usr/bin/cuno). Но нужно установить именно /bin/bash -c
🔸 Шаг 2. Перезагрузить systemd и включить юнит
sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo systemctl enablecuno-nextcloud.mount.servicesudo systemctl startcuno-nextcloud.mount.service
🔎 Проверка статуса
sudo systemctl status cuno-nextcloud.mount.service
Ожидаемый результат:
Active: active (running)
✅ После перезагрузки
reboot
После загрузки:
mount | grep nextcloud
ls /mnt/nextcloud
Должны быть видны файлы из бакета baket-name-1.
🛠 10. Подключаем (если уже есть nextcloud)
🔸 Шаг 1. Перевод Nextcloud в режим обслуживания
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
🔸 Шаг 2. Перенос текущих данных
sudo rsync -avzh /var/www/nextcloud/data /mnt/nextcloud/
sudo chown -R www-data:www-data /mnt/nextcloud/data
sudo chown -R 770 /mnt/nextcloud/data
🔸 Шаг 3. Обновление config.php
sudo nano /var/www/nextcloud/config/config.php
Измените параметр:
'datadirectory' => '/mnt/nextcloud/data',
🔸 Шаг 4. Выход из режима обслуживания
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
🔸 Шаг 5. Переиндексация данных
sudo -u www-data php /var/www/nextcloud/occ files:scan --all
Или для конкретного пользователя:
sudo -u www-data php /var/www/nextcloud/occ files:scan admin
✅ Готово!
Теперь Nextcloud использует ваш S3-бакет как основную директорию для хранения пользовательских данных.
✅ Проверено на:
- Selectel Object Storage (S3)
- Yandex Cloud (S3)
- CunoFS 1.2.7
- Ubuntu 24.04 LTS
- Nextcloud 31+
