Add Docker development environment with hot reloading
This commit is contained in:
parent
2282e8d835
commit
6fc18aabac
4 changed files with 174 additions and 0 deletions
30
backend/Dockerfile.dev
Normal file
30
backend/Dockerfile.dev
Normal 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
37
backend/tsconfig.json
Normal 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
83
docker-compose.dev.yml
Normal 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
24
frontend/Dockerfile.dev
Normal 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"]
|
||||||
Loading…
Add table
Reference in a new issue