From 34f7586fb660ace3a7c12ba911d95e08cf11eb73 Mon Sep 17 00:00:00 2001 From: Vic Date: Sat, 18 Jun 2022 22:43:53 +0200 Subject: [PATCH] updated documentation --- README.md | 34 ++--------- doc/pipelineschema.jpg | Bin 33363 -> 0 bytes docs/app_dependencies.md | 88 ++++++++++++++++++++++++++++ docs/infrastructure_description.md | 33 +++++++++++ {doc => docs/pictures}/app.jpg | Bin {doc => docs/pictures}/build.jpg | Bin {doc => docs/pictures}/deploy.jpg | Bin {doc => docs/pictures}/ebs.jpg | Bin {doc => docs/pictures}/env.jpg | Bin {doc => docs/pictures}/pipeline.jpg | Bin docs/pictures/pipelineschema.jpg | Bin 0 -> 34406 bytes {doc => docs/pictures}/rds.jpg | Bin {doc => docs/pictures}/s3Front.jpg | Bin {doc => docs/pictures}/udagram.jpg | Bin docs/pipeline_description.md | 32 ++++++++++ 15 files changed, 157 insertions(+), 30 deletions(-) delete mode 100644 doc/pipelineschema.jpg create mode 100644 docs/app_dependencies.md create mode 100644 docs/infrastructure_description.md rename {doc => docs/pictures}/app.jpg (100%) rename {doc => docs/pictures}/build.jpg (100%) rename {doc => docs/pictures}/deploy.jpg (100%) rename {doc => docs/pictures}/ebs.jpg (100%) rename {doc => docs/pictures}/env.jpg (100%) rename {doc => docs/pictures}/pipeline.jpg (100%) create mode 100644 docs/pictures/pipelineschema.jpg rename {doc => docs/pictures}/rds.jpg (100%) rename {doc => docs/pictures}/s3Front.jpg (100%) rename {doc => docs/pictures}/udagram.jpg (100%) create mode 100644 docs/pipeline_description.md diff --git a/README.md b/README.md index eeab218..0888afa 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ Provision the necessary AWS services needed for running the application: 1. From the root of the repo, navigate udagram-api folder `cd starter/udagram-api` to install the node_modules `npm install`. After installation is done start the api in dev mode with `npm run dev`. 1. Without closing the terminal in step 1, navigate to the udagram-frontend `cd starter/udagram-frontend` to intall the node_modules `npm install`. After installation is done start the api in dev mode with `npm run start`. +Note : For more details take a look at the docs folder + ## Testing This project contains two different test suite: unit tests and End-To-End tests(e2e). Follow these steps to run the tests. @@ -51,46 +53,18 @@ Unit tests are using the Jasmine Framework. The e2e tests are using Protractor and Jasmine. -### Architecture: - -![screenshot](doc/udagram.jpg) -![screenshot](doc/pipelineschema.jpg) - -# Screenshots: - -## RDS - -![screenshot](doc/rds.jpg) - -## Elastic Beanstalk - -![screenshot](doc/ebs.jpg) - -## S3 - -![screenshot](doc/s3Front.jpg) - -## Pipeline - -![screenshot](doc/env.jpg) -![screenshot](doc/pipeline.jpg) -![screenshot](doc/build.jpg) -![screenshot](doc/deploy.jpg) - ## Running App - [Access the application](http://udagram593666028033.s3-website-us-east-1.amazonaws.com/) ---- - -![screenshot](doc/app.jpg) - +![screenshot](docs/pictures/app.jpg) ## Built With - [Angular](https://angular.io/) - Single Page Application Framework - [Node](https://nodejs.org) - Javascript Runtime - [Express](https://expressjs.com/) - Javascript API Framework +- [Postgresql](https://www.postgresql.org/) - Postgresql Database # Author diff --git a/doc/pipelineschema.jpg b/doc/pipelineschema.jpg deleted file mode 100644 index 15861c51dff36c8edd7c6e161ac2f50bf1efeb7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33363 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 MOYJ}ZJ^q^iPcrP9wg3PC diff --git a/docs/app_dependencies.md b/docs/app_dependencies.md new file mode 100644 index 0000000..d7909ef --- /dev/null +++ b/docs/app_dependencies.md @@ -0,0 +1,88 @@ +# App Dependencies + +### udagram-front + +``` +"dependencies": { + "@angular/common": "^8.2.14", + "@angular/core": "^8.2.14", + "@angular/forms": "^8.2.14", + "@angular/http": "^7.2.16", + "@angular/platform-browser": "^8.2.14", + "@angular/platform-browser-dynamic": "^8.2.14", + "@angular/router": "^8.2.14", + "@ionic-native/core": "^5.0.0", + "@ionic-native/splash-screen": "^5.0.0", + "@ionic-native/status-bar": "^5.0.0", + "@ionic/angular": "^4.1.0", + "core-js": "^2.5.4", + "rxjs": "~6.5.4", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/architect": "~0.12.3", + "@angular-devkit/build-angular": "^0.803.24", + "@angular-devkit/core": "~7.2.3", + "@angular-devkit/schematics": "~7.2.3", + "@angular/cli": "~8.3.25", + "@angular/compiler": "~8.2.14", + "@angular/compiler-cli": "~8.2.14", + "@angular/language-service": "~8.2.14", + "@ionic/angular-toolkit": "~1.4.0", + "@types/jasmine": "~2.8.8", + "@types/jasminewd2": "~2.0.3", + "@types/node": "~10.12.0", + "@typescript-eslint/eslint-plugin": "^2.20.0", + "@typescript-eslint/parser": "^2.20.0", + "codelyzer": "~4.5.0", + "jasmine-core": "~2.99.1", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~3.1.4", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~1.1.2", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "~5.4.0", + "ts-node": "~8.0.0", + "tslint": "~5.12.0", + "typescript": "^3.5.3" + } +``` + +### udagram-api + +``` + "dependencies": { + "@types/bcryptjs": "2.4.2", + "@types/jsonwebtoken": "^8.3.2", + "aws-sdk": "^2.429.0", + "bcryptjs": "2.4.3", + "body-parser": "^1.18.3", + "cors": "^2.8.5", + "dotenv": "^8.2.0", + "email-validator": "^2.0.4", + "express": "^4.16.4", + "jsonwebtoken": "^8.5.1", + "pg": "^8.7.1", + "reflect-metadata": "^0.1.13", + "sequelize": "^5.21.4", + "sequelize-typescript": "^0.6.9" + }, + "devDependencies": { + "@types/bluebird": "^3.5.26", + "@types/cors": "^2.8.6", + "@types/express": "^4.16.1", + "@types/node": "^11.11.6", + "@types/sequelize": "^4.27.44", + "@types/validator": "^10.9.0", + "@typescript-eslint/eslint-plugin": "^2.19.2", + "@typescript-eslint/parser": "^2.19.2", + "chai": "^4.2.0", + "chai-http": "^4.2.1", + "eslint": "^6.8.0", + "eslint-config-google": "^0.14.0", + "mocha": "^6.1.4", + "ts-node-dev": "^1.0.0-pre.32", + "typescript": "^3.9.10" + } +``` \ No newline at end of file diff --git a/docs/infrastructure_description.md b/docs/infrastructure_description.md new file mode 100644 index 0000000..98183ea --- /dev/null +++ b/docs/infrastructure_description.md @@ -0,0 +1,33 @@ +# Infrastructure Description + +The application have `udagram/udagram-front` for the frontend and `udagram/udagram-api` for the backend + +- The frontend is hosted on Amazon S3 +- The Backend is hosted on Amazon Elastic Beanstalk +- The postgres Database is hosted on Amazon RDS + +## Infrastructure Diagram + +![screenshot](pictures/udagram.jpg) + +## Screenshots + + +### RDS + +![screenshot](pictures/rds.jpg) + +### Elastic Beanstalk + +![screenshot](pictures/ebs.jpg) + +### S3 + +![screenshot](pictures/s3Front.jpg) + +### Pipeline + +![screenshot](pictures/env.jpg) +![screenshot](pipeline.jpg) +![screenshot](pictures/build.jpg) +![screenshot](pictures/deploy.jpg) \ No newline at end of file diff --git a/doc/app.jpg b/docs/pictures/app.jpg similarity index 100% rename from doc/app.jpg rename to docs/pictures/app.jpg diff --git a/doc/build.jpg b/docs/pictures/build.jpg similarity index 100% rename from doc/build.jpg rename to docs/pictures/build.jpg diff --git a/doc/deploy.jpg b/docs/pictures/deploy.jpg similarity index 100% rename from doc/deploy.jpg rename to docs/pictures/deploy.jpg diff --git a/doc/ebs.jpg b/docs/pictures/ebs.jpg similarity index 100% rename from doc/ebs.jpg rename to docs/pictures/ebs.jpg diff --git a/doc/env.jpg b/docs/pictures/env.jpg similarity index 100% rename from doc/env.jpg rename to docs/pictures/env.jpg diff --git a/doc/pipeline.jpg b/docs/pictures/pipeline.jpg similarity index 100% rename from doc/pipeline.jpg rename to docs/pictures/pipeline.jpg diff --git a/docs/pictures/pipelineschema.jpg b/docs/pictures/pipelineschema.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17896889fa329159573e337f0508c8ffb6dce281 GIT binary patch literal 34406 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 E02zu6Q~&?~ literal 0 HcmV?d00001 diff --git a/doc/rds.jpg b/docs/pictures/rds.jpg similarity index 100% rename from doc/rds.jpg rename to docs/pictures/rds.jpg diff --git a/doc/s3Front.jpg b/docs/pictures/s3Front.jpg similarity index 100% rename from doc/s3Front.jpg rename to docs/pictures/s3Front.jpg diff --git a/doc/udagram.jpg b/docs/pictures/udagram.jpg similarity index 100% rename from doc/udagram.jpg rename to docs/pictures/udagram.jpg diff --git a/docs/pipeline_description.md b/docs/pipeline_description.md new file mode 100644 index 0000000..d80b613 --- /dev/null +++ b/docs/pipeline_description.md @@ -0,0 +1,32 @@ +# Pipeline + +The application use the integration of CircleCI with github, after each commit on the master branch, it will trigger CircleCI to deploy the application on AWS. + +## Steps + +![screenshot](pictures/pipelineschema.jpg) + +## CircleCI and AWS : + +### Build + +- Install Node/NPM +- Checkout the github repo code +- Install the dependencies for the Backend +- Build the Backend +- Install the dependencies for the Frontend +- Build the Frontend +- Lint FrontEnd + +### Hold + +- Need manual approval on CircleCI to trigger deployement + +### Deploy + +- Setup AWS CLI +- Setup AWS Access Key ID +- Setup Elastic Beanstalk CLI +- Deploy backend +- Deploy frontend +