diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000000000000000000000000000000000000..ec8a1f535f75b3bf780ea795124c60940b9f2e7d
--- /dev/null
+++ b/.env.development
@@ -0,0 +1 @@
+VITE_APP_API_URL=http://localhost:8080
\ No newline at end of file
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000000000000000000000000000000000000..4f7a45a51fe6a01d024e88de7c6bdeae3bda7c61
--- /dev/null
+++ b/.env.production
@@ -0,0 +1 @@
+VITE_APP_API_URL=http://backend:8080
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 15f8cb88f85dce50bd57b63701defaf3edcbc4d6..90070224797236dfe126967705c3ab18fd9c8edb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,8 @@
 image: node:alpine # Much smaller than other variants, faster and more resource effective
 
+variables:
+  DOCKER_TLS_CERTDIR: ""
+
 cache:
   key: "${CI_COMMIT_REF_SLUG}" # Branch-specific cache keys to have separate caches across branches.
   paths:
@@ -11,24 +14,16 @@ stages:
   - build
   - test
   - lint
+  - docker_build_and_push
+  - deploy_docker
 
 install_dependencies:
   stage: install
   script:
     - npm ci
-  cache:
-    key: ${CI_COMMIT_REF_SLUG}
-    paths:
-        - node_modules/
-    policy: push
 
 build_project:
   stage: build
-  cache:
-    key: "${CI_COMMIT_REF_SLUG}"
-    paths:
-      - node_modules/
-    policy: pull
   script:
     - npm ci
     - npm run build
@@ -40,7 +35,7 @@ vitest_unit-tests:
   cache:
     key: ${CI_COMMIT_REF_SLUG}
     paths:
-        - node_modules/
+      - node_modules/
     policy: pull
   script:
     - npm ci
@@ -53,18 +48,37 @@ eslint_run-lint:
   cache:
     key: ${CI_COMMIT_REF_SLUG}
     paths:
-        - node_modules/
+      - node_modules/
     policy: pull
   script:
     - npm ci
     - npm run lint
   dependencies:
     - install_dependencies
-  allow_failure: true  
-
-
-
-    
+  allow_failure: true
 
+docker_build_and_push:
+  stage: docker_build_and_push
+  image: docker:latest
+  services:
+    - docker:dind
+  tags:
+    - dind
+  script:
+    - docker login -u $DOCKER_USER -p $DOCKER_PAT registry.gitlab.com
+    - docker build -t registry.gitlab.com/$DOCKER_USER/sparesti-registry:frontend .
+    - docker push registry.gitlab.com/$DOCKER_USER/sparesti-registry:frontend
+  when: manual
 
-    
+deploy_docker:
+  stage: deploy_docker
+  image: ubuntu:latest
+  dependencies:
+    - docker_build_and_push
+  before_script:
+    - apt-get -yq update
+    - apt-get -yqq install ssh
+    - apt-get install sshpass
+  script:
+    - sshpass -p sParest1en ssh -v -o StrictHostKeyChecking=no root@128.199.53.153 "docker rm -f frontend || true; docker pull registry.gitlab.com/$DOCKER_USER/sparesti-registry:frontend && docker run -d -p 81:80 --name frontend registry.gitlab.com/$DOCKER_USER/sparesti-registry:frontend"
+  when: manual
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..25e704e6b5e39ddf6e9bad10be34a476701dd47f
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+# Step 1: Build your Vue application
+FROM node:16.10.0-alpine3.13 as build-stage
+WORKDIR /app
+COPY package*.json ./
+RUN npm install
+COPY . .
+RUN npm run build
+
+# Step 2: Setup the server with Nginx
+FROM nginx:stable-alpine as production-stage
+COPY --from=build-stage /app/dist /usr/share/nginx/html
+COPY web/nginx.conf /etc/nginx/nginx.conf
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index d80fae0b5000eaab01e06674f5084b3da957048d..3e11f067af7be7944457f7bc96e765d8abdf0dea 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,6 +1,8 @@
 <script setup lang="ts">
 import { RouterView } from 'vue-router'
 import ErrorBoundaryCatcher from '@/components/Exceptions/ErrorBoundaryCatcher.vue';
+let apiUrl = import.meta.env.VITE_APP_API_URL;
+console.log("apiUrl: ", apiUrl);
 </script>
 
 <template>
