2026年6月8日月曜日

SpringBoot のダッシュボードと本体の Web アプリを分離する方法

SpringBoot のダッシュボードと本体の Web アプリを分離する方法

概要

前回 Web アプリとワーカーを分離しました
更にダッシュボードを追加しましたが Web アプリと同じプロセスで起動するのでセキュリティ的に微妙でした
今回はダッシュボードアプリと Web アプリのプロセスを分離する方法を紹介します

環境

  • macOS 26.4.1
  • openjdk 26.0.1
  • SpringBoot 4.0.6
    • jasypt-spring-boot 4.0.4
    • jackson-databind 2.21.2
    • jobrunr 8.6.1
  • gradle 9.5.1
  • VSCode 1.121.0
  • MySQL 9.6.0
  • Redis 8.6.3

ダッシュボード用アプリの作成

JobRunr の設定が必要なので @Import で取り込みます
JobRunrConfig はこちらです

  • vim src/main/java/com/example/demo/DashboardApplication.java
package com.example.demo;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import com.example.demo.config.JobRunrConfig;
import com.example.demo.config.JobRunrDashboardProperties;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;

@EnableEncryptableProperties
@Configuration
@EnableAutoConfiguration
@ConfigurationPropertiesScan(basePackageClasses = JobRunrDashboardProperties.class)
@Import(JobRunrConfig.class)
public class DashboardApplication {

        public static void main(String[] args) {
                new SpringApplicationBuilder(DashboardApplication.class).profiles("dashboard").run(args);
        }
}

ダッシュボード用設定の追加

Web アプリとしての設定とワーカーとしてのはオフにしダッシュボードだけ有効にします

  • vim src/main/resources/application-dashboard.properties
spring.main.web-application-type=none

app.jobrunr.background-job-server.enabled=false
app.jobrunr.dashboard.enabled=true
app.jobrunr.dashboard.port=8000

Web アプリケーションとワーカーの設定は以下の通りです

  • vim src/main/resources/application.properties
spring.application.name=demo
# update はアプリケーション起動時に、Entityに対応するテーブルがなければ作成します
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.datasource.url=jdbc:mysql://${MYSQL_HOST:127.0.0.1}:3306/mydatabase
spring.datasource.username=ENC(bFMupckSRHJ/9QmXd1EVTw==)
spring.datasource.password=ENC(QFCt95vHHcJpgm8oKhghkJoEknQv3tF0)

spring.data.redis.host=localhost
spring.data.redis.port=6379

# Web起動時はJobRunrのBackgroundJobServerを無効化(worker jarで有効化)
app.jobrunr.background-job-server.enabled=false

# JobRunr Dashboard (管理画面)
app.jobrunr.dashboard.enabled=false
app.jobrunr.dashboard.port=8000

# Jasypt 暗号化キーの設定(環境変数から取得)
jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator
jasypt.encryptor.password=${JASYPT_PASSWORD:default_password}
  • vim src/main/resources/application-worker.properties
spring.main.web-application-type=none

app.jobrunr.background-job-server.enabled=true
app.jobrunr.dashboard.enabled=false

build.gradle の修正

ダッシュボードアプリを起動するタスクとダッシュボード用の jar を作成するタスクを追加します

  • vim build.gradle
tasks.register('dashboardBootRun', org.springframework.boot.gradle.tasks.run.BootRun) {
       group = 'application'
       description = 'Runs the JobRunr dashboard process using DashboardApplication.'
       mainClass = 'com.example.demo.DashboardApplication'
       classpath = sourceSets.main.runtimeClasspath
}

tasks.register('dashboardBootJar', org.springframework.boot.gradle.tasks.bundling.BootJar) {
       group = 'build'
       description = 'Builds the executable dashboard jar.'
       archiveClassifier = 'dashboard'
       mainClass = 'com.example.demo.DashboardApplication'
       classpath = sourceSets.main.runtimeClasspath
       targetJavaVersion = webBootJar.get().targetJavaVersion
       dependsOn tasks.named('classes')
}

tasks.named('assemble') {
       dependsOn tasks.named('workerBootJar')
       dependsOn tasks.named('workerBootJar'), tasks.named('dashboardBootJar')
}

動作確認

  • ./gradlew clean && ./gradlew dashboardBootRun -Dspring-boot.run.mainClass=com.example.demo.DashboardApplication --args='--jasypt.encryptor.password=asdfghjkl'

で localhost:8000/dashboard にアクセスすると JobRunr のダッシュボードにアクセスできます

jar は JASYPT_PASSWORD="xxx" ./gradlew clean build で作成します

  • JASYPT_PASSWORD=asdfghjkl java -jar build/libs/demo-0.0.1-SNAPSHOT-dashboard.jar

で実行します

最後に

SpringBoot のダッシュボード機能を Web アプリケーション本体と分離する方法を紹介しました
MySQL の設定を変更するだけで他のホストでも変更できるので基本はアプリのサーバとは別のサーバで動作させるのがいいでしょう

0 件のコメント:

コメントを投稿