diff --git a/.dockerignore b/.dockerignore index ca735ef..7866e61 100644 --- a/.dockerignore +++ b/.dockerignore @@ -142,3 +142,6 @@ Makefile .nvmrc .node-version .npmrc + + +node_modules \ No newline at end of file diff --git a/backend/.env.example b/.env.example similarity index 100% rename from backend/.env.example rename to .env.example diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dda9a51 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +FROM node:22-alpine AS deps + +WORKDIR /app + +COPY package.json package.json +COPY tsconfig.json tsconfig.json +RUN npm install + +FROM node:22-alpine AS build + +WORKDIR /app + +COPY --from=deps /app/node_modules node_modules +COPY package.json package.json +COPY tsconfig.json tsconfig.json +COPY src src +RUN npm run build + +FROM node:22-alpine AS runtime + +WORKDIR /app + +ENV NODE_ENV=production + +COPY package.json package.json +RUN npm install --omit=dev && npm cache clean --force + +COPY --from=build /app/dist dist + +USER node + +EXPOSE 4000 + +CMD ["npm", "run", "start"] diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index 165c7f2..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM node:22-alpine AS build - -WORKDIR /app - -COPY package.json package.json -COPY tsconfig.json tsconfig.json -RUN npm install - -COPY src src -RUN npm run build - -FROM node:22-alpine - -WORKDIR /app - -COPY --from=build /app/package.json package.json -COPY --from=build /app/node_modules node_modules -COPY --from=build /app/dist dist - -EXPOSE 4000 - -CMD ["npm", "run", "start"] diff --git a/backend/package.json b/backend/package.json deleted file mode 100644 index ca715c4..0000000 --- a/backend/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@pg-control/backend", - "version": "1.0.0", - "private": true, - "type": "module", - "scripts": { - "dev": "tsx watch src/server.ts", - "build": "tsc -p tsconfig.json", - "start": "node dist/server.js" - }, - "dependencies": { - "bcryptjs": "^2.4.3", - "connect-pg-simple": "^10.0.0", - "cors": "^2.8.5", - "dockerode": "^4.0.7", - "dotenv": "^16.4.5", - "express": "^4.19.2", - "express-rate-limit": "^7.4.0", - "express-session": "^1.18.0", - "helmet": "^7.1.0", - "pg": "^8.11.5", - "zod": "^3.23.8" - }, - "devDependencies": { - "@types/bcryptjs": "^2.4.6", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/express-session": "^1.18.0", - "@types/node": "^22.10.1", - "@types/pg": "^8.11.6", - "tsx": "^4.19.2", - "typescript": "^5.7.2" - } -} diff --git a/docker-compose.yml b/docker-compose.yml index 9ea7d4f..96860ab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,12 +48,12 @@ services: build: context: ./frontend dockerfile: Dockerfile + args: + VITE_API_BASE_URL: http://localhost:4000/api container_name: pg-control-frontend restart: unless-stopped depends_on: - backend - environment: - VITE_API_BASE_URL: http://localhost:4000/api ports: - "5173:80" diff --git a/frontend/.dockerignore b/frontend/.dockerignore new file mode 100644 index 0000000..cf982c6 --- /dev/null +++ b/frontend/.dockerignore @@ -0,0 +1,4 @@ +node_modules +dist +npm-debug.log +Dockerfile diff --git a/frontend/Dockerfile b/frontend/Dockerfile index e37429f..6fd60e9 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine AS build +FROM node:22-alpine AS deps WORKDIR /app @@ -6,6 +6,16 @@ COPY package.json package.json COPY vite.config.js vite.config.js RUN npm install +FROM node:22-alpine AS build + +WORKDIR /app + +ARG VITE_API_BASE_URL=http://localhost:4000/api +ENV VITE_API_BASE_URL=$VITE_API_BASE_URL + +COPY --from=deps /app/node_modules node_modules +COPY package.json package.json +COPY vite.config.js vite.config.js COPY public public COPY src src COPY index.html index.html @@ -14,5 +24,6 @@ RUN npm run build FROM nginx:1.27-alpine COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..8897f2f --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,17 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location = /health { + access_log off; + return 200 "ok\n"; + add_header Content-Type text/plain; + } +} diff --git a/package.json b/package.json index 76eaadf..ca715c4 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,34 @@ { - "name": "postgres-control-center", - "private": true, + "name": "@pg-control/backend", "version": "1.0.0", - "workspaces": [ - "backend", - "frontend" - ], + "private": true, + "type": "module", "scripts": { - "dev": "npm run dev -w backend & npm run dev -w frontend", - "build": "npm run build -w backend && npm run build -w frontend", - "start": "npm run start -w backend" + "dev": "tsx watch src/server.ts", + "build": "tsc -p tsconfig.json", + "start": "node dist/server.js" + }, + "dependencies": { + "bcryptjs": "^2.4.3", + "connect-pg-simple": "^10.0.0", + "cors": "^2.8.5", + "dockerode": "^4.0.7", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "express-rate-limit": "^7.4.0", + "express-session": "^1.18.0", + "helmet": "^7.1.0", + "pg": "^8.11.5", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/express-session": "^1.18.0", + "@types/node": "^22.10.1", + "@types/pg": "^8.11.6", + "tsx": "^4.19.2", + "typescript": "^5.7.2" } } diff --git a/backend/tsconfig.json b/tsconfig.json similarity index 100% rename from backend/tsconfig.json rename to tsconfig.json