diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..cdfcde5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,32 @@ + +# Broker +broker/node_modules +broker/scripts/start_dev.js +broker/ecosystem.config.cjs +broker/ecosystem.config.example.cjs +broker/Dockerfile +broker/.gitignore +broker/dist + +# Producer +producer/node_modules +producer/scripts/start_dev.js +producer/ecosystem.config.cjs +producer/ecosystem.config.example.cjs +producer/Dockerfile +producer/.gitignore +producer/dist + +# Dashboard +dashboard/* + +# Shared +shared/node_modules +shared/.gitignore + +# Others +docs/* +landing/* +docker/* +dev/* +assets/* diff --git a/broker/Dockerfile b/broker/Dockerfile index 830b432..0ab2d04 100644 --- a/broker/Dockerfile +++ b/broker/Dockerfile @@ -1,7 +1,43 @@ -FROM node:21-alpine +ARG NODE_VERSION=21 + +FROM node:${NODE_VERSION}-alpine as base + +ENV NODE_ENV=development + +# Build stage + +FROM base as build + +RUN npm install -g pnpm + +COPY --link broker/package.json broker/pnpm-lock.yaml home/app/ + +COPY --link shared/package.json shared/pnpm-lock.yaml /home/shared/ + WORKDIR /home/app -COPY package.json pnpm-lock.yaml ./ -RUN npm install -g pnpm && pnpm install --prod --frozen-lockfile -COPY ./dist /home/app/dist +RUN pnpm install --frozen-lockfile + +WORKDIR /home/shared +RUN pnpm install --frozen-lockfile + +COPY --link ../broker /home/app + +COPY --link ../shared /home/shared + +WORKDIR /home/app + +RUN pnpm run build_all + +RUN pnpm prune + +# Final stage + +FROM base + +COPY --from=build /home/app /home/app + +WORKDIR /home/app + EXPOSE ${PORT} -CMD ["node", "dist/broker/src/index.js"] \ No newline at end of file + +CMD ["node", "dist/app/src/index.js"] \ No newline at end of file diff --git a/broker/package.json b/broker/package.json index f16bc0d..be160c3 100644 --- a/broker/package.json +++ b/broker/package.json @@ -27,7 +27,8 @@ "build": "ts-node scripts/build.ts", "create_db": "cd scripts && ts-node create_database.ts", "build_all": "npm run compile && npm run build && npm run create_db", - "docker-build": "node scripts/prepare_docker.js && docker build -t litlyx-broker ." + "docker-build": "docker build -t litlyx-broker -f Dockerfile ../", + "docker-inspect": "docker run -it litlyx-broker sh" }, "keywords": [], "author": "Emily", diff --git a/broker/scripts/prepare_docker.js b/broker/scripts/prepare_docker.js deleted file mode 100644 index 5d29674..0000000 --- a/broker/scripts/prepare_docker.js +++ /dev/null @@ -1,7 +0,0 @@ - -const child = require('child_process'); - -const p = child.exec('pnpm run compile && pnpm run build && pnpm run create_db'); - -p.stdout.on('data', (e) => { console.log(e.toString()); }); -p.stderr.on('data', (e) => { console.log(e.toString()); }); \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7173af4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,54 @@ +version: "3.1" + +services: + mongo: + image: mongo + environment: + MONGO_INITDB_ROOT_USERNAME: litlyx + MONGO_INITDB_ROOT_PASSWORD: litlyx + ports: + - 27017:27017 + + cache: + image: redis:alpine + restart: always + ports: + - "6379:6379" + command: redis-server --save 20 1 --loglevel warning --requirepass litlyx + + producer: + image: litlyx-producer:latest + restart: always + ports: + - "3000:3000" + environment: + PORT: "3000" + REDIS_URL: "redis://cache" + REDIS_USERNAME: "default" + REDIS_PASSWORD: "litlyx" + STREAM_NAME: "lib-events" + + broker: + image: litlyx-broker:latest + restart: always + ports: + - "3999:3999" + environment: + # EMAIL_SERVICE: "" + # EMAIL_HOST: "" + # EMAIL_USER: "" + # EMAIL_PASS: "" + PORT: "3999" + MONGO_CONNECTION_STRING: "mongodb://litlyx:litlyx@mongo:27017/SimpleMetrics?readPreference=primaryPreferred&authSource=admin" + REDIS_URL: "redis://cache" + REDIS_USERNAME: "default" + REDIS_PASSWORD: "litlyx" + STREAM_NAME: "lib-events" + + # dashboard: + # image: litlyx-dashboard:latest + # restart: always + # ports: + # - "80:80" + # environment: + # PORT: "80" diff --git a/producer/Dockerfile b/producer/Dockerfile index e46ba3c..9eb9e59 100644 --- a/producer/Dockerfile +++ b/producer/Dockerfile @@ -1,7 +1,43 @@ -FROM node:21-alpine +ARG NODE_VERSION=21 + +FROM node:${NODE_VERSION}-alpine as base + +ENV NODE_ENV=development + +# Build stage + +FROM base as build + +RUN npm install -g pnpm + +COPY --link producer/package.json producer/pnpm-lock.yaml home/app/ + +COPY --link shared/package.json shared/pnpm-lock.yaml /home/shared/ + WORKDIR /home/app -COPY package.json pnpm-lock.yaml ./ -RUN npm install -g pnpm && pnpm install --prod --frozen-lockfile -COPY ./dist /home/app/dist +RUN pnpm install --frozen-lockfile + +WORKDIR /home/shared +RUN pnpm install --frozen-lockfile + +COPY --link ../producer /home/app + +COPY --link ../shared /home/shared + +WORKDIR /home/app + +RUN pnpm run compile && pnpm run build + +RUN pnpm prune + +# Final stage + +FROM base + +COPY --from=build /home/app /home/app + +WORKDIR /home/app + EXPOSE ${PORT} -CMD ["node", "dist/producer/src/index.js"] \ No newline at end of file + +CMD ["node", "dist/app/src/index.js"] \ No newline at end of file diff --git a/producer/package.json b/producer/package.json index 2b6d200..a6fd05a 100644 --- a/producer/package.json +++ b/producer/package.json @@ -11,6 +11,7 @@ "@types/express": "^4.17.21", "@types/node": "^20.14.2", "glob": "^10.4.1", + "ts-node": "^10.9.2", "typescript": "^5.4.5" }, "name": "litlyx-producer", @@ -21,7 +22,8 @@ "compile": "tsc", "build": "ts-node scripts/build.ts", "build_all": "npm run compile && npm run build", - "docker-build": "node scripts/prepare_docker.js && docker build -t litlyx-producer ." + "docker-build": "docker build -t litlyx-producer -f Dockerfile ../", + "docker-inspect": "docker run -it litlyx-producer sh" }, "keywords": [], "author": "Emily", diff --git a/producer/pnpm-lock.yaml b/producer/pnpm-lock.yaml index 7708eba..e4c77cd 100644 --- a/producer/pnpm-lock.yaml +++ b/producer/pnpm-lock.yaml @@ -36,12 +36,19 @@ importers: glob: specifier: ^10.4.1 version: 10.4.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.14.2)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 packages: + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -49,6 +56,16 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -82,6 +99,18 @@ packages: peerDependencies: '@redis/client': ^1.0.0 + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -122,6 +151,15 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -138,6 +176,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -204,6 +245,9 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -257,6 +301,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -487,6 +535,9 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -701,6 +752,20 @@ packages: resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==} engines: {node: '>= 0.4'} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -744,6 +809,9 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -771,8 +839,16 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + snapshots: + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -784,6 +860,15 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@pkgjs/parseargs@0.11.0': optional: true @@ -813,6 +898,14 @@ snapshots: dependencies: '@redis/client': 1.5.16 + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 @@ -868,6 +961,12 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.0 + + acorn@8.12.0: {} + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -878,6 +977,8 @@ snapshots: ansi-styles@6.2.1: {} + arg@4.1.3: {} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -960,6 +1061,8 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + create-require@1.1.1: {} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -1010,6 +1113,8 @@ snapshots: destroy@1.2.0: {} + diff@4.0.2: {} + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -1331,6 +1436,8 @@ snapshots: lru-cache@10.2.2: {} + make-error@1.3.6: {} + media-typer@0.3.0: {} merge-descriptors@1.0.1: {} @@ -1568,6 +1675,24 @@ snapshots: typedarray.prototype.slice: 1.0.3 which-typed-array: 1.1.15 + ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.2 + acorn: 8.12.0 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -1629,6 +1754,8 @@ snapshots: utils-merge@1.0.1: {} + v8-compile-cache-lib@3.0.1: {} + vary@1.1.2: {} which-boxed-primitive@1.0.2: @@ -1664,3 +1791,5 @@ snapshots: strip-ansi: 7.1.0 yallist@4.0.0: {} + + yn@3.1.1: {} diff --git a/producer/scripts/prepare_docker.js b/producer/scripts/prepare_docker.js deleted file mode 100644 index 4c61b07..0000000 --- a/producer/scripts/prepare_docker.js +++ /dev/null @@ -1,7 +0,0 @@ - -const child = require('child_process'); - -const p = child.exec('pnpm run compile && pnpm run build'); - -p.stdout.on('data', (e) => { console.log(e.toString()); }); -p.stderr.on('data', (e) => { console.log(e.toString()); }); \ No newline at end of file