name: nextcloud service_id: 50 service_display_name: Nextcloud service_short_name: nextcloud service_man: '# Инструкция по развертыванию Nextcloud через платформу

## 1. Общая информация

Nextcloud — платформа для хранения и совместной работы с файлами. Разворачивается в K8s через Helm-чарт `nextcloud/nextcloud`.

Сервис **не самодостаточен** — для создания необходимы заранее развёрнутые в той же ресурсной платформе:

* **PostgreSQL (k8s)** — база данных Nextcloud. У СУБД должен быть выставлен параметр `sslRequired: false`.
* **Redis (k8s)** — используется как memcache/locking backend.

Резервное копирование выполняется через **Velero** (бэкапятся под и PVC с данными), а не штатным S3-бэкапом СУБД.

### Доступные операции с сервисом

* **create** — создание сервиса
* **delete** — удаление сервиса
* **suspend** — остановка сервиса (масштабирование реплик в 0)
* **resume** — запуск сервиса
* **restart** — перезапуск (`kubectl rollout restart`)
* **modify** — изменение настроек сервиса
* **reconcile** — служебная операция синхронизации версии (запускается платформой автоматически)
* **create_backup** — создание резервной копии вручную (через Velero)
* **recovery** — восстановление из резервной копии в **новый** инстанс

> **Примечание:** операций работы с пользователями Nextcloud (`create_user`/`modify_user`/`delete_user`) на уровне платформы нет — пользователи приложения администрируются внутри самого Nextcloud.

---

## 2. Параметры создания сервиса

### Платформа для развертывания

Ресурсная платформа (`resourceRealm`), в которой будет развёрнут сервис. PostgreSQL и Redis, указанные ниже, обязаны находиться в той же ресурсной платформе.

### СУБД PostgreSQL (psqlUid)

UID инстанса PostgreSQL (k8s), в котором будет создана база и пользователь `nextcloud`.

* У выбранной СУБД должна отсутствовать база `nextcloud` и пользователь `nextcloud`.
* У СУБД обязан быть выключен `sslRequired` (`false`).

### СУБД Redis (redisUid)

UID инстанса Redis (k8s), который будет использоваться как memcache/locking backend.

### Количество реплик

Количество реплик Nextcloud (`clusterConfiguration.replicas`).

### Квота памяти пода (MB)

Объём памяти для пода Nextcloud в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода Nextcloud в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для данных (GB)

Объём диска под данные Nextcloud (`/var/www/html/data`) в гигабайтах.
Пример: `20`

### Домен

Домен, на котором будет доступен Nextcloud (`accessConfiguration.domain`).

* Если указано **полное доменное имя** (содержит точку, например `cloud.company.ru`) — домен считается клиентским. Перед созданием клиент обязан сам настроить DNS-запись, указывающую на адрес Ingress платформы, иначе создание завершится ошибкой.
* Если указано **короткое имя** (без точки, например `mycloud`) — платформа сама создаёт DNS-запись вида `.nextcloudk8s` и настраивает сертификат.

### Версия

Версия приложения Nextcloud (`appConfiguration.version`, поле `appVersion` Helm-чарта). По ней автоматически подбирается последняя подходящая версия Helm-чарта.

> **Примечание:** список поддерживаемых версий и допустимые шаги обновления заданы в `pipelines/stages/functions/helm.groovy` (см. раздел 13).

### Document Server

Параметр `appConfiguration.documentServer`. Если указать `collabora` — в кластер дополнительно разворачивается Collabora Online (совместное редактирование офисных документов), доступный по пути `/collabora` на том же домене.
Оставьте пустым, если Document Server не нужен.

### Уровень логирования

Параметр `appConfiguration.logLevel`. Одно из значений: `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`, либо `NONE` — чтобы не переопределять логирование Nextcloud.

---

## 3. Параметры модификации сервиса

Изменению подлежат ресурсы, версия и часть `appConfiguration`. Параметры `psqlUid`/`redisUid` менять после создания не рекомендуется.

### Количество реплик

См. раздел 2.

### Квота памяти пода (MB) / Квота CPU пода (mCPU) / Размер диска (GB)

См. раздел 2.

> **Примечание:** уменьшить уже выделенный размер диска нельзя.

### Версия

Обновление версии разрешено только **на один патч** либо **на одну минорную версию вперёд** (с `patch=0`). Прыжок сразу через несколько минорных версий или через несколько мажорных версий запрещён — обновляться нужно последовательно.

