Сервис получает тарифы коробов из API Wildberries, сохраняет их в PostgreSQL и выгружает актуальные данные в Google Sheets.
Приложение запускается в Docker-контейнерах одной командой и затем:
- при старте сразу выполняет синхронизацию;
- далее повторяет её каждый час.
-
Запрашивает тарифы коробов из WB API:
https://common-api.wildberries.ru/api/v1/tariffs/box
-
Сохраняет данные в PostgreSQL:
- данные хранятся по дням;
- для одного и того же дня запись по складу обновляется, а не дублируется.
-
Выгружает актуальные тарифы в Google Sheets (добавить .env.GOOGLE_SPREADSHEET_ID):
- в лист
stocks_coefs(изменить - .env.GOOGLE_SHEETS_RANGE); - с сортировкой по коэффициенту доставки по возрастанию.
- в лист
- Node.js
- TypeScript
- PostgreSQL
- Knex.js
- Google Sheets API
- Docker / Docker Compose
Скопировать example.env в .env и заполнить нужные значения.
Пример:
POSTGRES_PORT=5432
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
APP_PORT=5000
WB_API_TOKEN=
GOOGLE_SERVICE_ACCOUNT_PATH=/run/secrets/sa.json
GOOGLE_SPREADSHEET_ID=
GOOGLE_SHEETS_RANGE=stocks_coefs!A1Обязательно заполнить:
WB_API_TOKENGOOGLE_SPREADSHEET_ID
Положить файл сервисного ключа Google в папку:
secrets/service-account.json
В контейнере этот файл будет доступен по пути:
/run/secrets/sa.json
Нужно создать Google-таблицу и лист:
stocks_coefs
Потом:
взять GOOGLE_SPREADSHEET_ID из URL таблицы;
выдать сервисному аккаунту доступ Editor к этой таблице.
Пример URL:
https://docs.google.com/spreadsheets/d/1vButBOsfRp0Z_qHceFfW2gq1pM_MIy8mq8fasQXDLVk/edit
В этом случае GOOGLE_SPREADSHEET_ID:
1vButBOsfRp0Z_qHceFfW2gq1pM_MIy8mq8fasQXDLVk
docker compose up
После запуска сервис:
- применит миграции;
- выполнит сиды;
- сразу выполнит синхронизацию WB → PostgreSQL → Google Sheets;
- затем будет повторять её каждый час.
Основная таблица:
wb_box_tariffs_daily
Уникальность записи определяется по:
tariff_date + warehouse_name
Это значит:
- на один день и один склад хранится одна запись;
- при повторной синхронизации в течение дня запись обновляется через UPSERT.
В лист stocks_coefs записываются актуальные данные за текущий день.
Основные колонки:
- warehouse
- delivery_coef
- storage_coef
Строки без коэффициентов тоже сохраняются как пустые значения, без дополнительной фильтрации.
src/
config/
postgres/
services/
secrets/
README.md
compose.yaml
Dockerfile
example.envПосле запуска можно проверить:
- В логах контейнера app должен появиться успешный результат синхронизации.
- В PostgreSQL должна наполняться таблица wb_box_tariffs_daily.
- В Google Sheets на листе stocks_coefs должны появиться актуальные тарифы.
- изменил время запуска, теперь оно жестко привязано к началу следующего часа, исключает дрейф расписания
- оставил имя в контейнере, как было в шаблоне к ТЗ. это может вызвать конфликт имён. если возникнет, перед запуском:
docker stop postgres appdocker rm postgres app