# 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)