diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ce48a79 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +dist +.git +.gitignore +README.md +Dockerfile +docker-compose.yml +.eslint.config.js + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c6971eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +# Stage 1: Build +FROM node:20-alpine AS build + +WORKDIR /app + +# Copy package files and install dependencies +COPY package.json package-lock.json* ./ +RUN npm install + +# Copy source files and build the app +COPY . . +RUN npm run build + +# Stage 2: Production +FROM nginx:stable-alpine + +# Copy custom nginx configuration +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# Copy build artifacts from build stage +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6d83fb0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +services: + smart-home-app: + build: + context: . + dockerfile: Dockerfile + container_name: smart-home-app + ports: + - "8080:80" + restart: unless-stopped diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..c420cd2 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,22 @@ +server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + # Optional: Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf|eot|mp4|webm)$ { + expires 1y; + add_header Cache-Control "public, no-transform"; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +}