Fastify-Starter
Fastify-Starter copied to clipboard
:leopard: A boilerplate for server applications with Fastify and Mongo using TypeScript on Vite.
Fastify Starter
:leopard: A boilerplate for server applications with Fastify and Mongo using TypeScript on Vite.
:rainbow: View Demo: Live | Windows | macOS | Android | iOS
:octocat: Source Code: Web-side | Native-side | Server-side | Cloud-side
Table of Contents
- Getting Started
- Project Setup
- Key Features
- Configuration
- Directory Structure
Getting Started
Prerequisites:
- Node.js v20
- PNPM v9
- Docker v4 (Optional)
Get started with Fastify Starter.
# (optional)
# If you already have the MONGODB_URL and REDIS_URL connections,
# you can directly replace them.
# mongo server
$ docker compose up -d local-mongo
# redis server
$ docker compose up -d local-redis
# install dependencies
$ pnpm install
# dev server (in one terminal)
$ pnpm dev
# (negligible)
# The current demo doesn't make any calls to third-party or internal APIs.
# mock server (in another terminal)
$ pnpm mock
Or use barebones scaffolding for your new Fastify app
$ pnpm dlx degit Shyam-Chen/Barebones-Templates/fastify my-fastify-app
Project Setup
Follow steps to execute this boilerplate.
Install dependencies
$ pnpm install
Compiles and hot-reloads for development
$ pnpm dev
Mock third-party/private APIs during development
$ pnpm mock
Compiles and minifies for production
$ pnpm build
Locally preview the production build
# Before running the `preview` command, make sure to run the following commands.
$ pnpm build
$ pnpm preview
Lints and fixes files
Files: **/*.{js,ts}
$ pnpm lint
Check types
Files: app/src/**/*.ts
$ pnpm check
Runs unit tests
Files: app/src/**/*.test.ts
$ pnpm test
Runs end-to-end tests
Files: e2e/src/**/*.test.ts
# Before running the `e2e` command, make sure to run the following commands.
$ pnpm build
$ pnpm preview
$ pnpm e2e
Key Features
This seed repository provides the following features:
- ---------- Essentials ----------
- [x] Fastify - Web Application Framework
- [x] Routes - File-based Routing
- [x] MongoDB - Document Database
- [x] JWT - Authentication
- [x] PBKDF2 - Hash Passwords
- [x] OTP - Authenticator
- [x] Cloudinary - Asset Management
- [x] I18n - Internationalization and Localization
- [x] Redis - In-memory Data Structure Store
- [x] WebSocket - Two-way Interactive Communication Session
- [x] EventSource - Server-sent Events
- [x] Mailer - Email Sending
- [x] MJML - Email Builder
- [x] Nunjucks - Email Rendering
- [x] BullMQ - Message Queue
- ---------- Tools ----------
- [x] Vite - Bundler
- [x] TypeScript - JavaScript with Syntax for Types
- [x] Biome - Formatter and Linter
- [x] Vitest - Test Runner
- [x] Playwright - Test Automation
- ---------- Environments ----------
- [x] Node.js - JavaScript Runtime Environment
- [x] PNPM - Package Manager
- [x] Caddy - Web Server
- [x] Docker - Containerized Application Development
- [x] GitHub Actions - Continuous Integration and Delivery
- [x] Render - Cloud Application Hosting
Tiny examples
- [x] Hello World
- [x] CRUD Operations
- [x] JWT Authentication
- [x] One-time Password
- [x] File Uploads
- [x] Real-time Data
- [x] Real-time Updates
- [x] Sending Emails
- [x] Internationalization
- [x] Caching (Or use Redis Store)
- [x] Cache Deduplication (Or use Redis Store)
- [x] Background Workers (Or use Redis Store)
- [x] Cron Jobs (Or use Redis Store)
- [x] Delayed jobs (Or use Redis Store)
Configuration
Control the environment.
Default environments
Set your local environment variables.
// app/vite.config.ts
define: envify({
NODE_ENV: process.env.NODE_ENV || 'development',
HOST: process.env.HOST || '127.0.0.1',
PORT: process.env.PORT || 3000,
SITE_URL: process.env.SITE_URL || 'http://127.0.0.1:5173',
MONGODB_URL: process.env.MONGODB_URL || 'mongodb://root:[email protected]:27017/mydb',
REDIS_URL: process.env.REDIS_URL || 'redis://127.0.0.1:6379',
CLOUDINARY_URL: process.env.CLOUDINARY_URL || 'cloudinary://apikey:apisecret@cloudname',
SMTP_URL: process.env.SMTP_URL || `smtp://${user}:${pass}@smtp.ethereal.email:587`,
SECRET_KEY: process.env.SECRET_KEY || 'jbmpHPLoaV8N0nEpuLxlpT95FYakMPiu',
MONGOMS_VERSION: process.env.MONGOMS_VERSION || '7.0.11',
}),
Continuous integration environments
Add environment secrets to the GitHub Actions workflow.
DEPLOY_HOOK=xxx
Continuous delivery environments
Add environment variables to the Render build.
SITE_URL=xxx
MONGODB_URL=xxx
REDIS_URL=xxx
CLOUDINARY_URL=xxx
SMTP_URL=xxx
Directory Structure
The structure follows the LIFT Guidelines.
.
├── .github/workflows/ci.yaml
├── app
│ ├── public
│ ├── src
│ │ ├── assets
│ │ ├── components
│ │ ├── composables
│ │ ├── jobs
│ │ ├── locales
│ │ ├── middleware
│ │ ├── plugins
│ │ ├── routes
│ │ ├── templates
│ │ ├── utilities
│ │ ├── app.ts
│ │ ├── main.ts
│ │ ├── shims.d.ts
│ │ └── worker.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── vite.config.ts
├── db -> Set up local data for initializing and testing the database
│ ├── src
│ ├── mongo-init.js
│ └── package.json
├── docs -> Write API documentation with VitePress
│ ├── .vitepress
│ │ └── config.ts
│ ├── index.md
│ └── package.json
├── e2e -> API End-to-end testing
│ ├── src
│ ├── package.json
│ ├── playwright.config.ts
│ └── tsconfig.json
├── mock -> Mocking third-party or private API calls
│ ├── src
│ ├── package.json
│ ├── tsconfig.json
│ └── vite.config.ts
├── .dockerignore
├── .editorconfig
├── .gitignore
├── biome.json
├── Caddyfile
├── compose.yaml
├── Dockerfile
├── package.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── README.md
└── render.yaml