├── .github └── workflows │ ├── Untitled-1.txt │ └── github-actions-ci.yml ├── Dockerfile ├── README copy.md ├── README.md ├── deployment.yaml ├── package-lock.json ├── package.json ├── server.js └── service.yaml /.github/workflows/Untitled-1.txt: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Step 1: Setup your environment 4 | export AWS_ACCESS_KEY_ID="" 5 | export AWS_SECRET_ACCESS_KEY="" 6 | export AWS_DEFAULT_REGION="" 7 | 8 | # Step 2: Spin up an EC2 instance 9 | aws ec2 run-instances --image-id ami-027e5d5ba5f5ceb45 --count 1 --instance-type t2.micro --key-name 10 | 11 | # Step 3: Install dependencies 12 | sudo apt-get update && sudo apt-get install -y python python-pip unzip 13 | 14 | # Step 4: Install kubectl 15 | curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/linux/amd64/kubectl 16 | chmod +x ./kubectl 17 | sudo mv ./kubectl /usr/local/bin/kubectl 18 | 19 | # Step 5: Install Terraform 20 | wget https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip 21 | unzip terraform_0.11.13_linux_amd64.zip 22 | sudo mv terraform /usr/local/bin/ 23 | 24 | # Step 6: Install Jenkins 25 | sudo apt-get install default-jdk -y 26 | wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add - 27 | sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' 28 | sudo apt-get update 29 | sudo apt-get install jenkins -y 30 | -------------------------------------------------------------------------------- /.github/workflows/github-actions-ci.yml: -------------------------------------------------------------------------------- 1 | name: Node js app deploy to EKS 2 | on: 3 | push: 4 | branches: [ "main" ] 5 | pull_request: 6 | branches: [ "main" ] 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout code 13 | uses: actions/checkout@v3 14 | 15 | - name: Install kubectl 16 | uses: azure/setup-kubectl@v2.0 17 | with: 18 | version: 'v1.24.0' # default is latest stable 19 | id: install 20 | 21 | - name: Configure AWS Credentials 22 | uses: aws-actions/configure-aws-credentials@v1 23 | with: 24 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} 25 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 26 | aws-region: us-east-2 27 | 28 | - name: Login to Amazon ECR 29 | id: login-ecr 30 | uses: aws-actions/amazon-ecr-login@v1 31 | 32 | - name: Build, tag, and push docker image to Amazon ECR 33 | env: 34 | REGISTRY: ${{ steps.login-ecr.outputs.registry }} 35 | REPOSITORY: primuslearning 36 | IMAGE_TAG: 1.1 37 | run: | 38 | docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG . 39 | docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG 40 | 41 | - name: Update kube config 42 | run: aws eks update-kubeconfig --name primuslearning 43 | 44 | - name: Deploy to EKS 45 | run: | 46 | kubectl apply -f deployment.yaml 47 | kubectl apply -f service.yaml -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14-alpine 2 | 3 | # Create app directory 4 | WORKDIR /usr/src/app 5 | 6 | COPY . . 7 | 8 | RUN npm install 9 | 10 | EXPOSE 8080 11 | 12 | CMD [ "node", "server.js" ] -------------------------------------------------------------------------------- /README copy.md: -------------------------------------------------------------------------------- 1 | # deploy-to-eks-using-github-actions 2 | 1. Create an EKS Cluster using this command: 3 | 4 | eksctl create cluster --name primuslearning --region us-east-2 --nodegroup-name linux-nodes --node-type t2.micro --nodes 2 5 | 6 | 2. Then create .github folder and then create workflow folder inside .github folder 7 | 3. create file with .yml extension and write the workflow code 8 | 4. Create a github repository 9 | 5. Create secrets in github repo 10 | Go to settings of repo 11 | click on secrets and variables 12 | 6. Test application by getting the dns name and going to a web browser 13 | 14 | Clean up: Run: eksctl delete cluster --name primuslearning 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # deploy-to-eks-using-github-actions -------------------------------------------------------------------------------- /deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: primuslearning 5 | labels: 6 | app: primuslearning 7 | spec: 8 | replicas: 1 9 | selector: 10 | matchLabels: 11 | app: primuslearning 12 | template: 13 | metadata: 14 | labels: 15 | app: primuslearning 16 | spec: 17 | containers: 18 | - name: primuslearning 19 | image: 274127640471.dkr.ecr.us-east-2.amazonaws.com/primuslearning:1.1 20 | imagePullPolicy: Always 21 | ports: 22 | - containerPort: 8080 -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws_pipeline_web_app", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "aws_pipeline_web_app", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "express": "^4.17.1" 12 | } 13 | }, 14 | "node_modules/accepts": { 15 | "version": "1.3.7", 16 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 17 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 18 | "dependencies": { 19 | "mime-types": "~2.1.24", 20 | "negotiator": "0.6.2" 21 | }, 22 | "engines": { 23 | "node": ">= 0.6" 24 | } 25 | }, 26 | "node_modules/array-flatten": { 27 | "version": "1.1.1", 28 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 29 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 30 | }, 31 | "node_modules/body-parser": { 32 | "version": "1.19.0", 33 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 34 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 35 | "dependencies": { 36 | "bytes": "3.1.0", 37 | "content-type": "~1.0.4", 38 | "debug": "2.6.9", 39 | "depd": "~1.1.2", 40 | "http-errors": "1.7.2", 41 | "iconv-lite": "0.4.24", 42 | "on-finished": "~2.3.0", 43 | "qs": "6.7.0", 44 | "raw-body": "2.4.0", 45 | "type-is": "~1.6.17" 46 | }, 47 | "engines": { 48 | "node": ">= 0.8" 49 | } 50 | }, 51 | "node_modules/bytes": { 52 | "version": "3.1.0", 53 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 54 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 55 | "engines": { 56 | "node": ">= 0.8" 57 | } 58 | }, 59 | "node_modules/content-disposition": { 60 | "version": "0.5.3", 61 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 62 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 63 | "dependencies": { 64 | "safe-buffer": "5.1.2" 65 | }, 66 | "engines": { 67 | "node": ">= 0.6" 68 | } 69 | }, 70 | "node_modules/content-type": { 71 | "version": "1.0.4", 72 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 73 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 74 | "engines": { 75 | "node": ">= 0.6" 76 | } 77 | }, 78 | "node_modules/cookie": { 79 | "version": "0.4.0", 80 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 81 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", 82 | "engines": { 83 | "node": ">= 0.6" 84 | } 85 | }, 86 | "node_modules/cookie-signature": { 87 | "version": "1.0.6", 88 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 89 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 90 | }, 91 | "node_modules/debug": { 92 | "version": "2.6.9", 93 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 94 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 95 | "dependencies": { 96 | "ms": "2.0.0" 97 | } 98 | }, 99 | "node_modules/depd": { 100 | "version": "1.1.2", 101 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 102 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 103 | "engines": { 104 | "node": ">= 0.6" 105 | } 106 | }, 107 | "node_modules/destroy": { 108 | "version": "1.0.4", 109 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 110 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 111 | }, 112 | "node_modules/ee-first": { 113 | "version": "1.1.1", 114 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 115 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 116 | }, 117 | "node_modules/encodeurl": { 118 | "version": "1.0.2", 119 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 120 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 121 | "engines": { 122 | "node": ">= 0.8" 123 | } 124 | }, 125 | "node_modules/escape-html": { 126 | "version": "1.0.3", 127 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 128 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 129 | }, 130 | "node_modules/etag": { 131 | "version": "1.8.1", 132 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 133 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 134 | "engines": { 135 | "node": ">= 0.6" 136 | } 137 | }, 138 | "node_modules/express": { 139 | "version": "4.17.1", 140 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 141 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 142 | "dependencies": { 143 | "accepts": "~1.3.7", 144 | "array-flatten": "1.1.1", 145 | "body-parser": "1.19.0", 146 | "content-disposition": "0.5.3", 147 | "content-type": "~1.0.4", 148 | "cookie": "0.4.0", 149 | "cookie-signature": "1.0.6", 150 | "debug": "2.6.9", 151 | "depd": "~1.1.2", 152 | "encodeurl": "~1.0.2", 153 | "escape-html": "~1.0.3", 154 | "etag": "~1.8.1", 155 | "finalhandler": "~1.1.2", 156 | "fresh": "0.5.2", 157 | "merge-descriptors": "1.0.1", 158 | "methods": "~1.1.2", 159 | "on-finished": "~2.3.0", 160 | "parseurl": "~1.3.3", 161 | "path-to-regexp": "0.1.7", 162 | "proxy-addr": "~2.0.5", 163 | "qs": "6.7.0", 164 | "range-parser": "~1.2.1", 165 | "safe-buffer": "5.1.2", 166 | "send": "0.17.1", 167 | "serve-static": "1.14.1", 168 | "setprototypeof": "1.1.1", 169 | "statuses": "~1.5.0", 170 | "type-is": "~1.6.18", 171 | "utils-merge": "1.0.1", 172 | "vary": "~1.1.2" 173 | }, 174 | "engines": { 175 | "node": ">= 0.10.0" 176 | } 177 | }, 178 | "node_modules/finalhandler": { 179 | "version": "1.1.2", 180 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 181 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 182 | "dependencies": { 183 | "debug": "2.6.9", 184 | "encodeurl": "~1.0.2", 185 | "escape-html": "~1.0.3", 186 | "on-finished": "~2.3.0", 187 | "parseurl": "~1.3.3", 188 | "statuses": "~1.5.0", 189 | "unpipe": "~1.0.0" 190 | }, 191 | "engines": { 192 | "node": ">= 0.8" 193 | } 194 | }, 195 | "node_modules/forwarded": { 196 | "version": "0.2.0", 197 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 198 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 199 | "engines": { 200 | "node": ">= 0.6" 201 | } 202 | }, 203 | "node_modules/fresh": { 204 | "version": "0.5.2", 205 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 206 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 207 | "engines": { 208 | "node": ">= 0.6" 209 | } 210 | }, 211 | "node_modules/http-errors": { 212 | "version": "1.7.2", 213 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 214 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 215 | "dependencies": { 216 | "depd": "~1.1.2", 217 | "inherits": "2.0.3", 218 | "setprototypeof": "1.1.1", 219 | "statuses": ">= 1.5.0 < 2", 220 | "toidentifier": "1.0.0" 221 | }, 222 | "engines": { 223 | "node": ">= 0.6" 224 | } 225 | }, 226 | "node_modules/iconv-lite": { 227 | "version": "0.4.24", 228 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 229 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 230 | "dependencies": { 231 | "safer-buffer": ">= 2.1.2 < 3" 232 | }, 233 | "engines": { 234 | "node": ">=0.10.0" 235 | } 236 | }, 237 | "node_modules/inherits": { 238 | "version": "2.0.3", 239 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 240 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 241 | }, 242 | "node_modules/ipaddr.js": { 243 | "version": "1.9.1", 244 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 245 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 246 | "engines": { 247 | "node": ">= 0.10" 248 | } 249 | }, 250 | "node_modules/media-typer": { 251 | "version": "0.3.0", 252 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 253 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 254 | "engines": { 255 | "node": ">= 0.6" 256 | } 257 | }, 258 | "node_modules/merge-descriptors": { 259 | "version": "1.0.1", 260 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 261 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 262 | }, 263 | "node_modules/methods": { 264 | "version": "1.1.2", 265 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 266 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 267 | "engines": { 268 | "node": ">= 0.6" 269 | } 270 | }, 271 | "node_modules/mime": { 272 | "version": "1.6.0", 273 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 274 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 275 | "bin": { 276 | "mime": "cli.js" 277 | }, 278 | "engines": { 279 | "node": ">=4" 280 | } 281 | }, 282 | "node_modules/mime-db": { 283 | "version": "1.48.0", 284 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 285 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", 286 | "engines": { 287 | "node": ">= 0.6" 288 | } 289 | }, 290 | "node_modules/mime-types": { 291 | "version": "2.1.31", 292 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", 293 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", 294 | "dependencies": { 295 | "mime-db": "1.48.0" 296 | }, 297 | "engines": { 298 | "node": ">= 0.6" 299 | } 300 | }, 301 | "node_modules/ms": { 302 | "version": "2.0.0", 303 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 304 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 305 | }, 306 | "node_modules/negotiator": { 307 | "version": "0.6.2", 308 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 309 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 310 | "engines": { 311 | "node": ">= 0.6" 312 | } 313 | }, 314 | "node_modules/on-finished": { 315 | "version": "2.3.0", 316 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 317 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 318 | "dependencies": { 319 | "ee-first": "1.1.1" 320 | }, 321 | "engines": { 322 | "node": ">= 0.8" 323 | } 324 | }, 325 | "node_modules/parseurl": { 326 | "version": "1.3.3", 327 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 328 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 329 | "engines": { 330 | "node": ">= 0.8" 331 | } 332 | }, 333 | "node_modules/path-to-regexp": { 334 | "version": "0.1.7", 335 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 336 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 337 | }, 338 | "node_modules/proxy-addr": { 339 | "version": "2.0.7", 340 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 341 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 342 | "dependencies": { 343 | "forwarded": "0.2.0", 344 | "ipaddr.js": "1.9.1" 345 | }, 346 | "engines": { 347 | "node": ">= 0.10" 348 | } 349 | }, 350 | "node_modules/qs": { 351 | "version": "6.7.0", 352 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 353 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 354 | "engines": { 355 | "node": ">=0.6" 356 | } 357 | }, 358 | "node_modules/range-parser": { 359 | "version": "1.2.1", 360 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 361 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 362 | "engines": { 363 | "node": ">= 0.6" 364 | } 365 | }, 366 | "node_modules/raw-body": { 367 | "version": "2.4.0", 368 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 369 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 370 | "dependencies": { 371 | "bytes": "3.1.0", 372 | "http-errors": "1.7.2", 373 | "iconv-lite": "0.4.24", 374 | "unpipe": "1.0.0" 375 | }, 376 | "engines": { 377 | "node": ">= 0.8" 378 | } 379 | }, 380 | "node_modules/safe-buffer": { 381 | "version": "5.1.2", 382 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 383 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 384 | }, 385 | "node_modules/safer-buffer": { 386 | "version": "2.1.2", 387 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 388 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 389 | }, 390 | "node_modules/send": { 391 | "version": "0.17.1", 392 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 393 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 394 | "dependencies": { 395 | "debug": "2.6.9", 396 | "depd": "~1.1.2", 397 | "destroy": "~1.0.4", 398 | "encodeurl": "~1.0.2", 399 | "escape-html": "~1.0.3", 400 | "etag": "~1.8.1", 401 | "fresh": "0.5.2", 402 | "http-errors": "~1.7.2", 403 | "mime": "1.6.0", 404 | "ms": "2.1.1", 405 | "on-finished": "~2.3.0", 406 | "range-parser": "~1.2.1", 407 | "statuses": "~1.5.0" 408 | }, 409 | "engines": { 410 | "node": ">= 0.8.0" 411 | } 412 | }, 413 | "node_modules/send/node_modules/ms": { 414 | "version": "2.1.1", 415 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 416 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 417 | }, 418 | "node_modules/serve-static": { 419 | "version": "1.14.1", 420 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 421 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 422 | "dependencies": { 423 | "encodeurl": "~1.0.2", 424 | "escape-html": "~1.0.3", 425 | "parseurl": "~1.3.3", 426 | "send": "0.17.1" 427 | }, 428 | "engines": { 429 | "node": ">= 0.8.0" 430 | } 431 | }, 432 | "node_modules/setprototypeof": { 433 | "version": "1.1.1", 434 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 435 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 436 | }, 437 | "node_modules/statuses": { 438 | "version": "1.5.0", 439 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 440 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 441 | "engines": { 442 | "node": ">= 0.6" 443 | } 444 | }, 445 | "node_modules/toidentifier": { 446 | "version": "1.0.0", 447 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 448 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 449 | "engines": { 450 | "node": ">=0.6" 451 | } 452 | }, 453 | "node_modules/type-is": { 454 | "version": "1.6.18", 455 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 456 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 457 | "dependencies": { 458 | "media-typer": "0.3.0", 459 | "mime-types": "~2.1.24" 460 | }, 461 | "engines": { 462 | "node": ">= 0.6" 463 | } 464 | }, 465 | "node_modules/unpipe": { 466 | "version": "1.0.0", 467 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 468 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 469 | "engines": { 470 | "node": ">= 0.8" 471 | } 472 | }, 473 | "node_modules/utils-merge": { 474 | "version": "1.0.1", 475 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 476 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 477 | "engines": { 478 | "node": ">= 0.4.0" 479 | } 480 | }, 481 | "node_modules/vary": { 482 | "version": "1.1.2", 483 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 484 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 485 | "engines": { 486 | "node": ">= 0.8" 487 | } 488 | } 489 | }, 490 | "dependencies": { 491 | "accepts": { 492 | "version": "1.3.7", 493 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 494 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 495 | "requires": { 496 | "mime-types": "~2.1.24", 497 | "negotiator": "0.6.2" 498 | } 499 | }, 500 | "array-flatten": { 501 | "version": "1.1.1", 502 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 503 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 504 | }, 505 | "body-parser": { 506 | "version": "1.19.0", 507 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 508 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 509 | "requires": { 510 | "bytes": "3.1.0", 511 | "content-type": "~1.0.4", 512 | "debug": "2.6.9", 513 | "depd": "~1.1.2", 514 | "http-errors": "1.7.2", 515 | "iconv-lite": "0.4.24", 516 | "on-finished": "~2.3.0", 517 | "qs": "6.7.0", 518 | "raw-body": "2.4.0", 519 | "type-is": "~1.6.17" 520 | } 521 | }, 522 | "bytes": { 523 | "version": "3.1.0", 524 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 525 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 526 | }, 527 | "content-disposition": { 528 | "version": "0.5.3", 529 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 530 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 531 | "requires": { 532 | "safe-buffer": "5.1.2" 533 | } 534 | }, 535 | "content-type": { 536 | "version": "1.0.4", 537 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 538 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 539 | }, 540 | "cookie": { 541 | "version": "0.4.0", 542 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 543 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 544 | }, 545 | "cookie-signature": { 546 | "version": "1.0.6", 547 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 548 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 549 | }, 550 | "debug": { 551 | "version": "2.6.9", 552 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 553 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 554 | "requires": { 555 | "ms": "2.0.0" 556 | } 557 | }, 558 | "depd": { 559 | "version": "1.1.2", 560 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 561 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 562 | }, 563 | "destroy": { 564 | "version": "1.0.4", 565 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 566 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 567 | }, 568 | "ee-first": { 569 | "version": "1.1.1", 570 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 571 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 572 | }, 573 | "encodeurl": { 574 | "version": "1.0.2", 575 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 576 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 577 | }, 578 | "escape-html": { 579 | "version": "1.0.3", 580 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 581 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 582 | }, 583 | "etag": { 584 | "version": "1.8.1", 585 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 586 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 587 | }, 588 | "express": { 589 | "version": "4.17.1", 590 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 591 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 592 | "requires": { 593 | "accepts": "~1.3.7", 594 | "array-flatten": "1.1.1", 595 | "body-parser": "1.19.0", 596 | "content-disposition": "0.5.3", 597 | "content-type": "~1.0.4", 598 | "cookie": "0.4.0", 599 | "cookie-signature": "1.0.6", 600 | "debug": "2.6.9", 601 | "depd": "~1.1.2", 602 | "encodeurl": "~1.0.2", 603 | "escape-html": "~1.0.3", 604 | "etag": "~1.8.1", 605 | "finalhandler": "~1.1.2", 606 | "fresh": "0.5.2", 607 | "merge-descriptors": "1.0.1", 608 | "methods": "~1.1.2", 609 | "on-finished": "~2.3.0", 610 | "parseurl": "~1.3.3", 611 | "path-to-regexp": "0.1.7", 612 | "proxy-addr": "~2.0.5", 613 | "qs": "6.7.0", 614 | "range-parser": "~1.2.1", 615 | "safe-buffer": "5.1.2", 616 | "send": "0.17.1", 617 | "serve-static": "1.14.1", 618 | "setprototypeof": "1.1.1", 619 | "statuses": "~1.5.0", 620 | "type-is": "~1.6.18", 621 | "utils-merge": "1.0.1", 622 | "vary": "~1.1.2" 623 | } 624 | }, 625 | "finalhandler": { 626 | "version": "1.1.2", 627 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 628 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 629 | "requires": { 630 | "debug": "2.6.9", 631 | "encodeurl": "~1.0.2", 632 | "escape-html": "~1.0.3", 633 | "on-finished": "~2.3.0", 634 | "parseurl": "~1.3.3", 635 | "statuses": "~1.5.0", 636 | "unpipe": "~1.0.0" 637 | } 638 | }, 639 | "forwarded": { 640 | "version": "0.2.0", 641 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 642 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 643 | }, 644 | "fresh": { 645 | "version": "0.5.2", 646 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 647 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 648 | }, 649 | "http-errors": { 650 | "version": "1.7.2", 651 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 652 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 653 | "requires": { 654 | "depd": "~1.1.2", 655 | "inherits": "2.0.3", 656 | "setprototypeof": "1.1.1", 657 | "statuses": ">= 1.5.0 < 2", 658 | "toidentifier": "1.0.0" 659 | } 660 | }, 661 | "iconv-lite": { 662 | "version": "0.4.24", 663 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 664 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 665 | "requires": { 666 | "safer-buffer": ">= 2.1.2 < 3" 667 | } 668 | }, 669 | "inherits": { 670 | "version": "2.0.3", 671 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 672 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 673 | }, 674 | "ipaddr.js": { 675 | "version": "1.9.1", 676 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 677 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 678 | }, 679 | "media-typer": { 680 | "version": "0.3.0", 681 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 682 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 683 | }, 684 | "merge-descriptors": { 685 | "version": "1.0.1", 686 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 687 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 688 | }, 689 | "methods": { 690 | "version": "1.1.2", 691 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 692 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 693 | }, 694 | "mime": { 695 | "version": "1.6.0", 696 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 697 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 698 | }, 699 | "mime-db": { 700 | "version": "1.48.0", 701 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 702 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" 703 | }, 704 | "mime-types": { 705 | "version": "2.1.31", 706 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", 707 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", 708 | "requires": { 709 | "mime-db": "1.48.0" 710 | } 711 | }, 712 | "ms": { 713 | "version": "2.0.0", 714 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 715 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 716 | }, 717 | "negotiator": { 718 | "version": "0.6.2", 719 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 720 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 721 | }, 722 | "on-finished": { 723 | "version": "2.3.0", 724 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 725 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 726 | "requires": { 727 | "ee-first": "1.1.1" 728 | } 729 | }, 730 | "parseurl": { 731 | "version": "1.3.3", 732 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 733 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 734 | }, 735 | "path-to-regexp": { 736 | "version": "0.1.7", 737 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 738 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 739 | }, 740 | "proxy-addr": { 741 | "version": "2.0.7", 742 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 743 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 744 | "requires": { 745 | "forwarded": "0.2.0", 746 | "ipaddr.js": "1.9.1" 747 | } 748 | }, 749 | "qs": { 750 | "version": "6.7.0", 751 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 752 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 753 | }, 754 | "range-parser": { 755 | "version": "1.2.1", 756 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 757 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 758 | }, 759 | "raw-body": { 760 | "version": "2.4.0", 761 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 762 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 763 | "requires": { 764 | "bytes": "3.1.0", 765 | "http-errors": "1.7.2", 766 | "iconv-lite": "0.4.24", 767 | "unpipe": "1.0.0" 768 | } 769 | }, 770 | "safe-buffer": { 771 | "version": "5.1.2", 772 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 773 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 774 | }, 775 | "safer-buffer": { 776 | "version": "2.1.2", 777 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 778 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 779 | }, 780 | "send": { 781 | "version": "0.17.1", 782 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 783 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 784 | "requires": { 785 | "debug": "2.6.9", 786 | "depd": "~1.1.2", 787 | "destroy": "~1.0.4", 788 | "encodeurl": "~1.0.2", 789 | "escape-html": "~1.0.3", 790 | "etag": "~1.8.1", 791 | "fresh": "0.5.2", 792 | "http-errors": "~1.7.2", 793 | "mime": "1.6.0", 794 | "ms": "2.1.1", 795 | "on-finished": "~2.3.0", 796 | "range-parser": "~1.2.1", 797 | "statuses": "~1.5.0" 798 | }, 799 | "dependencies": { 800 | "ms": { 801 | "version": "2.1.1", 802 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 803 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 804 | } 805 | } 806 | }, 807 | "serve-static": { 808 | "version": "1.14.1", 809 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 810 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 811 | "requires": { 812 | "encodeurl": "~1.0.2", 813 | "escape-html": "~1.0.3", 814 | "parseurl": "~1.3.3", 815 | "send": "0.17.1" 816 | } 817 | }, 818 | "setprototypeof": { 819 | "version": "1.1.1", 820 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 821 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 822 | }, 823 | "statuses": { 824 | "version": "1.5.0", 825 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 826 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 827 | }, 828 | "toidentifier": { 829 | "version": "1.0.0", 830 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 831 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 832 | }, 833 | "type-is": { 834 | "version": "1.6.18", 835 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 836 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 837 | "requires": { 838 | "media-typer": "0.3.0", 839 | "mime-types": "~2.1.24" 840 | } 841 | }, 842 | "unpipe": { 843 | "version": "1.0.0", 844 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 845 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 846 | }, 847 | "utils-merge": { 848 | "version": "1.0.1", 849 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 850 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 851 | }, 852 | "vary": { 853 | "version": "1.1.2", 854 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 855 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 856 | } 857 | } 858 | } 859 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws_pipeline_web_app", 3 | "version": "1.0.0", 4 | "description": "Node.js on Docker", 5 | "author": "Ivan Polovyi ", 6 | "main": "server.js", 7 | "scripts": { 8 | "start": "node server.js" 9 | }, 10 | "dependencies": { 11 | "express": "^4.17.1" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // before rum 2 | //npm install express 3 | 4 | // to run 5 | // npm start 6 | 7 | 'use strict'; 8 | 9 | const express = require('express'); 10 | 11 | // Constants 12 | const PORT = 8080; 13 | const HOST = '0.0.0.0'; 14 | const OS = require('os'); 15 | const ENV = 'DEV'; 16 | 17 | 18 | // App 19 | const app = express(); 20 | app.get('/', (req, res) => { 21 | res.statusCode = 200; 22 | const msg = 'Hello from from Primus Learning, this was awesome'; 23 | res.send(getPage(msg)); 24 | }); 25 | 26 | app.get('/test', (req, res) => { 27 | res.statusCode = 200; 28 | const msg = 'Hello from /test Node!'; 29 | res.send(getPage(msg)); 30 | }); 31 | 32 | app.listen(PORT, HOST); 33 | console.log(`Running on http://${HOST}:${PORT}`); 34 | 35 | function getPage(message) { 36 | 37 | let body = "\n" 38 | + "\n" 39 | + "\n" 81 | + "\n" 82 | + "\n" 83 | + "
\n" 84 | + "
\n" 85 | + "

ENVIRONMENT: " + ENV + "

\n" 86 | + "
\n" 87 | + "
\n" 88 | + "

Host/container name

\n" 89 | + "
\n" 90 | + "

" + OS.hostname() + "

\n" 91 | + "
\n" 92 | + "
\n" 93 | + "

" + message + "

\n" 94 | + "
\n" 95 | + "
\n" 96 | + "\n" 97 | + "\n" 98 | + "\n"; 99 | return body; 100 | } 101 | -------------------------------------------------------------------------------- /service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: primuslearning 5 | spec: 6 | selector: 7 | app: primuslearning 8 | ports: 9 | - protocol: TCP 10 | port: 80 11 | targetPort: 8080 12 | type: LoadBalancer --------------------------------------------------------------------------------