feat: add Timeweb Cloud provider for Woodpecker CI autoscaler

- 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
This commit is contained in:
2026-05-16 13:09:07 +03:00
commit 191cdd108f
34 changed files with 8651 additions and 0 deletions

105
README.md Normal file
View File

@@ -0,0 +1,105 @@
# 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)