diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..ab57381ff35fd43dd963100b348b5233b0038fa2
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,3 @@
+node_modules
+build
+dist
diff --git a/.env.default b/.env.default
new file mode 100644
index 0000000000000000000000000000000000000000..d9c196bc25f71b391e10a4a49f2be4f392f1b4c7
--- /dev/null
+++ b/.env.default
@@ -0,0 +1 @@
+VITE_REST_API_URL="localhost:8000"
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index a547bf36d8d11a4f89c59c144f24795749086dd1..c65b7d448bab21b40c799566935f1dd0893a2632 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,6 @@ dist-ssr
 *.njsproj
 *.sln
 *.sw?
+
+# environment
+.env
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..91574ea565cec4919912eedca84e6401eef52714
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+FROM node:21-alpine
+
+# set working directory
+WORKDIR /app
+
+# add app
+COPY . ./
+
+# install app dependencies
+RUN npm install
+RUN npm run build
+
+
+# start app
+EXPOSE 3000
+CMD ["npm", "run", "preview"]
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dabb8e0a470d70b1467c84d4ea9c5fefbb62be89
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,12 @@
+version: '3.8'
+
+services:
+  web:
+    image: client-spa
+    volumes:
+      - '.:/app'
+      - '/app/node_modules'
+    ports:
+      - 3000:3000
+    environment:
+      - .env
diff --git a/vite.config.ts b/vite.config.ts
index 5a33944a9b41b59a9cf06ee4bb5586c77510f06b..49b18abcc1a45838ba631d80a06f70a8bcd4b696 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -4,4 +4,8 @@ import react from '@vitejs/plugin-react'
 // https://vitejs.dev/config/
 export default defineConfig({
   plugins: [react()],
+  preview: {
+    port: 3000,
+    host: true,
+  },
 })