From 58c43fddc5a7d35a5be4eb256cee130702dab385 Mon Sep 17 00:00:00 2001 From: Danil-Bodry Date: Fri, 17 Apr 2026 15:03:49 +0300 Subject: [PATCH] up docker-compose.yml + node js in gradle --- build.gradle.kts | 21 +++++++++ docker-compose.yml | 18 ++++---- .../java/su/xserver/iikocon/MainVerticle.java | 43 ++++++++++++------- .../iikocon/service/HealthCheckService.java | 4 +- 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6d016a9..73abe57 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,16 @@ plugins { java application id("com.gradleup.shadow") version "9.2.2" + id("com.github.node-gradle.node") version "7.1.0" +} + +node { + version.set("22.19.0") // версия Node.js + npmVersion.set("11.12.1") // версия npm + download.set(true) // автоматически скачать Node.js + workDir.set(file("${project.projectDir}/.gradle/nodejs")) + npmWorkDir.set(file("${project.projectDir}/.gradle/npm")) + nodeProjectDir.set(file("${project.projectDir}/frontend")) // папка с Vue-проектом } group = "com.example" @@ -75,6 +85,17 @@ tasks.withType { args = listOf(mainVerticleName) } +val buildFrontend by tasks.registering { + group = "build" + description = "Build Vue frontend" + dependsOn("npm_install") // установка зависимостей + dependsOn("npm_run_build") // сборка (должен быть скрипт "build" в package.json) +} + +tasks.processResources { + dependsOn(buildFrontend) +} + tasks.register("collectAllDependencies") { group = "project" description = "Сбор всех зависимостей для офлайн работы" diff --git a/docker-compose.yml b/docker-compose.yml index bd67d5a..60d61a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: - db: + iiko-db: image: mariadb:12.2.2 - container_name: mariadb + container_name: iiko-mariadb restart: unless-stopped user: "1000:1000" environment: @@ -18,9 +18,9 @@ services: - $PWD/app/mariadb:/var/lib/mysql - /etc/localtime:/etc/localtime:ro - pma: + iiko-pma: image: phpmyadmin:5.2.3 - container_name: phpmyadmin + container_name: iiko-phpmyadmin depends_on: - db restart: unless-stopped @@ -33,9 +33,9 @@ services: ports: - "7102:80" - redis: + iiko-redis: image: redis:latest - container_name: redis + container_name: iiko-redis restart: unless-stopped user: "1000:1000" environment: @@ -48,7 +48,7 @@ services: - $PWD/app/redis:/data - /etc/localtime:/etc/localtime:ro - app: + iiko-app: build: . container_name: iiko-app restart: unless-stopped @@ -58,11 +58,11 @@ services: - db - redis environment: - DATABASE__HOST: db + DATABASE__HOST: iiko-db DATABASE__PORT: 3306 DATABASE__DATABASE: app_db DATABASE__USER: app_user DATABASE__PASSWORD: app_pass - REDIS__HOST: redis + REDIS__HOST: iiko-redis REDIS__PORT: 6379 SERVER__PORT: 7104 diff --git a/src/main/java/su/xserver/iikocon/MainVerticle.java b/src/main/java/su/xserver/iikocon/MainVerticle.java index 0e72f52..b15276d 100644 --- a/src/main/java/su/xserver/iikocon/MainVerticle.java +++ b/src/main/java/su/xserver/iikocon/MainVerticle.java @@ -62,7 +62,6 @@ public class MainVerticle extends AbstractVerticle { .onFailure(err -> { log.error("Failed to initialize database", err); startPromise.fail(err); - return; }); Router router = initRouter(); @@ -104,6 +103,22 @@ public class MainVerticle extends AbstractVerticle { } }); + // ------ Раздаём Vue статику ------ + router.route("/assets/*").handler(StaticHandler.create("webroot/assets")); + + router.route("/favicon.ico").handler(ctx -> ctx.response().sendFile("webroot/favicon.ico")); + + // ------ SPA fallback: отдаём index.html на все не-API запросы ------ + router.route().handler(ctx -> { + if (ctx.request().path().startsWith("/api")) { + ctx.next(); + } else { + ctx.response() + .putHeader("Content-Type", "text/html") + .sendFile("webroot/index.html"); + } + }); + // Health Checks HealthCheckService healthCheckService = new HealthCheckService(vertx, redis, db); healthCheckService.registerHealthCheck(router); @@ -128,17 +143,15 @@ public class MainVerticle extends AbstractVerticle { router.route("/api/admin/*").handler(authHandler::requireAuth); // Получение списка пользователей - router.get("/api/admin/users").handler(rc -> { - userService.getAllUsers().onComplete(ar -> { - if (ar.succeeded()) { - rc.response() - .putHeader("Content-Type", "application/json") - .end(ar.result().encode()); - } else { - rc.response().setStatusCode(500).end(ar.cause().getMessage()); - } - }); - }); + router.get("/api/admin/users").handler(rc -> userService.getAllUsers().onComplete(ar -> { + if (ar.succeeded()) { + rc.response() + .putHeader("Content-Type", "application/json") + .end(ar.result().encode()); + } else { + rc.response().setStatusCode(500).end(ar.cause().getMessage()); + } + })); // Получение текущего пользователя router.get("/api/admin/me").handler(rc -> { @@ -156,9 +169,9 @@ public class MainVerticle extends AbstractVerticle { }); // Статическая раздача фронтенда - router.route("/*").handler(StaticHandler.create("webroot") - .setCachingEnabled(false) - .setIndexPage("index.html")); +// router.route("/*").handler(StaticHandler.create("webroot") +// .setCachingEnabled(false) +// .setIndexPage("index.html")); return router; } diff --git a/src/main/java/su/xserver/iikocon/service/HealthCheckService.java b/src/main/java/su/xserver/iikocon/service/HealthCheckService.java index 043c5bd..ab4cdf3 100644 --- a/src/main/java/su/xserver/iikocon/service/HealthCheckService.java +++ b/src/main/java/su/xserver/iikocon/service/HealthCheckService.java @@ -53,7 +53,7 @@ public class HealthCheckService { .onFailure(err -> future.tryFail("DataBase ping failed: " + err.getMessage())); }); - // Регистрируем endpoint /health - router.get("/health").handler(healthCheckHandler); + // Регистрируем endpoint /api/health + router.get("/api/health").handler(healthCheckHandler); } }