diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev new file mode 100644 index 0000000..2af23c7 --- /dev/null +++ b/backend/Dockerfile.dev @@ -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"] diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..dffa895 --- /dev/null +++ b/backend/tsconfig.json @@ -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" + ] +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..cf50766 --- /dev/null +++ b/docker-compose.dev.yml @@ -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 diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev new file mode 100644 index 0000000..8486d96 --- /dev/null +++ b/frontend/Dockerfile.dev @@ -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"]