> **Примечание:** перед обновлением на новую minor/major-версию необходимо сначала выполнить `modify` на текущей версии, обновившись до последнего релиза этой версии (иначе операция завершится ошибкой с описанием, до какой версии нужно обновиться сначала).

### Document Server / Уровень логирования

См. раздел 2.

---

## 4. Параметры удаления сервиса

Специальных параметров нет — удаление сносит namespace целиком.

> **Примечание:** резервные копии, созданные через `create_backup`, хранятся в Velero отдельно от инстанса и **не удаляются** вместе с сервисом — операции `delete_backup` для Nextcloud нет, копии нужно вычищать на стороне Velero отдельно.

---

## 5. Параметры создания бэкапа

Специальных пользовательских параметров нет — имя бэкапа генерируется автоматически в формате `<дата>-<версия>-`.

> **Примечание:** создать бэкап можно только если сервис предварительно приостановлен (`suspend`). Velero, в который создаётся бэкап, должен быть развёрнут в той же ресурсной платформе, что и Nextcloud, и не может быть сменён на другой Velero-инстанс в рамках одного сервиса.

Бэкапится под с данными вместе с PVC/PV (файлы), метаданные и БД PostgreSQL бэкапом не затрагиваются — версия схемы БД фиксируется отдельно (см. раздел 6).

---

## 6. Параметры восстановления из бэкапа (recovery)

В отличие от СУБД-сервисов, `recovery` у Nextcloud **не восстанавливает данные в текущий инстанс**, а создаёт **новый** инстанс сервиса (аналог `create`), в который переносятся файлы из указанной резервной копии.

### Точка восстановления (recoveryPoint)

Имя резервной копии Velero, из которой будет выполнено восстановление.

### Домен нового инстанса

Обязан отличаться от домена исходного (текущего) инстанса — восстановление на тот же домен не поддерживается.

### СУБД PostgreSQL нового инстанса

Если версия Nextcloud в бэкапе отличается от текущей версии инстанса, для нового инстанса обязательно нужно указать **другую** СУБД PostgreSQL (нельзя восстанавливать бэкап со старой схемой БД поверх БД с более новой схемой).

---

## 7. Выходные параметры

После успешного создания сервиса платформа возвращает:

### connectionUrl

Адрес для входа в Nextcloud: `https://<домен>`.

### namespace

Namespace в K8s-кластере, в котором развёрнут сервис.

### Учётные данные (Vault)

В Vault сохраняется пароль администратора (`adminPass`) под логином `admin`.

---

## 8. Пример подключения

Откройте `connectionUrl` в браузере и авторизуйтесь:

* **Логин:** `admin`
* **Пароль:** значение `adminPass` из блока «Учётные данные» в Vault

---

## 9. Дополнительная информация

### Зависимости

Nextcloud нельзя создать без уже существующих в том же `resourceRealm` сервисов PostgreSQL (k8s, `sslRequired: false`) и Redis (k8s). При `delete` зависимые СУБД и Redis не трогаются — удаляется только сам Nextcloud.

### suspend/resume

При `suspend` количество реплик Nextcloud, Collabora и exporter''а метрик принудительно выставляется в `0` через `helm upgrade` (реальное масштабирование, а не просто пауза cron). При `resume` реплики возвращаются к значению из `clusterConfiguration.replicas`.

### Collabora

Собирается из отдельного `image.repository: nexus-sa.tst.nubes.ru/collabora/code` и включается только при `appConfiguration.documentServer == ''collabora''`. Доступен на том же домене и том же TLS-сертификате, что и сам Nextcloud, по пути `/collabora`.

### Бэкап/восстановление через Velero

