✅ ЧТО СДЕЛАНО: - Поднят новый 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)
12 KiB
🌐 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:
Комбинируй несколько подходов:
- Nextcloud файлы (WebUI) → Redis Bridge (real-time, 1-2с)
- S3 прямые загрузки → n8n S3 Monitor (polling, 0-30с)
- 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! 🎉