Home
NestJS
NestJS - Setup with PostgreSQL & Docker
September 06, 2023
1 min

Table Of Contents

01
Setup Project
02
Project Structure
03
Run Project

Prerequisites & Tools

  • Node.js
  • VS Code
  • Insomnia
  • Docker

Setup Project

Create Project

npm i -g @nestjs/cli
nest new nestjs-app-name

Install Validation Dependencies

npm install class-validator class-transformer

In eslint.config.mjs, change:

projectService: true
// to
projectService: {
tsconfig: 'tsconfig.json',
},

Generate User Module

npx nest g module users
npx nest g service users
npx nest g controller users

Project Structure

my-app/
├── src/
│ ├── users/
│ │ ├── dto/
│ │ │ └── create-user.dto.ts
│ │ ├── user.entity.ts
│ │ ├── users.module.ts
│ │ ├── users.service.ts
│ │ └── users.controller.ts
│ ├── app.module.ts
│ └── main.ts
├── docker-compose.yml
├── Dockerfile
├── .env
├── package.json

1. .env

NODE_ENV=development
DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASS=postgres
DB_NAME=nestdb
PORT=3000

2. docker-compose.yml

services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: nestdb
ports:
- "5433:5432"
volumes:
- pgdata:/var/lib/postgresql
pgadmin:
image: dpage/pgadmin4
restart: unless-stopped
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
- "5050:80"
depends_on:
- postgres
app:
build: .
ports:
- "3000:3000"
depends_on:
- postgres
env_file:
- .env
volumes:
- .:/app
- /app/node_modules
command: npm run start:dev
volumes:
pgdata:

3. Dockerfile

FROM node:24-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start:dev"]

4. src/main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
transform: true,
whitelist: true,
forbidNonWhitelisted: true,
}),
);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

5. src/app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { UsersModule } from './users/users.module';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
type: 'postgres',
host: config.get<string>('DB_HOST'),
port: Number(config.get<string>('DB_PORT')),
username: config.get<string>('DB_USER'),
password: config.get<string>('DB_PASS'),
database: config.get<string>('DB_NAME'),
autoLoadEntities: true,
synchronize: true,
}),
}),
UsersModule,
],
})
export class AppModule {}

6. src/users/user.entity.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column()
name!: string;
@Column({ unique: true })
email!: string;
}

7. src/users/users.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UsersService],
controllers: [UsersController],
})
export class UsersModule {}

8. src/users/users.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private repo: Repository<User>,
) {}
create(data: Partial<User>) {
const user = this.repo.create(data);
return this.repo.save(user);
}
findAll() {
return this.repo.find();
}
}

9. src/users/users.controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private service: UsersService) {}
@Post()
create(@Body() body: any) {
return this.service.create(body);
}
@Get()
findAll() {
return this.service.findAll();
}
}

10. src/users/dto/create-user.dto.ts

import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
export class CreateUserDto {
@IsString()
@IsNotEmpty()
name!: string;
@IsEmail()
email!: string;
}

Run Project

// run with docker
docker compose up -d --build
// stop
docker compose down

Create User in Insomnia

POST http://localhost:3000/users
{
"name": "Daniel",
"email": "daniel@test.com"
}

Get Users

GET http://localhost:3000/users

pgAdmin

http://localhost:5050

Login:

admin@example.com
admin

Connect DB:

Host: postgres
Port: 5432

Tags

#NestJS

Share

Related Posts

NextJS
NestJS - Validation & Error Handling
September 06, 2023
1 min
© 2026, All Rights Reserved.
Powered By

Social Media

githublinkedinyoutube