Skip to content
Open
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
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
NODE_ENV='development'

HOST='127.0.0.1'
PORT=3000

MONGO_CONN="mongodb://127.0.0.1:27017/boilerplateapi"

JWT_SECRET=''
3 changes: 2 additions & 1 deletion .github/workflows/deploy-master.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ jobs:

steps:
- name: Checkout the files
uses: actions/checkout@v2
uses: actions/checkout@v3

- name: Deploy to EC2
uses: easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
REMOTE_HOST: ${{ secrets.HOST_DNS }}
REMOTE_USER: ${{ secrets.USERNAME }}
ARGS: '--delete'
TARGET: ${{ secrets.TARGET_DIR }}

- name: Restart Server
Expand Down
25 changes: 0 additions & 25 deletions .gitlab-ci.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v16.13.0
v22.12.0
170 changes: 170 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,171 @@
# API Boilerplate

A robust and scalable API boilerplate built with Fastify, featuring JWT authentication, Swagger documentation, and MongoDB integration.

## Features

- 🚀 **Fastify** - High performance web framework
- 📚 **Swagger Documentation** - Built-in API documentation
- 🔐 **JWT Authentication** - Secure authentication system
- 🗄️ **MongoDB Integration** - Using Mongoose ODM
- 🔄 **CORS Enabled** - Cross-Origin Resource Sharing
- 📦 **Module Aliases** - Clean import paths
- 🎯 **Response Standardization** - Consistent API responses
- 🛠️ **PM2 Process Management** - Production-ready process management

## Quick Start

### Prerequisites

- Node.js (v18 or higher)
- MongoDB
- PM2 (for production)

### Installation

```bash
# Clone the repository
git clone https://github.com/lightrainstech/api-boilerplate.git

# Install dependencies
yarn install

# Create .env file
cp .env.example .env
```

### Environment Variables

```env
PORT=3000
MONGODB_URI=mongodb://localhost:27017/your-database
JWT_SECRET=your-secret-key
NODE_ENV=development
```

### Development

```bash
# Start development server
yarn dev
```

### Production

```bash
# Start with PM2
pm2 start pm2.json
```

## Project Structure

```
src/
├── config/ # Configuration files
├── models/ # MongoDB models
├── plugins/ # Fastify plugins
├── services/ # API routes and business logic
├── utils/ # Utility functions
├── payload/ # Request/Response schemas
├── app.js # Application setup
└── server.js # Server entry point
```

## Module Aliases

```json
{
"@root": ".",
"@services": "src/services/v1/",
"@payloads": "src/payload/",
"@models": "src/models/",
"@configs": "src/config/",
"@utils": "src/utils/"
}
```

## API Documentation

Swagger documentation is available at `/docs` when the server is running.

## API Response Format

### Success Response

```json
{
"error": false,
"message": "Success",
"statusCode": 200,
"data": []
}
```

### Error Response

```json
{
"error": true,
"message": "Error message",
"statusCode": 400,
"data": []
}
```

## Production Deployment

The project includes PM2 configuration for production deployment:

```json
{
"apps": [
{
"name": "api-main",
"script": "./src/server.js",
"exec_mode": "cluster",
"instances": "max",
"max_memory_restart": "512M",
"env": {
"NODE_ENV": "production"
}
}
]
}
```

## Scripts

```bash
yarn start # Start the server
yarn run dev # Start development server with nodemon
```

## Dependencies

- @fastify/autoload
- @fastify/cors
- @fastify/etag
- @fastify/jwt
- @fastify/swagger
- @fastify/swagger-ui
- dotenv
- fastify
- fluent-json-schema
- mongoose
- and more...

## Contributing

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Author