Бэкап/восстановление файлов идёт через Velero с селектором `backup=-velero-backup` и включает под, PVC и PV — то есть непосредственно файлы `/var/www/html/data`. Восстановление БД в новый инстанс выполняется штатным механизмом `create` с параметром `instanceUidFrom`, который проставляет `recovery`-джоба автоматически.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 16 operation: create kind: instance action: create - svcOperationId: 404 operation: create_backup kind: subresource action: create - svcOperationId: 17 operation: delete kind: instance action: delete - svcOperationId: 67 operation: modify kind: instance action: modify - svcOperationId: 390 operation: reconcile kind: action action: reconcile - svcOperationId: 406 operation: recovery kind: action action: recovery - svcOperationId: 66 operation: restart kind: action action: restart - svcOperationId: 129 operation: resume kind: instance action: resume - svcOperationId: 128 operation: suspend kind: instance action: suspend stateOut: backups: {} cfsParams: - svcOperationCfsParamId: 1055 svcOperationCfsParam: startupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: false dataDescriptor: resourceRealm: dataType: string defaultValue: k8s-4-ext-nubes-ru isRequired: true isModifiable: false valueList: - k8s-4-ext-nubes-ru psqlEnabled: dataType: boolean defaultValue: 'true' isRequired: true isModifiable: false valueList: - 'true' redisEnabled: dataType: boolean defaultValue: 'true' isRequired: true isModifiable: false valueList: - 'true' psqlUid: dataType: uuid defaultValue: '' isRequired: true isModifiable: false redisUid: dataType: uuid defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 1056 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: cpu: dataType: integer > 0 defaultValue: '1000' isRequired: true isModifiable: false valueList: - '1000' - '2000' - '3000' - '4000' memory: dataType: integer > 0 defaultValue: '1024' isRequired: true isModifiable: false valueList: - '1024' - '2048' - '3072' - '4096' - '5120' - '6144' - '7168' - '8192' replicas: dataType: integer > 0 defaultValue: '1' isRequired: true isModifiable: false valueList: - '1' - '2' disk: dataType: integer > 0 defaultValue: '10' isRequired: true isModifiable: false - svcOperationCfsParamId: 1057 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: false dataDescriptor: domain: dataType: string defaultValue: nextcloud-v9jbyta8 isRequired: true isModifiable: false - svcOperationCfsParamId: 1058 svcOperationCfsParam: appConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: version: dataType: string defaultValue: 33.0.4 isRequired: true isModifiable: false valueList: - 33.0.4 documentServer: dataType: string defaultValue: collabora isRequired: true isModifiable: false valueList: - collabora logLevel: dataType: string defaultValue: INFO isRequired: true isModifiable: false valueList: - DEBUG - INFO - WARN - ERROR - FATAL - NONE - svcOperationCfsParamId: 1077 svcOperationCfsParam: startupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: false dataDescriptor: veleroUid: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 1059 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: cpu: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '1000' - '2000' - '3000' - '4000' memory: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '1024' - '2048' - '3072' - '4096' - '5120' - '6144' - '7168' - '8192' replicas: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '1' - '2' disk: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 1060 svcOperationCfsParam: appConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: version: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - 33.0.4 documentServer: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - collabora logLevel: dataType: string defaultValue: '' isRequired: true isModifiable: false valueList: - DEBUG - INFO - WARN - ERROR - FATAL - NONE - svcOperationCfsParamId: 1078 svcOperationCfsParam: startupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: resourceRealm: dataType: string defaultValue: k8s-4-ext-nubes-ru isRequired: true isModifiable: false valueList: - k8s-4-ext-nubes-ru psqlEnabled: dataType: boolean defaultValue: 'true' isRequired: true isModifiable: false valueList: - 'true' redisEnabled: dataType: boolean defaultValue: 'true' isRequired: true isModifiable: false valueList: - 'true' recoveryPoint: dataType: string defaultValue: '' isRequired: true isModifiable: false psqlUid: dataType: uuid defaultValue: '' isRequired: true isModifiable: false redisUid: dataType: uuid defaultValue: '' isRequired: true isModifiable: false veleroUid: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 1079 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: cpu: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '1000' - '2000' - '3000' - '4000' memory: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '1024' - '2048' - '3072' - '4096' - '5120' - '6144' - '7168' - '8192' replicas: dataType: integer > 0 defaultValue: 1,2 isRequired: true isModifiable: false disk: dataType: integer > 0 defaultValue: '10' isRequired: true isModifiable: false - svcOperationCfsParamId: 1080 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: domain: dataType: string defaultValue: nextcloud-zdaml6i9 isRequired: true isModifiable: false - svcOperationCfsParamId: 1081 svcOperationCfsParam: appConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: documentServer: dataType: string defaultValue: collabora isRequired: true isModifiable: false valueList: - collabora logLevel: dataType: string defaultValue: NONE isRequired: true isModifiable: false valueList: - DEBUG - INFO - WARN - ERROR - FATAL - NONE version: dataType: string defaultValue: '' isRequired: false isModifiable: false cfsParamsByOp: 16: - 1055 - 1056 - 1057 - 1058 404: - 1077 17: [] 67: - 1059 - 1060 390: [] 406: - 1078 - 1079 - 1080 - 1081 66: [] 129: [] 128: [] stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru", "psqlEnabled": true, "redisEnabled": true, "psqlUid": "", "redisUid": ""}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 10}' accessConfiguration: '{"domain": "nextcloud-v9jbyta8"}' appConfiguration: '{"version": "33.0.4", "documentServer": "collabora", "logLevel": "INFO"}'