Files

Fuel Notifier — деплой-пакет

Содержимое:

  • Dockerfile, .dockerignore — multi-stage сборка (Maven 3.8.6 / OpenJDK 11 → JRE 11).
  • application.yml — та же версия, что лежит в src/main/resources проекта, полностью параметризована переменными окружения (${VAR:default}) под Helm-деплой ниже.
  • helm/fuelbot/ — чарт для деплоя в Kubernetes, REST наружу через Service типа NodePort.

Сборка образа

Из корня основного репозитория проекта (там, где pom.xml и папка src), положив рядом этот Dockerfile:

docker build -t your-registry.example.com/fuelbot/fuel-notifier:latest .
docker push your-registry.example.com/fuelbot/fuel-notifier:latest

Если используете корпоративный Artifactory (как в вашем примере с startup/db_helper/export), переопределите базовые образы:

docker build \
  --build-arg BUILD_IMAGE=artifactory.emias.ru/docker/maven:3.8.6-openjdk-11 \
  --build-arg RUNTIME_IMAGE=artifactory.emias.ru/docker/emiasos-openjdk:11 \
  -t your-registry.example.com/fuelbot/fuel-notifier:latest .

Переменные окружения (см. application.yml)

Переменная По умолчанию Назначение
SERVER_PORT 8080 порт приложения
SPRING_DATASOURCE_URL jdbc:postgresql://localhost:5432/fuelbot JDBC URL
SPRING_DATASOURCE_USERNAME fuelbot пользователь БД
SPRING_DATASOURCE_PASSWORD fuelbot пароль БД (секрет)
SPRING_JPA_DDL_AUTO update режим Hibernate ddl-auto
FUEL_SOURCE_URL URL источника со списком заправок
FUEL_SOURCE_CONNECT_TIMEOUT_MS 5000 таймаут коннекта к источнику
FUEL_SOURCE_READ_TIMEOUT_MS 8000 таймаут чтения ответа источника
FUEL_EVENT_TTL_MINUTES 60 сколько хранится событие
FUEL_EVENT_CLEANUP_CRON 0 */15 * * * * крон очистки протухших событий
FUEL_MIGRATION_NOTIFY_LEGACY_ENABLED false разовый сброс онбординга легаси-пользователей
NEARBY_SOURCE_URL URL источника "заправки рядом" (/api/nearby). ⚠ имя не по паттерну FUEL_NEARBY_*
NEARBY_CLEANUP_RATE 600000 period очистки кэша "рядом", мс. ⚠ имя не по паттерну FUEL_NEARBY_*
FUEL_PRICES_SOURCE_URL https://www.gdebenz.ru/api/comments URL источника цен по конкретной станции
FUEL_PRICES_CACHE_TTL_MINUTES 20 сколько хранится цена по станции в кэше
FUEL_PRICES_MIN_INTERVAL_MS 2000 минимальный интервал между запросами к источнику цен (на всё приложение)
TELEGRAM_BOT_USERNAME username бота
TELEGRAM_BOT_TOKEN токен бота (секрет)
TELEGRAM_BOT_ENABLED true включить регистрацию бота
TELEGRAM_SEND_LOCATION true слать геопозицию заправки отдельным сообщением

Ещё пять параметров "рядом" (радиус поиска, TTL кэша, порог сдвига, grace-период вотчдога, частота его проверки) сейчас — чистые дефолты в коде (fuel.nearby.default-radius-km и т.п.), в application.yml/ConfigMap не вынесены. Если понадобится крутить их снаружи — сначала добавьте ${ENV_VAR:default} в application.yml, потом заведите ключ в values.yaml/configmap.yaml по уже сложившемуся шаблону.

Несекретные переменные уходят в ConfigMap (templates/configmap.yaml), секретные (SPRING_DATASOURCE_PASSWORD, TELEGRAM_BOT_TOKEN) — в Secret (templates/secret.yaml). Деплоймент подключает оба целиком через envFrom — добавить новую переменную в приложение означает добавить одну строчку в values.yaml (config.* или secrets.*) и в соответствующий шаблон, без правок deployment.yaml.

Установка чарта

values.yaml уже содержит ваши реальные значения (образ kayashov/fuel-bot:1.0, nodePort: 30018, БД postgres-postgresql, бот findazsbot) — для обновления версии достаточно:

helm upgrade --install fuelbot ./helm/fuelbot \
  --namespace fuelbot --create-namespace \
  --set image.tag=1.1

Полный пример с нуля / на другом окружении:

helm upgrade --install fuelbot ./helm/fuelbot \
  --namespace fuelbot --create-namespace \
  --set image.repository=kayashov/fuel-bot \
  --set image.tag=1.0 \
  --set config.fuelSourceUrl=http://your-source-host/api/stations \
  --set config.springDatasourceUrl=jdbc:postgresql://postgres.fuelbot.svc.cluster.local:5432/fuelbot \
  --set-string secrets.telegramBotToken=123456:AA... \
  --set-string secrets.springDatasourcePassword=real-db-password

--set-string — обязательно для токена бота (в нём двоеточие и цифры, без -string Helm может трактовать значение не как строку).

NodePort

По умолчанию service.nodePort=30018. Получить фактический адрес:

kubectl get svc fuelbot -n fuelbot -o jsonpath='{.spec.ports[0].nodePort}'
kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}'

(то же самое печатает helm install/upgrade в NOTES после установки).

Секреты в проде

По умолчанию чарт сам создаёт Secret из значений values.yaml — удобно для теста, но боевые пароли/токены в values.yaml (тем более в git) хранить не стоит. Для прода — --set-string при установке (как в примере выше, не попадает в git) или заведите секрет отдельно и укажите secrets.create=false + secrets.existingSecret=<имя-вашего-secret> (ключи внутри должны называться SPRING_DATASOURCE_PASSWORD и TELEGRAM_BOT_TOKEN, см. templates/secret.yaml).

Пробы

livenessProbe/readinessProbe — простые TCP-проверки порта (в проекте нет Spring Actuator, поэтому HTTP /actuator/health недоступен). Если позже добавите actuator — стоит переключить пробы в templates/deployment.yaml на httpGet: /actuator/health/{liveness,readiness}.