Nextcloud Admin — Управление через API
Скилл для полноценного управления Nextcloud-инстансом через OCS REST API и WebDAV. Все операции выполняются через curl из терминала.
Подключение
Конфигурация берётся из переменных окружения:
| Переменная | Назначение |
|---|---|
NEXTCLOUD_URL | Базовый URL инстанса (например https://cloud.example.com) |
NEXTCLOUD_USER | Имя пользователя для аутентификации |
NEXTCLOUD_TOKEN | App-токен пользователя (используется вместо пароля) |
NEXTCLOUD_ADMIN_TOKEN | App-токен администратора (для операций управления пользователями/группами/приложениями) |
Перед выполнением любых операций всегда проверяй наличие переменных:
# Проверка обязательных переменных
if [ -z "$NEXTCLOUD_URL" ] || [ -z "$NEXTCLOUD_USER" ] || [ -z "$NEXTCLOUD_TOKEN" ]; then
echo "ERROR: Set NEXTCLOUD_URL, NEXTCLOUD_USER, NEXTCLOUD_TOKEN env vars"
exit 1
fi
Базовые принципы
Аутентификация
Все запросы используют Basic Auth с логином и app-токеном:
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" ...
Для административных операций (пользователи, группы, приложения) используй admin-токен:
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" ...
Обязательные заголовки
Все OCS-запросы требуют заголовка:
-H "OCS-APIRequest: true"
Для получения ответа в JSON (вместо XML по умолчанию) добавляй format=json:
?format=json
Все POST-запросы к OCS требуют:
-H "Content-Type: application/x-www-form-urlencoded"
Формат ответов
OCS API возвращает XML по умолчанию. Для JSON добавляй ?format=json или &format=json.
Успешный ответ (OCS v1): statuscode: 100
Успешный ответ (OCS v2): statuscode: 200
Рекомендуется использовать format=json и парсить через jq.
Операции с файлами (WebDAV)
WebDAV — основной протокол для работы с файлами. Базовый URL:
$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/
Листинг файлов (PROPFIND)
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X PROPFIND \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/" \
-H "Depth: 1"
Depth: 0— только указанный ресурсDepth: 1— ресурс + непосредственные дочерние элементыDepth: infinity— вся иерархия (может быть отключено на сервере)
Загрузка файла на сервер
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-T "/path/to/local/file.txt" \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/remote/path/file.txt"
Скачивание файла
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-o "/path/to/save/file.txt" \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/remote/path/file.txt"
Создание директории
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X MKCOL \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/new-folder/"
Удаление файла/директории
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X DELETE \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/path/to/delete"
Перемещение файла
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X MOVE \
-H "Destination: $NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/new/path/file.txt" \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/old/path/file.txt"
Копирование файла
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X COPY \
-H "Destination: $NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/copy/path/file.txt" \
"$NEXTCLOUD_URL/remote.php/dav/files/$NEXTCLOUD_USER/original/path/file.txt"
Шаринг (OCS Share API)
Базовый URL: $NEXTCLOUD_URL/ocs/v2.php/apps/files_sharing/api/v1
Подробный справочник всех эндпоинтов шаринга — см. references/api-reference.md (раздел «Share API»).
Получить все шары
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json" \
-H "OCS-APIRequest: true"
Создать публичную ссылку
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v2.php/apps/files_sharing/api/v1/shares" \
-H "OCS-APIRequest: true" \
-d "path=/Documents/report.pdf" \
-d "shareType=3" \
-d "permissions=1"
shareType: 0=пользователь, 1=группа, 3=публичная ссылка, 4=email, 6=федеративный, 10=Talk
permissions: 1=чтение, 2=обновление, 4=создание, 8=удаление, 16=шаринг, 31=все
Создать ссылку с паролем и сроком
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v2.php/apps/files_sharing/api/v1/shares" \
-H "OCS-APIRequest: true" \
-d "path=/Documents/secret.pdf" \
-d "shareType=3" \
-d "permissions=1" \
-d "password=SuperSecret123" \
-d "expireDate=2025-12-31"
Расшарить файл конкретному пользователю
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v2.php/apps/files_sharing/api/v1/shares" \
-H "OCS-APIRequest: true" \
-d "path=/Documents/report.pdf" \
-d "shareType=0" \
-d "shareWith=otheruser" \
-d "permissions=1"
Удалить шару
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X DELETE \
"$NEXTCLOUD_URL/ocs/v2.php/apps/files_sharing/api/v1/shares/{shareId}" \
-H "OCS-APIRequest: true"
Управление пользователями (OCS Provisioning API)
Требует admin-токен. Базовый URL: $NEXTCLOUD_URL/ocs/v1.php/cloud
Подробный справочник — см. references/api-reference.md (раздел «User Provisioning API»).
Список пользователей
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users?format=json" \
-H "OCS-APIRequest: true"
Создать пользователя
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users" \
-H "OCS-APIRequest: true" \
-d "userid=newuser" \
-d "password=SecurePass123" \
-d "displayName=New User" \
-d "email=newuser@example.com" \
-d "groups[]=team1"
Информация о пользователе
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}?format=json" \
-H "OCS-APIRequest: true"
Редактировать пользователя
# Изменить email
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X PUT \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}" \
-H "OCS-APIRequest: true" \
-d "key=email" \
-d "value=newemail@example.com"
Доступные ключи: email, quota, displayname, phone, address, website, twitter, password, language, locale
Включить/выключить пользователя
# Выключить
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X PUT \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}/disable" \
-H "OCS-APIRequest: true"
# Включить
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X PUT \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}/enable" \
-H "OCS-APIRequest: true"
Удалить пользователя
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X DELETE \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}" \
-H "OCS-APIRequest: true"
Управление группами
Требует admin-токен.
Список групп
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/groups?format=json" \
-H "OCS-APIRequest: true"
Создать группу
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/groups" \
-H "OCS-APIRequest: true" \
-d "groupid=newgroup"
Участники группы
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/groups/{groupid}?format=json" \
-H "OCS-APIRequest: true"
Добавить пользователя в группу
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}/groups" \
-H "OCS-APIRequest: true" \
-d "groupid=targetgroup"
Удалить пользователя из группы
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X DELETE \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users/{userid}/groups" \
-H "OCS-APIRequest: true" \
-d "groupid=targetgroup"
Удалить группу
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X DELETE \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/groups/{groupid}" \
-H "OCS-APIRequest: true"
Управление приложениями
Требует admin-токен.
Список приложений
# Все
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/apps?format=json" \
-H "OCS-APIRequest: true"
# Только включённые
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/apps?filter=enabled&format=json" \
-H "OCS-APIRequest: true"
Включить/выключить приложение
# Включить
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X POST \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/apps/{appid}" \
-H "OCS-APIRequest: true"
# Выключить
curl -u "$NEXTCLOUD_USER:$NEXTCLOUD_ADMIN_TOKEN" \
-X DELETE \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/apps/{appid}" \
-H "OCS-APIRequest: true"
Обработка ответов и ошибок
Всегда проверяй HTTP-код и OCS-статус:
response=$(curl -s -w "\n%{http_code}" -u "$NEXTCLOUD_USER:$NEXTCLOUD_TOKEN" \
-X GET \
"$NEXTCLOUD_URL/ocs/v1.php/cloud/users?format=json" \
-H "OCS-APIRequest: true")
http_code=$(echo "$response" | tail -1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then
status=$(echo "$body" | jq -r '.ocs.meta.status')
if [ "$status" = "ok" ]; then
echo "Success"
echo "$body" | jq '.ocs.data'
else
echo "OCS Error: $(echo "$body" | jq -r '.ocs.meta.message')"
fi
else
echo "HTTP Error: $http_code"
fi
Частые проблемы
| Проблема | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Неверный токен/пароль | Проверь NEXTCLOUD_TOKEN, используй app-токен вместо пароля |
| 997 Unauthorized | Пропущен заголовок OCS-APIRequest | Добавь -H "OCS-APIRequest: true" |
| 404 Not Found | Неверный путь или файл не существует | Проверь URL и наличие файла |
| CSRF Error | Пропущен заголовок | Добавь -H "OCS-APIRequest: true" |
| Ответ в XML вместо JSON | Не указан format | Добавь ?format=json |
Составные сценарии
Для детального справочника всех эндпоинтов, аргументов и кодов ошибок — читай references/api-reference.md.