history: document deck-api 403 workaround, map-fixed sub-fields, devops discussion, CMDB bug
This commit is contained in:
@@ -96,3 +96,79 @@ NUBES_API_ENDPOINT="https://lk-api-gateway.ngcloud.ru/api/v1/svc" # prod
|
|||||||
```
|
```
|
||||||
|
|
||||||
Всё остальное — авто-детект.
|
Всё остальное — авто-детект.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Доступ к СТАРОМУ deck-api (DDoS-Guard 403)
|
||||||
|
|
||||||
|
Старый API **жив**, но DDoS-Guard усилил фильтрацию. Просто `User-Agent: Mozilla/5.0` уже недостаточно.
|
||||||
|
|
||||||
|
### Рабочие заголовки для curl:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -H "Authorization: Bearer $TOKEN" \
|
||||||
|
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \
|
||||||
|
-H "Referer: https://deck-test.ngcloud.ru/" \
|
||||||
|
"https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=/services/90"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ключевое**: `Referer` с доменом того же стенда. Без него — 403.
|
||||||
|
|
||||||
|
### Без токена (публичные эндпоинты):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -H "User-Agent: Mozilla/5.0" \
|
||||||
|
"https://deck-api-test.ngcloud.ru/api/v1"
|
||||||
|
# → 200 (OK)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Что изменилось с июля 2026
|
||||||
|
|
||||||
|
DDoS-Guard ужесточил правила:
|
||||||
|
- Старый `User-Agent: Mozilla/5.0` + `Accept: */*` → 403
|
||||||
|
- Новый: нужен полный браузерный User-Agent + Referer
|
||||||
|
- Провайдер (v5.0.75) использовал старые заголовки — при следующем билде надо обновить
|
||||||
|
- Новый Gateway (`lk-api-gateway`) — 403 не выдаёт, работает с любым User-Agent
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проблема map-fixed параметров и dataDescriptor
|
||||||
|
|
||||||
|
### Суть
|
||||||
|
|
||||||
|
Новый Gateway группирует плоские параметры в map-fixed JSON-блоки. Sub-поля (`dataDescriptor`) не видны в `/serviceOperation/{id}` — появляются только в ответе уже выполненной операции `/instanceOperations/{uid}`.
|
||||||
|
|
||||||
|
### Как получить sub-поля (на примере postgres)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Найти любой успешный инстанс postgres
|
||||||
|
curl ... "https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=/instances?serviceId=90&page=1&size=1"
|
||||||
|
|
||||||
|
# 2. Взять instanceUid → запросить операции → взять create-операцию
|
||||||
|
curl ... "https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=/instances/{uid}"
|
||||||
|
|
||||||
|
# 3. Запросить операцию — в cfsParams будет dataDescriptor с sub-полями
|
||||||
|
curl ... "https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=/instanceOperations/{opUid}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Правильные JSON-ключи для postgres (из dataDescriptor)
|
||||||
|
|
||||||
|
| Блок | Поля |
|
||||||
|
|---|---|
|
||||||
|
| `startupConfiguration` | `resourceRealm` |
|
||||||
|
| `clusterConfiguration` | `cpu`, `memory`, `replicas`, `disk` |
|
||||||
|
| `accessConfiguration` | `masterIpSpace`, `masterAccessList`, `slaveIpSpace`, `slaveAccessList` |
|
||||||
|
| `postgresConfiguration` | `version`, `sslRequired`, `poolerMaster`, `poolerSlave` |
|
||||||
|
| `postgresConf` | `paramName`, `paramValue` (массив) |
|
||||||
|
| `backupConfiguration` | `s3Uid`, `retain`, `schedule` |
|
||||||
|
| `autoscaleConfiguration` | `enabled`, `schedule`, `quota`, `percent` |
|
||||||
|
|
||||||
|
### Обсуждение с девопсами (02.07.2026)
|
||||||
|
|
||||||
|
- Плоские параметры **не вернутся** — map-fixed остаётся (нужно для групп ключей, нод, учёток)
|
||||||
|
- Структуру блоков обещают давать в API, но пока не придумали формат
|
||||||
|
- Пока единственный источник структуры — Jenkins-конфиги
|
||||||
|
|
||||||
|
### CMDB backend bug
|
||||||
|
|
||||||
|
При run операции бэкенд `/app/cmdb` падает с `ValidationError: InstanceState: version, instanceUid, dtState, isTest, instanceOperationUid — can't be blank`. Это баг в Gateway→CMDB, не в провайдере.
|
||||||
|
|||||||
@@ -1,40 +1,42 @@
|
|||||||
resource "nubes_postgres" "npg" {
|
resource "nubes_postgres" "npg" {
|
||||||
resource_name = "pg4tf033"
|
resource_name = "pg4tf033"
|
||||||
|
|
||||||
cluster_configuration = jsonencode({
|
startup_configuration = jsonencode({
|
||||||
platform = var.realm
|
resourceRealm = var.realm
|
||||||
instances = 1
|
|
||||||
memory = 512
|
|
||||||
cpu = 500
|
|
||||||
disk = "1"
|
|
||||||
})
|
})
|
||||||
|
|
||||||
startup_configuration = jsonencode({
|
cluster_configuration = jsonencode({
|
||||||
appVersion = "17"
|
cpu = 500
|
||||||
|
memory = 512
|
||||||
|
replicas = 1
|
||||||
|
disk = "1"
|
||||||
})
|
})
|
||||||
|
|
||||||
access_configuration = jsonencode({
|
access_configuration = jsonencode({
|
||||||
needExternalAddressMaster = false
|
masterIpSpace = ""
|
||||||
|
masterAccessList = ""
|
||||||
|
slaveIpSpace = ""
|
||||||
|
slaveAccessList = ""
|
||||||
})
|
})
|
||||||
|
|
||||||
postgres_configuration = jsonencode({
|
postgres_configuration = jsonencode({
|
||||||
enablePgPoolerMaster = false
|
version = "17"
|
||||||
enablePgPoolerSlave = false
|
sslRequired = false
|
||||||
allowNoSsl = false
|
poolerMaster = false
|
||||||
s3Uid = var.s3_uid
|
poolerSlave = false
|
||||||
jsonParameters = jsonencode({
|
|
||||||
log_connections = "off"
|
|
||||||
log_disconnections = "off"
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
backup_configuration = jsonencode({})
|
backup_configuration = jsonencode({
|
||||||
|
s3Uid = var.s3_uid
|
||||||
|
retain = "7"
|
||||||
|
schedule = "0 0 * * *"
|
||||||
|
})
|
||||||
|
|
||||||
autoscale_configuration = jsonencode({
|
autoscale_configuration = jsonencode({
|
||||||
autoScale = false
|
enabled = false
|
||||||
percentage = 10
|
schedule = ""
|
||||||
techWindow = 0
|
quota = "1"
|
||||||
quotaGb = "1"
|
percent = 10
|
||||||
})
|
})
|
||||||
|
|
||||||
operation_timeout = "11m"
|
operation_timeout = "11m"
|
||||||
|
|||||||
Reference in New Issue
Block a user