Add rate limiting to prevent abuse

Co-authored-by: mblanke <9078342+mblanke@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-01-09 21:54:17 +00:00
parent 4c89a0641b
commit 96ec73fc05
3 changed files with 41 additions and 0 deletions

28
package-lock.json generated
View File

@@ -13,6 +13,7 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"dockerode": "^4.0.9", "dockerode": "^4.0.9",
"express": "^4.22.1", "express": "^4.22.1",
"express-rate-limit": "^8.2.1",
"ws": "^8.19.0" "ws": "^8.19.0"
} }
}, },
@@ -723,6 +724,24 @@
"url": "https://opencollective.com/express" "url": "https://opencollective.com/express"
} }
}, },
"node_modules/express-rate-limit": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"license": "MIT",
"dependencies": {
"ip-address": "10.0.1"
},
"engines": {
"node": ">= 16"
},
"funding": {
"url": "https://github.com/sponsors/express-rate-limit"
},
"peerDependencies": {
"express": ">= 4.11"
}
},
"node_modules/express/node_modules/debug": { "node_modules/express/node_modules/debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -995,6 +1014,15 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/ip-address": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"license": "MIT",
"engines": {
"node": ">= 12"
}
},
"node_modules/ipaddr.js": { "node_modules/ipaddr.js": {
"version": "1.9.1", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",

View File

@@ -24,6 +24,7 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"dockerode": "^4.0.9", "dockerode": "^4.0.9",
"express": "^4.22.1", "express": "^4.22.1",
"express-rate-limit": "^8.2.1",
"ws": "^8.19.0" "ws": "^8.19.0"
} }
} }

View File

@@ -5,19 +5,31 @@ const axios = require('axios');
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const os = require('os'); const os = require('os');
const rateLimit = require('express-rate-limit');
const app = express(); const app = express();
const PORT = process.env.PORT || 3001; const PORT = process.env.PORT || 3001;
const FRONTEND_PORT = 3000; const FRONTEND_PORT = 3000;
// Rate limiting to prevent abuse
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // Limit each IP to 100 requests per windowMs
message: 'Too many requests from this IP, please try again later.'
});
// Middleware // Middleware
app.use(cors()); app.use(cors());
app.use(express.json()); app.use(express.json());
app.use('/api', limiter); // Apply rate limiting to all API routes
// Serve frontend static files in production // Serve frontend static files in production
const frontendDistPath = path.join(__dirname, 'frontend', 'dist'); const frontendDistPath = path.join(__dirname, 'frontend', 'dist');
if (fs.existsSync(frontendDistPath)) { if (fs.existsSync(frontendDistPath)) {
const frontendApp = express(); const frontendApp = express();
// Apply rate limiting to frontend serving as well
frontendApp.use(limiter);
frontendApp.use(express.static(frontendDistPath)); frontendApp.use(express.static(frontendDistPath));
frontendApp.get('/*', (req, res) => { frontendApp.get('/*', (req, res) => {
res.sendFile(path.join(frontendDistPath, 'index.html')); res.sendFile(path.join(frontendDistPath, 'index.html'));