This is a Full-stack Dockerized boilerplate. A vanilla infrastructure made to simplify the develpoment and deploying processes.
- React.js
- Redux
- Node.js
- Nest.js
- Postgres
- Docker
Make sure you have the below installed on your machine.
- Docker : https://docs.docker.com/engine/install/
- Docker-Compose : https://docs.docker.com/compose/install/
- Node : https://nodejs.org/en/
project-name
|
|---/ client
|
|---/ public
|---/ src
|
.env
.dockerignore
.gitignore
Dockerfile
Dockerfile.dev
nginx.conf
tsconfig.json
package.json
|
|---/ database
.env
initdb.sql
.gitignore
|---/ server
|
|---/src
|
ormconfig.json
.dockerignore
.gitignore
Dockerfile
Dockerfile.dev
nodemon.json
package.json
wait-for-it.sh
|
|
docker-compose.yml
docker-compose-dev.yml
.prettierrc
README.md
Demo is a simple Todolist using React and Material-UI on client side, nest on backend and postgres as our database demo can be started in development mode and in production mode as well.
Clone this repo to your local machine
git clone https://github.com/nadavpodjarski/postgres-express-react-typescript-boilerplate.git project-name
Before we run our container lets calm down our editor and npm install dependecies locally. For that let's run the following command
# install server dependencies
cd project-name/server && npm i
# instal client dependencies
cd ../client && npm i
Now Let's check our Demo, for that run the following command
cd ../ && sudo docker-compose --file docker-compose-dev.yml up
it will be served on http://localhost:3000
Replace project-name with your own
Client has been created with create-react-app and located in ./project-name/client
In develpoment mode the client will be run in a container built with ./client/Dockerfile.dev
and will be exposed on port 3000, with docker volumes every change thats been saved will be reflected within the running container.
In production mode the client build will be created and will run in a container built with ./client/Dockerfile
.
The client build/static-files will be served with nginx server and will be exposed on port 80.
Enviornment variables are located in ./client/.env
but can be declared into the dockerfile itself under ENV or in the docker compose file under enviornemt property.
In order to use docker stack deploy its needed to use one of the other options and not env_file.
note that nginx server has a minimalistic configuration
Postgres data-base is created with an official postgres image which can be found in docker hub https://hub.docker.com/_/postgres
Enviornment variables will be located in the docker-compose file.` and will contain our database credentials :
POSTGRES_USER=admin
POSTGRES_PASSWORD=admin
POSTGRES_DB=pern_db
Volumes of our database will be located in ./server/database/data
Production volume is located in
./server/data/prod
Development volume is located in./server/data/dev
Server is located in ./projec-name/server
using express.
In development mode the server will run in a container built with ./server/Dockerfile.dev
.
and will be exposed on port 5500 to the "outside" world, with docker volumes and nodemon, every change thats been saved will be refelected within the running container.
In production mode the server will run in a container built with ./server/Dockerfile
.
and be exposed on port 5500 only to the docker composer internal services within the same network.
in our case server and client are on the same network "webapp" , hence only the client can communicate with the server, and will do thatthrough the /api
location. for more locations, its needed to configure them in the ./client/nginx.conf
file.
Data-base connection is handled with ormconfig.json that is located at ./server/ormconfig.json
and will contain postgres credentials to establish connection to our data-base.
Thanks to https://github.com/vishnubob/wait-for-it for the wait-for-it.sh script, we can set that the server image will run only after getting confirmation that postgres container is available.
by that we wont get connection failures due to bad order of docker composing.
To establish a development environment, simply run the following command from the project root folder.
sudo docker-compose --file docker-compose-dev.yml up
On save changes in client and server, containers will be automatically updated, no need to restart any servers.
To establish production environment, simply run the following command from the root folder.
sudo docker-compose up
This will creates build for both server and client, will serve client build with nginx server on port 80 and will communicate with server on port 5500 in the location /api.
- To drop the use of sudo run the folowing command in your terminal
sudo usermod -aG docker $USER
- If you are making changes within the dockerfiles you will need to rebuild them, for that add the --build flag to the docker compose up command.