Сервис на NestJS, который решает две задачи:
- Регулярно получает тарифы WB для коробов и сохраняет их в PostgreSQL по дням.
- Регулярно обновляет актуальные тарифы из PostgreSQL в Google Sheets (лист
stocks_coefs) дляNтаблиц.
- NestJS — backend
- PostgreSQL — СУБД
- Knex.js — работа с БД и миграции
- Google Sheets API
- Docker + Docker Compose
- Docker + Docker Compose
- Доступ к WB API (токен)
- Google Service Account JSON с доступом на редактирование нужных таблиц
В проекте в docker-compose.yml используется .env.example как файл окружения контейнеров.
Перед запуском подставьте в .env.example реальные значения:
# порты
APP_PORT=3005
# Postgres (по ТЗ: postgres/postgres/postgres)
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
POSTGRES_PORT=5432
POSTGRES_HOST=postgres
# WB / Google
WB_API_TOKEN=your_wb_token
WB_API_BASE_URL=https://common-api.wildberries.ru
GOOGLE_SHEETS_IDS=spreadsheet_id_1,spreadsheet_id_2
GOOGLE_SERVICE_ACCOUNT_JSON_PATH=secrets/google_sa.json
GOOGLE_SHEETS_TAB=stocks_coefs
# Cron
WB_CRON=0 * * * *
SHEETS_CRON=*/10 * * * *
WB_TZ=Europe/MoscowСоздайте файл сервисного аккаунта Google:
cp secrets/google_sa.json.example secrets/google_sa.jsonПосле этого вставьте в secrets/google_sa.json реальные ключи сервисного аккаунта.
Важно: сервисный аккаунт должен иметь роль Editor для каждой таблицы из GOOGLE_SHEETS_IDS.
Запуск по ТЗ одной командой:
docker compose up --buildЧто происходит при старте:
- Поднимается PostgreSQL.
backend-devждет healthcheck БД.- На старте backend выполняются миграции (
npm run migrate:dev). - Запускается приложение (
npm run start:dev).
Остановка:
docker compose down- Endpoint WB:
GET https://common-api.wildberries.ru/api/v1/tariffs/box?date=YYYY-MM-DD - Планировщик:
WB_CRON(по умолчанию: каждый час) - Данные за день сохраняются в таблицу
wb_box_tariffs_daily - В течение дня записи обновляются через upsert (по ключу
tariff_date + warehouse_name)
- Планировщик:
SHEETS_CRON(по умолчанию: каждые 10 минут) - Из БД берутся данные за текущую дату
- Данные сортируются по возрастанию
box_delivery_coef_expr - Выполняется перезапись листа
stocks_coefsдля всехGOOGLE_SHEETS_IDS
Логи сервиса:
docker compose logs -f backend-devОжидаемые сообщения:
Планировщик WB активированПланировщик Sheets активированWB API: сохранено тарифов: ...Google Sheets: обновил ...
Проверка данных в БД:
docker compose exec postgres psql -U postgres -d postgres -c "select tariff_date, count(*) from wb_box_tariffs_daily group by tariff_date order by tariff_date desc;"Проверка Google Sheets:
- Откройте таблицу по ID из
GOOGLE_SHEETS_IDS. - Проверьте лист
stocks_coefs. - Убедитесь, что данные обновляются и отсортированы по
box_delivery_coef_expr.
Если запускать npm run migrate:dev/rollback:* на хосте, переменные POSTGRES_* из Docker могут не подхватиться.
Поэтому миграции и откаты лучше выполнять внутри контейнера:
docker compose exec backend-dev npm run migrate:dev
docker compose exec backend-dev npm run rollback:dev
docker compose exec backend-dev npm run rollback:dev:allКак зайти в контейнер вручную:
docker compose exec backend-dev shВыход из контейнера:
exit| Действие | Команда |
|---|---|
| Запуск (по ТЗ) | docker compose up --build |
| Запуск в фоне | npm run dev:up |
| Остановка | npm run dev:down |
| Логи backend | npm run dev:logs |
| Состояние контейнеров | npm run dev:ps |
| Применить миграции (Docker) | docker compose exec backend-dev npm run migrate:dev |
| Откатить 1 миграцию (Docker) | docker compose exec backend-dev npm run rollback:dev |
| Откатить все миграции (Docker) | docker compose exec backend-dev npm run rollback:dev:all |
| Войти в контейнер backend | docker compose exec backend-dev sh |
| Проверка линта | npm run lint:check |
| Проверка типов | npm run typecheck |
В репозитории хранятся только шаблоны конфигурации без чувствительных данных:
.env.examplesecrets/google_sa.json.example
Реальные токены и ключи в git не добавляются.
- Разработчик: Saprankov Prokhor
- Telegram: @Proha_Sap
- Email: stepa.ryazanoff@gmail.com
- GitHub: https://github.com/stepaRyazanoff