Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
services:
# MongoDB database
mongo:
profiles: ["web_app"]
image: mongo:6
container_name: mongo
volumes:
- mongo_data:/data/db
ports:
- "27017:27017"
networks:
- gmail-net
# React frontend
web_front:
profiles: ["web_app"]
Expand Down Expand Up @@ -26,6 +37,9 @@ services:
- ./web_server/.env
depends_on:
- run_server
- mongo
environment:
- MONGO_URI=mongodb://mongo:27017/appdb
ports:
- "${NODE_PORT:-3001}:3001"
networks:
Expand Down Expand Up @@ -91,6 +105,7 @@ services:

volumes:
app_data:
mongo_data:

networks:
gmail-net:
7 changes: 3 additions & 4 deletions web_server/.env
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
REACT_URL=http://localhost:3000
NODE_PORT=3001
JSON_LIMIT=10mb
JWT_SECRET=gradingMode
JWT_EXPIRATION_TIME=24h
JWT_SECRET=replace_me
JWT_EXPIRATION_TIME=24h
MONGO_URI=mongodb://localhost:27017/appdb
4 changes: 4 additions & 0 deletions web_server/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
NODE_PORT=3001
JWT_SECRET=replace_me
JWT_EXPIRATION_TIME=24h
MONGO_URI=mongodb://mongo:27017/appdb
24 changes: 23 additions & 1 deletion web_server/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,32 @@ const inbox = require('./routes/mails');
const users = require('./routes/users');
const labels = require('./routes/labels');
const blacklist = require('./routes/blacklist');
const { connectDB } = require('./config/db');
const health = require('./routes/health');
// Dev routes are disabled by default. Uncomment if needed for local debugging.
// const devUsers = require('./routes/devUsers');
// const devLabels = require('./routes/devLabels');
// const devMails = require('./routes/devMails');

app.use('/api/mails', inbox);
app.use('/api', users);
app.use('/api/labels', labels);
app.use('/api/blacklist', blacklist);
app.use('/health', health);
// app.use('/dev/users', devUsers);
// app.use('/dev/labels', devLabels);
// app.use('/dev/mails', devMails);

app.listen(PORT);
const start = async () => {
try {
await connectDB();
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
} catch (err) {
console.error('Failed to start server:', err && err.message ? err.message : err);
process.exit(1);
}
};

start();
51 changes: 51 additions & 0 deletions web_server/config/db.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
const mongoose = require('mongoose');

mongoose.set('strictQuery', true);

const MAX_RETRIES = 3;
const RETRY_DELAYS_MS = [1000, 2000, 4000];

function addConnectionListeners() {
const connection = mongoose.connection;
connection.on('connected', () => {
console.log('Mongo connected');
});
connection.on('error', (err) => {
console.error('Mongo connection error:', err && err.message ? err.message : err);
});
connection.on('disconnected', () => {
console.warn('Mongo disconnected');
});
}

async function connectDB() {
addConnectionListeners();

const mongoUri = process.env.MONGO_URI;

if (!mongoUri) {
throw new Error('MONGO_URI is not defined in environment variables');
}

for (let attemptIndex = 0; attemptIndex < MAX_RETRIES; attemptIndex += 1) {
try {
await mongoose.connect(mongoUri);
return mongoose.connection;
} catch (error) {
const isLastAttempt = attemptIndex === MAX_RETRIES - 1;
if (isLastAttempt) {
throw error;
}
const delay = RETRY_DELAYS_MS[attemptIndex] || 1000;
console.warn(`Mongo connection attempt ${attemptIndex + 1} failed. Retrying in ${delay}ms...`);
await new Promise((resolve) => setTimeout(resolve, delay));
}
}

// Should never reach here
throw new Error('Unknown Mongo connection error');
}

module.exports = { connectDB };


Loading