| Service | Type | Status |
|---|---|---|
| nginx | systemd | active |
| postgresql | systemd | active |
| redis-server | systemd | active |
| mosquitto | systemd | active |
| picobernacca | systemd | active |
| docker | systemd | active |
| ssh | systemd | active |
| darkskyscout-api | pm2 | online |
| darkskyscout-web | pm2 | online |
/var/lib/docker/rootfs/overlayfs/15d42d5e4b02b74722adff094f90d72fc172c16f12d28339aeb7d3fabbcdf746/usr/bin/chsh /var/lib/docker/rootfs/overlayfs/15d42d5e4b02b74722adff094f90d72fc172c16f12d28339aeb7d3fabbcdf746/usr/bin/chfn /var/lib/docker/rootfs/overlayfs/15d42d5e4b02b74722adff094f90d72fc172c16f12d28339aeb7d3fabbcdf746/usr/bin/mount /var/lib/docker/rootfs/overlayfs/15d42d5e4b02b74722adff094f90d72fc172c16f12d28339aeb7d3fabbcdf746/usr/bin/umount /var/lib/docker/rootfs/overlayfs/15d42d5e4b02b74722ad
Service '' is listening on all interfaces but config expects localhost only
Port 8883 is listening on 0.0.0.0 but not in expected_ports config
Port 5055 is listening on 0.0.0.0 but not in expected_ports config
Port 9001 is listening on 0.0.0.0 but not in expected_ports config
Port 8003 is listening on 0.0.0.0 but not in expected_ports config
Port 8000 is listening on 0.0.0.0 but not in expected_ports config
Port 3050 is listening on * but not in expected_ports config
Port 8065 is listening on * but not in expected_ports config
File: packages/api/package-lock.json Line 0: fast-xml-parser 5.3.4 → 5.3.5
File: /opt/darkskyscout/vercel-satellite-proxy/api/n2yo/[...path].js
Line 45: if (!apiKey || apiKey === 'your_n2yo_api_key_here') {File: /opt/darkskyscout/packages/api/src/server.minimal.js
Line 51: if (!OPENWEATHER_API_KEY || OPENWEATHER_API_KEY === 'demo_key') {File: /opt/darkskyscout/packages/api/src/routes/admin-sources-api.js Line 95: if (requires_api_key !== undefined) filters.requires_api_key = requires_api_key === 'true';
File: /opt/darkskyscout/packages/api/src/routes/webhooks.js
Line 238: const apiKey = req.get('X-API-Key');File: /opt/darkskyscout/packages/api/src/middleware/security.middleware.js Line 258: const apiKey = req.headers['x-api-key'];
File: /opt/darkskyscout/packages/api/src/middleware/auth.js Line 340: const apiKey = req.headers['x-api-key'];
File: /opt/darkskyscout/packages/api/src/middleware/validation.middleware.js
Line 41: const passwordValidation = body('password')File: /opt/darkskyscout/packages/api/src/prisma/seed.dev.js
Line 31: const hashedPassword = await bcrypt.hash('password123', 10);File: /opt/darkskyscout/packages/api/src/services/skyTrackingOptimized.service.js
Line 90: if (!this.config.n2yo.apiKey || this.config.n2yo.apiKey === 'demo_key') {File: /opt/darkskyscout/packages/api/src/services/skyTrackingOptimized.service.js
Line 405: if (!this.config.n2yo.apiKey || this.config.n2yo.apiKey === 'demo_key') {File: /opt/darkskyscout/packages/api/src/services/googleEarthEngine.service.js
Line 146: if (!googleApiKey || googleApiKey === 'your_google_maps_api_key_here') {File: /opt/darkskyscout/packages/api/src/services/googleEarthEngine.service.js
Line 268: if (!googleApiKey || googleApiKey === 'your_google_maps_api_key_here') {File: /opt/darkskyscout/packages/api/src/services/skyInterference.service.js
Line 56: if (!this.n2yoApiKey || this.n2yoApiKey === 'your_n2yo_api_key_here' || this.n2yoApiKey === 'demo_key') {File: /opt/darkskyscout/packages/api/src/services/skyInterference.service.js
Line 132: if (this.n2yoApiKey && this.n2yoApiKey !== 'demo_key') {File: /opt/darkskyscout/packages/api/src/services/skyInterference.service.js
Line 196: if (!this.n2yoApiKey || this.n2yoApiKey === 'your_n2yo_api_key_here' || this.n2yoApiKey === 'demo_key') {File: /opt/darkskyscout/packages/api/src/services/skyInterference.service.js
Line 735: if (!this.n2yoApiKey || this.n2yoApiKey === 'your_n2yo_api_key_here' || this.n2yoApiKey === 'demo_key') {File: /opt/darkskyscout/packages/api/src/services/googleAuthRepair.service.js Line 78: diagnosis.mapsApiKey.error = 'Billing not enabled';
File: /opt/darkskyscout/packages/api/src/services/AuthService.js
Line 8: const { validatePassword, validateEmail } = require('../utils/validation');File: /opt/darkskyscout/packages/api/src/services/satelliteClaudeSearch.service.js
Line 1: const { spawn } = require('child_process');File: /opt/darkskyscout/packages/api/src/services/claudeSearch.service.js
Line 1: const { exec } = require('child_process');File: /opt/darkskyscout/packages/api/src/services/adapters/claudeCode.adapter.js
Line 4: const { exec } = require('child_process');File: /opt/darkskyscout/packages/web/src/services/n2yoClient.service.js Line 26: return !!this.apiKey && this.apiKey !== 'your_n2yo_api_key_here';
File: /opt/darkskyscout/packages/web/src/pages/RegisterPage.jsx Line 87: newErrors.password = 'Password is required';
File: /opt/darkskyscout/packages/web/src/pages/RegisterPage.jsx Line 89: newErrors.password = 'Password must be at least 8 characters';
File: /opt/darkskyscout/packages/web/src/pages/RegisterPage.jsx Line 91: newErrors.password = 'Password must contain uppercase, lowercase and number';
File: /opt/darkskyscout/packages/web/src/pages/RegisterPage.jsx Line 95: newErrors.confirmPassword = 'Please confirm your password';
File: /opt/darkskyscout/packages/web/src/pages/RegisterPage.jsx Line 97: newErrors.confirmPassword = 'Passwords do not match';
File: /opt/darkskyscout/packages/web/src/pages/LoginPage.jsx Line 82: newErrors.password = 'Password is required';
File: /opt/darkskyscout/packages/web/src/components/accommodation/PhotoGallery.jsx
Line 107: dangerouslySetInnerHTML={{ __html: selectedPhoto.attribution }}File: /opt/darkskyscout/packages/web/src/components/accommodation/PhotoGallery.jsx
Line 107: dangerouslySetInnerHTML={{ __html: selectedPhoto.attribution }}File: /opt/darkskyscout/packages/web/src/components/common/MatchSuggestions.jsx
Line 96: e.target.parentElement.innerHTML = `<span class="text-lg font-bold">${suggestion.user.name[0]}</span>`;File: /opt/darkskyscout/packages/web/src/components/map/InstantLightPollutionOverlay.jsx Line 478: tooltip.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/CustomLocationMarkers.jsx Line 54: el.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/SimpleBortleOverlay.jsx Line 67: svgElement.innerHTML = '';
File: /opt/darkskyscout/packages/web/src/components/map/MapLibreMap.jsx Line 446: el.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/MapLibreMap.jsx Line 534: el.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/MapLibreMap.jsx Line 616: el.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/MapLibreMap.jsx Line 1275: loadingIndicator.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/MapLibreMap.jsx Line 1421: clickableIndicator.innerHTML = `
File: /opt/darkskyscout/packages/web/src/components/map/MapLibreMap.jsx Line 1619: errorIndicator.innerHTML = `
File: packages/api/package-lock.json Line 0: axios 1.13.4 → 1.13.5, 0.30.3
File: packages/api/package-lock.json Line 0: fast-xml-parser 5.3.4 → 5.3.6
File: packages/api/package-lock.json Line 0: minimatch 3.1.2 → 10.2.1
File: packages/api/package-lock.json Line 0: multer 1.4.5-lts.2 → 2.0.0
File: packages/api/package-lock.json Line 0: multer 1.4.5-lts.2 → 2.0.0
File: packages/api/package-lock.json Line 0: multer 1.4.5-lts.2 → 2.0.1
File: packages/api/package-lock.json Line 0: multer 1.4.5-lts.2 → 2.0.2
File: packages/api/package-lock.json Line 0: tar 6.2.1 → 7.5.3
File: packages/api/package-lock.json Line 0: tar 6.2.1 → 7.5.4
File: packages/api/package-lock.json Line 0: tar 6.2.1 → 7.5.7
File: packages/api/package-lock.json Line 0: tar 6.2.1 → 7.5.8
File: packages/api/package-lock.json Line 0: tar-fs 3.0.4 → 1.16.4, 2.1.2, 3.0.7
File: packages/api/package-lock.json Line 0: tar-fs 3.0.4 → 1.16.5, 2.1.3, 3.0.9
File: packages/api/package-lock.json Line 0: tar-fs 3.0.4 → 3.1.1, 2.1.4, 1.16.6
File: packages/api/package-lock.json Line 0: ws 8.16.0 → 5.2.4, 6.2.3, 7.5.10, 8.17.1
File: packages/web/package-lock.json Line 0: axios 1.13.4 → 1.13.5, 0.30.3
File: packages/web/package-lock.json Line 0: jsonpath 1.2.1 → no fix
File: packages/web/package-lock.json Line 0: minimatch 3.1.2 → 10.2.1
File: packages/web/package-lock.json Line 0: minimatch 5.1.6 → 10.2.1
File: packages/web/package-lock.json Line 0: minimatch 9.0.5 → 10.2.1
File: packages/web/package-lock.json Line 0: nth-check 1.0.2 → 2.0.1
File: /opt/darkskyscout/packages/api/src/middleware/analytics.middleware.js
Line 86: return crypto.createHash('md5').update(components.join('|')).digest('hex');File: /opt/darkskyscout/packages/api/src/middleware/feature-flags.middleware.js
Line 294: const hash = crypto.createHash('md5').update(hashInput).digest('hex');File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js
Line 110: return crypto.createHash('md5').update(fingerprint).digest('hex');File: /opt/darkskyscout/packages/api/src/middleware/cache.middleware.js
Line 56: const hash = crypto.createHash('md5').update(fullKey).digest('hex');File: /opt/darkskyscout/packages/api/src/middleware/cache.middleware.js
Line 316: const paramsHash = crypto.createHash('md5').update(paramsString).digest('hex');File: /opt/darkskyscout/packages/api/src/middleware/compression.middleware.js
Line 353: const hash = crypto.createHash('md5').update(chunk).digest('hex');File: /opt/darkskyscout/packages/api/src/services/userLocationInteractions.service.js
Line 22: return crypto.createHash('md5').update(`${name}_${location.id || Date.now()}`).digest('hex');File: packages/web/package-lock.json Line 0: ajv 6.12.6 → 8.18.0, 6.14.0
File: packages/web/package-lock.json Line 0: ajv 8.17.1 → 8.18.0, 6.14.0
File: packages/web/package-lock.json Line 0: postcss 7.0.39 → 8.4.31
File: packages/web/package-lock.json Line 0: webpack-dev-server 4.15.2 → 5.2.1
File: packages/web/package-lock.json Line 0: webpack-dev-server 4.15.2 → 5.2.1
File: fix_all_localhost.sh Line 35: REACT_APP_MAPBOX_ACCESS_TOKEN=**************************************************************************************
File: fix_browser_cache_delirium.sh Line 64: REACT_APP_MAPBOX_ACCESS_TOKEN=**************************************************************************************
File: /opt/darkskyscout/packages/api/src/server.minimal.js Line 2894: const openWeatherKey = process.env.OPENWEATHER_API_KEY || 'c52cc3a156e8d8556f1394fc999a3418';
File: /opt/darkskyscout/packages/api/src/server.minimal.js Line 2929: const openWeatherKey = process.env.OPENWEATHER_API_KEY || 'c52cc3a156e8d8556f1394fc999a3418';
File: /opt/darkskyscout/packages/api/src/server.js Line 9: const HOST = process.env.HOST || '0.0.0.0';
File: /opt/darkskyscout/packages/api/src/debug-sky-tracking.js
Line 13: console.log(' OPENSKY_CLIENT_ID:', process.env.OPENSKY_CLIENT_ID || 'NOT SET');File: /opt/darkskyscout/packages/api/src/socket.js Line 17: origin: process.env.FRONTEND_URL || "https://darkskyscout.xamad.net",
File: /opt/darkskyscout/packages/api/src/server.quick.js Line 450: const redirectUri = process.env.GOOGLE_REDIRECT_URI || 'https://darkskyscout-api.xamad.net/api/auth/google/callback';
File: /opt/darkskyscout/packages/api/src/server.quick.js Line 505: const baseUrl = returnUrl || process.env.FRONTEND_URL || 'https://darkskyscout.xamad.net';
File: /opt/darkskyscout/packages/api/src/server.quick.js Line 580: const errorUrl = process.env.FRONTEND_URL || 'https://darkskyscout.xamad.net';
File: /opt/darkskyscout/packages/api/src/config/database.js Line 108: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/config/database.js Line 651: limit: process.env.MAX_REQUEST_SIZE || '10mb',
File: /opt/darkskyscout/packages/api/src/config/database.js Line 659: limit: process.env.MAX_REQUEST_SIZE || '10mb'
File: /opt/darkskyscout/packages/api/src/routes/auth.simple.js Line 51: process.env.JWT_SECRET || 'dev-secret',
File: /opt/darkskyscout/packages/api/src/routes/auth.simple.js Line 112: process.env.JWT_SECRET || 'dev-secret',
File: /opt/darkskyscout/packages/api/src/routes/auth.simple.js Line 141: const decoded = jwt.verify(token, process.env.JWT_SECRET || 'dev-secret');
File: /opt/darkskyscout/packages/api/src/routes/auth.js Line 86: expiresIn: process.env.JWT_EXPIRES_IN || '15m'
File: /opt/darkskyscout/packages/api/src/routes/auth.js
Line 92: { expiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d' }File: /opt/darkskyscout/packages/api/src/routes/auth.js Line 341: expiresIn: process.env.JWT_EXPIRES_IN || '15m'
File: /opt/darkskyscout/packages/api/src/routes/auth.js Line 523: expiresIn: process.env.JWT_EXPIRES_IN || '15m'
File: /opt/darkskyscout/packages/api/src/routes/auth.google.js Line 19: const redirectUri = process.env.GOOGLE_REDIRECT_URI || 'https://darkskyscout-api.xamad.net/api/auth/google/callback';
File: /opt/darkskyscout/packages/api/src/routes/auth.google.js Line 222: const baseUrl = process.env.FRONTEND_URL || 'https://darkskyscout.xamad.net';
File: /opt/darkskyscout/packages/api/src/routes/auth.google.js Line 274: const errorUrl = process.env.FRONTEND_URL || 'https://darkskyscout.xamad.net';
File: /opt/darkskyscout/packages/api/src/routes/communitySharing.routes.js Line 102: const decoded = jwt.verify(token, process.env.JWT_SECRET || 'fallback-secret');
File: /opt/darkskyscout/packages/api/src/routes/auth-social.routes.js Line 18: callbackURL: process.env.GOOGLE_CALLBACK_URL || '/api/auth/google/callback'
File: /opt/darkskyscout/packages/api/src/routes/auth-social.routes.js Line 80: callbackURL: process.env.FACEBOOK_CALLBACK_URL || '/api/auth/facebook/callback',
File: /opt/darkskyscout/packages/api/src/routes/auth-social.routes.js Line 137: callbackURL: process.env.GITHUB_CALLBACK_URL || '/api/auth/github/callback'
File: /opt/darkskyscout/packages/api/src/routes/auth-social.routes.js
Line 229: { expiresIn: process.env.JWT_EXPIRES_IN || '15m' }File: /opt/darkskyscout/packages/api/src/routes/auth-social.routes.js
Line 235: { expiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d' }File: /opt/darkskyscout/packages/api/src/routes/auth.repair.js Line 164: googleRedirectUri: process.env.GOOGLE_REDIRECT_URI || 'https://darkskyscout-api.xamad.net/api/auth/google/callback',
File: /opt/darkskyscout/packages/api/src/routes/auth.repair.js Line 165: frontendUrl: process.env.FRONTEND_URL || 'https://darkskyscout.xamad.net',
File: /opt/darkskyscout/packages/api/src/routes/auth.routes.js
Line 32: { expiresIn: process.env.JWT_EXPIRES_IN || '15m' }File: /opt/darkskyscout/packages/api/src/routes/auth.routes.js
Line 38: { expiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d' }File: /opt/darkskyscout/packages/api/src/workers/analytics.worker.js Line 890: const filepath = path.join(process.env.EXPORT_DIR || '/tmp', filename);
File: /opt/darkskyscout/packages/api/src/workers/manager.js Line 263: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/manager.js Line 417: timezone: process.env.TZ || 'UTC'
File: /opt/darkskyscout/packages/api/src/workers/manager.js Line 785: version: process.env.npm_package_version || 'unknown',
File: /opt/darkskyscout/packages/api/src/workers/weather-scraper.js Line 240: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/weather-scraper.js Line 248: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/cleanup.worker.js Line 426: const tempDir = process.env.TEMP_DIR || '/tmp';
File: /opt/darkskyscout/packages/api/src/workers/cleanup.worker.js Line 432: const uploadsDir = process.env.UPLOADS_DIR || '/uploads';
File: /opt/darkskyscout/packages/api/src/workers/cleanup.worker.js Line 438: const logsDir = process.env.LOGS_DIR || '/logs';
File: /opt/darkskyscout/packages/api/src/workers/cleanup.worker.js Line 743: const tempDir = process.env.TEMP_DIR || '/tmp';
File: /opt/darkskyscout/packages/api/src/workers/index.js Line 33: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/index.js Line 51: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/index.js Line 69: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/index.js Line 87: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/index.js Line 105: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/workers/index.js Line 119: host: process.env.REDIS_HOST || 'localhost',
File: /opt/darkskyscout/packages/api/src/middleware/monitoring.middleware.js Line 241: url: process.env.REDIS_URL || 'redis://localhost:6379',
File: /opt/darkskyscout/packages/api/src/middleware/monitoring.middleware.js Line 348: version: process.env.APP_VERSION || '1.0.0',
File: /opt/darkskyscout/packages/api/src/middleware/monitoring.middleware.js Line 349: environment: process.env.NODE_ENV || 'development'
File: /opt/darkskyscout/packages/api/src/middleware/monitoring.middleware.js Line 364: version: process.env.APP_VERSION || '1.0.0',
File: /opt/darkskyscout/packages/api/src/middleware/monitoring.middleware.js Line 365: environment: process.env.NODE_ENV || 'development',
File: /opt/darkskyscout/packages/api/src/middleware/error.middleware.js Line 210: maxSize: process.env.MAX_FILE_SIZE || '50MB'
File: /opt/darkskyscout/packages/api/src/middleware/upload.js Line 12: region: process.env.AWS_REGION || 'eu-west-1',
File: /opt/darkskyscout/packages/api/src/middleware/upload.js Line 19: const bucket = process.env.AWS_S3_BUCKET || 'skyscout-uploads';
File: /opt/darkskyscout/packages/api/src/middleware/auth.middleware.simple.js Line 12: const secret = process.env.JWT_SECRET || 'dev-jwt-secret-key-for-testing-only-change-in-production';
File: /opt/darkskyscout/packages/api/src/middleware/logging.middleware.js Line 182: const environment = process.env.NODE_ENV || 'development';
File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js Line 20: ios: process.env.IOS_CURRENT_VERSION || '1.0.0',
File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js Line 21: android: process.env.ANDROID_CURRENT_VERSION || '1.0.0'
File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js Line 24: ios: process.env.IOS_FORCE_UPDATE_VERSION || '0.9.0',
File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js Line 25: android: process.env.ANDROID_FORCE_UPDATE_VERSION || '0.9.0'
File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js Line 197: ios: process.env.IOS_DOWNLOAD_URL || 'https://apps.apple.com/app/skyscout',
File: /opt/darkskyscout/packages/api/src/middleware/mobile.middleware.js Line 198: android: process.env.ANDROID_DOWNLOAD_URL || 'https://play.google.com/store/apps/details?id=com.skyscout'
File: /opt/darkskyscout/packages/api/src/middleware/maintenance.middleware.js Line 263: contactSupport: process.env.SUPPORT_EMAIL || 'support@skyscout.app'
File: /opt/darkskyscout/packages/api/src/middleware/cache.middleware.js Line 8: url: process.env.REDIS_URL || 'redis://localhost:6379',
File: /opt/darkskyscout/packages/api/src/middleware/geo.middleware.js Line 27: timezoneAPI: process.env.TIMEZONE_API_URL || 'http://api.timezonedb.com/v2.1/get-time-zone',
File: /opt/darkskyscout/packages/api/src/middleware/geo.middleware.js Line 31: elevationAPI: process.env.ELEVATION_API_URL || 'https://api.open-elevation.com/api/v1/lookup',
File: /opt/darkskyscout/packages/api/src/middleware/geo.middleware.js Line 34: bortleAPI: process.env.BORTLE_API_URL || 'https://www.lightpollutionmap.info/QueryRaster/',
File: /opt/darkskyscout/packages/api/src/services/LocationService.js Line 472: key: process.env.TIMEZONEDB_KEY || 'demo',
File: /opt/darkskyscout/packages/api/src/services/ai.grok.js Line 7: this.apiUrl = process.env.GROK_API_URL || 'https://api.x.ai/v1'; // Default Grok API URL
File: /opt/darkskyscout/packages/api/src/services/MediaService.js Line 32: region: process.env.AWS_REGION || 'us-east-1'
File: /opt/darkskyscout/packages/api/src/services/skyInterference.proxy.service.js Line 11: this.proxyBaseUrl = process.env.SATELLITE_PROXY_URL || 'https://your-app.vercel.app';
File: /opt/darkskyscout/packages/api/src/services/aiEngineManager.service.js Line 30: primary: process.env.AI_ENGINE_PRIMARY || 'claude-code',
File: /opt/darkskyscout/packages/api/src/services/aiEngineManager.service.js
Line 31: fallbackChain: (process.env.AI_ENGINE_FALLBACK || 'claude-api,openai,deepseek').split(','),File: /opt/darkskyscout/packages/api/src/services/googleAuthRepair.service.js Line 10: this.redirectUri = process.env.GOOGLE_REDIRECT_URI || 'https://darkskyscout-api.xamad.net/api/auth/google/callback';
File: /opt/darkskyscout/packages/api/src/services/lightPollution.realtime.service.js Line 28: nasa: process.env.NASA_API_KEY || 'DEMO_KEY',
File: /opt/darkskyscout/packages/api/src/services/EmailService.js Line 262: from: process.env.EMAIL_FROM || 'SkyScout <noreply@skyscout.app>',
File: /opt/darkskyscout/packages/api/src/services/EmailService.js Line 297: from: process.env.EMAIL_FROM || 'SkyScout <noreply@skyscout.app>',
File: /opt/darkskyscout/packages/api/src/services/EmailService.js Line 324: appUrl: process.env.APP_URL || 'https://app.skyscout.com'
File: /opt/darkskyscout/packages/api/src/services/matrix.service.js Line 7: const MATRIX_SERVER = process.env.MATRIX_SERVER_URL || 'http://localhost:8008';
File: /opt/darkskyscout/packages/api/src/services/matrix.service.js Line 8: const MATRIX_DOMAIN = process.env.MATRIX_DOMAIN || 'chat.darkskyscout.xamad.net';
File: /opt/darkskyscout/packages/api/src/services/matrix.service.js Line 9: const REGISTRATION_SECRET = process.env.MATRIX_REGISTRATION_SECRET || '_hkFIRqh5;a^3t7aZ9*WMKPuLqsn8gS-cTwAbxYjYN0Iad_I1Q';
File: /opt/darkskyscout/packages/api/src/services/matrix.service.js Line 57: const secret = process.env.JWT_SECRET || 'darkskyscout-matrix-secret';
File: /opt/darkskyscout/packages/api/src/services/matrix.service.js Line 106: user: process.env.MATRIX_ADMIN_USER || 'darkskyadmin',
File: /opt/darkskyscout/packages/api/src/services/matrix.service.js Line 107: password: process.env.MATRIX_ADMIN_PASSWORD || 'DarkSky2024Admin!'
File: /opt/darkskyscout/packages/api/src/services/s3Service.js Line 9: this.bucketName = process.env.AWS_S3_BUCKET || 'skyscout-media';
File: /opt/darkskyscout/packages/api/src/services/s3Service.js Line 44: const baseUrl = process.env.API_URL || 'https://darkskyscout-api.xamad.net';
File: /opt/darkskyscout/packages/api/src/services/s3Service.js Line 115: const baseUrl = process.env.API_URL || 'https://darkskyscout-api.xamad.net';
File: /opt/darkskyscout/packages/api/src/services/ai.huggingface.js Line 7: this.model = process.env.HUGGINGFACE_MODEL || 'deepseek/deepseek-v3-0324';
File: /opt/darkskyscout/packages/api/src/services/ai.huggingface.js Line 8: this.baseUrl = process.env.HUGGINGFACE_API_URL || 'https://router.huggingface.co/novita/v3/openai/chat/completions';
File: /opt/darkskyscout/packages/api/src/services/AuthService.js Line 16: this.jwtExpiration = process.env.JWT_EXPIRATION || '24h';
File: /opt/darkskyscout/packages/api/src/services/AuthService.js Line 17: this.refreshTokenExpiration = process.env.REFRESH_TOKEN_EXPIRATION || '7d';
File: /opt/darkskyscout/packages/api/src/services/emailService.js Line 7: this.fromEmail = process.env.EMAIL_FROM || 'noreply@darkskyscout.xamad.net';
File: /opt/darkskyscout/packages/api/src/services/adapters/claudeAPI.adapter.js Line 12: this.baseURL = process.env.CLAUDE_API_URL || 'https://api.anthropic.com/v1';
File: /opt/darkskyscout/packages/api/src/services/adapters/claudeAPI.adapter.js Line 13: this.model = process.env.CLAUDE_API_MODEL || 'claude-3-5-sonnet-20241022';
File: /opt/darkskyscout/packages/api/src/services/adapters/claudeAPI.adapter.js Line 14: this.version = process.env.CLAUDE_API_VERSION || '2023-06-01';
File: /opt/darkskyscout/packages/api/src/services/adapters/deepseek.adapter.js Line 12: this.baseURL = process.env.HUGGINGFACE_API_URL || 'https://router.huggingface.co/novita/v3/openai/chat/completions';
File: /opt/darkskyscout/packages/api/src/services/adapters/deepseek.adapter.js Line 13: this.model = process.env.HUGGINGFACE_MODEL || 'deepseek/deepseek-v3';
File: /opt/darkskyscout/packages/api/src/services/adapters/openai.adapter.js Line 12: this.baseURL = process.env.OPENAI_API_URL || 'https://api.openai.com/v1';
File: /opt/darkskyscout/packages/api/src/services/adapters/openai.adapter.js Line 13: this.model = process.env.OPENAI_MODEL || 'gpt-4';
File: /opt/darkskyscout/packages/api/src/services/adapters/claudeCode.adapter.js Line 14: this.claudePath = process.env.CLAUDE_CODE_PATH || '/home/deploy/.nvm/versions/node/v22.17.1/bin/claude';
File: /opt/darkskyscout/packages/api/src/services/adapters/claudeCode.adapter.js Line 16: this.defaultModel = process.env.CLAUDE_CODE_MODEL || 'sonnet'; // Use alias for latest Sonnet model
File: /opt/darkskyscout/packages/api/src/services/adapters/huggingface.adapter.js Line 12: this.baseURL = process.env.HUGGINGFACE_INFERENCE_URL || 'https://api-inference.huggingface.co/models';
File: /opt/darkskyscout/packages/api/src/services/adapters/huggingface.adapter.js Line 13: this.model = process.env.HUGGINGFACE_DEFAULT_MODEL || 'microsoft/DialoGPT-large';
File: /opt/darkskyscout/packages/web/src/test-api-connection.js Line 2: const API_BASE_URL = process.env.REACT_APP_API_URL || 'https://darkskyscout-api.xamad.net';
File: /opt/darkskyscout/packages/web/src/services/geocoding.service.js Line 118: const API_BASE = process.env.REACT_APP_API_URL || '/api';
File: /opt/darkskyscout/packages/web/src/services/externalLocation.service.js Line 443: const API_BASE = process.env.REACT_APP_API_URL || '/api';
File: /opt/darkskyscout/packages/web/src/services/communitySharing.service.js Line 3: const API_BASE_URL = process.env.REACT_APP_API_URL || 'https://darkskyscout-api.xamad.net/api';
File: /opt/darkskyscout/packages/web/src/pages/AIEngineAdminPage.jsx Line 8: const API_URL = process.env.REACT_APP_API_URL || 'https://darkskyscout-api.xamad.net/api';
File: /opt/darkskyscout/packages/web/src/pages/AccommodationDetailPage.jsx Line 124: const apiUrl = process.env.REACT_APP_API_URL || 'https://darkskyscout-api.xamad.net/api';
File: /opt/darkskyscout/packages/web/src/components/admin/AIEngineManager.jsx Line 6: const API_URL = process.env.REACT_APP_API_URL || 'https://darkskyscout-api.xamad.net/api';
File: /opt/darkskyscout/packages/web/src/components/map/MapboxMap.jsx Line 8: mapboxgl.accessToken = process.env.REACT_APP_MAPBOX_ACCESS_TOKEN || 'pk.eyJ1IjoiZGFya3NreXNjb3V0IiwiYSI6ImNsdmhkZnhrbzAyeDQycW9ma3J2aHUwaGMifQ.placeholder';
File: /home/webhook/picobernacca/app.py Line 202: app.run(host="127.0.0.1", port=config.PORT, debug=True)
File: /home/webhook/picobernacca/templates/dashboard.html Line 5: <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
File: /home/webhook/picobernacca/templates/dashboard.html Line 6: <meta name="theme-color" content="#0a0a28">
File: /home/webhook/picobernacca/templates/dashboard.html Line 7: <meta name="apple-mobile-web-app-capable" content="yes">
File: /home/webhook/picobernacca/templates/dashboard.html Line 8: <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
Logs show an active brute-force attack from 222.121.250.156 cycling through root, admin, oracle, usuario, and test usernames with maximum authentication attempts exceeded. fail2ban is INACTIVE, meaning there is no automated IP banning. Combined with PasswordAuthentication=yes on SSH, this creates a high-probability credential compromise vector. MaxStartups throttling events confirm connection flooding is occurring.
PasswordAuthentication is set to 'yes' in both config and runtime. With an active brute-force attack in progress and no fail2ban, this significantly increases the risk of unauthorized access. Key-based authentication is already configured (1 ed25519 key for root), so password auth can be safely disabled.
12 services are bound to 0.0.0.0 or [::]. Several have no identified process name: port 3030 (unknown), port 8065 (unknown), port 3050 (node). Ports 8000 and 8003 run unidentified Python processes, and port 5055 runs python3. Without nftables rule visibility, it's unclear if these are filtered. Unnecessary exposure increases attack surface significantly.
Mosquitto MQTT broker is listening on 0.0.0.0:8883 (MQTT over TLS) and 0.0.0.0:9001 (likely WebSocket). MQTT brokers exposed to the internet are frequent targets for unauthorized subscription/publishing attacks. If authentication is not configured or uses weak credentials, attackers can intercept or inject messages into IoT communication channels.
pam_pwquality is not configured (no password complexity enforcement) and pam_faillock is not configured (no account lockout after failed attempts). PASS_MAX_DAYS is 99999 (no password expiration), PASS_MIN_DAYS is 0. Combined with password authentication being enabled on SSH, weak passwords could be set and brute-forced indefinitely at the PAM level.
X11Forwarding is set to 'yes' and AllowTcpForwarding is 'yes'. X11 forwarding can be exploited for X11 session hijacking if an attacker gains SSH access. TCP forwarding allows tunneling through the server, which could be used for lateral movement or as a proxy. On a server (not a workstation), neither is typically needed.
ClientAliveInterval is 0 and UnusedConnectionTimeout is 'none'. Idle SSH sessions remain open indefinitely, increasing the risk of session hijacking if a workstation is left unattended. MaxAuthTries is 6 (recommended <= 4), giving attackers more password guesses per connection.
fs.suid_dumpable is set to 2 (suidsafe), which allows core dumps of SUID processes to be written (readable only by root). Core dumps from privileged processes can leak sensitive data such as passwords, encryption keys, or memory contents of privileged applications.
The root partition (/) is at 80% usage with 7.3G remaining of 38G. While not immediately critical, continued growth (especially from logs, Docker images, or database data) could cause service failures. Docker overlay filesystem shares the same partition. A full disk can cause PostgreSQL corruption, application crashes, and inability to write logs.
RequiredRSASize is set to 1024, which allows weak RSA keys. NIST deprecated 1024-bit RSA keys in 2013. While the configured host key is Ed25519 (strong), clients could authenticate with weak 1024-bit RSA keys.
net.ipv4.conf.all.send_redirects=1 allows the server to send ICMP redirect messages, which could be abused for MITM attacks on the local network. net.ipv4.conf.all.log_martians=0 means packets with impossible source addresses are not logged, reducing visibility into potential spoofing attacks.
DebianBanner is 'yes', disclosing the OS distribution to attackers during SSH handshake. AuthorizedKeysFile includes '.ssh/authorized_keys2' which is a deprecated path and could be used to plant backdoor keys in a less obvious location. Both are information disclosure / attack surface issues.
The SSH MAC configuration includes hmac-sha1 and umac-64 variants which are considered weak. While ETM (Encrypt-then-MAC) variants are present and preferred, the non-ETM hmac-sha1 and umac-64 are still accepted, allowing downgrade by a capable attacker.
net.ipv4.ip_forward=1 enables the kernel to route packets between network interfaces. This is typically required for Docker networking and is expected on this system (Docker/containerd are present). However, if Docker is not actively used for inter-container or host networking, this should be disabled to prevent the server from being used as a router in network attacks.
Whitelisted findings are still detected and reported, but don't affect the security score. Use this for known issues that are intentional or accepted business risks.
These fixes were identified during the last audit. Review them before approving. SecShield creates a snapshot before applying any changes and will auto-rollback if services break. Force Security Updates: applies only security patches immediately. Force All Updates: applies all pending packages (use with caution).
No pending fixes from the last audit.