mirror of
https://github.com/hknsh/project-knedita.git
synced 2024-11-28 09:31:16 +00:00
fix: fixed dockerfile
This commit is contained in:
parent
d55a2dedba
commit
78471ba5c4
8 changed files with 99 additions and 59 deletions
|
@ -1,4 +1,11 @@
|
||||||
.env
|
.env
|
||||||
node_modules/
|
node_modules/
|
||||||
.vscode/
|
.vscode/
|
||||||
client/
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
npm-debug.log
|
||||||
|
dist
|
||||||
|
.env.example
|
||||||
|
package-lock_copy.json
|
||||||
|
package_copy.json
|
||||||
|
docker.env.example
|
5
.husky/install.mjs
Normal file
5
.husky/install.mjs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') {
|
||||||
|
process.exit(0)
|
||||||
|
}
|
||||||
|
const husky = (await import('husky')).default
|
||||||
|
console.log(husky())
|
72
Dockerfile
72
Dockerfile
|
@ -1,34 +1,50 @@
|
||||||
FROM node:18 as builder
|
# LOCAL
|
||||||
|
FROM node:20-alpine AS dev
|
||||||
|
|
||||||
# Create app dir
|
WORKDIR /usr/src/app
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY package*.json ./
|
COPY --chown=node:node package*.json ./
|
||||||
COPY prisma ./prisma/
|
COPY --chown=node:node prisma ./prisma/
|
||||||
|
|
||||||
RUN npm install -D @swc/cli @swc/core
|
|
||||||
RUN npm install
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
# Stage 2
|
|
||||||
FROM node:18
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN npm i pm2 -g
|
|
||||||
|
|
||||||
COPY --from=builder /app/package*.json ./
|
|
||||||
COPY --from=builder /app/prisma ./prisma/
|
|
||||||
COPY --from=builder /app/dist ./dist/
|
|
||||||
COPY --from=builder /app/docker.env ./
|
|
||||||
|
|
||||||
RUN mv docker.env .env
|
|
||||||
|
|
||||||
RUN npm ci
|
RUN npm ci
|
||||||
|
|
||||||
EXPOSE 8080
|
COPY --chown=node:node . .
|
||||||
|
|
||||||
CMD ["npm", "run", "prod:start"]
|
USER node
|
||||||
|
|
||||||
|
# BUILD
|
||||||
|
FROM node:20-alpine AS build
|
||||||
|
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
COPY --chown=node:node package*.json ./
|
||||||
|
COPY --chown=node:node --from=dev /usr/src/app/node_modules ./node_modules
|
||||||
|
COPY --chown=node:node --from=dev /usr/src/app/prisma ./prisma/
|
||||||
|
COPY --chown=node:node .husky ./.husky
|
||||||
|
COPY --chown=node:node tsconfig.json tsconfig.build.json ./
|
||||||
|
COPY --chown=node:node docker.env ./.env
|
||||||
|
COPY --chown=node:node . .
|
||||||
|
|
||||||
|
RUN npm install husky -g
|
||||||
|
|
||||||
|
RUN npm run prisma:generate
|
||||||
|
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
ENV NODE_ENV production
|
||||||
|
|
||||||
|
RUN npm ci --only=production && npm cache clean --force
|
||||||
|
|
||||||
|
USER node
|
||||||
|
|
||||||
|
# PROD
|
||||||
|
FROM node:20-alpine as production
|
||||||
|
|
||||||
|
COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules
|
||||||
|
COPY --chown=node:node --from=build /usr/src/app/dist ./dist
|
||||||
|
COPY --chown=node:node --from=build /usr/src/app/prisma ./prisma
|
||||||
|
COPY --chown=node:node --from=build /usr/src/app/.husky ./.husky
|
||||||
|
COPY --chown=node:node --from=build /usr/src/app/.env ./
|
||||||
|
COPY --chown=node:node --from=build /usr/src/app/package*.json ./
|
||||||
|
|
||||||
|
CMD ["npm", "run" , "prod"]
|
||||||
|
|
|
@ -9,21 +9,6 @@ networks:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|
||||||
services:
|
services:
|
||||||
api:
|
|
||||||
container_name: api
|
|
||||||
restart: unless-stopped
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
ports:
|
|
||||||
- 8080:8080
|
|
||||||
depends_on:
|
|
||||||
- postgres
|
|
||||||
- redis
|
|
||||||
- localstack
|
|
||||||
env_file:
|
|
||||||
- docker.env
|
|
||||||
|
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:alpine
|
image: postgres:alpine
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
@ -58,6 +43,21 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- redis:/data
|
- redis:/data
|
||||||
|
|
||||||
|
api:
|
||||||
|
container_name: api
|
||||||
|
restart: unless-stopped
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
- redis
|
||||||
|
- minio
|
||||||
|
env_file:
|
||||||
|
- docker.env
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres:
|
postgres:
|
||||||
name: backend-db
|
name: backend-db
|
||||||
|
|
|
@ -7,7 +7,7 @@ POSTGRES_USER=<placeholder>
|
||||||
POSTGRES_PASSWORD=<placeholder>
|
POSTGRES_PASSWORD=<placeholder>
|
||||||
DB_HOST=postgres
|
DB_HOST=postgres
|
||||||
|
|
||||||
DATABASE_URL=postgresql://<placeholder>:<placeholder>@${DB_HOST}:<placeholder>/${POSTGRES_DB}?schema=<placeholder>
|
DATABASE_URL=postgresql://<USER>:<PASS>@${DB_HOST}:<PORT>/${POSTGRES_DB}?schema=<PROD-SCHEMA>
|
||||||
|
|
||||||
# Redis
|
# Redis
|
||||||
REDIS_HOST=redis
|
REDIS_HOST=redis
|
||||||
|
|
28
package-lock.json
generated
28
package-lock.json
generated
|
@ -33,6 +33,7 @@
|
||||||
"passport": "^0.7.0",
|
"passport": "^0.7.0",
|
||||||
"passport-jwt": "^4.0.1",
|
"passport-jwt": "^4.0.1",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
|
"prisma": "^5.8.1",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
"sharp": "^0.33.2"
|
"sharp": "^0.33.2"
|
||||||
|
@ -57,9 +58,9 @@
|
||||||
"eslint": "^8.42.0",
|
"eslint": "^8.42.0",
|
||||||
"eslint-config-prettier": "^9.0.0",
|
"eslint-config-prettier": "^9.0.0",
|
||||||
"eslint-plugin-prettier": "^5.0.0",
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
|
"husky": "^9.0.7",
|
||||||
"jest": "^29.5.0",
|
"jest": "^29.5.0",
|
||||||
"prettier": "^3.0.0",
|
"prettier": "^3.0.0",
|
||||||
"prisma": "^5.8.1",
|
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"supertest": "^6.3.3",
|
"supertest": "^6.3.3",
|
||||||
"ts-jest": "^29.1.0",
|
"ts-jest": "^29.1.0",
|
||||||
|
@ -3852,14 +3853,12 @@
|
||||||
"node_modules/@prisma/debug": {
|
"node_modules/@prisma/debug": {
|
||||||
"version": "5.9.0",
|
"version": "5.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.9.0.tgz",
|
||||||
"integrity": "sha512-3Uhj5YSPqaIfzJQ6JQzCNBXeBTy0x803fGIoo2tvP/KIEd+o4o49JxCQtKtP8aeef5iNh5Nn9Z25wDrdLjS80A==",
|
"integrity": "sha512-3Uhj5YSPqaIfzJQ6JQzCNBXeBTy0x803fGIoo2tvP/KIEd+o4o49JxCQtKtP8aeef5iNh5Nn9Z25wDrdLjS80A=="
|
||||||
"devOptional": true
|
|
||||||
},
|
},
|
||||||
"node_modules/@prisma/engines": {
|
"node_modules/@prisma/engines": {
|
||||||
"version": "5.9.0",
|
"version": "5.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.9.0.tgz",
|
||||||
"integrity": "sha512-BH1fpXbMH09TwfZH5FVMJwRp6afEhKzqwebbCLdaEkJDuhxA//iwbILLqGFtGTgZbdBNUOThIK+UC3++5kWMTg==",
|
"integrity": "sha512-BH1fpXbMH09TwfZH5FVMJwRp6afEhKzqwebbCLdaEkJDuhxA//iwbILLqGFtGTgZbdBNUOThIK+UC3++5kWMTg==",
|
||||||
"devOptional": true,
|
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/debug": "5.9.0",
|
"@prisma/debug": "5.9.0",
|
||||||
|
@ -3871,14 +3870,12 @@
|
||||||
"node_modules/@prisma/engines-version": {
|
"node_modules/@prisma/engines-version": {
|
||||||
"version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64",
|
"version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64.tgz",
|
||||||
"integrity": "sha512-HFl7275yF0FWbdcNvcSRbbu9JCBSLMcurYwvWc8WGDnpu7APxQo2ONtZrUggU3WxLxUJ2uBX+0GOFIcJeVeOOQ==",
|
"integrity": "sha512-HFl7275yF0FWbdcNvcSRbbu9JCBSLMcurYwvWc8WGDnpu7APxQo2ONtZrUggU3WxLxUJ2uBX+0GOFIcJeVeOOQ=="
|
||||||
"devOptional": true
|
|
||||||
},
|
},
|
||||||
"node_modules/@prisma/fetch-engine": {
|
"node_modules/@prisma/fetch-engine": {
|
||||||
"version": "5.9.0",
|
"version": "5.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.9.0.tgz",
|
||||||
"integrity": "sha512-NL8Vm8Vl2d6NOSkkPGN5TTTz4s6cyCleXOzqtOFWzfKFJ4wtN2Shu7llOT+ykf6nDzh1lCN2JHUt1S6FGFZGig==",
|
"integrity": "sha512-NL8Vm8Vl2d6NOSkkPGN5TTTz4s6cyCleXOzqtOFWzfKFJ4wtN2Shu7llOT+ykf6nDzh1lCN2JHUt1S6FGFZGig==",
|
||||||
"devOptional": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/debug": "5.9.0",
|
"@prisma/debug": "5.9.0",
|
||||||
"@prisma/engines-version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64",
|
"@prisma/engines-version": "5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64",
|
||||||
|
@ -3889,7 +3886,6 @@
|
||||||
"version": "5.9.0",
|
"version": "5.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.9.0.tgz",
|
||||||
"integrity": "sha512-8CatX+E6eZxcOjJZe5hF8EXxdb5GsQTA/u7pdmUJSxGLacW9K3r5vDdgV8s22PubObQQ6979/rkCMItbCrG4Yg==",
|
"integrity": "sha512-8CatX+E6eZxcOjJZe5hF8EXxdb5GsQTA/u7pdmUJSxGLacW9K3r5vDdgV8s22PubObQQ6979/rkCMItbCrG4Yg==",
|
||||||
"devOptional": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/debug": "5.9.0"
|
"@prisma/debug": "5.9.0"
|
||||||
}
|
}
|
||||||
|
@ -8808,6 +8804,21 @@
|
||||||
"node": ">=10.17.0"
|
"node": ">=10.17.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/husky": {
|
||||||
|
"version": "9.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/husky/-/husky-9.0.7.tgz",
|
||||||
|
"integrity": "sha512-vWdusw+y12DUEeoZqW1kplOFqk3tedGV8qlga8/SF6a3lOiWLqGZZQvfWvY0fQYdfiRi/u1DFNpudTSV9l1aCg==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"husky": "bin.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/typicode"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/iconv-lite": {
|
"node_modules/iconv-lite": {
|
||||||
"version": "0.4.24",
|
"version": "0.4.24",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||||
|
@ -11472,7 +11483,6 @@
|
||||||
"version": "5.9.0",
|
"version": "5.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/prisma/-/prisma-5.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/prisma/-/prisma-5.9.0.tgz",
|
||||||
"integrity": "sha512-0UcOofjNuAnd227JMaPqZvP01dsUXw9EXB9iC8fyoZtfv7zkQ0ozxyjY1g+vcjFPOnNLICMnLHx+lM5BJZYqOQ==",
|
"integrity": "sha512-0UcOofjNuAnd227JMaPqZvP01dsUXw9EXB9iC8fyoZtfv7zkQ0ozxyjY1g+vcjFPOnNLICMnLHx+lM5BJZYqOQ==",
|
||||||
"devOptional": true,
|
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/engines": "5.9.0"
|
"@prisma/engines": "5.9.0"
|
||||||
|
|
10
package.json
10
package.json
|
@ -12,14 +12,15 @@
|
||||||
"docker:build": "docker build -t api . && docker compose up -d",
|
"docker:build": "docker build -t api . && docker compose up -d",
|
||||||
"docker:db": "docker compose -f docker-compose.db.yml up -d",
|
"docker:db": "docker compose -f docker-compose.db.yml up -d",
|
||||||
"docker:seed": "docker exec -it api npm run prisma:seed",
|
"docker:seed": "docker exec -it api npm run prisma:seed",
|
||||||
|
"migrate:deploy": "prisma migrate deploy",
|
||||||
"migrate:dev": "prisma migrate dev",
|
"migrate:dev": "prisma migrate dev",
|
||||||
"migrate:dev:create": "prisma migrate dev --create-only",
|
"migrate:dev:create": "prisma migrate dev --create-only",
|
||||||
"migrate:reset": "prisma migrate reset",
|
"migrate:reset": "prisma migrate reset",
|
||||||
"prisma:generate": "npx prisma generate",
|
"prisma:generate": "npx prisma generate",
|
||||||
"prisma:seed": "prisma db seed",
|
"prisma:seed": "prisma db seed",
|
||||||
"prisma:studio": "npx prisma studio",
|
"prisma:studio": "npx prisma studio",
|
||||||
"prepare": "husky install",
|
"prepare": "husky .husky/install",
|
||||||
"prod": "node dist/main",
|
"prod": "npm run migrate:deploy && node dist/main",
|
||||||
"start": "nest start",
|
"start": "nest start",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test:cov": "jest --coverage",
|
"test:cov": "jest --coverage",
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
"passport": "^0.7.0",
|
"passport": "^0.7.0",
|
||||||
"passport-jwt": "^4.0.1",
|
"passport-jwt": "^4.0.1",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
|
"prisma": "^5.8.1",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
"sharp": "^0.33.2"
|
"sharp": "^0.33.2"
|
||||||
|
@ -76,9 +78,9 @@
|
||||||
"eslint": "^8.42.0",
|
"eslint": "^8.42.0",
|
||||||
"eslint-config-prettier": "^9.0.0",
|
"eslint-config-prettier": "^9.0.0",
|
||||||
"eslint-plugin-prettier": "^5.0.0",
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
|
"husky": "^9.0.7",
|
||||||
"jest": "^29.5.0",
|
"jest": "^29.5.0",
|
||||||
"prettier": "^3.0.0",
|
"prettier": "^3.0.0",
|
||||||
"prisma": "^5.8.1",
|
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"supertest": "^6.3.3",
|
"supertest": "^6.3.3",
|
||||||
"ts-jest": "^29.1.0",
|
"ts-jest": "^29.1.0",
|
||||||
|
@ -106,4 +108,4 @@
|
||||||
"coverageDirectory": "../coverage",
|
"coverageDirectory": "../coverage",
|
||||||
"testEnvironment": "node"
|
"testEnvironment": "node"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -8,7 +8,7 @@ export class S3Service {
|
||||||
constructor(@InjectS3() private readonly s3: S3) {}
|
constructor(@InjectS3() private readonly s3: S3) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the image url if the upload to minio as successful. Otherwise returns `false`.
|
* Returns the image url if the upload to minio was successful.
|
||||||
*/
|
*/
|
||||||
async uploadImageToMinio(userID: string, buffer: Buffer): Promise<string> {
|
async uploadImageToMinio(userID: string, buffer: Buffer): Promise<string> {
|
||||||
const compressedBuffer = await sharp(buffer)
|
const compressedBuffer = await sharp(buffer)
|
||||||
|
|
Loading…
Reference in a new issue