- Implement timewebcloud provider with DeployAgent, RemoveAgent, ListDeployedAgentNames - Add minimal HTTP API client for Timeweb Cloud (create/list/delete servers) - Register provider in main.go with CLI flags - Add timeweb-list and timeweb-tester utilities - Include Dockerfile and docker-compose.yml for deployment - Update DEPLOY.md with verified OS/preset IDs
106 lines
4.9 KiB
Markdown
106 lines
4.9 KiB
Markdown
# Timeweb Cloud Autoscaler Provider for Woodpecker CI
|
||
|
||
Динамический autoscaler для Woodpecker CI с поддержкой хостера Timeweb Cloud.
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
┌──────────────────────┐
|
||
│ Woodpecker Server │◄──── постоянно запущен на VDS
|
||
│ (gRPC + Web UI) │
|
||
└──────────┬───────────┘
|
||
│
|
||
▼ gRPC
|
||
┌──────────────────────┐
|
||
│ Woodpecker Agent │◄──── постоянно запущен на VDS (можно оставить 1 статический)
|
||
│ (Docker Compose) │
|
||
└──────────────────────┘
|
||
|
||
┌──────────────────────────────────────────┐
|
||
│ Woodpecker Autoscaler │◄──── постоянно запущен
|
||
│ (форк woodpecker-ci/autoscaler + │
|
||
│ провайдер timewebcloud) │
|
||
└──────────┬───────────────────────────────┘
|
||
│
|
||
▼ HTTP / JWT
|
||
┌──────────────────────────────────────────┐
|
||
│ Timeweb Cloud API │
|
||
│ api.timeweb.cloud │
|
||
│ - CreateServer │
|
||
│ - DeleteServer │
|
||
│ - ListServers │
|
||
└──────────────────────────────────────────┘
|
||
|
||
Flow:
|
||
1. Появляется задача в очереди Woodpecker
|
||
2. Autoscaler создает новый VDS через Timeweb API
|
||
3. VDS загружается, cloud-init устанавливает Docker и запускает Agent
|
||
4. Agent подключается к Server по gRPC и забирает задачу
|
||
5. По завершении задачи и истечении idle-timeout, autoscaler удаляет VDS
|
||
```
|
||
|
||
## Сборка
|
||
|
||
Требования: Go 1.23+
|
||
|
||
```bash
|
||
go build -o woodpecker-autoscaler ./cmd/woodpecker-autoscaler
|
||
```
|
||
|
||
При сборке на машине с ограниченной памятью используйте:
|
||
```bash
|
||
GOMAXPROCS=1 go build -p 1 -o woodpecker-autoscaler ./cmd/woodpecker-autoscaler
|
||
```
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
export WOODPECKER_SERVER=https://your-woodpecker-server
|
||
export WOODPECKER_TOKEN=your-token
|
||
export WOODPECKER_PROVIDER=timewebcloud
|
||
export WOODPECKER_TIMEWEBCLOUD_API_TOKEN=your-jwt-token
|
||
export WOODPECKER_TIMEWEBCLOUD_OS_ID=123
|
||
export WOODPECKER_TIMEWEBCLOUD_PRESET_ID=456
|
||
export WOODPECKER_TIMEWEBCLOUD_AVAILABILITY_ZONE=msk-1
|
||
|
||
./woodpecker-autoscaler
|
||
```
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
twcloud-scaler/
|
||
├── agents.md # Контекст для AI-агентов
|
||
├── README.md # Этот файл
|
||
├── go.mod # Модуль Go
|
||
├── woodpecker-autoscaler # Собранный бинарник
|
||
├── cmd/
|
||
│ └── woodpecker-autoscaler/
|
||
│ ├── main.go # Точка входа
|
||
│ └── flags.go # Глобальные CLI-флаги
|
||
├── providers/
|
||
│ └── timewebcloud/
|
||
│ ├── provider.go # Реализация Provider interface
|
||
│ ├── flags.go # CLI-флаги провайдера
|
||
│ └── api/
|
||
│ └── client.go # Минимальный HTTP-клиент для Timeweb API
|
||
├── engine/ # Ядро autoscaler (из upstream)
|
||
├── config/ # Конфигурация (из upstream)
|
||
├── server/ # Woodpecker API client (из upstream)
|
||
└── utils/ # Утилиты (из upstream)
|
||
```
|
||
|
||
## Что реализовано
|
||
|
||
- [x] Провайдер `timewebcloud` для Woodpecker Autoscaler
|
||
- [x] Создание VDS (`DeployAgent`) с cloud-init
|
||
- [x] Удаление VDS (`RemoveAgent`) по имени агента
|
||
- [x] Список развернутых агентов (`ListDeployedAgentNames`) с фильтрацией по префиксу
|
||
- [x] Минимальный HTTP-клиент для Timeweb Cloud API (вместо сломанного SDK)
|
||
- [x] Интеграция в main.go
|
||
- [x] Успешная сборка бинарника
|
||
|
||
## Ссылки
|
||
- [Woodpecker Autoscaler](https://github.com/woodpecker-ci/autoscaler)
|
||
- [Timeweb Cloud API Docs](https://timeweb.cloud/api-docs)
|