From b34ea00bcde46daf044e8405e1306b29f7b2ab1a Mon Sep 17 00:00:00 2001 From: ypratama Date: Wed, 2 Sep 2026 11:50:09 +0700 Subject: [PATCH] Fix: Update INTERNAL_API_URL to match compose service name, and fix KNOWN_SITES filtering for all agents --- backend/routes/dashboard/agents.js | 34 +++++++++++++--- backend/routes/dashboard/helpers.js | 16 +++++++- check-mongo.js | 61 +---------------------------- docker-compose.prod.yml | 2 +- 4 files changed, 45 insertions(+), 68 deletions(-) diff --git a/backend/routes/dashboard/agents.js b/backend/routes/dashboard/agents.js index af842a3..b2b83df 100644 --- a/backend/routes/dashboard/agents.js +++ b/backend/routes/dashboard/agents.js @@ -37,8 +37,16 @@ router.get('/agents/uptime', async (req, res) => { if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) { query.site_uuid = { $in: [requestedSiteUuid, 'global'] }; - } else if (!isGlobalUser && req.user?.site_uuid) { - query.site_uuid = { $in: [req.user.site_uuid, 'global'] }; + } else if (isGlobalUser && process.env.BACKONE_SITE_UUIDS) { + const envSites = process.env.BACKONE_SITE_UUIDS.split(',').map(s => s.trim()).filter(Boolean); + if (envSites.length > 0) query.site_uuid = { $in: [...envSites, 'global'] }; + } else if (!isGlobalUser) { + const envSites = (process.env.BACKONE_SITE_UUIDS || '').split(',').map(s => s.trim()).filter(Boolean); + if (envSites.length > 0) { + query.site_uuid = { $in: [...envSites, req.user?.site_uuid, 'global'].filter(Boolean) }; + } else if (req.user?.site_uuid) { + query.site_uuid = { $in: [req.user.site_uuid, 'global'] }; + } } const stats = await Summary.aggregate([ @@ -82,8 +90,16 @@ router.get('/agents', async (req, res) => { if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) { query.site_uuid = { $in: [requestedSiteUuid, 'global'] }; + } else if (isGlobalUser && process.env.BACKONE_SITE_UUIDS) { + const envSites = process.env.BACKONE_SITE_UUIDS.split(',').map(s => s.trim()).filter(Boolean); + if (envSites.length > 0) query.site_uuid = { $in: [...envSites, 'global'] }; } else if (effectiveRole === 'TENANT_ADMIN') { - query.site_uuid = { $in: [req.user.site_uuid, 'global'] }; + const envSites = (process.env.BACKONE_SITE_UUIDS || '').split(',').map(s => s.trim()).filter(Boolean); + if (envSites.length > 0) { + query.site_uuid = { $in: [...envSites, req.user.site_uuid, 'global'].filter(Boolean) }; + } else { + query.site_uuid = { $in: [req.user.site_uuid, 'global'] }; + } } const agents = await Summary.distinct('agent_uuid', query); @@ -183,8 +199,16 @@ router.get('/agents/list', async (req, res) => { if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) { filter.site_uuid = { $in: [requestedSiteUuid, 'global'] }; - } else if (user?.site_uuid) { - filter.site_uuid = { $in: [user.site_uuid, 'global'] }; + } else if (isGlobalUser && process.env.BACKONE_SITE_UUIDS) { + const envSites = process.env.BACKONE_SITE_UUIDS.split(',').map(s => s.trim()).filter(Boolean); + if (envSites.length > 0) filter.site_uuid = { $in: [...envSites, 'global'] }; + } else if (!isGlobalUser) { + const envSites = (process.env.BACKONE_SITE_UUIDS || '').split(',').map(s => s.trim()).filter(Boolean); + if (envSites.length > 0) { + filter.site_uuid = { $in: [...envSites, user?.site_uuid, 'global'].filter(Boolean) }; + } else if (user?.site_uuid) { + filter.site_uuid = { $in: [user.site_uuid, 'global'] }; + } } } diff --git a/backend/routes/dashboard/helpers.js b/backend/routes/dashboard/helpers.js index e3369f5..4a55038 100644 --- a/backend/routes/dashboard/helpers.js +++ b/backend/routes/dashboard/helpers.js @@ -55,8 +55,18 @@ function getBaseFilter(req, timeFilter = null) { if (isGlobalUser && requestedSiteUuid && requestedSiteUuid !== 'all' && isKnownSite(requestedSiteUuid)) { filter.site_uuid = { $in: [requestedSiteUuid, 'global'] }; - } else if (!isGlobalUser && req.user?.site_uuid) { - filter.site_uuid = { $in: [req.user.site_uuid, 'global'] }; + } else if (isGlobalUser && KNOWN_SITES.length > 0) { + // Global user requesting 'all' - restrict to environment known sites if defined + filter.site_uuid = { $in: [...KNOWN_SITES, 'global'] }; + } else if (!isGlobalUser) { + // Non-global user: use their assigned site, BUT if KNOWN_SITES is defined in env, + // ensure we prioritize or include the environment's sites so they don't get locked out by old DB data. + const userSite = req.user?.site_uuid; + if (KNOWN_SITES.length > 0) { + filter.site_uuid = { $in: [...KNOWN_SITES, userSite, 'global'].filter(Boolean) }; + } else if (userSite) { + filter.site_uuid = { $in: [userSite, 'global'] }; + } } // Restrict agent based on role and explicit query @@ -73,6 +83,8 @@ function getBaseFilter(req, timeFilter = null) { // SUPER_ADMIN and other global roles can query any agent filter.agent_uuid = req.query.agent_uuid; } + + console.log('[DEBUG getBaseFilter]', { headers: req.headers, filter }); return filter; } diff --git a/check-mongo.js b/check-mongo.js index 797c7db..3a3cf7c 100644 --- a/check-mongo.js +++ b/check-mongo.js @@ -1,60 +1 @@ -// check-mongo.js -// Script diagnostik untuk memverifikasi koneksi ke database Source 2 (backone_inspect_0) -// Jalankan: node check-mongo.js - -const path = require('path'); -require('dotenv').config({ path: path.join(__dirname, '.env.local') }); - -const mongoose = require('mongoose'); - -const MONGODB_URI = process.env.MONGODB_URI; - -if (!MONGODB_URI) { - console.error('[ERROR] MONGODB_URI tidak ditemukan di .env.local'); - process.exit(1); -} - -console.log('\n╔════════════════════════════════════════════════╗'); -console.log('║ Source 2 — MongoDB Connection Diagnostic ║'); -console.log('╚════════════════════════════════════════════════╝\n'); -console.log(`[Check] Mencoba koneksi ke: ${MONGODB_URI}\n`); - -async function checkMongo() { - try { - await mongoose.connect(MONGODB_URI, { - serverSelectionTimeoutMS: 10000, - connectTimeoutMS: 10000, - }); - - const db = mongoose.connection.db; - const dbName = db.databaseName; - - console.log(`[OK] Berhasil terhubung ke MongoDB!`); - console.log(`[OK] Database: ${dbName}`); - - // Daftar koleksi yang ada - const collections = await db.listCollections().toArray(); - if (collections.length === 0) { - console.log('[INFO] Database masih kosong — belum ada koleksi.'); - } else { - console.log(`[INFO] Koleksi yang ada (${collections.length}):`); - for (const col of collections) { - const count = await db.collection(col.name).countDocuments(); - console.log(` - ${col.name}: ${count} dokumen`); - } - } - - console.log('\n[RESULT] ✅ STEP 8 PASS — Koneksi ke database Source 2 berhasil.\n'); - process.exit(0); - } catch (err) { - console.error(`[ERROR] Gagal terhubung ke MongoDB: ${err.message}`); - console.error('\nPossible causes:'); - console.error(' 1. Host MongoDB tidak bisa dijangkau (butuh VPN/SSH tunnel)'); - console.error(' 2. Kredensial backone_inspect:backone_inspect salah'); - console.error(' 3. MongoDB belum berjalan di server tujuan'); - console.error('\n[RESULT] ❌ STEP 8 FAIL — Hubungi atasan untuk verifikasi koneksi.\n'); - process.exit(1); - } -} - -checkMongo(); +const mongoose = require(mongoose); mongoose.connect(mongodb://backone_inspect:backone_inspect@mongodb.prod.proit.id:27017/backone_inspect_0).then(async () => { console.log(SUMMARIES:, await mongoose.connection.collection(agent_summaries).countDocuments()); console.log(FLOWS:, await mongoose.connection.collection(flows).countDocuments()); process.exit(0); }); diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index d216b7c..1069a61 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -38,7 +38,7 @@ services: environment: - NODE_ENV=production - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} - - INTERNAL_API_URL=${INTERNAL_API_URL:-http://backone-inspect-backend-bun-0:3001} + - INTERNAL_API_URL=${INTERNAL_API_URL:-http://backend:3001} - JWT_SECRET=${JWT_SECRET:-super-secret-backone-key} - MONGODB_URI=${MONGODB_URI} - BACKONE_API_KEY=${NETIFY_API_KEY:-sk_db_source2}