This commit is contained in:
2026-03-19 16:16:12 +07:00
parent c702fdb6c1
commit 31e59827aa
6 changed files with 7 additions and 1 deletions

6
backend/.dockerignore Normal file
View File

@@ -0,0 +1,6 @@
node_modules
dist
npm-debug.log
Dockerfile
.env
.env.local

8
backend/.env.example Normal file
View File

@@ -0,0 +1,8 @@
NODE_ENV=development
PORT=4000
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/app_admin
SESSION_SECRET=change-me
SESSION_NAME=pgcc.sid
ALLOWED_ORIGIN=http://localhost:5173
POSTGRES_CONTAINER_NAME=pg-control-postgres
COOKIE_SECURE=false

34
backend/Dockerfile Normal file
View File

@@ -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"]

34
backend/package.json Normal file
View File

@@ -0,0 +1,34 @@
{
"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"
}
}

20
backend/tsconfig.json Normal file
View File

@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "dist",
"rootDir": "src",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"types": [
"node"
]
},
"include": [
"src"
]
}