Lightrains Tech ([@lightrainstech](https://github.com/lightrainstech))
42 changes: 28 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,27 +1,41 @@
{
"name": "api-boilerplate",
"description": "boilerplate api",
"version": "2.0.0",
"version": "0.1.0",
"main": "./src/server.js",
"license": "MIT",
"dependencies": {
"@fastify/autoload": "^5.3.1",
"@fastify/cors": "^8.1.0",
"@fastify/etag": "^4.1.0",
"@fastify/jwt": "^6.3.2",
"@fastify/swagger": "^7.5.0",
"dotenv": "^16.0.2",
"fastify": "^4.5.3",
"fluent-json-schema": "^3.1.0",
"mongoose": "^6.5.4",
"mongoose-unique-validator": "^3.1.0",
"@fastify/autoload": "^6.3.1",
"@fastify/cookie": "^11.0.2",
"@fastify/cors": "^11.2.0",
"@fastify/etag": "^6.1.0",
"@fastify/jwt": "^10.0.0",
"@fastify/swagger": "^9.7.0",
"@fastify/swagger-ui": "^5.2.5",
"bcrypt": "^6.0.0",
"dotenv": "^17.3.1",
"fastify": "^5.8.2",
"fluent-json-schema": "^6.0.0",
"module-alias": "^2.3.4",
"mongoose": "^9.3.0",
"path": "^0.12.7",
"v8-compile-cache": "^2.3.0"
"v8-compile-cache": "^2.4.0"
},
"scripts": {
"start": "node ./src/server.js",
"dev": "nodemon ./src/server.js",
"start": "node ./src/server.js | pino-colada",
"dev": "nodemon ./src/server.js | pino-colada",
"version": "",
"postversion": "git push && git push --tags"
},
"_moduleAliases": {
"@root": ".",
"@services": "src/services/v1/",
"@payloads": "src/payload/",
"@models": "src/models/",
"@configs": "src/config/",
"@utils": "src/utils/"
},
"devDependencies": {
"pino-colada": "^2.2.2"
}
}
29 changes: 29 additions & 0 deletions pm2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"apps": [
{
"name": "api-main",
"script": "./src/server.js",
"exec_mode": "cluster",
"instances": "max",
"max_memory_restart": "512M",
"autorestart": true,
"watch": false,
"max_restarts": 10,
"env": {
"NODE_ENV": "production"
},
"env_development": {
"NODE_ENV": "development"
},
"merge_logs": true,
"log_date_format": "YYYY-MM-DD HH:mm:ss Z",
"error_file": "logs/error.log",
"out_file": "logs/out.log",
"log_type": "json",
"node_args": "--max-old-space-size=512",
"kill_timeout": 3000,
"listen_timeout": 8000,
"source_map_support": true
}
]
}
33 changes: 20 additions & 13 deletions src/app.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,43 @@
'use strict'

require('dotenv').config()
// Require external modules
const path = require('path')
const autoload = require('@fastify/autoload')
const swagger = require('@fastify/swagger')
const swaggerUi = require('@fastify/swagger-ui')

const Etag = require('@fastify/etag')
const cors = require('@fastify/cors')

// Import Swagger Options
const swaggerConf = require('./config/swagger')
const swaggerConf = require('@configs/swagger')

module.exports = function (fastify, opts, next) {
module.exports = (fastify, opts, next) => {
fastify.register(cors, {
origin: '*',
allowedHeaders: ['Authorization', 'Content-Type'],
credentials: true
origin: true,
allowedHeaders: [
'Authorization',
'Content-Type',
'x-project',
'x-admin-key'
],
credentials: true,
maxAge: 8400,
preflightContinue: true
})
// Register swagger
fastify.register(swagger, swaggerConf.options)
fastify.register(Etag)
// Register swagger UI
fastify.register(swaggerUi, swaggerConf.uiOptions)

fastify.register(require('@fastify/jwt'), {
secret: process.env.JWT_SECRET
})
fastify.register(Etag)

fastify.register(autoload, {
dir: path.join(__dirname, 'plugins')
})
fastify.register(autoload, {
dir: path.join(__dirname, 'services'),
options: Object.assign({ prefix: '/api' }, opts)
dir: path.join(__dirname, 'services/v1/'),
options: Object.assign({ prefix: '/v1' }, opts)
})

next()
}
Loading