mern-stack
mern-stack copied to clipboard
MERN Stack with Docker - MongoDB - Express - React - Redux - React Native - NodeJs
MERN Stack with Docker
MongoDB - Express - React - Redux - React Native - NodeJS
MERN stack is intended to provide a starting point for building full-stack JavaScript applications, including dynamic web and mobile apps. The stack is made of MongoDB, Express, React, Redux, React Native and NodeJS.
Demo
- Web app demo
- Mobile app demo
- Dummy accounts:
- email:
[email protected]- password:password - email:
[email protected]- password:password
- email:
Project Breakdown
1. API Server
NOTE: The full API documentation can be found here
- Directory
server - Todo:
- [x] Authentication system - passport
- [x] Sign up - bcrypt
- [x] Local login - jsonwebtoken - passport-jwt
- [x] Apple login - @nicokaiser/passport-apple
- [x] Facebook login - passport-facebook-token
- [x] Google login - passport-google-id-token
- [x] Email verification
- [x] Password reset email
- [x] Authorization system
- [x] Role-based access control
- [x] Principle of least privilege
- [x] User management - CRUD operations
- [x] Input validation and sanitization - joi
- [x] Integration testing - mocha - chai - supertest
- [x] Docker support - node:lts-buster
- [x] Dev mode - See server/Dockerfile
- [x] Prod mode - See server/Dockerfile.prod
- [x] Authentication system - passport
2. React Client
- Directory
client - Created by using create-react-app
- Todo:
- [x] Redux store - react-redux
- [x] Redux form - redux-form. NOTE: Migrate to formik soon
- [x] Router - react-router-dom - connected-react-router
- [x] Material design - Material-UI
- [ ] Authentication pages
- [x] Sign up page
- [x] Sign in page with email, Facebook or Google account
- [x] Request password reset email page
- [x] Request verification email page
- [x] Reset password page
- [ ] Profile page
- [ ] User management pages
- [ ] User list page
- [ ] User edit page
- [x] Docker support - node:lts-buster - nginx:stable-alpine
- [x] Dev mode - See client/Dockerfile
- [x] Prod mode - See client/Dockerfile.prod
3. React Native - Mobile
- Directory
mobile - Created by using react-native-cli. If you want to use Expo, please check out expo branch and see docs here
- Todo:
- [x] Redux store - react-redux
- [x] Router - react-navigation
- [x] Material design - react-native-paper
- [ ] Authentication screens
- [x] Sign up screen
- [x] Sign in screen with email, Facebook or Google account
- [x] Request password reset email screen
- [x] Request verification email screen
- [ ] Settings screen
4. Nginx Proxy
- Directory
nginx-proxy - Todo:
- [x] Reverse proxy server - nginx:stable
- [x] Dev mode - See nginx-proxy/Dockerfile
- [x] Prod mode - See nginx-proxy/Dockerfile.prod
- [x] Install and auto-renew SSL certificate
- [x] Force all HTTP traffic (domain name and IP address) to HTTPS
- [x] Use recommended configuration - server-configs-nginx
- [x] Configuration can be done easily by modifying the
.envfile
- [x] Reverse proxy server - nginx:stable
5. CI and CD
- Directory
.github/workflows - Todo:
- [x] Testing workflow
- [x] Building and deploying workflow
Getting started
1. Clone the mern-stack repository
If you want to use Expo for developing mobile app, please check out the expo branch and see instructions here
git clone https://github.com/t-ho/mern-stack.git
cd mern-stack
cp .env.example .env
cp client/.env.example client/.env
cp mobile/.env.example mobile/.env
# Edit all three .env files to meet your requirements
2. Install package dependencies
In the root directory, run:
npm install
3. Start development servers
To start server, client, and mobile, run:
# In the root directory (mern):
npm start
# Server API is running at http://localhost:SERVER_PORT (http://localhost:8861 by default)
# Web client is running at http://localhost:PORT (http://localhost:3000 by default)
# Mobile - Expo DevTools is running at http://localhost:19002
NOTE:
- For the sake of simplicity, we use free service ngrok to create a public API URL for mobile development. The downside of this approach is that the public URL is only available for 8 hours, so we need to restart the npm process every 8 hours.
- After 8 hours, the
mobileprocess will be terminated, and a warning message will be displayed in your terminal to remind you to restart npm process.
To restart npm process (If you don't start the mobile development process, ignore this step):
# In your current terminal, press Ctrl + C to exit. Then run
npm start # start server, client and mobile dev process
# or
npm run server:mobile # start server and mobile dev process
Or to start server and client only, run:
# In the root directory (mern):
npm run server:client
# Server API is running at http://localhost:SERVER_PORT (http://localhost:8861 by default)
# Web client is running at http://localhost:PORT (http://localhost:3000 by default)
Or to start server and mobile only, run:
# In the root directory (mern):
npm run server:mobile
# Server API is running at http://localhost:SERVER_PORT (http://localhost:8861 by default)
4. Run the mobile app in your emulator/simulator
cd mobile
npx react-native run-android
# or
npx react-native run-ios
5. Run the mobile app on your mobile devices
- Please read the documenatation here
6. Debug mobile app with react-native-debugger
- Install react-native-debugger.
- Open React Native Debugger window instance with port
19001(Debugger>New Window). - Enable Debugging mode on your iOS simulator or Android emulator.
7. Debug web app with Redux DevTools
- On Chrome, install redux-devtools-extension
- On Firefox, install redux-devtools-add-ons
8. Docker
You can start the MERN stack (server and client only) using docker-compose:
Development mode
git clone https://github.com/t-ho/mern-stack.git
cd mern-stack
cp .env.example .env
cp client/.env.example client/.env
# Edit the .env file to meet your requirements
docker-compose up
# The mongoDB service listen on port 27018
The nginx-proxy server will listen on port 8080 (NGINX_PROXY_PORT) by default.
Production mode
git clone https://github.com/t-ho/mern-stack.git
cd mern-stack
cp .env.example .env.prod
# Edit the .env.prod file to meet your requirements
docker-compose -f docker-compose.prod.yml --env-file ./.env.prod up -d
Testing
In the root (mern-stack) directory, run:
npm run test
Testing frameworks:

