Сервис для автоматического получения информации о тарифах Wildberries и синхронизации с Google Sheets.
Приложение выполняет следующие задачи:
- Ежечасное получение данных о тарифах коробов через WB API
- Сохранение данных в PostgreSQL с накоплением истории по дням
- UPSERT логика - обновление данных в течение дня
- Регулярное обновление произвольного количества Google таблиц (лист
stocks_coefs) - Автоматическая сортировка данных по коэффициенту
- HTTP endpoints для health checks и метрик
- Prometheus метрики для мониторинга
- Unit тесты (38 passed, coverage 36%)
- Graceful shutdown
- Retry логика для API запросов
- Structured logging
- Docker & Docker Compose
- Node.js 20+ (для локальной разработки)
- Клонируйте репозиторий:
git clone https://github.com/shuldeshoff/wb-tariffs-tracker.git
cd wb-tariffs-tracker- Создайте файл
.envиз примера:
cp .env.example .env- Настройте переменные окружения в
.env:
# Wildberries API
WB_API_TOKEN=your_token_from_hh
# Google Sheets
GOOGLE_SERVICE_ACCOUNT_EMAIL=your-service-account@project.iam.gserviceaccount.com
GOOGLE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nYour_Key_Here\n-----END PRIVATE KEY-----
GOOGLE_SHEET_IDS=sheet_id_1,sheet_id_2- Запустите приложение:
docker compose up --buildПриложение запустится и сразу начнет работу:
- Получит данные от WB API
- Сохранит в базу данных
- Обновит все указанные Google Sheets
- HTTP сервер будет доступен на порту 3000 (по умолчанию)
После запуска приложения доступны следующие endpoints:
| Endpoint | Описание | Метод |
|---|---|---|
/health |
Комплексная проверка здоровья (БД + scheduler) | GET |
/ready |
Проверка готовности к работе | GET |
/live |
Проверка жизни приложения | GET |
/metrics |
Prometheus метрики | GET |
/status |
Статус сервиса и scheduler | GET |
# Проверка здоровья приложения
curl http://localhost:3000/health
# Получение метрик для Prometheus
curl http://localhost:3000/metrics
# Проверка статуса
curl http://localhost:3000/statusПриложение экспортирует следующие метрики:
Counters (Счётчики):
wb_api_requests_total{status}- Всего запросов к WB APIwb_api_errors_total{error_type}- Всего ошибок WB APIsheets_update_total{status}- Всего обновлений Google Sheetssheets_update_errors_total- Всего ошибок обновления Sheetstariffs_processed_total- Всего обработанных тарифов
Gauges (Гауджи):
last_successful_fetch_timestamp- Время последнего успешного получения данныхlast_successful_sheets_update_timestamp- Время последнего успешного обновления таблицactive_tasks{task_type}- Количество активных задач
Histograms (Гистограммы):
wb_api_duration_seconds- Длительность запросов к WB APIsheets_update_duration_seconds- Длительность обновления Google Sheetsdb_operation_duration_seconds{operation}- Длительность операций с БД
/health endpoint возвращает:
{
"status": "healthy",
"timestamp": "2025-10-22T12:00:00.000Z",
"uptime": 3600,
"checks": {
"database": {
"status": "healthy",
"latency": 5
},
"scheduler": {
"status": "healthy",
"tasks": {
"fetchData": "running",
"updateSheets": "running"
}
}
}
}| Переменная | Описание | По умолчанию |
|---|---|---|
POSTGRES_HOST |
Хост PostgreSQL | localhost |
POSTGRES_PORT |
Порт PostgreSQL | 5432 |
POSTGRES_DB |
Имя БД | postgres |
POSTGRES_USER |
Пользователь БД | postgres |
POSTGRES_PASSWORD |
Пароль БД | postgres |
APP_PORT |
Порт HTTP сервера | 3000 |
WB_API_URL |
URL WB API | https://common-api.wildberries.ru/api/v1/tariffs/box |
WB_API_TOKEN |
Токен WB API | обязательно |
GOOGLE_SERVICE_ACCOUNT_EMAIL |
Email Service Account | обязательно |
GOOGLE_PRIVATE_KEY |
Приватный ключ | обязательно |
GOOGLE_SHEET_IDS |
ID таблиц через запятую | обязательно |
CRON_FETCH_WB_DATA |
Расписание получения данных | 0 * * * * (каждый час) |
CRON_UPDATE_SHEETS |
Расписание обновления таблиц | */30 * * * * (каждые 30 мин) |
LOG_LEVEL |
Уровень логирования | info |
NODE_ENV |
Окружение | development |
- Перейдите в Google Cloud Console
- Создайте новый проект или выберите существующий
- Включите Google Sheets API
- Создайте Service Account:
- IAM & Admin → Service Accounts → Create Service Account
- Скачайте JSON-ключ
- Откройте свои Google Sheets и дайте доступ Service Account (Share):
- Email:
your-service-account@project.iam.gserviceaccount.com - Права: Editor
- Email:
- Скопируйте из JSON:
client_email→GOOGLE_SERVICE_ACCOUNT_EMAILprivate_key→GOOGLE_PRIVATE_KEY
wb-tariffs-tracker/
├── src/
│ ├── config/ # Конфигурация
│ ├── postgres/ # Миграции и seeds
│ ├── repositories/ # Работа с БД
│ ├── services/ # Бизнес-логика
│ ├── scheduler/ # Планировщик задач
│ ├── types/ # TypeScript типы
│ ├── utils/ # Утилиты
│ └── index.ts # Точка входа
├── tests/ # Тесты
├── logs/ # Логи приложения
├── .env.example # Пример переменных окружения
├── compose.yaml # Docker Compose конфигурация
├── Dockerfile # Docker образ
└── README.md # Этот файл
Хранит данные о тарифах с уникальным ключом (date, warehouse_name, box_type).
При повторном получении данных в течение дня записи обновляются (UPSERT).
Данные в Google Sheets обновляются на листе stocks_coefs со следующими колонками:
- Склад
- Тип коробки
- Коэффициент
- Дата обновления
- Дата следующей коробки
- Дата до максимума
Данные автоматически сортируются по возрастанию коэффициента.
# Установить зависимости
npm install
# Запустить PostgreSQL
docker compose up -d postgres
# Применить миграции
npm run knex:dev migrate latest
# Запустить в режиме разработки
npm run dev# Запустить все тесты
npm test
# Watch режим
npm run test:watch
# С покрытием кода
npm run test:coverage# Проверить код с ESLint
npm run lint
# Автоматически исправить ошибки
npm run lint:fix
# Проверить с нулевой толерантностью к warnings (для CI)
npm run lint:check
# Проверить форматирование Prettier
npm run prettier
# Исправить форматирование
npm run prettier-format# Создать новую миграцию
npm run knex:dev migrate make migration_name
# Применить миграции
npm run knex:dev migrate latest
# Откатить последнюю миграцию
npm run knex:dev migrate rollbackПосле запуска приложение доступно на http://localhost:3000:
# Проверка здоровья приложения
curl http://localhost:3000/health
# Ожидается: {"status":"healthy", "checks":{"database":{"status":"healthy"},...}}
# Проверка статуса сервиса
curl http://localhost:3000/status
# Ожидается: {"service":"wb-tariffs-service","version":"1.0.0",...}
# Проверка метрик Prometheus
curl http://localhost:3000/metrics
# Ожидается: метрики в формате Prometheus
# Liveness probe (для Kubernetes)
curl http://localhost:3000/live
# Readiness probe (для Kubernetes)
curl http://localhost:3000/ready# Логи приложения
docker compose logs -f app
# Логи базы данных
docker compose logs -f postgres
# Проверка что scheduler работает
docker compose logs app | grep "Scheduler started"
# Проверка что API запросы выполняются
docker compose logs app | grep "GET /"# Подключиться к PostgreSQL
docker compose exec postgres psql -U postgres -d postgres
# Проверить данные
SELECT date, warehouse_name, box_type, coefficient
FROM tariffs
ORDER BY date DESC, coefficient ASC
LIMIT 10;# Запуск всех сервисов
docker compose up --build
# Запуск только БД
docker compose up -d postgres
# Остановка
docker compose down
# Полная очистка (с удалением volumes)
docker compose down --volumes --rmi local
# Перезапуск приложения
docker compose restart app- Backend: Node.js 20, TypeScript (strict mode)
- Database: PostgreSQL 16, Knex.js
- APIs: Wildberries API, Google Sheets API v4
- Infrastructure: Docker, Docker Compose
- Scheduler: node-cron (ежечасно + каждые 30 мин)
- Testing: Jest, ts-jest (coverage 36%, 38 tests passed)
- Logging: log4js (console + file rotation)
- HTTP Server: Express (5 endpoints)
- Metrics: prom-client (26 Prometheus метрик)
| Требование | Статус | Реализация |
|---|---|---|
| PostgreSQL + Knex.js | Выполнено | PostgreSQL 16.1, Knex 3.0.1 |
| TypeScript описание типов | Выполнено | Strict mode, все типы описаны |
| WB API endpoint | Выполнено | https://common-api.wildberries.ru/api/v1/tariffs/box |
| Ежечасное получение данных | Выполнено | Cron: 0 * * * * |
| Накопление данных по дням | Выполнено | UPSERT по ключу (date, warehouse, box_type) |
| Обновление данных за день | Выполнено | onConflict + merge в Knex |
| N Google таблиц | Выполнено | Через GOOGLE_SHEET_IDS (comma-separated) |
| Лист stocks_coefs | Выполнено | Реализовано |
| Сортировка по коэффициенту | Выполнено | ORDER BY coefficient ASC |
| Docker + compose | Выполнено | Multi-stage build, healthchecks |
docker compose up |
Выполнено | Запуск одной командой |
| README с инструкцией | Выполнено | Полная документация |
| .env.example | Выполнено | Без чувствительных данных |
| postgres/postgres/postgres | Выполнено | По умолчанию |
Юрий Шульдешов
Telegram: @shuldeshoff