feat: Add Docker support with development and production configurations

This commit is contained in:
2025-08-04 15:56:11 +02:00
parent ec1dbaa2a7
commit 6aa0a659cc
8 changed files with 216 additions and 2 deletions

49
.dockerignore Normal file
View File

@@ -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/

29
Dockerfile Normal file
View File

@@ -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"]

28
Dockerfile.dev Normal file
View File

@@ -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"]

28
docker-compose.dev.yml Normal file
View File

@@ -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

32
docker-compose.yml Normal file
View File

@@ -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

View File

@@ -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;

39
nginx.conf Normal file
View File

@@ -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";
}
}
}

View File

@@ -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"