๐ A boilerplate for Node.js, Express, Mongoose, Heroku, Atlas, Nodemon, PM2, and Babel.
๐ Live Demo
This seed repository provides the following features:
- ---------- Essentials ----------
- Web application framework with Express.
- Object-document mapping with Mongoose.
- Make authenticated requests with Passport.
- File upload with Multer.
- Real-time communication with WS.
- ---------- Tools ----------
- Next generation JavaScript with Babel.
- JavaScript static code analyzer with ESLint.
- Code formatter with Prettier.
- Unit testing with Jest.
- End-to-End testing with Supertest.
- Mocking external requests with Nock.
- Automatically restart application with Nodemon.
- Keeping application alive with PM2.
- Reverse proxy with Caddy.
- ---------- Environments ----------
- Cloud application hosting with Heroku.
- Cloud NoSQL database hosting with Atlas.
- Cloud storage hosting with Cloudinary.
- Error tracking service with Sentry.
- Software container with Docker.
- Continuous integration with CircleCI.
- Fix and prevent known vulnerabilities with Snyk.
- Test coverage integration with Codecov.
Follow steps to execute this boilerplate.
$ npm install
$ brew services start mongodb-community
$ yarn serve
$ yarn build
$ yarn lint
Files: src/**/*.spec.js
$ yarn unit
Files: e2e/**/*.spec.js
# Before running the `meas` command, make sure to run the following commands.
$ yarn build
$ yarn preview
# If it's not setup, run it.
$ yarn setup
$ yarn e2e
Files: e2e/**/*.meas.js
# Before running the `meas` command, make sure to run the following commands.
$ yarn build
$ yarn preview
# If it's not setup, run it.
$ yarn setup
$ yarn meas
# If it's not active, run it.
$ yarn active
$ yarn mock
Dockerize an application.
- Build and run the container in the background
$ docker-compose up -d mongodb app
- Run a command in a running container
$ docker-compose exec app <COMMAND>
- Remove the old container before creating the new one
$ docker-compose rm -fs
- Restart up the container in the background
$ docker-compose up -d --build app
Control the environment.
Set your local environment variables. (use export const <ENV_NAME> = process.env.<ENV_NAME> || <LOCAL_ENV>;
)
// src/env.js
export const NODE_ENV = process.env.NODE_ENV || 'development';
export const INDEX_NAME = process.env.INDEX_NAME || 'local';
export const HOST = process.env.HOST || '0.0.0.0';
export const PORT = process.env.PORT || 3000;
export const SECRET_KEY = process.env.SECRET_KEY || 'jbmpHPLoaV8N0nEpuLxlpT95FYakMPiu';
export const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://127.0.0.1:27017/test';
// ---
export const FACEBOOK_APP_ID = process.env.FACEBOOK_APP_ID || 'XXX';
export const FACEBOOK_APP_SECRET = process.env.FACEBOOK_APP_SECRET || 'XXX';
export const GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID || 'XXX';
export const GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET || 'XXX';
export const APPLE_SERVICES_ID = process.env.APPLE_SERVICES_ID || 'XXX';
export const APPLE_TEAM_ID = process.env.APPLE_TEAM_ID || 'XXX';
export const APPLE_KEY_ID = process.env.APPLE_KEY_ID || 'XXX';
export const APPLE_PRIVATE_KEY = process.env.APPLE_PRIVATE_KEY || 'XXX';
export const CLOUDINARY_URL = process.env.CLOUDINARY_URL || 'cloudinary://key:secret@domain_name';
export const RATE_LIMIT = process.env.RATE_LIMIT || 0;
export const SENTRY_DSN = process.env.SENTRY_DSN || null;
Add environment variables to the CircleCI build.
# Project Settings > Environment Variables > Add Environment Variable
SECRET_KEY
MONGODB_URI
CLOUDINARY_URL
SENTRY_DSN
If you want to set environment variables from a file.
.
โโโ e2e
โโโ envs
โ โโโ dev.js
โ โโโ stage.js
โ โโโ prod.js
โโโ mock
โโโ src
// envs/<ENV_NAME>.js
function Environment() {
this.NODE_ENV = 'production';
// more...
}
module.exports = new Environment();
$ npm install babel-plugin-transform-inline-environment-variables env-cmd -D
// babel.config.js
plugins: [
// ...
'transform-inline-environment-variables',
],
// package.json
"scripts": {
// "env-cmd -f ./envs/<ENV_NAME>.js" + "yarn build"
"build:dev": "env-cmd -f ./envs/dev.js yarn build",
"build:stage": "env-cmd -f ./envs/stage.js yarn build",
"build:prod": "env-cmd -f ./envs/prod.js yarn build",
},
The structure follows the LIFT Guidelines.
.
โโโ e2e
โโโ mock
โ โโโ requests
โ โโโ responses
โโโ src
โ โโโ core
โ โ โโโ ...
โ โโโ <FEATURE> -> feature modules
โ โ โโโ __tests__
โ โ โ โโโ controller.spec.js
โ โ โ โโโ service.spec.js
โ โ โ โโโ model.spec.js
โ โ โโโ controller.js
โ โ โโโ service.js
โ โ โโโ model.js
โ โ โโโ index.js
โ โโโ <GROUP> -> module group
โ โ โโโ <FEATURE> -> feature modules
โ โ โโโ __tests__
โ โ โ โโโ controller.spec.js
โ โ โ โโโ service.spec.js
โ โ โ โโโ model.spec.js
โ โ โโโ controller.js
โ โ โโโ service.js
โ โ โโโ model.js
โ โ โโโ index.js
โ โโโ app.js
โ โโโ env.js
โ โโโ server.js
โโโ .editorconfig
โโโ .eslintrc
โโโ .gitignore
โโโ .prettierrc
โโโ babel.config
โโโ Caddyfile
โโโ circle.yml
โโโ develop.Dockerfile
โโโ docker-compose.yml
โโโ Dockerfile
โโโ jest.config.js
โโโ LICENSE
โโโ package-lock.json
โโโ package.json
โโโ processes.js
โโโ produce.Dockerfile
โโโ README.md
Microservice architecture โ a variant of the service-oriented architecture structural style โ arranges an application as a collection of loosely coupled services. In a microservices architecture, services are fine-grained and the protocols are lightweight.
See Server-side Micro-Fullstack for instructions on how to create microservices from source code.