Files
crm.clientright.ru/crm_extensions/file_storage/NEXTCLOUD_API_OVERVIEW.md
Fedor 269c7ea216 feat: OnlyOffice Standalone integration with S3 direct URLs
 ЧТО СДЕЛАНО:
- Поднят новый standalone OnlyOffice Document Server (порт 8083)
- Настроен Nginx для доступа через office.clientright.ru:9443
- Создан open_file_v3_standalone.php для работы с новым OnlyOffice
- Реализована поддержка прямых S3 URL (bucket публичный)
- Добавлен s3_proxy.php с поддержкой Range requests
- Создан onlyoffice_callback.php для сохранения (базовая версия)
- Файлы успешно открываются и загружаются!

⚠️ TODO (на завтра):
- Доработать onlyoffice_callback.php для сохранения обратно в ОРИГИНАЛЬНЫЙ путь в S3
- Добавить Redis маппинг documentKey → S3 path
- Обновить CRM JS для использования open_file_v3_standalone.php
- Протестировать сохранение файлов
- Удалить тестовые файлы

📊 РЕЗУЛЬТАТ:
- OnlyOffice Standalone РАБОТАЕТ! 
- Файлы открываются напрямую из S3 
- Редактор загружается БЫСТРО 
- Автосохранение настроено  (но нужна доработка callback)
2025-11-01 01:02:03 +03:00

12 KiB
Raw Blame History

🌐 Nextcloud API - Обзор и возможности

📋 Доступные API

1. WebDAV API (РАБОТАЕТ)

Базовый URL: https://office.clientright.ru:8443/remote.php/webdav/

Аутентификация: Basic Auth (admin + app password)

Возможности:

  • Список файлов и папок (PROPFIND)
  • Загрузка файлов (PUT)
  • Скачивание файлов (GET)
  • Удаление файлов (DELETE)
  • Создание папок (MKCOL)
  • Перемещение/копирование (MOVE/COPY)
  • Получение метаданных (PROPFIND)

Пример - список файлов:

curl -u "admin:APP_PASSWORD" \
  -X PROPFIND \
  "https://office.clientright.ru:8443/remote.php/webdav/" \
  -H "Depth: 1"

Пример - загрузка файла:

curl -u "admin:APP_PASSWORD" \
  -T /path/to/local/file.txt \
  "https://office.clientright.ru:8443/remote.php/webdav/file.txt"

Пример - скачивание файла:

curl -u "admin:APP_PASSWORD" \
  "https://office.clientright.ru:8443/remote.php/webdav/file.txt" \
  -o downloaded.txt

2. OCS API (Open Collaboration Services)

Базовый URL: https://office.clientright.ru:8443/ocs/v2.php/

Заголовки: OCS-APIRequest: true

Формат ответа: JSON (?format=json)

2.1 Capabilities API (информация о сервере)

curl -u "admin:APP_PASSWORD" \
  "https://office.clientright.ru:8443/ocs/v1.php/cloud/capabilities?format=json" \
  -H "OCS-APIRequest: true"

Ответ включает:

  • Версию Nextcloud (31.0.9)
  • Доступные возможности
  • Лимиты загрузки
  • Настройки шаринга

2.2 Activity API (СОБЫТИЯ ФАЙЛОВ!)

URL: https://office.clientright.ru:8443/ocs/v2.php/apps/activity/api/v2/activity

Параметры:

  • format=json - формат ответа
  • limit=N - количество событий
  • since=TIMESTAMP - события после определённой даты

Пример:

curl -u "admin:APP_PASSWORD" \
  "https://office.clientright.ru:8443/ocs/v2.php/apps/activity/api/v2/activity?format=json&limit=10" \
  -H "OCS-APIRequest: true"

Типы событий:

  • file_created - файл создан
  • file_changed - файл изменён
  • file_deleted - файл удалён
  • file_restored - файл восстановлен
  • file_shared - файл расшарен

Структура события:

{
  "activity_id": 195,
  "type": "file_created",
  "subject": "Вы создали «experimental_report.xlsx»",
  "message": "",
  "object_type": "files",
  "object_id": 73460,
  "object_name": "/experimental_report.xlsx",
  "datetime": "2025-10-30T12:53:40+00:00",
  "user": "admin"
}

⚠️ Ограничения:

  • Нет real-time уведомлений (только polling)
  • События агрегируются (несколько файлов в одном событии)
  • Может быть задержка до минуты

2.3 Users API

Список пользователей:

curl -u "admin:APP_PASSWORD" \
  "https://office.clientright.ru:8443/ocs/v1.php/cloud/users?format=json" \
  -H "OCS-APIRequest: true"

Информация о пользователе:

curl -u "admin:APP_PASSWORD" \
  "https://office.clientright.ru:8443/ocs/v1.php/cloud/users/admin?format=json" \
  -H "OCS-APIRequest: true"

2.4 Sharing API

Список расшаренных файлов:

curl -u "admin:APP_PASSWORD" \
  "https://office.clientright.ru:8443/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json" \
  -H "OCS-APIRequest: true"

Создать публичную ссылку:

curl -u "admin:APP_PASSWORD" \
  -X POST \
  -d "path=/file.txt&shareType=3" \
  "https://office.clientright.ru:8443/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json" \
  -H "OCS-APIRequest: true"

3. Direct Download URL

Для файлов можно получить прямую ссылку скачивания:

Формат:

https://office.clientright.ru:8443/index.php/apps/files/ajax/download.php?dir=/&files=filename.txt

Или через WebDAV:

https://office.clientright.ru:8443/remote.php/webdav/filename.txt

🎯 Использование для мониторинга файлов

Вариант 1: Activity API Polling (РЕКОМЕНДУЮ для Nextcloud)

Создай n8n workflow:

┌─────────────────────────────────────────────┐
│  Schedule (каждые 30 сек)                   │
└─────────────────┬───────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────┐
│  HTTP Request                               │
│  GET /ocs/v2.php/apps/activity/api/v2/      │
│      activity?format=json&limit=100         │
└─────────────────┬───────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────┐
│  Code (JS)                                  │
│  - Фильтруем file_created/changed/deleted  │
│  - Сохраняем последний activity_id          │
│  - Возвращаем только новые события          │
└─────────────────┬───────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────┐
│  Redis Publish                              │
│  Channel: crm:file:events                   │
└─────────────────────────────────────────────┘

Преимущества:

  • Официальный API
  • Надёжный
  • Детальная информация о событиях
  • Не требует доступа к Redis Nextcloud

Недостатки:

  • ⚠️ Задержка 30-60 сек (polling)
  • ⚠️ События агрегируются

Вариант 2: Redis Bridge (УЖЕ РАБОТАЕТ!)

Nextcloud Redis (notify_storage_update) → 
→ redis_bridge.js → 
→ CRM Redis (crm:file:events)

Преимущества:

  • Real-time (~1-2 сек)
  • Не нагружает Nextcloud API

Недостатки:

  • ⚠️ Требует доступ к внутреннему Redis
  • ⚠️ Меньше метаданных

📊 Сравнение подходов

Метод Задержка Детали Сложность Надёжность
Activity API 30-60с Низкая
Redis Bridge 1-2с Средняя
S3 Monitor 0-30с Низкая
WebDAV Poll 60с+ Низкая

🛠️ Примеры кода

PHP - Получение последних событий

<?php
$username = 'admin';
$password = 'APP_PASSWORD';
$url = 'https://office.clientright.ru:8443/ocs/v2.php/apps/activity/api/v2/activity?format=json&limit=10';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['OCS-APIRequest: true']);

$response = curl_exec($ch);
$data = json_decode($response, true);

foreach ($data['ocs']['data'] as $activity) {
    if (in_array($activity['type'], ['file_created', 'file_changed', 'file_deleted'])) {
        echo "Event: {$activity['type']}\n";
        echo "File: {$activity['object_name']}\n";
        echo "Time: {$activity['datetime']}\n";
        echo "---\n";
    }
}
?>

Node.js - Activity API Monitor

const axios = require('axios');
const Redis = require('ioredis');

const CONFIG = {
    nextcloud: {
        url: 'https://office.clientright.ru:8443',
        username: 'admin',
        password: 'APP_PASSWORD'
    },
    redis: {
        host: '147.45.146.17',
        port: 6379,
        password: 'CRM_Redis_Pass_2025_Secure!'
    },
    pollInterval: 30000 // 30 секунд
};

const redis = new Redis(CONFIG.redis);
let lastActivityId = 0;

async function checkActivities() {
    try {
        const response = await axios.get(
            `${CONFIG.nextcloud.url}/ocs/v2.php/apps/activity/api/v2/activity`,
            {
                params: { format: 'json', limit: 100 },
                headers: { 'OCS-APIRequest': 'true' },
                auth: {
                    username: CONFIG.nextcloud.username,
                    password: CONFIG.nextcloud.password
                }
            }
        );

        const activities = response.data.ocs.data;
        const fileEvents = activities.filter(a => 
            ['file_created', 'file_changed', 'file_deleted'].includes(a.type) &&
            a.activity_id > lastActivityId
        );

        for (const event of fileEvents.reverse()) {
            const payload = {
                type: event.type,
                source: 'nextcloud_activity',
                timestamp: event.datetime,
                file_id: event.object_id,
                path: event.object_name,
                filename: event.object_name.split('/').pop(),
                user: event.user
            };

            await redis.publish('crm:file:events', JSON.stringify(payload));
            console.log(`📤 Published: ${event.type} - ${event.object_name}`);
            
            lastActivityId = Math.max(lastActivityId, event.activity_id);
        }

    } catch (error) {
        console.error('❌ Error:', error.message);
    }
}

// Запуск
console.log('🚀 Nextcloud Activity Monitor');
setInterval(checkActivities, CONFIG.pollInterval);
checkActivities();

🎯 Рекомендации

Для твоего use case:

Комбинируй несколько подходов:

  1. Nextcloud файлы (WebUI)Redis Bridge (real-time, 1-2с)
  2. S3 прямые загрузкиn8n S3 Monitor (polling, 0-30с)
  3. CRM загрузкиПрямая публикация в Redis (instant)

Все события в одном канале: crm:file:events

Альтернатива (если нужна простота):

  • Используй только Activity API через n8n для Nextcloud событий
  • Плюс S3 Monitor для прямых загрузок в S3

📚 Полезные ссылки


🔐 Безопасность

App Password: tGHKS-3cC9m-7Hggb-65Awk-zxWQE
Пользователь: admin

⚠️ Важно: Используй App Passwords, а не основной пароль!


Готово! Теперь ты знаешь все доступные API Nextcloud! 🎉