Add Docker development environment with hot reloading

This commit is contained in:
TheMaddax 2025-06-01 06:55:36 -07:00
parent 2282e8d835
commit 6fc18aabac
4 changed files with 174 additions and 0 deletions

30
backend/Dockerfile.dev Normal file
View file

@ -0,0 +1,30 @@
FROM node:22-alpine
# Install ffmpeg for video processing
RUN apk add --no-cache ffmpeg
# Set working directory
WORKDIR /app
# Install dependencies
COPY package*.json ./
RUN npm ci
# Copy source code
COPY . .
# Create uploads directory
RUN mkdir -p uploads/videos uploads/thumbnails uploads/subtitles uploads/transcripts uploads/documents uploads/textversions
# Create a non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
RUN chown -R appuser:appgroup /app
# Switch to non-root user
USER appuser
# Expose port
EXPOSE 4000
# Start development server with hot reloading
CMD ["npm", "run", "dev"]

37
backend/tsconfig.json Normal file
View file

@ -0,0 +1,37 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "commonjs",
"lib": ["ES2022"],
"outDir": "./dist",
"rootDir": "./src",
"strict": false,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": false,
"declarationMap": false,
"sourceMap": true,
"removeComments": true,
"noImplicitReturns": false,
"noFallthroughCasesInSwitch": false,
"noUnusedLocals": false,
"noUnusedParameters": false,
"exactOptionalPropertyTypes": false,
"noImplicitOverride": false,
"noPropertyAccessFromIndexSignature": false,
"noUncheckedIndexedAccess": false,
"allowUnusedLabels": true,
"allowUnreachableCode": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"dist",
"**/*.test.ts",
"**/*.spec.ts"
]
}

83
docker-compose.dev.yml Normal file
View file

@ -0,0 +1,83 @@
services:
# Frontend development service with hot reloading
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.dev
restart: unless-stopped
ports:
- "3000:3000"
depends_on:
- mongodb
environment:
- NODE_ENV=development
- NEXT_PUBLIC_API_URL=http://localhost:4000
volumes:
- ./frontend/src:/app/src:rw
- ./frontend/public:/app/public:rw
- ./frontend/package.json:/app/package.json:rw
- ./frontend/package-lock.json:/app/package-lock.json:rw
- ./frontend/next.config.js:/app/next.config.js:rw
- ./frontend/tailwind.config.js:/app/tailwind.config.js:rw
- ./frontend/postcss.config.js:/app/postcss.config.js:rw
- ./frontend/tsconfig.json:/app/tsconfig.json:rw
- /app/node_modules
- /app/.next
networks:
- app-network
command: npm run dev
# Backend development service with hot reloading
backend:
build:
context: ./backend
dockerfile: Dockerfile.dev
restart: unless-stopped
ports:
- "4000:4000"
depends_on:
- mongodb
environment:
- NODE_ENV=development
- MONGODB_URI=mongodb://mongodb:27017/ocd-website
- PORT=4000
volumes:
- ./backend/src:/app/src:rw
- ./backend/package.json:/app/package.json:rw
- ./backend/package-lock.json:/app/package-lock.json:rw
- ./backend/tsconfig.json:/app/tsconfig.json:rw
- ./backend/uploads:/app/uploads:rw
- /app/node_modules
- /app/dist
networks:
- app-network
command: npm run dev
# MongoDB service for development
mongodb:
image: mongo:7.0
restart: unless-stopped
ports:
- "27017:27017"
volumes:
- mongo-dev-data:/data/db:rw
- ./mongo-init:/docker-entrypoint-initdb.d:ro
networks:
- app-network
environment:
- MONGO_INITDB_DATABASE=ocd-website
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017 --quiet
interval: 30s
timeout: 10s
retries: 3
# Networks
networks:
app-network:
driver: bridge
# Volumes
volumes:
mongo-dev-data:
name: ocd-mongo-dev-data

24
frontend/Dockerfile.dev Normal file
View file

@ -0,0 +1,24 @@
FROM node:22-alpine
# Set working directory
WORKDIR /app
# Install dependencies
COPY package*.json ./
RUN npm ci
# Copy source code
COPY . .
# Create a non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
RUN chown -R appuser:appgroup /app
# Switch to non-root user
USER appuser
# Expose port
EXPOSE 3000
# Start development server with hot reloading
CMD ["npm", "run", "dev"]