From 5dbc66ae4755dc4c607ebaf6b0d988721c16aab9 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 18 Mar 2026 06:08:45 +0300 Subject: [PATCH] feat: add docker support --- Dockerfile | 17 +++++++++++++++++ compose.yml | 18 ++++++++++++++++++ package.json | 5 +++-- prisma.config.ts | 6 +++++- src/app.module.ts | 7 ++++++- yarn.lock | 13 +++++++++++++ 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 Dockerfile create mode 100644 compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6b2a33b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM node:22.19.0 AS builder +WORKDIR /app +COPY package.json yarn.lock ./ +RUN yarn install +COPY . . +RUN yarn prisma generate +RUN yarn build + +FROM node:22.19.0 AS runner +WORKDIR /app +ENV NODE_ENV=production +COPY package.json yarn.lock prisma.config.ts ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/prisma ./prisma +CMD ["node", "dist/src/main"] + diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..5b22714 --- /dev/null +++ b/compose.yml @@ -0,0 +1,18 @@ +name: teacinema +services: + auth-service: + container_name: teacinema-auth-service + build: + context: . + dockerfile: Dockerfile + restart: always + env_file: + - .env.production.local + networks: + - teacinema + + + +networks: + teacinema: + external: true diff --git a/package.json b/package.json index 31b5751..8945c96 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", - "start:dev": "nest start --watch", + "start:dev": "cross-env NODE_ENV=development nest start --watch", "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", + "start:prod": "cross-env NODE_ENV=production node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", @@ -56,6 +56,7 @@ "@types/jest": "^30.0.0", "@types/node": "^22.10.7", "@types/supertest": "^6.0.2", + "cross-env": "^10.1.0", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-prettier": "^5.2.2", diff --git a/prisma.config.ts b/prisma.config.ts index 5c66d1a..ff95aa2 100644 --- a/prisma.config.ts +++ b/prisma.config.ts @@ -1,6 +1,10 @@ -import 'dotenv-expand/config' +import dotenv from 'dotenv' +import dotenvExpand from 'dotenv-expand' import { defineConfig } from 'prisma/config' +const env = dotenv.config({ path: '.env.development.local' }) +dotenvExpand.expand(env) + export default defineConfig({ schema: 'prisma/schema.prisma', migrations: { diff --git a/src/app.module.ts b/src/app.module.ts index 02e772b..ad24d39 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -23,6 +23,11 @@ import { UsersModule } from './modules/users/users.module' imports: [ ConfigModule.forRoot({ isGlobal: true, + envFilePath: [ + `.env.${process.env.NODE_ENV}.local`, + `.env.${process.env.NODE_ENV}`, + '.env' + ], load: [dabataseEnv, grpcEnv, redisEnv, passportEnv, telegramEnv, rmqEnv] }), PrismaModule, @@ -33,7 +38,7 @@ import { UsersModule } from './modules/users/users.module' AccountModule, TelegramModule, TokenModule, - MessagingModule, + MessagingModule ] }) export class AppModule {} diff --git a/yarn.lock b/yarn.lock index 70b8f89..17ddc03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -414,6 +414,11 @@ dependencies: tslib "^2.4.0" +"@epic-web/invariant@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@epic-web/invariant/-/invariant-1.0.0.tgz#1073e5dee6dd540410784990eb73e4acd25c9813" + integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== + "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" @@ -2723,6 +2728,14 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-env@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.1.0.tgz#cfd2a6200df9ed75bfb9cb3d7ce609c13ea21783" + integrity sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw== + dependencies: + "@epic-web/invariant" "^1.0.0" + cross-spawn "^7.0.6" + cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"