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`.
* У СУБД обязан быть выключен `sslMode` (`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-чарта.
### 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: ''
isRequired: true
isModifiable: false
valueList:
- devclustername
- k8s-3-sandbox-nubes-ru
- k8s-4-sandbox-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-gsjkslra
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: ''
isRequired: true
isModifiable: false
valueList:
- devclustername
- k8s-3-sandbox-nubes-ru
- k8s-4-sandbox-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-cpp3zfhe
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": "", "psqlEnabled": true, "redisEnabled": true, "psqlUid": "", "redisUid": ""}'
clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 10}'
accessConfiguration: '{"domain": "nextcloud-gsjkslra"}'
appConfiguration: '{"version": "33.0.4", "documentServer": "collabora", "logLevel": "INFO"}'