diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..1e5447f --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,26 @@ +FROM node:lts-alpine + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install --only=production +RUN npm install -g prisma + +COPY . . + +RUN npx prisma generate + +RUN mkdir -p logs + +EXPOSE 3001 + +RUN echo '#!/bin/sh\n\ +echo "Waiting for database..."\n\ +sleep 10\n\ +echo "Running database migrations..."\n\ +npx prisma migrate deploy\n\ +echo "Starting server..."\n\ +npm start' > /app/start.sh && chmod +x /app/start.sh + +CMD ["/app/start.sh"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c0079dd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,75 @@ +services: + # PostgreSQL Database + database: + image: postgres:17-alpine3.22 + container_name: patchmon-database + environment: + POSTGRES_DB: patchmon_db + POSTGRES_USER: patchmon_user + POSTGRES_PASSWORD: p@tchm0n_p@55 + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - patchmon-network + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U patchmon_user -d patchmon_db"] + interval: 10s + timeout: 5s + retries: 5 + + # Backend API Service + backend: + build: + context: ./backend + dockerfile: Dockerfile + container_name: patchmon-backend + environment: + DATABASE_URL: postgresql://patchmon_user:p@tchm0n_p@55@database:5432/patchmon_db + PORT: 3001 + NODE_ENV: production + API_VERSION: v1 + CORS_ORIGIN: http://localhost:3000 + RATE_LIMIT_WINDOW_MS: 900000 + RATE_LIMIT_MAX: 100 + LOG_LEVEL: info + ENABLE_LOGGING: true + ENABLE_HSTS: true + TRUST_PROXY: true + ports: + - "3001:3001" + depends_on: + database: + condition: service_healthy + networks: + - patchmon-network + restart: unless-stopped + volumes: + - backend_logs:/app/logs + + # Frontend Service + frontend: + build: + context: ./frontend + dockerfile: Dockerfile + container_name: patchmon-frontend + environment: + PORT: 3000 + CORS_ORIGIN: http://localhost:3001 + ports: + - "3000:3000" + depends_on: + - backend + networks: + - patchmon-network + restart: unless-stopped + +networks: + patchmon-network: + driver: bridge + +volumes: + postgres_data: + backend_logs: \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..3129277 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,16 @@ +FROM node:lts-alpine + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY . . + +RUN npm run build +RUN npm install --only=production + +EXPOSE 3000 + +CMD ["node", "server.js"] \ No newline at end of file