From 74d5037f092025b687a672dab9030e4994cfc803 Mon Sep 17 00:00:00 2001 From: Mathias Date: Fri, 18 Jul 2025 14:36:45 +0200 Subject: [PATCH] Create docker implementation --- docker-compose.yml | 52 +++++++++++++++++++++++++++++++++++ mobile-calendar/.dockerignore | 17 ++++++++++++ mobile-calendar/Dockerfile | 35 +++++++++++++++++++++++ mobile-shopping/.dockerignore | 17 ++++++++++++ mobile-shopping/Dockerfile | 35 +++++++++++++++++++++++ mobile-shopping/nginx.conf | 31 +++++++++++++++++++++ server/.dockerignore | 12 ++++++++ server/Dockerfile | 30 ++++++++++++++++++++ 8 files changed, 229 insertions(+) create mode 100644 docker-compose.yml create mode 100644 mobile-calendar/.dockerignore create mode 100644 mobile-calendar/Dockerfile create mode 100644 mobile-shopping/.dockerignore create mode 100644 mobile-shopping/Dockerfile create mode 100644 mobile-shopping/nginx.conf create mode 100644 server/.dockerignore create mode 100644 server/Dockerfile diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..22d3dd5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,52 @@ +version: '3.8' + +services: + server: + build: + context: ./server + dockerfile: Dockerfile + container_name: openwall-server + ports: + - "3001:3001" + volumes: + - server-data:/app/data + environment: + - NODE_ENV=production + - DATABASE_PATH=/app/data/database.sqlite + restart: unless-stopped + networks: + - openwall-network + + mobile-calendar: + build: + context: ./mobile-calendar + dockerfile: Dockerfile + container_name: openwall-mobile-calendar + ports: + - "8080:80" + depends_on: + - server + restart: unless-stopped + networks: + - openwall-network + + mobile-shopping: + build: + context: ./mobile-shopping + dockerfile: Dockerfile + container_name: openwall-mobile-shopping + ports: + - "8081:80" + depends_on: + - server + restart: unless-stopped + networks: + - openwall-network + +volumes: + server-data: + driver: local + +networks: + openwall-network: + driver: bridge diff --git a/mobile-calendar/.dockerignore b/mobile-calendar/.dockerignore new file mode 100644 index 0000000..d44018d --- /dev/null +++ b/mobile-calendar/.dockerignore @@ -0,0 +1,17 @@ +node_modules +dist +build +.git +.gitignore +README.md +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.DS_Store +.vscode +coverage diff --git a/mobile-calendar/Dockerfile b/mobile-calendar/Dockerfile new file mode 100644 index 0000000..c543970 --- /dev/null +++ b/mobile-calendar/Dockerfile @@ -0,0 +1,35 @@ +# Use Node.js official image for building +FROM node:18-alpine as builder + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package.json pnpm-lock.yaml ./ + +# Install pnpm globally +RUN npm install -g pnpm + +# Install dependencies +RUN pnpm install --frozen-lockfile + +# Copy source code +COPY . . + +# Build the application +RUN pnpm build + +# Use nginx for serving the built application +FROM nginx:alpine + +# Copy built application from builder stage +COPY --from=builder /app/dist /usr/share/nginx/html + +# Copy nginx configuration +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# Expose port +EXPOSE 80 + +# Start nginx +CMD ["nginx", "-g", "daemon off;"] diff --git a/mobile-shopping/.dockerignore b/mobile-shopping/.dockerignore new file mode 100644 index 0000000..d44018d --- /dev/null +++ b/mobile-shopping/.dockerignore @@ -0,0 +1,17 @@ +node_modules +dist +build +.git +.gitignore +README.md +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.DS_Store +.vscode +coverage diff --git a/mobile-shopping/Dockerfile b/mobile-shopping/Dockerfile new file mode 100644 index 0000000..c543970 --- /dev/null +++ b/mobile-shopping/Dockerfile @@ -0,0 +1,35 @@ +# Use Node.js official image for building +FROM node:18-alpine as builder + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package.json pnpm-lock.yaml ./ + +# Install pnpm globally +RUN npm install -g pnpm + +# Install dependencies +RUN pnpm install --frozen-lockfile + +# Copy source code +COPY . . + +# Build the application +RUN pnpm build + +# Use nginx for serving the built application +FROM nginx:alpine + +# Copy built application from builder stage +COPY --from=builder /app/dist /usr/share/nginx/html + +# Copy nginx configuration +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# Expose port +EXPOSE 80 + +# Start nginx +CMD ["nginx", "-g", "daemon off;"] diff --git a/mobile-shopping/nginx.conf b/mobile-shopping/nginx.conf new file mode 100644 index 0000000..cd326a7 --- /dev/null +++ b/mobile-shopping/nginx.conf @@ -0,0 +1,31 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Handle client-side routing + location / { + try_files $uri $uri/ /index.html; + } + + # Proxy API requests to the backend server + location /api/ { + proxy_pass http://server:3001; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; +} diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 0000000..203c575 --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,12 @@ +node_modules +npm-debug.log +.git +.gitignore +README.md +.env +.nyc_output +coverage +.nyc_output +*.log +.DS_Store +.vscode diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..4ce65a6 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,30 @@ +# Use Node.js official image +FROM node:18-alpine + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package.json pnpm-lock.yaml ./ + +# Install pnpm globally +RUN npm install -g pnpm + +# Install dependencies +RUN pnpm install --frozen-lockfile + +# Copy source code +COPY . . + +# Create directory for SQLite database +RUN mkdir -p /app/data + +# Expose port +EXPOSE 3001 + +# Set environment variables +ENV NODE_ENV=production +ENV DATABASE_PATH=/app/data/database.sqlite + +# Start the application +CMD ["pnpm", "start"]