From 6aa0a659cc589f94e0eb287ed3c0f289411dcf81 Mon Sep 17 00:00:00 2001 From: RKWojs Date: Mon, 4 Aug 2025 15:56:11 +0200 Subject: [PATCH] feat: Add Docker support with development and production configurations --- .dockerignore | 49 ++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 29 +++++++++++++++++++++++++ Dockerfile.dev | 28 ++++++++++++++++++++++++ docker-compose.dev.yml | 28 ++++++++++++++++++++++++ docker-compose.yml | 32 +++++++++++++++++++++++++++ next.config.ts | 11 +++++++++- nginx.conf | 39 +++++++++++++++++++++++++++++++++ package.json | 2 +- 8 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Dockerfile.dev create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.yml create mode 100644 nginx.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8e5cfeb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,49 @@ +# Docker +Dockerfile +Dockerfile.dev +.dockerignore + +# Dependencies +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Production build +.next/ +out/ + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Database +*.db +*.sqlite + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# OS +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Temporary files +tmp/ +temp/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f985a5f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Use official Node.js runtime as base image +FROM node:18-alpine + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm ci --only=production + +# Copy app source +COPY . . + +# Create directory for database +RUN mkdir -p /app/data + +# Build the application +RUN npm run build + +# Expose port +EXPOSE 3000 + +# Set environment to production +ENV NODE_ENV=production + +# Start the application +CMD ["npm", "start"] diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..a8099ce --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,28 @@ +# Development Dockerfile (for npm run dev) +FROM node:18-alpine + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install all dependencies (including dev dependencies) +RUN npm install + +# Copy app source +COPY . . + +# Create directory for database +RUN mkdir -p /app/data + +# Expose port +EXPOSE 3000 + +# Set environment to development and configure for external access +ENV NODE_ENV=development +ENV HOSTNAME=0.0.0.0 +ENV PORT=3000 + +# Start the development server +CMD ["npm", "run", "dev"] diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..b12df10 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,28 @@ +version: '3.8' + +services: + inventory-app-dev: + build: + context: . + dockerfile: Dockerfile.dev + ports: + - "0.0.0.0:3000:3000" + volumes: + # Mount source code for hot reload + - .:/app + - /app/node_modules + # Mount database file to persist data + - ./database.db:/app/database.db + environment: + - NODE_ENV=development + - WATCHPACK_POLLING=true + - HOSTNAME=0.0.0.0 + restart: unless-stopped + stdin_open: true + tty: true + networks: + - inventory-network + +networks: + inventory-network: + driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3729bfd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: '3.8' + +services: + inventory-app: + build: . + ports: + - "3000:3000" + volumes: + # Mount database directory to persist data + - ./data:/app/data + # Mount the database file specifically + - ./database.db:/app/database.db + environment: + - NODE_ENV=production + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Optional: Add a lightweight web server for reverse proxy + nginx: + image: nginx:alpine + ports: + - "80:80" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - inventory-app + restart: unless-stopped diff --git a/next.config.ts b/next.config.ts index e9ffa30..88a0563 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,16 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + // Allow external connections in development + experimental: { + serverComponentsExternalPackages: ['better-sqlite3'], + }, + // Configure for Docker development + ...(process.env.NODE_ENV === 'development' && { + env: { + HOSTNAME: '0.0.0.0', + }, + }), }; export default nextConfig; diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..50ffb10 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,39 @@ +events { + worker_connections 1024; +} + +http { + upstream inventory_app { + server inventory-app:3000; + } + + server { + listen 80; + server_name localhost; + + # Increase client max body size for file uploads + client_max_body_size 10M; + + # Proxy all requests to the Next.js app + location / { + proxy_pass http://inventory_app; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + 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; + proxy_cache_bypass $http_upgrade; + proxy_read_timeout 300s; + proxy_connect_timeout 75s; + } + + # Optional: Serve static files directly (for better performance) + location /_next/static/ { + proxy_pass http://inventory_app; + proxy_cache_valid 1y; + add_header Cache-Control "public, immutable"; + } + } +} diff --git a/package.json b/package.json index 644d5cc..a885832 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbopack", + "dev": "next dev --turbopack --hostname 0.0.0.0 --port 3000", "build": "next build", "start": "next start", "lint": "next lint"