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}.