Just Boilerplate Express with TypeScript ( 🦊 )
- npm >=
v6.x
- node >=
v12.x
- eslint
v7.x
- husky >=
v7.x
- Familiar with TypeScript 💪
- TypeScript
v4.x
- Sequelize ORM
v6.x
- Nodemailer
- Handlebars for templating HTML
- Yup for validation schema
- JavaScript Style Standard with TypeScript
- Formating code using Prettier Integration Eslint and TypeScript Eslint
- Using Module Alias for simplify the require/import paths
- Documentation with Swagger
- Generate Log File with Winston
- Convensional Commit with Husky & Commitlint
clone this repo with https
/ ssh
/ github cli
git clone /~https://github.com/masb0ymas/expresso.git
After cloning this repo, make sure you have duplicated
the .env.example
file to .env
, don't let the .env.example file be deleted or renamed.
npm install
or
yarn
npx husky install
or
yarn husky install
npm run key:generate
or
yarn key:generate
npm run dev
or
yarn dev
npm run test:types
or
yarn test:types
npm run test:types-watch
or
yarn test:types-watch
npm run build
or
yarn build
Using sequelize with development mode, you can set the database configuration in .env
, like this :
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=example_database
DB_USERNAME=example_user
DB_PASSWORD=example_password
DB_OPERATOR_ALIAS=
DB_TIMEZONE=+07:00
then after that you can adjust the database config in DB_DATABASE
, DB_USERNAME
, DB_PASSWORD
.
now you can run this command :
npm run db:reset
or
yarn db:reset
npm run serve:production
or
yarn serve:production
pm2 start ecosystem.config.js --env=production
server {
listen 80;
listen [::]:80;
server_name yourdomain.com;
client_max_body_size 2000M;
location / {
proxy_pass http://127.0.0.1:7000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
npm install -g loadtest
Then run the app that you want to test with node app.js
. We’ll start by testing the version that doesn’t use clustering.
With the app running, open another Terminal and run the following load test:
loadtest http://localhost:8000/v1/user -n 1000 -c 100
-n
= network / requests
-c
= concurrency
--rps
= request per second
Read documentation loadtest
if you want to try 1000 requests
you have to increase RATE_LIMIT=1000
, by default 100 requests
Requests: 0 (0%), requests per second: 0, mean latency: 0 ms
Target URL: http://localhost:8000/v1/user
Max requests: 1000
Concurrency level: 100
Agent: none
Completed requests: 1000
Total errors: 0
Total time: 1.7057602980000002 s
Requests per second: 586
Mean latency: 162.8 ms
Percentage of the requests served within a certain time
50% 136 ms
90% 261 ms
95% 337 ms
99% 390 ms
100% 419 ms (longest request)
npm run test
or
yarn test
Adjust the config in .env like this:
...
PORT=8000 # change this port according to your needs
...
DB_CONNECTION=mysql
DB_HOST=db # access to service db in docker
DB_PORT=3306
DB_DATABASE=example
DB_USERNAME=your_username
DB_PASSWORD=your_password
DB_OPERATOR_ALIAS=
DB_TIMEZONE=+07:00
...
REDIS_HOST=redis # access to service redis in docker
REDIS_PASSWORD=your_password
REDIS_PORT=6379
container_name
in each service is customizable.
PORT=...
If you want to use a port other than 8000
, you must also change the port in the services app
services:
app:
build:
context: .
container_name: express_app
depends_on:
- db
- redis
restart: always
ports:
- '8000:8000'
DB_HOST=..
. must be accessed using IPv4 Docker Network services db
.
db:
image: mariadb
container_name: express_db
volumes:
- ./storage/mariadb-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
restart: always
ports:
- '3307:3306'
networks:
- express_network
After all the above configuration is adjusted, you can run it with the command:
Command aggregates the output of each container
docker-compose up
Detached mode: Run containers in the background,
docker-compose up -d
if you want to release the app version, you can use the following command :
npm run release
or
yarn release
I use topol.io to create email templates, and it's free and can export to html format
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=465
MAIL_AUTH_TYPE=
MAIL_USERNAME=your_mail@domain.com
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=
MAILGUN_API_KEY=your_api_key_mailgun
MAILGUN_DOMAIN=your_domain
MAIL_DRIVER=gmail
MAIL_HOST=
MAIL_PORT=
MAIL_AUTH_TYPE=OAuth2
MAIL_USERNAME=your_account@gmail.com
MAIL_PASSWORD=
MAIL_ENCRYPTION=
OAUTH_CLIENT_ID=your_client_id
OAUTH_CLIENT_SECRET=your_client_secret
OAUTH_REDIRECT_URL=https://developers.google.com/oauthplayground
OAUTH_REFRESH_TOKEN=your_refresh_token
👤 masb0ymas
- Website: https://resume.masb0ymas.vercel.app
- Twitter: @masb0ymas
- Github: @masb0ymas
- LinkedIn: @masb0ymas
Give a ⭐️ if this project helped you!
This README was generated with ❤️ by readme-md-generator