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/.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 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/Dockerfile b/Dockerfile new file mode 100644 index 000000000..3fa35cc54 --- /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/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 a91f29a26..cef2f5a65 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", @@ -23,7 +24,21 @@ "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", + "docker:up": "docker compose --env-file .env up --detach", + "docker:down": "docker compose down", + "eb:init": "eb init mcnic-cart-api", + "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", diff --git a/webpack.config.js b/webpack.config.js index e04134d72..eeffed103 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,11 +11,15 @@ 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', + seed: 'prisma/seed.ts', + }, output: { ...options.output, libraryTarget: 'commonjs2', - filename: 'handlers/cart/cart.js', + filename: '[name].js', }, optimization: { minimize: false,