diff --git a/src/api/core/OpenAPI.ts b/src/api/core/OpenAPI.ts
index 213c15d4a7b840e8d13a35f74c2618c13b7c9398..b33daf25d0e3518d35dc91aac288e991b8a7c160 100644
--- a/src/api/core/OpenAPI.ts
+++ b/src/api/core/OpenAPI.ts
@@ -20,7 +20,7 @@ export type OpenAPIConfig = {
 };
 
 export const OpenAPI: OpenAPIConfig = {
-    BASE: 'http://localhost:8080',
+    BASE: import.meta.env.VITE_APP_API_URL,
     VERSION: '3.0',
     WITH_CREDENTIALS: false,
     CREDENTIALS: 'include',
diff --git a/vite.config.ts b/vite.config.ts
index 36c61875691ce720ebf98971095b49d1f25f43a2..82dea2695f1eca5f72c9a8f00421521e7e245da4 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -6,6 +6,9 @@ import vueJsx from '@vitejs/plugin-vue-jsx'
 
 // https://vitejs.dev/config/
 export default defineConfig({
+  server: {
+    port: 80,
+  },
   plugins: [
     vue(),
     vueJsx(),
diff --git a/web/nginx-selfsigned.crt b/web/nginx-selfsigned.crt
new file mode 100644
index 0000000000000000000000000000000000000000..31d6d00b731c68b0fdfa9b2fc8c6f6ec79e71ed7
--- /dev/null
+++ b/web/nginx-selfsigned.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDYzCCAkugAwIBAgIUXKYKAuQxFdfKFhGqgi6mW6JWbxcwDQYJKoZIhvcNAQEL
+BQAwQTELMAkGA1UEBhMCTk8xDzANBgNVBAgMBk5vcndheTEhMB8GA1UECgwYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4XDTI0MDUwMjIwMzA0OFoXDTI1MDUwMjIw
+MzA0OFowQTELMAkGA1UEBhMCTk8xDzANBgNVBAgMBk5vcndheTEhMB8GA1UECgwY
+SW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEA4IV2JIAiI9konh3CuNYgmnv9KDhYcjj+L/6YrFauiZjZs/2haW8c
+pPLJP7NK/gzsuTqvewmh/3m8oIPxnwIJAPNq7Rf/UMeHHNRKt8KE/v+1hz6dAguy
+Ua6XC8UjVLqjg8vsftecvYmn/Ypj35aN2omFNr7NpFCfpI/zhk8SKS24GleG4DQ7
+89GxjkJtbIHfuoCrs+0YxRPWCvDGM9a79UYXW0evvufh2xN6jM9BLsBvgc+vm231
+usO2KLI1g/o34iAW6IseLu9qaPhLo2YfyC4fXCpsCRaZLumHKMoo0zFP/DejRIXu
+25sKJNSX3dyO2thbkKvaNJh29DO9WOtv9QIDAQABo1MwUTAdBgNVHQ4EFgQUKbhw
+GAXog/z7Hkp3KOmSWxr8jm4wHwYDVR0jBBgwFoAUKbhwGAXog/z7Hkp3KOmSWxr8
+jm4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAxWd0Sdju0DEc
+64W6TZq+4S7Rv/ZshcOPF4jWHgcLR2b9HP4cYPVMvuV5zNQi5wFp3A6oFR1JX6pd
+gQ/J+t1EuFyfrn5ojoOm5f1oNeiMPmpfsSRSzwRTabUs9LHeyQzoBXipmhYdqEoH
+SNv9aIQQ8e0in4uHFnvl1e8vrMb8Kl8ShcYmuYJ2FTIWERv482mrRB3pVMf+OFg0
+BtaQWgyU6CL1oysNH7X5t60uhjDc+D+gdSiaggzeP9tatMsJTeTam4GQbRkXuqLP
+FcjSHq4amTzrXrxX+6hWsvT5i/qSUwlVkt608j5KKUrU8oHjjqMOu58tx1lQTqIs
+dxpgMfpu7A==
+-----END CERTIFICATE-----
diff --git a/web/nginx-selfsigned.key b/web/nginx-selfsigned.key
new file mode 100644
index 0000000000000000000000000000000000000000..c0192306417b2142ddafa7c260e1c10ac98ace19
--- /dev/null
+++ b/web/nginx-selfsigned.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDghXYkgCIj2Sie
+HcK41iCae/0oOFhyOP4v/pisVq6JmNmz/aFpbxyk8sk/s0r+DOy5Oq97CaH/ebyg
+g/GfAgkA82rtF/9Qx4cc1Eq3woT+/7WHPp0CC7JRrpcLxSNUuqODy+x+15y9iaf9
+imPflo3aiYU2vs2kUJ+kj/OGTxIpLbgaV4bgNDvz0bGOQm1sgd+6gKuz7RjFE9YK
+8MYz1rv1RhdbR6++5+HbE3qMz0EuwG+Bz6+bbfW6w7YosjWD+jfiIBboix4u72po
++EujZh/ILh9cKmwJFpku6YcoyijTMU/8N6NEhe7bmwok1Jfd3I7a2FuQq9o0mHb0
+M71Y62/1AgMBAAECggEASqCh2dULQ/4g7Zl3yUdHNAIlbfJ4l5LRDnPiHFp9jjfT
+mOujdK+dhkg602UNdq8mGhVjEZLsmUXGCFaC//bFtl6yeldBIoEHrHH12emamkW1
+eVw7BNyNa3AMPbnLmhSlWB/2nlydeTShtXkD5GQfB3YxZLZ8FPNFdQXyDIEIyM2N
+m6yKx9LLBXf3bcppr4L/ELY+j6XsxYNcL7U6D772qSxJ06riAEMd4A+oYUeP/7Y9
+233soqxaioUUQAH/C6wedHSzgZEx+6+9wFG3M395kRB9PcTNI0w1+hGyqgwz28lJ
+CzronzBlAsSb33zJ0IgTXFGZM1qj4nsJT7RoM5AuSwKBgQD07PTVOsvBIojuDuwG
+lUxD2tvnrSqEXy8YLyJnsTF8jHRFjYJl7AFkrnIFeE31A1ffQTybY+4eewiCEUuC
+7gcnlRvkm6sPd1SUXJjDAGP9qKW2rlWolBhmoozvBztxQGhmkMoGazV/sp1ScUAF
+gKgLRlvV1FOeK/Zo9c19VMPrbwKBgQDqrFK5NcrhlfdRSc8W3Pu/NyC6iDPqw6lK
+rqTnqBrQ4VHJh+iJXAD7dZq8Yty/mbpHwdfnNJdEFHh+8eFFPjZ+x9i7a22Xn6nQ
+lrxkXJUS52MOslrp8ZVuT1NXuicwVlMrnNiQSmvX6+oaEJD3WGrfyx88FJ2solyv
+WhkKWdt42wKBgBYKxTXzZqbo/r295gvpn8VzitrcwLjNACYDB+uhDL0SvtwLkjKt
+/Koc8PIBE7L7LAtRiazKX4GqvOdHuy37UfWD+9ClGc34hUoc0zqpbFZFuTQpmFfl
+jBSgiGJymizlCQBCA4x0VYo6fuIOgx57p6PsHxOtWiEf/7sOdAHVgRRNAoGBAI/s
+CXvfOsLpF1m6O5CZDKgz5hWgLL8BKpVL0ITmezO5zFAd0wZS76NIeBKrSxkS7cTO
+ZFw+y7qMF247Z93wjrloVUp0Uy0XVa1AlN+0TBTg5caAqfMqH2wcqE94MkqZ1r47
+njG4ArXU0KkVmeKoTjtcNpbBSgYzOUatqgfIHirbAoGAC2tUjjLJfM1S7TDU/XmO
+SnEaGegsI48DpyNM/5W8QPWsVkGPq8pV4K4/Ogz2GfbEuHBaV9hjtf9LpHjQN9dp
+NuTWZd31mQL/fbauXnLO5qmCCGgxnZ8HQ6VX7ns2IavpzwCPxa7lWhQsay/VpYMQ
+UstmKmv675SAHtiyFp/AUJ8=
+-----END PRIVATE KEY-----
diff --git a/web/nginx.conf b/web/nginx.conf
new file mode 100644
index 0000000000000000000000000000000000000000..f6b768301ef88d330ae4c88f208a92acc071dafb
--- /dev/null
+++ b/web/nginx.conf
@@ -0,0 +1,22 @@
+worker_processes  auto;
+
+error_log  /var/log/nginx/error.log notice;
+pid        /var/run/nginx.pid;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include /etc/nginx/mime.types;
+
+    server {
+        listen 80;
+        server_name localhost;
+
+        location / {
+            root /usr/share/nginx/html;
+            try_files $uri $uri/ /index.html;
+        }
+    }
+}
\ No newline at end of file