This template is intended to be used as single service in a REST multi-service application using Cloud Pub/Sub as message broker
The main difference with the previous template is the folder infra in which you can find all the GKE configurations to use in local with Skaffold and in cloud with GKE
To know more about how to implement GKE and run with Skaffold please refer to this folder:
./infra
The application uses express as framework and is configured with the following features:
ECMA2020
features enabledDotenv
Load environment variables from .env fileEslint
Code quality toolPrettier
to prettify the codeMongoDB
ready to go configuration with mongooseMySQL
ready to go configuration with mysql2Sequelize
ready to go configuration with sequelizeCORS
feature enabledRBAC
logic to authorize people with specific roles to use the endpoints.Sendgrid
email service support with sendgrid.Error Handling
errors custom middleware and helpers globally configuredMulter
File uploading configured to use in routes as middlewareGoogle Cloud Storage
middleware configured to use Google Cloud Storage as upload bucketGoogle Cloud Pub/Sub
pub/sub support for event driven events addedAxios
globally configured in./src/utils/api.utils.js
Swagger
documentation reachable athttp://localhost:3000/api/v1/docs
Jest
Testing tool supportLogger
Logging support with WinstonDocker
ready configuration with multi-stage optionBest practices
in naming files
-
App entry point is located in
./src/app.js
-
Server config entrypoint is located in
./src/bin/server.js
-
Babel config to transpile the code is located at
./.babelrc
-
Prettier config is located at
./.prettierrc
-
Eslint config is located at
./.eslintrc
-
Sendgrid service support is located at
./src/services/email/sendgrid.service.js
- You can define your own email services in this file
-
Mongo config is located at
./src/config/mongodb.config.js
- Models definition are located in
./src/models
- Models definition are located in
-
MYSQL config is located at
./src/config/mysql.config.js
-
Error Handling middleware is located at
./src/middlewares/errorHandler.middleware.js
- You can configure as many errors you need in
./src/helpers/errors.helper.js
- You can configure as many errors you need in
-
Multer middleware is located at
./src/middlewares/upload.middleware.js
- If you want to use Google Cloud Storage as upload bucket follow instructions at
./src/config/gcloud/README.md
- If you want to use Google Cloud Storage as upload bucket follow instructions at
-
RBAC logic middleware is located at
./src/middlewares/verifyRights.middleware.js
-
Swagger config file is located at
./swagger.json
- Swagger routes are defined in
./src/routes/swagger.route.js
- Swagger routes are defined in
-
Docker config is located at
./Dockerfile
-
Pub/Sub service is located at
./src/services/pubsub/pub-sub.service.js
infra/
- For more information about the k8s configuration please check the README file
k8s
- folder contains all production kubernetes manifestsk8s-dev
- folder contains all development kubernetes manifests to run with skaffoldscripts
- older contains all script related to the creation of a cluster or running skaffold or secret creation
src/
bin/
- server configuration folderconfig/
- this folder contains all the configs file (database, passport, etc...)constants/
- this folder contains all the global constantscontrollers/
- all the controllers to use in routes that interact with servicesdebug/
- the logger file will be stored herehelpers/
- some helpers func i.e. an error helper that returns json everytime an error comes inmiddlewares/
- here you can find all the custom middlewaresmodels/
- database model definitionroutes/
- here you find all the defined routes of the appservices/
- here we store all the services; i.e. here we define methods to manipulate a db model entitytests/
- here we store all the jest testutils/
- containing some utils function to be reused in the code (i.e. axios global configuration)
Copy the .env.example to .env
cp env.example .env
Then replace:
MONGO_URI
string with your Mongo connectionMONGO_URI_TEST
string with your Mongo Test connection
MYSQL_HOST_STAGE
string with your mysql host nameMYSQL_USER_STAGE
string with your mysql usernameMYSQL_PASSWORD_STAGE
string with your mysql password nameMYSQL_DB_STAGE
string with your mysql db nameMYSQL_SOCKET_STAGE
string with your mysql socket name
GOOGLE_APPLICATION_CREDENTIALS
path with yoursGOOGLE_PROJECT_ID
with yoursSENDGRID_API_KEY
with yoursSENDGRID_SENDER_EMAIL
with yours
In order to Google Cloud Storage works follow instructions located in ./src/config/gcloud/README.md
To get started with this repo npm install in the root folder
npm install
To getting started with a dev environment. Here we use nodemon and babel-node to restart the server asa we change something
npm run start:dev
To transpile the code and create a production build
npm run transpile
This command will create a build in the root directory
To start with a production ready build you can run this command
# This set the NODE_ENV to production, npm-run-all, create a build and run the server command
npm run start
If you have a build and you want to node the build you can run
# This command launch the node instance inside the ./build/bin/server
npm run server
If you use Docker and wanna dockerize the app you can run the command
docker build -t <dockerhubusername>/<docker-image-name>:<tag> .
then
docker run --name <docker-process-name> -d - p 3000:3000 <dockerhubusername>/<docker-image-name>:<tag>