mirror of
https://github.com/9technologygroup/patchmon.net.git
synced 2025-11-05 22:43:23 +00:00
Simplified the docker nginx template
Modified the url for the buillboard to just /bullboard and made the nginx configuration to match
This commit is contained in:
@@ -445,8 +445,8 @@ app.use(`/api/${apiVersion}/ws`, wsRoutes);
|
|||||||
let bullBoardRouter = null;
|
let bullBoardRouter = null;
|
||||||
const bullBoardSessions = new Map(); // Store authenticated sessions
|
const bullBoardSessions = new Map(); // Store authenticated sessions
|
||||||
|
|
||||||
// Mount Bull Board at /admin instead of /api/v1/admin to avoid path conflicts
|
// Mount Bull Board at /bullboard for cleaner URL
|
||||||
app.use(`/admin/queues`, (_req, res, next) => {
|
app.use(`/bullboard`, (_req, res, next) => {
|
||||||
// Relax COOP/COEP for Bull Board in non-production to avoid browser warnings
|
// Relax COOP/COEP for Bull Board in non-production to avoid browser warnings
|
||||||
if (process.env.NODE_ENV !== "production") {
|
if (process.env.NODE_ENV !== "production") {
|
||||||
res.setHeader("Cross-Origin-Opener-Policy", "same-origin-allow-popups");
|
res.setHeader("Cross-Origin-Opener-Policy", "same-origin-allow-popups");
|
||||||
@@ -457,7 +457,7 @@ app.use(`/admin/queues`, (_req, res, next) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Authentication middleware for Bull Board
|
// Authentication middleware for Bull Board
|
||||||
app.use(`/admin/queues`, async (req, res, next) => {
|
app.use(`/bullboard`, async (req, res, next) => {
|
||||||
// Skip authentication for static assets only
|
// Skip authentication for static assets only
|
||||||
if (req.path.includes("/static/") || req.path.includes("/favicon")) {
|
if (req.path.includes("/static/") || req.path.includes("/favicon")) {
|
||||||
return next();
|
return next();
|
||||||
@@ -534,7 +534,7 @@ app.use(`/admin/queues`, async (req, res, next) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.use(`/admin/queues`, (req, res, next) => {
|
app.use(`/bullboard`, (req, res, next) => {
|
||||||
if (bullBoardRouter) {
|
if (bullBoardRouter) {
|
||||||
return bullBoardRouter(req, res, next);
|
return bullBoardRouter(req, res, next);
|
||||||
}
|
}
|
||||||
@@ -542,7 +542,7 @@ app.use(`/admin/queues`, (req, res, next) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Error handler specifically for Bull Board routes
|
// Error handler specifically for Bull Board routes
|
||||||
app.use("/admin/queues", (err, req, res, _next) => {
|
app.use("/bullboard", (err, req, res, _next) => {
|
||||||
console.error("Bull Board error on", req.method, req.url);
|
console.error("Bull Board error on", req.method, req.url);
|
||||||
console.error("Error details:", err.message);
|
console.error("Error details:", err.message);
|
||||||
console.error("Stack:", err.stack);
|
console.error("Stack:", err.stack);
|
||||||
@@ -874,7 +874,7 @@ async function startServer() {
|
|||||||
// Set up Bull Board for queue monitoring
|
// Set up Bull Board for queue monitoring
|
||||||
const serverAdapter = new ExpressAdapter();
|
const serverAdapter = new ExpressAdapter();
|
||||||
// Set basePath to match where we mount the router
|
// Set basePath to match where we mount the router
|
||||||
serverAdapter.setBasePath("/admin/queues");
|
serverAdapter.setBasePath("/bullboard");
|
||||||
|
|
||||||
const { QUEUE_NAMES } = require("./services/automation");
|
const { QUEUE_NAMES } = require("./services/automation");
|
||||||
const bullAdapters = Object.values(QUEUE_NAMES).map(
|
const bullAdapters = Object.values(QUEUE_NAMES).map(
|
||||||
@@ -888,7 +888,7 @@ async function startServer() {
|
|||||||
|
|
||||||
// Set the router for the Bull Board middleware (secured middleware above)
|
// Set the router for the Bull Board middleware (secured middleware above)
|
||||||
bullBoardRouter = serverAdapter.getRouter();
|
bullBoardRouter = serverAdapter.getRouter();
|
||||||
console.log("✅ Bull Board mounted at /admin/queues (secured)");
|
console.log("✅ Bull Board mounted at /bullboard (secured)");
|
||||||
|
|
||||||
// Initialize WS layer with the underlying HTTP server
|
// Initialize WS layer with the underlying HTTP server
|
||||||
initAgentWs(server, prisma);
|
initAgentWs(server, prisma);
|
||||||
|
|||||||
@@ -29,6 +29,29 @@ server {
|
|||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Bull Board proxy
|
||||||
|
location /bullboard {
|
||||||
|
proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Host $host;
|
||||||
|
|
||||||
|
# Preserve original client IP through proxy chain
|
||||||
|
proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;
|
||||||
|
|
||||||
|
# CORS headers for Bull Board
|
||||||
|
add_header Access-Control-Allow-Origin * always;
|
||||||
|
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
|
||||||
|
add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
|
||||||
|
|
||||||
|
# Handle preflight requests
|
||||||
|
if ($request_method = 'OPTIONS') {
|
||||||
|
return 204;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# API proxy
|
# API proxy
|
||||||
location /api/ {
|
location /api/ {
|
||||||
proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
|
proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
|
||||||
@@ -52,63 +75,6 @@ server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# SSE (Server-Sent Events) specific configuration
|
|
||||||
location /api/v1/ws/status/ {
|
|
||||||
proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header X-Forwarded-Host $host;
|
|
||||||
|
|
||||||
# Critical SSE settings
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_cache off;
|
|
||||||
proxy_set_header Connection '';
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
chunked_transfer_encoding off;
|
|
||||||
|
|
||||||
# Timeout settings for long-lived connections
|
|
||||||
proxy_read_timeout 24h;
|
|
||||||
proxy_send_timeout 24h;
|
|
||||||
proxy_connect_timeout 60s;
|
|
||||||
|
|
||||||
# Disable nginx buffering for real-time streaming
|
|
||||||
proxy_request_buffering off;
|
|
||||||
proxy_max_temp_file_size 0;
|
|
||||||
|
|
||||||
# CORS headers for SSE - commented out to let backend handle CORS
|
|
||||||
# add_header Access-Control-Allow-Origin * always;
|
|
||||||
# add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
|
|
||||||
# add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
|
|
||||||
|
|
||||||
# Handle preflight requests
|
|
||||||
if ($request_method = 'OPTIONS') {
|
|
||||||
return 204;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# WebSocket upgrade handling
|
|
||||||
location /api/v1/agents/ws {
|
|
||||||
proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header X-Forwarded-Host $host;
|
|
||||||
|
|
||||||
# WebSocket timeout settings
|
|
||||||
proxy_read_timeout 24h;
|
|
||||||
proxy_send_timeout 24h;
|
|
||||||
proxy_connect_timeout 60s;
|
|
||||||
|
|
||||||
# Disable buffering for WebSocket
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_cache off;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Static assets caching
|
# Static assets caching
|
||||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||||
|
|||||||
@@ -227,7 +227,7 @@ const Automation = () => {
|
|||||||
|
|
||||||
// Use the proxied URL through the frontend (port 3000)
|
// Use the proxied URL through the frontend (port 3000)
|
||||||
// This avoids CORS issues as everything goes through the same origin
|
// This avoids CORS issues as everything goes through the same origin
|
||||||
const url = `/admin/queues?token=${encodeURIComponent(token)}`;
|
const url = `/bullboard?token=${encodeURIComponent(token)}`;
|
||||||
window.open(url, "_blank", "width=1200,height=800");
|
window.open(url, "_blank", "width=1200,height=800");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user