From 34eeff01cf78a637193d6e4aabec4fed630cd432 Mon Sep 17 00:00:00 2001 From: max Date: Sun, 28 Jul 2024 14:46:29 -0700 Subject: [PATCH 1/7] feat: add docker-compose --- docker-compose.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..75be4f945 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +name: cart-api +services: + db: + image: postgres + restart: always + ports: + - 5432:5432 + environment: + - PG_HOST=${PG_HOST} + - PG_DB=${PG_DB} + - PG_USER=${PG_USER} + - PG_PASSWORD=${PG_PASSWORD} + - PG_PORT=${PG_PORT} + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U ${PG_USER}'] + interval: 3s + timeout: 3s + retries: 5 + + server: + image: mcnic/aws-cart-service + command: sh -c "npm run db:deploy && npm run db:seed && npm run start:prod" + restart: always + depends_on: + db: + condition: service_healthy + ports: + - ${SERVER_PORT}:${SERVER_PORT} + environment: + - PORT=${SERVER_PORT} + - DATABASE_URL=${DATABASE_URL} \ No newline at end of file From b2d16411a616404f4d6c1bcaf1517345f1055fec Mon Sep 17 00:00:00 2001 From: max Date: Sun, 4 Aug 2024 23:44:15 -0700 Subject: [PATCH 2/7] feat: fix build for main.js and handler --- webpack.config.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index e04134d72..c85dedaff 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,11 +11,14 @@ module.exports = (options, webpack) => { ...options, devtool: 'source-map', externals: [], - entry: './src/handlers/cart.ts', + entry: { + 'handlers/cart/cart': 'src/handlers/cart.ts', + main: 'src/main.ts', + }, output: { ...options.output, libraryTarget: 'commonjs2', - filename: 'handlers/cart/cart.js', + filename: '[name].js', }, optimization: { minimize: false, From 355f2695c612c64f643f34025b1eb29ceb2cad78 Mon Sep 17 00:00:00 2001 From: max Date: Sun, 4 Aug 2024 23:44:55 -0700 Subject: [PATCH 3/7] feat: add Dockerfile and cmds --- .dockerignore | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 37 +++++++++++++++++++++++++++++++++++++ package.json | 6 +++++- 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..0d636a35b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,51 @@ +# compiled output +/dist +/node_modules + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml + +# GIT +.git/ + +# AWS CDK +cdk/ +cdk.context.json +cdk.out + +.env* +test/ +.dockerignore diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..e297f5d6c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +FROM node:20-alpine AS base + +FROM base AS install-dev +WORKDIR /tmp/dev +COPY package*.json ./ +RUN npm ci + +FROM base AS install-prod +WORKDIR /tmp/prod +COPY package*.json ./ +RUN npm ci --omit dev + +FROM install-dev AS prisma +COPY prisma ./prisma +RUN npm run db:generate + +FROM prisma AS build +ENV NODE_ENV=production +COPY tsconfig* webpack.config.js ./ +COPY src ./src +RUN npm run build + +FROM base +WORKDIR /app +COPY --from=install-prod /tmp/prod/node_modules/@prisma ./node_modules/@prisma/ +COPY --from=install-prod /tmp/prod/node_modules/prisma ./node_modules/prisma/ +COPY --from=install-prod /tmp/prod/node_modules/.bin ./node_modules/.bin/ + +COPY --from=build /tmp/dev/node_modules/.prisma ./node_modules/.prisma/ +COPY --from=build /tmp/dev/prisma ./prisma/ + +COPY --from=build /tmp/dev/dist/main.js ./dist/ +# # COPY --from=build /tmp/dev/dist/seed.js ./dist/ +COPY --from=build /tmp/dev/package.json ./ + +EXPOSE 4000 +CMD ["dist/main.js"] \ No newline at end of file diff --git a/package.json b/package.json index a91f29a26..3aa447622 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,11 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" + "test:e2e": "jest --config ./test/jest-e2e.json", + "docker:build": "docker build --tag mcnic/cart-api:latest .", + "docker:push": "docker push mcnic/cart-api:latest", + "docker:start": "docker run -it --rm -p 4000:4000 mcnic/cart-api", + "docker:test": "docker run -it --rm -p 4000:4000 mcnic/cart-api /bin/sh" }, "dependencies": { "@codegenie/serverless-express": "^4.14.1", From 000fd903a0b18faf2fa54f08de82b89a512c22f3 Mon Sep 17 00:00:00 2001 From: max Date: Sun, 4 Aug 2024 23:48:35 -0700 Subject: [PATCH 4/7] fix: add seed script --- Dockerfile | 2 +- webpack.config.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e297f5d6c..3fa35cc54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ COPY --from=build /tmp/dev/node_modules/.prisma ./node_modules/.prisma/ COPY --from=build /tmp/dev/prisma ./prisma/ COPY --from=build /tmp/dev/dist/main.js ./dist/ -# # COPY --from=build /tmp/dev/dist/seed.js ./dist/ +COPY --from=build /tmp/dev/dist/seed.js ./dist/ COPY --from=build /tmp/dev/package.json ./ EXPOSE 4000 diff --git a/webpack.config.js b/webpack.config.js index c85dedaff..eeffed103 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,6 +14,7 @@ module.exports = (options, webpack) => { entry: { 'handlers/cart/cart': 'src/handlers/cart.ts', main: 'src/main.ts', + seed: 'prisma/seed.ts', }, output: { ...options.output, From 2f4cac883f9753a98e27238be6382135eeefbcd2 Mon Sep 17 00:00:00 2001 From: max Date: Mon, 5 Aug 2024 00:06:41 -0700 Subject: [PATCH 5/7] fix: env --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 246effc8e..60955f5c5 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -PORT=4000 +SERVER_PORT=4000 PG_DB=nest-rest-api PG_DB=cart From be190af7f43b01607ce73565500fbd101462e1ef Mon Sep 17 00:00:00 2001 From: max Date: Tue, 6 Aug 2024 22:09:31 -0700 Subject: [PATCH 6/7] wip: deploy --- .env.local | 8 ++++++++ .gitignore | 10 +++++----- README.md | 8 ++++++++ docker-compose.yml | 11 ++++------- package-lock.json | 17 +++++++++++++++++ package.json | 12 +++++++++++- 6 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 .env.local diff --git a/.env.local b/.env.local new file mode 100644 index 000000000..20c7b3bca --- /dev/null +++ b/.env.local @@ -0,0 +1,8 @@ +SERVER_PORT=4000 + +PG_HOST=cart.c3aey8qs0t72.us-east-1.rds.amazonaws.com +PG_DB=cart +PG_USER=postgres +PG_PASSWORD=lHkkyloIUUA7mlmr1Jbw +PG_PORT=5432 +DATABASE_URL=postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PG_PORT}/${PG_DB} diff --git a/.gitignore b/.gitignore index 354c593d4..b71ab25b3 100644 --- a/.gitignore +++ b/.gitignore @@ -32,13 +32,13 @@ lerna-debug.log* !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json -# Elastic Beanstalk Files -.elasticbeanstalk/* -!.elasticbeanstalk/*.cfg.yml -!.elasticbeanstalk/*.global.yml # AWS CDK cdk.context.json cdk.out -.env \ No newline at end of file +.env +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml diff --git a/README.md b/README.md index 911cca29d..355af6a62 100644 --- a/README.md +++ b/README.md @@ -124,3 +124,11 @@ Nest is [MIT licensed](LICENSE). ## TODO - add auth and check it in CartService + +## Elastic Beanstalk + +steps: + +- `npm run eb:init` +- `npm run eb:create` +- `npm run eb:terminate` diff --git a/docker-compose.yml b/docker-compose.yml index 75be4f945..2b8d8c59e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,11 +6,8 @@ services: ports: - 5432:5432 environment: - - PG_HOST=${PG_HOST} - - PG_DB=${PG_DB} - - PG_USER=${PG_USER} - - PG_PASSWORD=${PG_PASSWORD} - - PG_PORT=${PG_PORT} + - POSTGRES_USER=${PG_USER} + - POSTGRES_PASSWORD=${PG_PASSWORD} healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${PG_USER}'] interval: 3s @@ -18,8 +15,8 @@ services: retries: 5 server: - image: mcnic/aws-cart-service - command: sh -c "npm run db:deploy && npm run db:seed && npm run start:prod" + image: mcnic/cart-api + command: sh -c "npm run db:deploy && node ./dist/seed.js && npm run start:prod" restart: always depends_on: db: diff --git a/package-lock.json b/package-lock.json index ecaad5197..b8385767b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,6 +48,7 @@ "cdk": "2.149.0", "copy-webpack-plugin": "^12.0.2", "cross-env": "^7.0.3", + "env-cmd": "^10.1.0", "esbuild": "^0.23.0", "eslint": "8.43.0", "eslint-config-prettier": "^8.8.0", @@ -4841,6 +4842,22 @@ "node": ">=10.13.0" } }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dev": true, + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", diff --git a/package.json b/package.json index 3aa447622..bb2f171d0 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "db:migrate": "npx prisma migrate dev", "db:seed": "npx prisma db seed", "db:seed2": "node -r dotenv/config ./scripts/seed.js", + "db:deploy": "prisma migrate deploy --schema ./prisma", "deploy": "npm run build && cdk deploy", "format": "prettier --write src test deploy", "start": "nest start", @@ -27,7 +28,16 @@ "docker:build": "docker build --tag mcnic/cart-api:latest .", "docker:push": "docker push mcnic/cart-api:latest", "docker:start": "docker run -it --rm -p 4000:4000 mcnic/cart-api", - "docker:test": "docker run -it --rm -p 4000:4000 mcnic/cart-api /bin/sh" + "docker:test": "docker run -it --rm -p 4000:4000 mcnic/cart-api /bin/sh", + "docker:up": "docker compose --env-file .env up --detach", + "docker:down": "docker compose down", + "eb:init": "eb init mcnic-cart-api", + "eb:create2": "eb create dev2 --cname mcnic-cart-api-dev2 --single", + "eb:create3": "env-cmd -x -f .env eb create prod --cname mcnic-cart-api-prod --single --envvars DATABASE_URL=\\$DATABASE_URL SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD --instance-types=t2.micro", + "eb:create": "env-cmd -x -f .env eb create prod --cname mcnic-cart-api-prod --single --envvars DATABASE_URL=\\$DATABASE_URL --instance-types=t2.micro", + "eb:setenv": "env-cmd -x -f .env eb setenv DATABASE_URL=\\$DATABASE_URL SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD", + "eb:deploy": "eb deploy prod", + "eb:terminate": "eb terminate --all" }, "dependencies": { "@codegenie/serverless-express": "^4.14.1", From a6bfa5611eb6f8b0ff66be7288c6728463ae77d9 Mon Sep 17 00:00:00 2001 From: max Date: Tue, 6 Aug 2024 23:53:03 -0700 Subject: [PATCH 7/7] wip: change npm cmd --- package.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bb2f171d0..cef2f5a65 100644 --- a/package.json +++ b/package.json @@ -32,12 +32,13 @@ "docker:up": "docker compose --env-file .env up --detach", "docker:down": "docker compose down", "eb:init": "eb init mcnic-cart-api", - "eb:create2": "eb create dev2 --cname mcnic-cart-api-dev2 --single", - "eb:create3": "env-cmd -x -f .env eb create prod --cname mcnic-cart-api-prod --single --envvars DATABASE_URL=\\$DATABASE_URL SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD --instance-types=t2.micro", - "eb:create": "env-cmd -x -f .env eb create prod --cname mcnic-cart-api-prod --single --envvars DATABASE_URL=\\$DATABASE_URL --instance-types=t2.micro", - "eb:setenv": "env-cmd -x -f .env eb setenv DATABASE_URL=\\$DATABASE_URL SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD", - "eb:deploy": "eb deploy prod", - "eb:terminate": "eb terminate --all" + "eb:create": "eb create prod3 --cname mcnic-cart-api-prod3 --single", + "eb:create-2": "env-cmd -x -f .env eb create prod --cname mcnic-cart-api-prod --single --envvars DATABASE_URL=\\$DATABASE_URL SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD --instance-types=t2.micro", + "eb:create-3": "env-cmd -x -f .env eb create prod --cname mcnic-cart-api-prod --single --envvars DATABASE_URL=\\$DATABASE_URL SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD PG_HOST=\\$PG_HOST --instance-types=t2.micro", + "eb:setenv": "env-cmd -x -f .env eb setenv DATABASE_URL=\\${DATABASE_URL} SERVER_PORT=\\$SERVER_PORT PG_USER=\\$PG_USER PG_PASSWORD=\\$PG_PASSWORD PG_HOST=\\$PG_HOST", + "eb:deploy": "eb deploy prod3", + "eb:terminate": "eb terminate --all", + "eb:logs": "eb logs | grep ERROR" }, "dependencies": { "@codegenie/serverless-express": "^4.14.1",