diff --git a/.env b/.env
new file mode 100644
index 0000000000000000000000000000000000000000..083c815f94fc2dac4e7fbb2b98d4b301a4170aed
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+NODE_ENV=development
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 915d68d9732518080578adb92dc55c49c4dc0d8d..cf9c2126744522a355b5131b218723027e48ccad 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,16 +11,15 @@ build:
         - export CI_REGISTRY_PW=$CI_REGISTRY_PW
         - export CI_REGISTRY_USER=$CI_REGISTRY_USER
         - echo "To release new docker image for development and staging, we use tag 'dev' only !!!"
-        - tag=$(echo $CI_COMMIT_MESSAGE | sed -r 's/.*(\[tag\])//')
-        - export tag=$tag
+        - export tag=dev
         - cicd_path=$(pwd)/cicd
-       
     script:
         - bash $cicd_path/build.sh
     only:
         - release
     tags:
-        - chinguyen_nodejs_managestudent
+        - runner-builder
+
 deploy: 
     stage: deploy
     before_script:
@@ -28,7 +27,6 @@ deploy:
         - cicd_path=$(pwd)/cicd
         - export CI_REGISTRY_PW=$CI_REGISTRY_PW
         - export CI_REGISTRY_USER=$CI_REGISTRY_USER
-        - tag=$(echo $CI_COMMIT_MESSAGE | sed -r 's/.*(\[tag\])//')
         - | 
             if [ ! -d $mount_data_folder ]; then
                 sudo mkdir $mount_data_folder
@@ -40,9 +38,9 @@ deploy:
                 sudo chown -R gitlab-runner.gitlab-runner $mount_data_folder/$project_name
             fi
     script:
-        - export tag=$tag
+        - export tag=dev
         - bash $cicd_path/deploy.sh
     only:
         - release
     tags:
