This commit is contained in:
Jake Kasper
2025-09-02 07:40:22 -05:00
parent 714f90bb1a
commit 47bfd404a7
3 changed files with 6 additions and 32 deletions

View File

@@ -28,7 +28,6 @@ const PORT = process.env.PORT || 5000;
app.set('trust proxy', 1); app.set('trust proxy', 1);
// Security middleware // Security middleware
// Loosen CSP slightly to support CRA dev server/HMR behind proxy
app.use(helmet({ app.use(helmet({
contentSecurityPolicy: { contentSecurityPolicy: {
directives: { directives: {
@@ -37,9 +36,7 @@ app.use(helmet({
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"], styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"],
fontSrc: ["'self'", "https://fonts.gstatic.com"], fontSrc: ["'self'", "https://fonts.gstatic.com"],
imgSrc: ["'self'", "data:", "https://maps.googleapis.com", "https://maps.gstatic.com"], imgSrc: ["'self'", "data:", "https://maps.googleapis.com", "https://maps.gstatic.com"],
connectSrc: ["'self'", "https:", "wss:", "ws:", "https://api.openweathermap.org"], connectSrc: ["'self'", "https://api.openweathermap.org"]
// Allow eval for development source maps if needed (not for production)
// 'unsafe-eval' is not added here by default
} }
} }
})); }));
@@ -54,18 +51,13 @@ const limiter = rateLimit({
}); });
app.use(limiter); app.use(limiter);
// Stricter rate limiting for auth routes (but skip harmless public checks) // Stricter rate limiting for auth routes
const authLimiter = rateLimit({ const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes windowMs: 15 * 60 * 1000, // 15 minutes
max: parseInt(process.env.AUTH_RATE_LIMIT_MAX || '2000', 10), max: 200, // Increased to 200 auth requests per 15 minutes for development
message: 'Too many authentication attempts, please try again later.', message: 'Too many authentication attempts, please try again later.',
standardHeaders: true, standardHeaders: true,
legacyHeaders: false, legacyHeaders: false,
skip: (req) => {
// Skip rate limiting for public, low-risk endpoints that the UI may poll
const p = req.path || '';
return p === '/registration-status' || p.startsWith('/authentik');
}
}); });
// Middleware // Middleware

View File

@@ -11,19 +11,11 @@ services:
build: build:
context: ./frontend context: ./frontend
dockerfile: Dockerfile dockerfile: Dockerfile
command: >-
sh -lc "
if [ ! -d node_modules ] || [ -z \"$(ls -A node_modules 2>/dev/null)\" ]; then
echo '[frontend] Installing dependencies...';
npm install --silent;
fi;
npm start
"
environment: environment:
- REACT_APP_API_URL=https://turftracker.kaspers.us/api - REACT_APP_API_URL=https://turftracker.kaspers.us/api
volumes: volumes:
- ./frontend:/app - ./frontend:/app
- frontend_node_modules:/app/node_modules - /app/node_modules
depends_on: depends_on:
- backend - backend
networks: networks:
@@ -43,14 +35,6 @@ services:
build: build:
context: ./backend context: ./backend
dockerfile: Dockerfile dockerfile: Dockerfile
command: >-
sh -lc "
if [ ! -d node_modules ] || [ -z \"$(ls -A node_modules 2>/dev/null)\" ]; then
echo '[backend] Installing production dependencies...';
npm install --only=production --silent;
fi;
npm start
"
environment: environment:
- NODE_ENV=development - NODE_ENV=development
- DB_HOST=db - DB_HOST=db
@@ -67,7 +51,7 @@ services:
- FRONTEND_URL=https://turftracker.kaspers.us - FRONTEND_URL=https://turftracker.kaspers.us
volumes: volumes:
- ./backend:/app - ./backend:/app
- backend_node_modules:/app/node_modules - /app/node_modules
depends_on: depends_on:
- db - db
networks: networks:
@@ -115,5 +99,3 @@ services:
volumes: volumes:
postgres_data: postgres_data:
frontend_node_modules:
backend_node_modules:

View File

@@ -28,4 +28,4 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD node healthcheck.js CMD node healthcheck.js
# Start the application # Start the application
CMD ["npm", "start"] CMD ["npm", "start"]