A step by step guide to deploying Client/Server app using Docker
.
1. Install Docker
, if it has not been installed already.
2. Sign up to the Digital Ocean (DO)
, if you don't have an account already.
3. Create a personal SSH key
, if you don't have one already.
At the command prompt type ssh-keygen -t ed25519 -C "natalie.seltzer@gmail.com"
Accept defaults, pw optional.
Go to your .ssh
folder under your home dir and add contenent of public and private keys to the password valt. This keys will be used by DO
to access github
repo.
4. Create github Access Token
, if you don't have one already.
To careate github Access Token
Login to github
Developer settings
menu at the bottom of the left-hand side menu. And click on the Personal access tokens
left-hand side menu. Then click on the Generate new token
button. Choose read: packages
option under the write:packages
sub-section.
Copy the token and add it to the password walt.
On a dev laptop copy existing Client / Server project into a new directory.
Remove all references to old project.
Delete .git
dir from the route of the project.
Run npm init
in both client
and server
directories.
Add
.env
file containing env variables to the /server
dir of your project.Make desired changes and test.
Add docker-compose.yaml
file to the project's root directory and Docker
files to both client
and server
directories and test.
Create github
repository.
Create git
repository, create/update .gitignore
file. Add .env
to the .gitignore
file.
Deploy to github
.
At the root of the project create .github/workflows
directories and add main.yaml
file to it.
Deploy to github
.
????? on github
.
Login into Digital Ocean
.
Create Digital Ocean Project
by clicking on the + New Project
left-hand side menu.
Then, click on the green Create
button and select Droplets
to create DO Droplet
with following options:
Image: Ubuntu 22.04 (latest) Plan: Basic CPU opitons: Regular with SSD Datacenter: London Authentication: SSH keys (use your publich SSH key) Hostname: replace with your project name, e.g. myProject-test
* If you do not see your personal public SSH key in the Authentication
section, add it by clicking on the New SSH Key
button and entering the contenet of your public SSH key.
Save the IP address of the newly created Droplet.
At the local command prompt type
ssh root@99.999.99.99
* Where 99.999.99.99 is the IP Address of your new Droplet.
Bring Droplet env up-to-date by running the following commands at the Droplet's command line:
apt update apt upgrade
* Click enter to accept defaults.
Follow instructions on the docs.docker.com/engine/install/ubuntu webpage and install Docker at your Droplet by running the following commands at the Droplet's command line:
1. Set up the repository:
sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
2. Add Docker’s official GPG key:
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
3. Use the following command to set up the repository:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. Install Docker Engine
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin apt install docker-compose
* Accept all defaults by pressing Enter.
HTTP Server will be used to server Client Single Page build by Quasar
On the dev machine, go to the project folder and run the following command to get to the client container command line:
docker-compose exec client /bin/bash
Then run the following command:
npm install http-server
On the Digital Ocean Server, go to the project folder and run the following command to install MYSQL:
apt-get install mysql-server
Create a db:
mysql
Then at mysql prompt create your project db:
mysql> CREATE DATABASE myprojectdb;
Create db user:
mysql> CREATE USER 'myprojectuser'@'localhost' IDENTIFIED BY 'myprojectuserpassword'; mysql> GRANT ALL PRIVILEGES ON myprojectdb.* TO 'myprojectuser'@'localhost'; mysql> CREATE USER 'myprojectuser'@'%' IDENTIFIED BY 'myprojectuserpassword'; mysql> GRANT ALL PRIVILEGES ON myprojectdb.* TO 'myprojectuser'@'%'; mysql> exit
Update MYSQL config:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Update as following:
bind-address = 127.0.0.1,172.18.0.1
1. At the Droplet's command line create docker-compose.yaml
file
cd /srv mkdir myProjectDir cd myProjectDir nano docker-compose.yaml
containing:
version: '2' services: server: image: ghcr.io/criptogirl/myproject-server:master ports: - '8081:8081' env_file: - .env volumes: - ./config:/config - ./datafiles:/datafiles client: image: ghcr.io/criptogirl/myproject-client:master ports: - '8080:8080'
* Note that image link is all low-case
4. Add Github access token to DO Droplet.
docker login ghcr.io -u CriptoGirl
* use github Access Token as password.
At the Droplet's command line go to your project's directory and create .env file:
cd /srv/myProjectDir nano .env
containing env variables, e.g.
MYSQL_MYPROJECT_HOST=172.18.0.1 MYSQL_MYPROJECT_USER=myprojectdbuser MYSQL_MYPROJECT_PW=myprojectdbuserpassword MYSQL_MYPROJECT_DB=myprojectdb GOOGLE_FIREBASE_myproject=/conf/myproject-firebase-adminsdk-.....json DATA_UPLOAD_DIR=/datafiles
At the DO Project Directory, create config and datafiles directories
mkdir datafiles mkdir config
Add myproject-firebase-adminsdk-....json filet to the DO config directory.
cd config nano myproject-firebase-adminsdk-....json
Copy content of firebase config file from local env into this file.
1. On your dev machine update the /client/Dockerfile
as follows:
FROM node:12 AS base ENV PATH=/usr/src/node_modules/.bin:$PATH WORKDIR /usr/src ADD package.json package-lock.json . RUN npm install # CMD tail -f /dev/null CMD ./node_modules/.bin/quasar dev FROM base AS prod ADD . /usr/src RUN ./node_modules/.bin/quasar build CMD ./node_modules/.bin/http-server dist/spa -p 7080
2. On your dev machine update the /server/Dockerfile
as follows:
FROM node:10 AS base WORKDIR /usr/src ADD package.json package-lock.json . RUN npm install CMD ./node_modules/.bin/nodemon server.js FROM base AS prod ADD . /usr/src CMD ./node_modules/.bin/nodemon server.js
3. On your dev machine update the docker-compose.yaml
file adding the following line to both client and server build sections:
target: base
4. On your dev machine update the env
section of the /client/quasar.conf.js
file as follows:
SERVER_URL: 'HTTP://99.999.99.99:7081/'
5. On your dev machine update the /server/.gitignore
file file as follows:
*node_modules/ notes/ /config/ datafiles/
6. On your dev machine make sure that .js files containing sql commands uses LF (Unix)
rather then CRLF (Windows)
line endings. Use your editor to check and change if required.
1. Add your latest changes to github
:
git add . git commit -m "changes" git push origin master
The github
will build a new image.
Go to the github
select your project's repository and click on the Actions
tab to see the image buing build.
When images are built, pull the images by running the following command at the Droplet's command line:
cd /srv/myProject docker-compose pull
Start Docker containers
by running the following command at the DO command line:
docker-compose up -d
Check logs by typing
docker-compose logs
or
docker-compose logs -f client
Test in a browser. E.g. 99.999.99.99:7080
Note that Cron jobs would normally run on the server and not on dev.
Create scripts
folder under the server
folder of your project and add myScript.js
file to the /server/scripts
folder.
At the DO Droplet's command prompt create Cron Job
file:
nano /etc/cron.d/myCronJob
containing:
# comment line to run every minute: every min, every hour, every day, every month, every week day * * * * * root docker exec myproject_server_1 node scripts/myScript.js > /tmp/myLog
To run your script ones a day at 5am: 0 5 * * *
To see the log
cd /tmp cat myLog
For more info visit crontab.guru
On DO server execute following commands:
cd srv/myrpject docker-compose exec server bin/bash
Followed by:
npx sequelize-cli db:migrate --debug npx sequelize-cli db:seed:all
In case above did not work, run sql at MYSQL command prompt.Copy file into your project directory, then:
mysql> USE myprojectdb; mysql> source initial_db.sql; mysql> show tables;
1. Add your latest changes to github
:
git add . git commit -m "changes" git push origin master
The github
will build a new image.
Go to the github
select your project's repository and click on the Actions
tab to see the image buing build.
Wait for the image to be built before proceeding to the next step.
At the local command prompt type
ssh root@99.999.99.99
* Where 99.999.99.99 is the IP Address of your new Droplet.
Pull the images from github by running the following command at the Droplet's command line:
cd /srv/myProject docker-compose pull
Start Docker containers
by running the following command at the DO command line:
docker-compose up -d
Check logs by typing
docker-compose logs
or
docker-compose logs -f client
Test in a browser. E.g. 99.999.99.99:7080
1. Login to Digital Ocean
.
2. Select project from the left hand side menu.
3. Click on the ...
on the right hand side of the associated droplet and click on the Destroy
option to Destroy the Droplet.
4. Click on the project's Settings
tab and scroll down to the Delete Project
section. Click on the Delete Project
button.
You might need to mark another project as default, to be able to delete your project. This can be done from the Settings
tab of another project.