-        - chinguyen_nodejs_managestudent
+        - asset-ci-cd
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..2e22749fbac0a5eaf4103ef9d3bcbbf87edb4136
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+### STAGE 1: RUN ###
+FROM node
+RUN chmod 1777 /tmp
+RUN mkdir /data
+RUN apt-get update -y
+RUN apt-get install -y libgdiplus
+RUN apt-get install -y libreoffice
+RUN apt-get install -y libfontconfig
+RUN apt-get install -y phantomjs
+ENV OPENSSL_CONF=/opt/openssl.cnf
+WORKDIR /usr/src/app
+COPY package.json package-lock.json ./
+RUN npm install
+COPY . .
+RUN cp -r ./swagger/supports/* ./node_modules
+ENTRYPOINT ["node", "swagger.js"]
\ No newline at end of file
diff --git a/cicd/CICD/cp_ad b/cicd/CICD/cp_ad
new file mode 100644
index 0000000000000000000000000000000000000000..5fd927c27edc9ff3e0e00ed57243c69614828371
--- /dev/null
+++ b/cicd/CICD/cp_ad
@@ -0,0 +1,31 @@
+#! /bin/bash
+
+function cp_ad()
+{
+    sourceCheck=$1;
+    desPath=$2;
+    defaultSourceCheck=$3;
+    if [[ -z $sourceCheck ]] || [[ -z $desPath ]] 
+    then
+        echo "Source path or destination path is empty";
+        exit 1;
+    fi
+    for item in "$sourceCheck"/*
+    do
+        if [[ -d $item ]] 
+        then
+            relativePath=$(echo ${item/$defaultSourceCheck/});
+            pathRm=$desPath$relativePath;
+            echo $pathRm;
+            rm -rf $pathRm;
+            cp_ad $item $desPath $defaultSourceCheck;
+        fi
+	relativePath=$(echo ${item/$defaultSourceCheck/});
+        pathRm=$desPath$relativePath;
+        echo $pathRm
+        rm -rf $pathRm
+    done 
+}
+
+cp_ad $1 $2 $3;
+cp -rf $1/* $2;
diff --git a/cicd/CICD/swagger-codegen-cli.jar b/cicd/CICD/swagger-codegen-cli.jar
new file mode 100644
index 0000000000000000000000000000000000000000..da93ece3b8f40dadf8da7498f646d0f3eda8cead
Binary files /dev/null and b/cicd/CICD/swagger-codegen-cli.jar differ
diff --git a/cicd/CICD/swagger_download b/cicd/CICD/swagger_download
new file mode 100644
index 0000000000000000000000000000000000000000..9210fa5db7a8abfacea9b7cbf8b083fb236afadc
--- /dev/null
+++ b/cicd/CICD/swagger_download
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+function download_angular()
+{
+    sourceCheck=$1;
+    if [[ -z $sourceCheck ]]
+    then
+        echo "Source path is empty";
+        exit 1;
+    fi
+    for item in "$sourceCheck"/*
+    do
+        if [[ -d $item ]]
+        then
+            download_angular $item;
+        fi
+	sed -i '/return this.httpClient.request<Blob>/!{p;d;};n;n;n;a\\t\tresponseType: \x27blob\x27 as \x27json\x27,' $item
+	echo $item;
+    done
+}
+
+download_angular $1;
diff --git a/cicd/build-model.sh b/cicd/build-model.sh
new file mode 100644
index 0000000000000000000000000000000000000000..d163380fcb536d92199568817ccce09b0b943c97
--- /dev/null
+++ b/cicd/build-model.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+echo "Waiting for the application goes online..."
+sleep 15
+swaggerUrl="http://localhost:$port_mapping/swagger/v1/swagger.json"
+api=$(curl $swaggerUrl)
+status=$?
+if test $status -ne 0
+then
+	exit 1
+fi
+api=$(jq 'del(.components.securitySchemes)' <<<$api)
+api=$(jq 'del(.security)' <<<$api)
+echo $api > apiFinal.json
+request='{"spec":{},"type":"CLIENT","lang":"typescript-angular"}'
+request=$(jq --argfile apiFinal apiFinal.json '.spec = $apiFinal' <<<$request)
+echo $request > ts.json
+rm -rf client
+java -jar CICD/swagger-codegen-cli.jar generate -i apiFinal.json -l typescript-angular -o client --additional-properties modelPropertyNaming=original
+rm -rf ts.json;
+rm -rf production_file;
+rm -rf apiFinal.json;
+temp_path=$(pwd);
+mkdir production_file;
+cp -r client/*.ts production_file/; cp -r client/api production_file/; cp -r client/model production_file/; rm -rf client; mv production_file client
+bash CICD/swagger_download client
+git clone --single-branch --branch $fe_model_branch "http://${GIT_USER}:${GIT_USER_PW}@$fe_git_address.git"
+cd $fe_git_project_name
+git pull origin $fe_model_branch;
+bash $temp_path/CICD/cp_ad $temp_path/client $temp_path/$fe_git_project_name/src/app $temp_path/client
+git add --all; git commit -m "Update model auto" --allow-empty; git push "http://${GIT_USER}:${GIT_USER_PW}@$fe_git_address.git" HEAD:$fe_model_branch
\ No newline at end of file
diff --git a/cicd/build.sh b/cicd/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..87ad0aea35471b8e7695dbc0dcb19f688b612fd2
--- /dev/null
+++ b/cicd/build.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+echo $image_name:$tag 
+sudo docker build -t $image_name:$tag -f Dockerfile .
+sudo docker logout registry.gitlab.com
+echo "$CI_REGISTRY_PW" | sudo docker login registry.gitlab.com -u "$CI_REGISTRY_USER" --password-stdin
+sudo docker push $image_name:$tag
\ No newline at end of file
diff --git a/cicd/deploy.sh b/cicd/deploy.sh
new file mode 100644
index 0000000000000000000000000000000000000000..df03ad1d2d1fa72515381ce6e1c9f10deeffc299
--- /dev/null
+++ b/cicd/deploy.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+jq -r 'keys[] as $k | "\($k)=\(.[$k])"' $environment_json_path > .env
+sed -i 's|PROJECT-NAME|'$project_name'|' docker-compose.yaml      
+sed -i 's|ENVIRONMENT-NAME|'$environment_name'|' docker-compose.yaml
+sed -i 's|IMAGE-NAME|'$image_name'|' docker-compose.yaml
+sed -i 's|IMAGE-TAG|'$tag'|' docker-compose.yaml
+sed -i 's|P-MAPPING|'$port_mapping'|' docker-compose.yaml
+sed -i 's|MOUNT-DATA-FOLDER|'$mount_data_folder'|' docker-compose.yaml
+echo "$CI_REGISTRY_PW" | sudo docker login registry.gitlab.com -u "$CI_REGISTRY_USER" --password-stdin
+sudo docker-compose down
+sudo docker-compose pull
+sudo docker-compose --env-file .env up -d
\ No newline at end of file
diff --git a/cicd/release.sh b/cicd/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c2a383d286722b35cdff31f0d4e443e4e8bbdc0b
--- /dev/null
+++ b/cicd/release.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+if [ "$check" == "[tag]" ]; then
+    sed -i 's|#||g' Dockerfile
+    sudo docker build -t $image_name:$tag -f Dockerfile .
+    sudo docker logout registry.gitlab.com
+    echo "$CI_REGISTRY_PW" | sudo docker login registry.gitlab.com -u "$CI_REGISTRY_USER" --password-stdin
+    sudo docker push $image_name:$tag
+    sudo docker rmi $image_name:$tag
+fi
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..051ba5b9c9f7e2f3a4f3ddce3ff222d1f4630ff6
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,12 @@
+version: '3.5'
+
+services:
+  app:
+    container_name: ENVIRONMENT-NAME-PROJECT-NAME
+    image: IMAGE-NAME:IMAGE-TAG
+    volumes:
+      - MOUNT-DATA-FOLDER/PROJECT-NAME:/media
+    ports:
+      - P-MAPPING:3000
+    restart: unless-stopped
+    pull_policy: always
\ No newline at end of file
diff --git a/env-param.sh b/env-param.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ef8214f19ee2abbe9f02db1f4a44163943656417
--- /dev/null
+++ b/env-param.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+export project_name="chinguyen_nodejs_managestudents"
+export image_name="registry.gitlab.com/meusolutions/chinguyen_nodejs_managestudents"
+export port_mapping="5000"
+export environment_name="staging"
+export mount_data_folder="/var/data"
+
diff --git a/hd b/hd
new file mode 100644
index 0000000000000000000000000000000000000000..da5f0540c6ec214ead6532dc5649876b63e92019
--- /dev/null
+++ b/hd
@@ -0,0 +1,38 @@
+-----BEGIN OPENSSH PRIVATE KEY-----
+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
+-----END OPENSSH PRIVATE KEY-----
diff --git a/index.js b/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..8794974e08c7f5018f08c5e364f832df66d88a37
--- /dev/null
+++ b/index.js
@@ -0,0 +1,15 @@
+var express = require('express');
+var app = express();
+
+app.get('/', function (req, res) {
+   res.send('Hello World');
+})
+
+var server = app.listen(8081, function () {
+
+  var host = server.address().address
+  var port = server.address().port
+
+  console.log("Ung dung Node.js dang lang nghe tai dia chi: http://%s:%s", host, port)
+
+})
\ No newline at end of file
diff --git a/package.json b/package.json
index c67de3420e668b8f5f4d18840318736877f67b20..a59a2afe03da203820f1112d4cf6de4637a70d7c 100644
--- a/package.json
+++ b/package.json
@@ -34,8 +34,8 @@
     "dependencies": {
         "body-parser": "1.19.0",
         "cors": "2.8.5",
-        "cross-env": "^7.0.0",
-        "express": "4.17.1",
+        "cross-env": "7.0.0",
+        "express": "^4.17.1",
         "express-boom": "3.0.0",
         "express-validator": "^6.9.2",
         "kafka-node": "^5.0.0",