cd ./web
yarn
cd ../server
yarn
cd ../package
yarn
Create ./web/.env.local
file and add the following lines:
NEXT_PUBLIC_API_URL=http://localhost:4000
Create ./server/.env
file and add the following lines:
PORT=4000
POSTGRES_URL=postgres://postgres:postgres@localhost:5432/simple-auth
JWT_SECRET=A_RANDOM_STRING_THAT_SHOULD_BE_REGULARLY_CHANGED
JWT_EXPIRES_IN=1h
JWT_SECRET
can be any random string
- Start the database
You can use
cd ./server docker compose up -d
docker compose down
to stop the database. Also, you can useyarn drizzle-kit studio
to open the database GUI onhttp://localhost:4983
. - Migrate the database
- Note: you might need to wait for a minute or two for the database to be ready.
cd ./server yarn migrate
- Start the server
cd ./server yarn dev
- Start the web
cd ./web yarn dev
- Go to
http://localhost:3000
in your browser
- Create folers
Create two folders:
web
,package
andserver
in the root directory of the project.web
folder will contain a NextJS project.server
folder will contain an ExpressJS project and serve as the backend.package
folder will contain serveral shared files between theweb
andserver
projects, such as types definitions, constants, etc.
- Initialize git
git init
Go to the web
folder, run yarn create next-app .
to create a NextJS project. Select the default options for the questions.
cd ./web
yarn create next-app .
- Add a path to the
tsconfig.json
file{ "compilerOptions": { "paths": { "@package/*": ["../package/*"], }, } }
In the web
folder, follow the below instructions to setup Prettier and ESLint.
- Install prettier and prettier plugins
yarn add -D prettier prettier-plugin-tailwindcss @trivago/prettier-plugin-sort-imports
- Install eslint and eslint plugins
yarn add -D eslint typescript @typescript-eslint/parser eslint-config-prettier @typescript-eslint/eslint-plugin
- Copy and paste the
./web/.eslintrc.json
file and./web.prettierrc.cjs
file from this repo to your project root
-
Setup Shadcn UI
# In the ./web folder npx shadcn-ui@latest init
-
Answer the questions carefully since some of the default options are not compatible with our setup.
- Would you like to use TypeScript (recommended)?
yes
- Which style would you like to use? ›
New York
- I personally prefer New York style, but you can choose any style you like.
- Which color would you like to use as base color? ›
Slate
- You can choose any color you like.
- Where is your global CSS file? › ›
src/app/globals.css
- IMPORTANT: You must enter
src/app/globals.css
here. Otherwise, the setup will fail.
- IMPORTANT: You must enter
- Do you want to use CSS variables for colors? ›
yes
- Where is your tailwind.config.js located? ›
tailwind.config.ts
- IMPORTANT: We are using TypeScript, so you must enter
tailwind.config.ts
here.
- IMPORTANT: We are using TypeScript, so you must enter
- Configure the import alias for components: ›
@/components
- Configure the import alias for utils: ›
@/lib/utils/shadcn
- Are you using React Server Components? ›
yes
- Would you like to use TypeScript (recommended)?
- Copy and paste the
./web/.env.example
file into the./web/.env.local
- Fill in the environment variables in the
./web/.env.local
file
In this tutorial, we will show how to do user authentication with NextJS and ExpressJS. Therefore, we need to redirect api routes to the ExpressJS server.
In ./web/next.config.js
, add the following lines:
const nextConfig = {
...
async redirects() {
return [
{
source: "/api/:path*",
destination: `${process.env.NEXT_PUBLIC_API_URL}/:path*`,
permanent: true,
},
];
},
...
};
Also, remember to add NEXT_PUBLIC_API_URL
to the ./web/.env.local
file. For example, if server
runs at port 4000, then you have to set:
# ./web/.env.local
NEXT_PUBLIC_API_URL=http://localhost:4000
# ./server/.env
PORT=4000
yarn create next-app
will automatically initialize a git repository. However, we have already initialized a git repository in the root directory of the project. Therefore, we need to remove the git repository in the web
folder.
cd ./web
rm -rf .git
In the server
folder, run yarn init -y
to create a NodeJS project.
cd ./server
yarn init -y
- Install TypeScript and ts-node
yarn add -D ts-node typescript @types/node
- Create
tsconfig.json
fileyarn tsc --init
- Add a path to the
tsconfig.json
file{ "compilerOptions": { "paths": { "@package/*": ["../package/*"], }, } }
In the server
folder, follow the below instructions to setup Prettier and ESLint.
-
Install prettier and prettier plugins
yarn add -D prettier prettier-plugin-tailwindcss @trivago/prettier-plugin-sort-imports
-
Install eslint and eslint plugins
yarn add -D eslint typescript @typescript-eslint/parser eslint-config-prettier @typescript-eslint/eslint-plugin
-
Copy and paste the
./server/prettierrc.cjs
file from this repo to your project root. -
Setup ESLint In the
server
folder, run the following command to setup ESLint.npx eslint --init
- How would you like to use ESLint? ·
To check syntax and find problems
- What type of modules does your project use? ·
JavaScript modules (import/export)
- Which framework does your project use? ·
None of these
- Does your project use TypeScript? ·
Yes
- Where does your code run? ·
Node
- IMPORTANT: Press
space
to select,a
to toggle all,i
to invert selection. If you only pressEnter
, the setup will becomebrowser
instead ofnode
.
- IMPORTANT: Press
- What format do you want your config file to be in? ·
JSON
- Would you like to install them now? ·
Yes
- Which package manager do you want to use? ·
yarn
- How would you like to use ESLint? ·
-
Add
lint
andformat
scripts topackage.json
{ "scripts": { "lint": "eslint .", "format": "prettier --write ." }, }
- Install ExpressJS
yarn add express cors body-parser nodemon dotenv yarn add -D @types/express @types/cors @types/body-parser
- Add
start
anddev
scripts topackage.json
{ "scripts": { "start":"ts-node src/index.ts", "dev": "nodemon src/index.ts", ... }, }
- Create
src/index.ts
fileimport express from 'express'; const app = express(); const port = process.env.PORT || 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Server is listening on port ${port}`); });
- Create
./server/.env
file. Copy and paste all the content in./server/.env.example
file into the./server/.env
file. - Fill in the environment variables in the
./server/.env
file - Create
./server/.gitignore
file and add the following linesnode_modules .env
If you completed all the steps above, you should be able to run yarn dev
in the ./server
folder and you will see "Hello World!" at http://localhost:<YOUR PORT NUMBER>
in your browser.
-
Install drizzle
yarn add drizzle-orm pg yarn add -D drizzle-kit @types/pg
-
Add
POSTGRES_URL
to.env
:... POSTGRES_URL=postgres://postgres:postgres@localhost:5432/simple-auth
-
Add the following lines to
server/src/db/index.ts
:import { drizzle } from "drizzle-orm/node-postgres"; import { Pool } from "pg"; const pool = new Pool({ connectionString: <POSTGRES_URL> // Get the POSTGRES_URL from .env }); export const db = drizzle(pool);
-
Create
docker-compse.yml
in theserver
folder:version: "3.1" services: postgresql: image: postgres environment: POSTGRES_DB: simple-auth POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres PGDATA: /var/lib/postgresql/data volumes: - ./pg-data:/var/lib/postgresql/data ports: - "5432:5432" # adminer is a simple frontend for you to interact with the database adminer: image: adminer ports: - 8080:8080
-
Run
docker-compose up
to start the databasedocker compose up -d
-
Add
migrate
script topackage.json
{ "scripts": { ... "migrate": "drizzle-kit push:pg" }, }
-
Add
pg-data
to.gitignore
:... pg-data
-
Add
drizzle.config.ts
in theserver
folder:import dotenv from "dotenv"; import type { Config } from "drizzle-kit"; // this file is for drizzle-kit, which is used to do our database migrations dotenv.config({ path: "./.env" }); if (!process.env.POSTGRES_URL) { throw new Error("POSTGRES_URL must be defined in .env"); } export default { schema: "./src/db/schema.ts", out: "./drizzle", driver: "pg", dbCredentials: { connectionString: process.env.POSTGRES_URL }, } satisfies Config;
Note that all your schemas should be kept in
./src/db/schema.ts
file. -
Create
server/src/db/schema.ts
file -
Whenever you create or update a schema, you need to run
yarn migrate
to update the database.yarn migrate
In the package
folder, run yarn init -y
to create a NodeJS project.
cd ./package
yarn init -y
In the package
folder, follow the below instructions to setup Prettier and ESLint.
- Install prettier and prettier plugins
yarn add -D prettier prettier-plugin-tailwindcss @trivago/prettier-plugin-sort-imports
- Install eslint and eslint plugins
yarn add -D eslint typescript @typescript-eslint/parser eslint-config-prettier @typescript-eslint/eslint-plugin
- Copy and paste the
./package/.eslintrc.json
file and./package.prettierrc.cjs
file from this repo to your project root