adjast wss + docker logs

This commit is contained in:
2026-05-11 13:10:00 +03:00
parent 724b74b3c8
commit 4d574d5fdf
9 changed files with 327 additions and 67 deletions
@@ -1,27 +1,26 @@
package com.jambotronGroup.jambotron.WebSocket;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
private final DockerLogsHandler dockerLogsHandler;
public WebSocketConfig(DockerLogsHandler dockerLogsHandler) {
this.dockerLogsHandler = dockerLogsHandler;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// Брокер для сообщений клиенту
config.enableSimpleBroker("/topic");
// Префикс для запросов от клиента к серверу
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(dockerLogsHandler, "/api/ws-jambotron/{projectId}")
// Поскольку есть proxy.conf.json, запросы приходят как Same-Origin.
// Но для стабильности разработки лучше явно указать localhost.
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/api/ws-jambotron")
.setAllowedOriginPatterns("https://*.jambotron.com", "https://jambotron.com")
.setAllowedOrigins("http://localhost:8082", "http://localhost:4200");
.setAllowedOrigins("http://localhost:8082", "http://localhost:4200")
.withSockJS(); // Для стабильности соединения
}
}
@@ -0,0 +1,9 @@
package com.jambotronGroup.jambotron.console;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync // <--- Обязательно добавь это
public class AsyncConfig {
}
@@ -0,0 +1,38 @@
package com.jambotronGroup.jambotron.console;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.model.Frame;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class DockerLogService {
private final SimpMessagingTemplate messagingTemplate;
private final DockerClient dockerClient;
// Spring сам подставит сюда dockerClient из твоего DockerConfig
public DockerLogService(SimpMessagingTemplate messagingTemplate, DockerClient dockerClient) {
this.messagingTemplate = messagingTemplate;
this.dockerClient = dockerClient;
}
@Async
public void streamLogs(String containerId) {
dockerClient.logContainerCmd(containerId)
.withStdOut(true)
.withStdErr(true)
.withFollowStream(true)
.withTail(100)
.exec(new ResultCallback.Adapter<Frame>() {
@Override
public void onNext(Frame frame) {
String logLine = new String(frame.getPayload());
// Отправляем в топик, на который подпишется фронтенд
messagingTemplate.convertAndSend("/topic/logs/" + containerId, logLine);
}
});
}
}
@@ -0,0 +1,21 @@
package com.jambotronGroup.jambotron.controllers;
import com.jambotronGroup.jambotron.console.DockerLogService;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.stereotype.Controller;
@Controller
public class LogController {
private final DockerLogService dockerLogService;
public LogController(DockerLogService dockerLogService) {
this.dockerLogService = dockerLogService;
}
// Когда клиент шлет сообщение на /app/start-logs
@MessageMapping("/start-logs")
public void handleStartLogs(String containerId) {
dockerLogService.streamLogs(containerId);
}
}