├── README.md ├── deployment.yaml ├── k8s-web-hello ├── Dockerfile ├── index.mjs ├── package-lock.json └── package.json ├── k8s-web-to-nginx.yaml ├── k8s-web-to-nginx ├── Dockerfile ├── index.mjs ├── package-lock.json └── package.json ├── nginx.yaml └── service.yaml /README.md: -------------------------------------------------------------------------------- 1 | # Git repository for the Kubernetes Course 2 | 3 | ## How to clone repository 4 | ```git clone https://github.com/bstashchuk/k8s.git``` 5 | -------------------------------------------------------------------------------- /deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: k8s-web-hello 5 | spec: 6 | replicas: 5 7 | selector: 8 | matchLabels: 9 | app: k8s-web-hello 10 | template: 11 | metadata: 12 | labels: 13 | app: k8s-web-hello 14 | spec: 15 | containers: 16 | - name: k8s-web-hello 17 | image: bstashchuk/k8s-web-hello 18 | resources: 19 | limits: 20 | memory: "128Mi" 21 | cpu: "250m" 22 | ports: 23 | - containerPort: 3000 24 | -------------------------------------------------------------------------------- /k8s-web-hello/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM --platform=linux/amd64 node:alpine 2 | 3 | WORKDIR /app 4 | 5 | EXPOSE 3000 6 | 7 | COPY package.json package-lock.json ./ 8 | 9 | RUN npm install 10 | 11 | COPY . ./ 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /k8s-web-hello/index.mjs: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import os from 'os' 3 | 4 | const app = express() 5 | const PORT = 3000 6 | 7 | app.get("/", (req, res) => { 8 | const helloMessage = `

VERSION 2: Hello from the ${os.hostname()}

` 9 | console.log(helloMessage) 10 | res.send(helloMessage) 11 | }) 12 | 13 | app.listen(PORT, () => { 14 | console.log(`Web server is listening at port ${PORT}`) 15 | }) 16 | -------------------------------------------------------------------------------- /k8s-web-hello/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "k8s-web-hello", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "k8s-web-hello", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.17.2" 13 | } 14 | }, 15 | "node_modules/accepts": { 16 | "version": "1.3.7", 17 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 18 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 19 | "dependencies": { 20 | "mime-types": "~2.1.24", 21 | "negotiator": "0.6.2" 22 | }, 23 | "engines": { 24 | "node": ">= 0.6" 25 | } 26 | }, 27 | "node_modules/array-flatten": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 30 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 31 | }, 32 | "node_modules/body-parser": { 33 | "version": "1.19.1", 34 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 35 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 36 | "dependencies": { 37 | "bytes": "3.1.1", 38 | "content-type": "~1.0.4", 39 | "debug": "2.6.9", 40 | "depd": "~1.1.2", 41 | "http-errors": "1.8.1", 42 | "iconv-lite": "0.4.24", 43 | "on-finished": "~2.3.0", 44 | "qs": "6.9.6", 45 | "raw-body": "2.4.2", 46 | "type-is": "~1.6.18" 47 | }, 48 | "engines": { 49 | "node": ">= 0.8" 50 | } 51 | }, 52 | "node_modules/bytes": { 53 | "version": "3.1.1", 54 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 55 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", 56 | "engines": { 57 | "node": ">= 0.8" 58 | } 59 | }, 60 | "node_modules/content-disposition": { 61 | "version": "0.5.4", 62 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 63 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 64 | "dependencies": { 65 | "safe-buffer": "5.2.1" 66 | }, 67 | "engines": { 68 | "node": ">= 0.6" 69 | } 70 | }, 71 | "node_modules/content-type": { 72 | "version": "1.0.4", 73 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 74 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 75 | "engines": { 76 | "node": ">= 0.6" 77 | } 78 | }, 79 | "node_modules/cookie": { 80 | "version": "0.4.1", 81 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 82 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 83 | "engines": { 84 | "node": ">= 0.6" 85 | } 86 | }, 87 | "node_modules/cookie-signature": { 88 | "version": "1.0.6", 89 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 90 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 91 | }, 92 | "node_modules/debug": { 93 | "version": "2.6.9", 94 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 95 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 96 | "dependencies": { 97 | "ms": "2.0.0" 98 | } 99 | }, 100 | "node_modules/depd": { 101 | "version": "1.1.2", 102 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 103 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 104 | "engines": { 105 | "node": ">= 0.6" 106 | } 107 | }, 108 | "node_modules/destroy": { 109 | "version": "1.0.4", 110 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 111 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 112 | }, 113 | "node_modules/ee-first": { 114 | "version": "1.1.1", 115 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 116 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 117 | }, 118 | "node_modules/encodeurl": { 119 | "version": "1.0.2", 120 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 121 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 122 | "engines": { 123 | "node": ">= 0.8" 124 | } 125 | }, 126 | "node_modules/escape-html": { 127 | "version": "1.0.3", 128 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 129 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 130 | }, 131 | "node_modules/etag": { 132 | "version": "1.8.1", 133 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 134 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 135 | "engines": { 136 | "node": ">= 0.6" 137 | } 138 | }, 139 | "node_modules/express": { 140 | "version": "4.17.2", 141 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 142 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 143 | "dependencies": { 144 | "accepts": "~1.3.7", 145 | "array-flatten": "1.1.1", 146 | "body-parser": "1.19.1", 147 | "content-disposition": "0.5.4", 148 | "content-type": "~1.0.4", 149 | "cookie": "0.4.1", 150 | "cookie-signature": "1.0.6", 151 | "debug": "2.6.9", 152 | "depd": "~1.1.2", 153 | "encodeurl": "~1.0.2", 154 | "escape-html": "~1.0.3", 155 | "etag": "~1.8.1", 156 | "finalhandler": "~1.1.2", 157 | "fresh": "0.5.2", 158 | "merge-descriptors": "1.0.1", 159 | "methods": "~1.1.2", 160 | "on-finished": "~2.3.0", 161 | "parseurl": "~1.3.3", 162 | "path-to-regexp": "0.1.7", 163 | "proxy-addr": "~2.0.7", 164 | "qs": "6.9.6", 165 | "range-parser": "~1.2.1", 166 | "safe-buffer": "5.2.1", 167 | "send": "0.17.2", 168 | "serve-static": "1.14.2", 169 | "setprototypeof": "1.2.0", 170 | "statuses": "~1.5.0", 171 | "type-is": "~1.6.18", 172 | "utils-merge": "1.0.1", 173 | "vary": "~1.1.2" 174 | }, 175 | "engines": { 176 | "node": ">= 0.10.0" 177 | } 178 | }, 179 | "node_modules/finalhandler": { 180 | "version": "1.1.2", 181 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 182 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 183 | "dependencies": { 184 | "debug": "2.6.9", 185 | "encodeurl": "~1.0.2", 186 | "escape-html": "~1.0.3", 187 | "on-finished": "~2.3.0", 188 | "parseurl": "~1.3.3", 189 | "statuses": "~1.5.0", 190 | "unpipe": "~1.0.0" 191 | }, 192 | "engines": { 193 | "node": ">= 0.8" 194 | } 195 | }, 196 | "node_modules/forwarded": { 197 | "version": "0.2.0", 198 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 199 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 200 | "engines": { 201 | "node": ">= 0.6" 202 | } 203 | }, 204 | "node_modules/fresh": { 205 | "version": "0.5.2", 206 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 207 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 208 | "engines": { 209 | "node": ">= 0.6" 210 | } 211 | }, 212 | "node_modules/http-errors": { 213 | "version": "1.8.1", 214 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 215 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 216 | "dependencies": { 217 | "depd": "~1.1.2", 218 | "inherits": "2.0.4", 219 | "setprototypeof": "1.2.0", 220 | "statuses": ">= 1.5.0 < 2", 221 | "toidentifier": "1.0.1" 222 | }, 223 | "engines": { 224 | "node": ">= 0.6" 225 | } 226 | }, 227 | "node_modules/iconv-lite": { 228 | "version": "0.4.24", 229 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 230 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 231 | "dependencies": { 232 | "safer-buffer": ">= 2.1.2 < 3" 233 | }, 234 | "engines": { 235 | "node": ">=0.10.0" 236 | } 237 | }, 238 | "node_modules/inherits": { 239 | "version": "2.0.4", 240 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 241 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 242 | }, 243 | "node_modules/ipaddr.js": { 244 | "version": "1.9.1", 245 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 246 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 247 | "engines": { 248 | "node": ">= 0.10" 249 | } 250 | }, 251 | "node_modules/media-typer": { 252 | "version": "0.3.0", 253 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 254 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 255 | "engines": { 256 | "node": ">= 0.6" 257 | } 258 | }, 259 | "node_modules/merge-descriptors": { 260 | "version": "1.0.1", 261 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 262 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 263 | }, 264 | "node_modules/methods": { 265 | "version": "1.1.2", 266 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 267 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 268 | "engines": { 269 | "node": ">= 0.6" 270 | } 271 | }, 272 | "node_modules/mime": { 273 | "version": "1.6.0", 274 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 275 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 276 | "bin": { 277 | "mime": "cli.js" 278 | }, 279 | "engines": { 280 | "node": ">=4" 281 | } 282 | }, 283 | "node_modules/mime-db": { 284 | "version": "1.51.0", 285 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 286 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 287 | "engines": { 288 | "node": ">= 0.6" 289 | } 290 | }, 291 | "node_modules/mime-types": { 292 | "version": "2.1.34", 293 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 294 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 295 | "dependencies": { 296 | "mime-db": "1.51.0" 297 | }, 298 | "engines": { 299 | "node": ">= 0.6" 300 | } 301 | }, 302 | "node_modules/ms": { 303 | "version": "2.0.0", 304 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 305 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 306 | }, 307 | "node_modules/negotiator": { 308 | "version": "0.6.2", 309 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 310 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 311 | "engines": { 312 | "node": ">= 0.6" 313 | } 314 | }, 315 | "node_modules/on-finished": { 316 | "version": "2.3.0", 317 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 318 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 319 | "dependencies": { 320 | "ee-first": "1.1.1" 321 | }, 322 | "engines": { 323 | "node": ">= 0.8" 324 | } 325 | }, 326 | "node_modules/parseurl": { 327 | "version": "1.3.3", 328 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 329 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 330 | "engines": { 331 | "node": ">= 0.8" 332 | } 333 | }, 334 | "node_modules/path-to-regexp": { 335 | "version": "0.1.7", 336 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 337 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 338 | }, 339 | "node_modules/proxy-addr": { 340 | "version": "2.0.7", 341 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 342 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 343 | "dependencies": { 344 | "forwarded": "0.2.0", 345 | "ipaddr.js": "1.9.1" 346 | }, 347 | "engines": { 348 | "node": ">= 0.10" 349 | } 350 | }, 351 | "node_modules/qs": { 352 | "version": "6.9.6", 353 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 354 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", 355 | "engines": { 356 | "node": ">=0.6" 357 | }, 358 | "funding": { 359 | "url": "https://github.com/sponsors/ljharb" 360 | } 361 | }, 362 | "node_modules/range-parser": { 363 | "version": "1.2.1", 364 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 365 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 366 | "engines": { 367 | "node": ">= 0.6" 368 | } 369 | }, 370 | "node_modules/raw-body": { 371 | "version": "2.4.2", 372 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 373 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 374 | "dependencies": { 375 | "bytes": "3.1.1", 376 | "http-errors": "1.8.1", 377 | "iconv-lite": "0.4.24", 378 | "unpipe": "1.0.0" 379 | }, 380 | "engines": { 381 | "node": ">= 0.8" 382 | } 383 | }, 384 | "node_modules/safe-buffer": { 385 | "version": "5.2.1", 386 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 387 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 388 | "funding": [ 389 | { 390 | "type": "github", 391 | "url": "https://github.com/sponsors/feross" 392 | }, 393 | { 394 | "type": "patreon", 395 | "url": "https://www.patreon.com/feross" 396 | }, 397 | { 398 | "type": "consulting", 399 | "url": "https://feross.org/support" 400 | } 401 | ] 402 | }, 403 | "node_modules/safer-buffer": { 404 | "version": "2.1.2", 405 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 406 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 407 | }, 408 | "node_modules/send": { 409 | "version": "0.17.2", 410 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 411 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 412 | "dependencies": { 413 | "debug": "2.6.9", 414 | "depd": "~1.1.2", 415 | "destroy": "~1.0.4", 416 | "encodeurl": "~1.0.2", 417 | "escape-html": "~1.0.3", 418 | "etag": "~1.8.1", 419 | "fresh": "0.5.2", 420 | "http-errors": "1.8.1", 421 | "mime": "1.6.0", 422 | "ms": "2.1.3", 423 | "on-finished": "~2.3.0", 424 | "range-parser": "~1.2.1", 425 | "statuses": "~1.5.0" 426 | }, 427 | "engines": { 428 | "node": ">= 0.8.0" 429 | } 430 | }, 431 | "node_modules/send/node_modules/ms": { 432 | "version": "2.1.3", 433 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 434 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 435 | }, 436 | "node_modules/serve-static": { 437 | "version": "1.14.2", 438 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 439 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 440 | "dependencies": { 441 | "encodeurl": "~1.0.2", 442 | "escape-html": "~1.0.3", 443 | "parseurl": "~1.3.3", 444 | "send": "0.17.2" 445 | }, 446 | "engines": { 447 | "node": ">= 0.8.0" 448 | } 449 | }, 450 | "node_modules/setprototypeof": { 451 | "version": "1.2.0", 452 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 453 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 454 | }, 455 | "node_modules/statuses": { 456 | "version": "1.5.0", 457 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 458 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 459 | "engines": { 460 | "node": ">= 0.6" 461 | } 462 | }, 463 | "node_modules/toidentifier": { 464 | "version": "1.0.1", 465 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 466 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 467 | "engines": { 468 | "node": ">=0.6" 469 | } 470 | }, 471 | "node_modules/type-is": { 472 | "version": "1.6.18", 473 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 474 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 475 | "dependencies": { 476 | "media-typer": "0.3.0", 477 | "mime-types": "~2.1.24" 478 | }, 479 | "engines": { 480 | "node": ">= 0.6" 481 | } 482 | }, 483 | "node_modules/unpipe": { 484 | "version": "1.0.0", 485 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 486 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 487 | "engines": { 488 | "node": ">= 0.8" 489 | } 490 | }, 491 | "node_modules/utils-merge": { 492 | "version": "1.0.1", 493 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 494 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 495 | "engines": { 496 | "node": ">= 0.4.0" 497 | } 498 | }, 499 | "node_modules/vary": { 500 | "version": "1.1.2", 501 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 502 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 503 | "engines": { 504 | "node": ">= 0.8" 505 | } 506 | } 507 | }, 508 | "dependencies": { 509 | "accepts": { 510 | "version": "1.3.7", 511 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 512 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 513 | "requires": { 514 | "mime-types": "~2.1.24", 515 | "negotiator": "0.6.2" 516 | } 517 | }, 518 | "array-flatten": { 519 | "version": "1.1.1", 520 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 521 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 522 | }, 523 | "body-parser": { 524 | "version": "1.19.1", 525 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 526 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 527 | "requires": { 528 | "bytes": "3.1.1", 529 | "content-type": "~1.0.4", 530 | "debug": "2.6.9", 531 | "depd": "~1.1.2", 532 | "http-errors": "1.8.1", 533 | "iconv-lite": "0.4.24", 534 | "on-finished": "~2.3.0", 535 | "qs": "6.9.6", 536 | "raw-body": "2.4.2", 537 | "type-is": "~1.6.18" 538 | } 539 | }, 540 | "bytes": { 541 | "version": "3.1.1", 542 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 543 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" 544 | }, 545 | "content-disposition": { 546 | "version": "0.5.4", 547 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 548 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 549 | "requires": { 550 | "safe-buffer": "5.2.1" 551 | } 552 | }, 553 | "content-type": { 554 | "version": "1.0.4", 555 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 556 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 557 | }, 558 | "cookie": { 559 | "version": "0.4.1", 560 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 561 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 562 | }, 563 | "cookie-signature": { 564 | "version": "1.0.6", 565 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 566 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 567 | }, 568 | "debug": { 569 | "version": "2.6.9", 570 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 571 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 572 | "requires": { 573 | "ms": "2.0.0" 574 | } 575 | }, 576 | "depd": { 577 | "version": "1.1.2", 578 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 579 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 580 | }, 581 | "destroy": { 582 | "version": "1.0.4", 583 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 584 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 585 | }, 586 | "ee-first": { 587 | "version": "1.1.1", 588 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 589 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 590 | }, 591 | "encodeurl": { 592 | "version": "1.0.2", 593 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 594 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 595 | }, 596 | "escape-html": { 597 | "version": "1.0.3", 598 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 599 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 600 | }, 601 | "etag": { 602 | "version": "1.8.1", 603 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 604 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 605 | }, 606 | "express": { 607 | "version": "4.17.2", 608 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 609 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 610 | "requires": { 611 | "accepts": "~1.3.7", 612 | "array-flatten": "1.1.1", 613 | "body-parser": "1.19.1", 614 | "content-disposition": "0.5.4", 615 | "content-type": "~1.0.4", 616 | "cookie": "0.4.1", 617 | "cookie-signature": "1.0.6", 618 | "debug": "2.6.9", 619 | "depd": "~1.1.2", 620 | "encodeurl": "~1.0.2", 621 | "escape-html": "~1.0.3", 622 | "etag": "~1.8.1", 623 | "finalhandler": "~1.1.2", 624 | "fresh": "0.5.2", 625 | "merge-descriptors": "1.0.1", 626 | "methods": "~1.1.2", 627 | "on-finished": "~2.3.0", 628 | "parseurl": "~1.3.3", 629 | "path-to-regexp": "0.1.7", 630 | "proxy-addr": "~2.0.7", 631 | "qs": "6.9.6", 632 | "range-parser": "~1.2.1", 633 | "safe-buffer": "5.2.1", 634 | "send": "0.17.2", 635 | "serve-static": "1.14.2", 636 | "setprototypeof": "1.2.0", 637 | "statuses": "~1.5.0", 638 | "type-is": "~1.6.18", 639 | "utils-merge": "1.0.1", 640 | "vary": "~1.1.2" 641 | } 642 | }, 643 | "finalhandler": { 644 | "version": "1.1.2", 645 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 646 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 647 | "requires": { 648 | "debug": "2.6.9", 649 | "encodeurl": "~1.0.2", 650 | "escape-html": "~1.0.3", 651 | "on-finished": "~2.3.0", 652 | "parseurl": "~1.3.3", 653 | "statuses": "~1.5.0", 654 | "unpipe": "~1.0.0" 655 | } 656 | }, 657 | "forwarded": { 658 | "version": "0.2.0", 659 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 660 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 661 | }, 662 | "fresh": { 663 | "version": "0.5.2", 664 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 665 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 666 | }, 667 | "http-errors": { 668 | "version": "1.8.1", 669 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 670 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 671 | "requires": { 672 | "depd": "~1.1.2", 673 | "inherits": "2.0.4", 674 | "setprototypeof": "1.2.0", 675 | "statuses": ">= 1.5.0 < 2", 676 | "toidentifier": "1.0.1" 677 | } 678 | }, 679 | "iconv-lite": { 680 | "version": "0.4.24", 681 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 682 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 683 | "requires": { 684 | "safer-buffer": ">= 2.1.2 < 3" 685 | } 686 | }, 687 | "inherits": { 688 | "version": "2.0.4", 689 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 690 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 691 | }, 692 | "ipaddr.js": { 693 | "version": "1.9.1", 694 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 695 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 696 | }, 697 | "media-typer": { 698 | "version": "0.3.0", 699 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 700 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 701 | }, 702 | "merge-descriptors": { 703 | "version": "1.0.1", 704 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 705 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 706 | }, 707 | "methods": { 708 | "version": "1.1.2", 709 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 710 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 711 | }, 712 | "mime": { 713 | "version": "1.6.0", 714 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 715 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 716 | }, 717 | "mime-db": { 718 | "version": "1.51.0", 719 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 720 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 721 | }, 722 | "mime-types": { 723 | "version": "2.1.34", 724 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 725 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 726 | "requires": { 727 | "mime-db": "1.51.0" 728 | } 729 | }, 730 | "ms": { 731 | "version": "2.0.0", 732 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 733 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 734 | }, 735 | "negotiator": { 736 | "version": "0.6.2", 737 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 738 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 739 | }, 740 | "on-finished": { 741 | "version": "2.3.0", 742 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 743 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 744 | "requires": { 745 | "ee-first": "1.1.1" 746 | } 747 | }, 748 | "parseurl": { 749 | "version": "1.3.3", 750 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 751 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 752 | }, 753 | "path-to-regexp": { 754 | "version": "0.1.7", 755 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 756 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 757 | }, 758 | "proxy-addr": { 759 | "version": "2.0.7", 760 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 761 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 762 | "requires": { 763 | "forwarded": "0.2.0", 764 | "ipaddr.js": "1.9.1" 765 | } 766 | }, 767 | "qs": { 768 | "version": "6.9.6", 769 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 770 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" 771 | }, 772 | "range-parser": { 773 | "version": "1.2.1", 774 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 775 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 776 | }, 777 | "raw-body": { 778 | "version": "2.4.2", 779 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 780 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 781 | "requires": { 782 | "bytes": "3.1.1", 783 | "http-errors": "1.8.1", 784 | "iconv-lite": "0.4.24", 785 | "unpipe": "1.0.0" 786 | } 787 | }, 788 | "safe-buffer": { 789 | "version": "5.2.1", 790 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 791 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 792 | }, 793 | "safer-buffer": { 794 | "version": "2.1.2", 795 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 796 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 797 | }, 798 | "send": { 799 | "version": "0.17.2", 800 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 801 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 802 | "requires": { 803 | "debug": "2.6.9", 804 | "depd": "~1.1.2", 805 | "destroy": "~1.0.4", 806 | "encodeurl": "~1.0.2", 807 | "escape-html": "~1.0.3", 808 | "etag": "~1.8.1", 809 | "fresh": "0.5.2", 810 | "http-errors": "1.8.1", 811 | "mime": "1.6.0", 812 | "ms": "2.1.3", 813 | "on-finished": "~2.3.0", 814 | "range-parser": "~1.2.1", 815 | "statuses": "~1.5.0" 816 | }, 817 | "dependencies": { 818 | "ms": { 819 | "version": "2.1.3", 820 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 821 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 822 | } 823 | } 824 | }, 825 | "serve-static": { 826 | "version": "1.14.2", 827 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 828 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 829 | "requires": { 830 | "encodeurl": "~1.0.2", 831 | "escape-html": "~1.0.3", 832 | "parseurl": "~1.3.3", 833 | "send": "0.17.2" 834 | } 835 | }, 836 | "setprototypeof": { 837 | "version": "1.2.0", 838 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 839 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 840 | }, 841 | "statuses": { 842 | "version": "1.5.0", 843 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 844 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 845 | }, 846 | "toidentifier": { 847 | "version": "1.0.1", 848 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 849 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 850 | }, 851 | "type-is": { 852 | "version": "1.6.18", 853 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 854 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 855 | "requires": { 856 | "media-typer": "0.3.0", 857 | "mime-types": "~2.1.24" 858 | } 859 | }, 860 | "unpipe": { 861 | "version": "1.0.0", 862 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 863 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 864 | }, 865 | "utils-merge": { 866 | "version": "1.0.1", 867 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 868 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 869 | }, 870 | "vary": { 871 | "version": "1.1.2", 872 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 873 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 874 | } 875 | } 876 | } 877 | -------------------------------------------------------------------------------- /k8s-web-hello/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "k8s-web-hello", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.mjs" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.17.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /k8s-web-to-nginx.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: k8s-web-to-nginx 5 | spec: 6 | type: LoadBalancer 7 | selector: 8 | app: k8s-web-to-nginx 9 | ports: 10 | - port: 3333 11 | targetPort: 3000 12 | --- 13 | apiVersion: apps/v1 14 | kind: Deployment 15 | metadata: 16 | name: k8s-web-to-nginx 17 | spec: 18 | replicas: 3 19 | selector: 20 | matchLabels: 21 | app: k8s-web-to-nginx 22 | template: 23 | metadata: 24 | labels: 25 | app: k8s-web-to-nginx 26 | spec: 27 | containers: 28 | - name: k8s-web-to-nginx 29 | image: bstashchuk/k8s-web-to-nginx 30 | resources: 31 | limits: 32 | memory: "128Mi" 33 | cpu: "250m" 34 | ports: 35 | - containerPort: 3000 36 | -------------------------------------------------------------------------------- /k8s-web-to-nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM --platform=linux/amd64 node:alpine 2 | 3 | WORKDIR /app 4 | 5 | EXPOSE 3000 6 | 7 | COPY package.json package-lock.json ./ 8 | 9 | RUN npm install 10 | 11 | COPY . ./ 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /k8s-web-to-nginx/index.mjs: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import os from 'os' 3 | 4 | const app = express() 5 | const PORT = 3000 6 | 7 | app.get("/", (req, res) => { 8 | const helloMessage = `

Hello from the ${os.hostname()}

` 9 | console.log(helloMessage) 10 | res.send(helloMessage) 11 | }) 12 | 13 | app.get("/nginx", async (req, res) => { 14 | const url = 'http://nginx' 15 | const response = await fetch(url); 16 | const body = await response.text(); 17 | res.send(body) 18 | }) 19 | 20 | app.get("/jsonplaceholder", async (req, res) => { 21 | const url = "https://jsonplaceholder.typicode.com/todos"; 22 | const response = await fetch(url); 23 | const body = await response.text(); 24 | res.setHeader("Content-Type", "application/json"); 25 | res.send(body); 26 | }); 27 | 28 | app.listen(PORT, () => { 29 | console.log(`Web server is listening at port ${PORT}`) 30 | }) 31 | -------------------------------------------------------------------------------- /k8s-web-to-nginx/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "k8s-web-hello", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "k8s-web-hello", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.17.2", 13 | "node-fetch": "^3.1.0" 14 | } 15 | }, 16 | "node_modules/accepts": { 17 | "version": "1.3.7", 18 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 19 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 20 | "dependencies": { 21 | "mime-types": "~2.1.24", 22 | "negotiator": "0.6.2" 23 | }, 24 | "engines": { 25 | "node": ">= 0.6" 26 | } 27 | }, 28 | "node_modules/array-flatten": { 29 | "version": "1.1.1", 30 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 31 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 32 | }, 33 | "node_modules/body-parser": { 34 | "version": "1.19.1", 35 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 36 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 37 | "dependencies": { 38 | "bytes": "3.1.1", 39 | "content-type": "~1.0.4", 40 | "debug": "2.6.9", 41 | "depd": "~1.1.2", 42 | "http-errors": "1.8.1", 43 | "iconv-lite": "0.4.24", 44 | "on-finished": "~2.3.0", 45 | "qs": "6.9.6", 46 | "raw-body": "2.4.2", 47 | "type-is": "~1.6.18" 48 | }, 49 | "engines": { 50 | "node": ">= 0.8" 51 | } 52 | }, 53 | "node_modules/bytes": { 54 | "version": "3.1.1", 55 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 56 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", 57 | "engines": { 58 | "node": ">= 0.8" 59 | } 60 | }, 61 | "node_modules/content-disposition": { 62 | "version": "0.5.4", 63 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 64 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 65 | "dependencies": { 66 | "safe-buffer": "5.2.1" 67 | }, 68 | "engines": { 69 | "node": ">= 0.6" 70 | } 71 | }, 72 | "node_modules/content-type": { 73 | "version": "1.0.4", 74 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 75 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 76 | "engines": { 77 | "node": ">= 0.6" 78 | } 79 | }, 80 | "node_modules/cookie": { 81 | "version": "0.4.1", 82 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 83 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 84 | "engines": { 85 | "node": ">= 0.6" 86 | } 87 | }, 88 | "node_modules/cookie-signature": { 89 | "version": "1.0.6", 90 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 91 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 92 | }, 93 | "node_modules/data-uri-to-buffer": { 94 | "version": "4.0.0", 95 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", 96 | "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", 97 | "engines": { 98 | "node": ">= 12" 99 | } 100 | }, 101 | "node_modules/debug": { 102 | "version": "2.6.9", 103 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 104 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 105 | "dependencies": { 106 | "ms": "2.0.0" 107 | } 108 | }, 109 | "node_modules/depd": { 110 | "version": "1.1.2", 111 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 112 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 113 | "engines": { 114 | "node": ">= 0.6" 115 | } 116 | }, 117 | "node_modules/destroy": { 118 | "version": "1.0.4", 119 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 120 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 121 | }, 122 | "node_modules/ee-first": { 123 | "version": "1.1.1", 124 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 125 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 126 | }, 127 | "node_modules/encodeurl": { 128 | "version": "1.0.2", 129 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 130 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 131 | "engines": { 132 | "node": ">= 0.8" 133 | } 134 | }, 135 | "node_modules/escape-html": { 136 | "version": "1.0.3", 137 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 138 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 139 | }, 140 | "node_modules/etag": { 141 | "version": "1.8.1", 142 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 143 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 144 | "engines": { 145 | "node": ">= 0.6" 146 | } 147 | }, 148 | "node_modules/express": { 149 | "version": "4.17.2", 150 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 151 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 152 | "dependencies": { 153 | "accepts": "~1.3.7", 154 | "array-flatten": "1.1.1", 155 | "body-parser": "1.19.1", 156 | "content-disposition": "0.5.4", 157 | "content-type": "~1.0.4", 158 | "cookie": "0.4.1", 159 | "cookie-signature": "1.0.6", 160 | "debug": "2.6.9", 161 | "depd": "~1.1.2", 162 | "encodeurl": "~1.0.2", 163 | "escape-html": "~1.0.3", 164 | "etag": "~1.8.1", 165 | "finalhandler": "~1.1.2", 166 | "fresh": "0.5.2", 167 | "merge-descriptors": "1.0.1", 168 | "methods": "~1.1.2", 169 | "on-finished": "~2.3.0", 170 | "parseurl": "~1.3.3", 171 | "path-to-regexp": "0.1.7", 172 | "proxy-addr": "~2.0.7", 173 | "qs": "6.9.6", 174 | "range-parser": "~1.2.1", 175 | "safe-buffer": "5.2.1", 176 | "send": "0.17.2", 177 | "serve-static": "1.14.2", 178 | "setprototypeof": "1.2.0", 179 | "statuses": "~1.5.0", 180 | "type-is": "~1.6.18", 181 | "utils-merge": "1.0.1", 182 | "vary": "~1.1.2" 183 | }, 184 | "engines": { 185 | "node": ">= 0.10.0" 186 | } 187 | }, 188 | "node_modules/fetch-blob": { 189 | "version": "3.1.3", 190 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", 191 | "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", 192 | "funding": [ 193 | { 194 | "type": "github", 195 | "url": "https://github.com/sponsors/jimmywarting" 196 | }, 197 | { 198 | "type": "paypal", 199 | "url": "https://paypal.me/jimmywarting" 200 | } 201 | ], 202 | "dependencies": { 203 | "web-streams-polyfill": "^3.0.3" 204 | }, 205 | "engines": { 206 | "node": "^12.20 || >= 14.13" 207 | } 208 | }, 209 | "node_modules/finalhandler": { 210 | "version": "1.1.2", 211 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 212 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 213 | "dependencies": { 214 | "debug": "2.6.9", 215 | "encodeurl": "~1.0.2", 216 | "escape-html": "~1.0.3", 217 | "on-finished": "~2.3.0", 218 | "parseurl": "~1.3.3", 219 | "statuses": "~1.5.0", 220 | "unpipe": "~1.0.0" 221 | }, 222 | "engines": { 223 | "node": ">= 0.8" 224 | } 225 | }, 226 | "node_modules/formdata-polyfill": { 227 | "version": "4.0.10", 228 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 229 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 230 | "dependencies": { 231 | "fetch-blob": "^3.1.2" 232 | }, 233 | "engines": { 234 | "node": ">=12.20.0" 235 | } 236 | }, 237 | "node_modules/forwarded": { 238 | "version": "0.2.0", 239 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 240 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 241 | "engines": { 242 | "node": ">= 0.6" 243 | } 244 | }, 245 | "node_modules/fresh": { 246 | "version": "0.5.2", 247 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 248 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 249 | "engines": { 250 | "node": ">= 0.6" 251 | } 252 | }, 253 | "node_modules/http-errors": { 254 | "version": "1.8.1", 255 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 256 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 257 | "dependencies": { 258 | "depd": "~1.1.2", 259 | "inherits": "2.0.4", 260 | "setprototypeof": "1.2.0", 261 | "statuses": ">= 1.5.0 < 2", 262 | "toidentifier": "1.0.1" 263 | }, 264 | "engines": { 265 | "node": ">= 0.6" 266 | } 267 | }, 268 | "node_modules/iconv-lite": { 269 | "version": "0.4.24", 270 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 271 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 272 | "dependencies": { 273 | "safer-buffer": ">= 2.1.2 < 3" 274 | }, 275 | "engines": { 276 | "node": ">=0.10.0" 277 | } 278 | }, 279 | "node_modules/inherits": { 280 | "version": "2.0.4", 281 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 282 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 283 | }, 284 | "node_modules/ipaddr.js": { 285 | "version": "1.9.1", 286 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 287 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 288 | "engines": { 289 | "node": ">= 0.10" 290 | } 291 | }, 292 | "node_modules/media-typer": { 293 | "version": "0.3.0", 294 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 295 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 296 | "engines": { 297 | "node": ">= 0.6" 298 | } 299 | }, 300 | "node_modules/merge-descriptors": { 301 | "version": "1.0.1", 302 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 303 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 304 | }, 305 | "node_modules/methods": { 306 | "version": "1.1.2", 307 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 308 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 309 | "engines": { 310 | "node": ">= 0.6" 311 | } 312 | }, 313 | "node_modules/mime": { 314 | "version": "1.6.0", 315 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 316 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 317 | "bin": { 318 | "mime": "cli.js" 319 | }, 320 | "engines": { 321 | "node": ">=4" 322 | } 323 | }, 324 | "node_modules/mime-db": { 325 | "version": "1.51.0", 326 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 327 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 328 | "engines": { 329 | "node": ">= 0.6" 330 | } 331 | }, 332 | "node_modules/mime-types": { 333 | "version": "2.1.34", 334 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 335 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 336 | "dependencies": { 337 | "mime-db": "1.51.0" 338 | }, 339 | "engines": { 340 | "node": ">= 0.6" 341 | } 342 | }, 343 | "node_modules/ms": { 344 | "version": "2.0.0", 345 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 346 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 347 | }, 348 | "node_modules/negotiator": { 349 | "version": "0.6.2", 350 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 351 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 352 | "engines": { 353 | "node": ">= 0.6" 354 | } 355 | }, 356 | "node_modules/node-fetch": { 357 | "version": "3.1.0", 358 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", 359 | "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", 360 | "dependencies": { 361 | "data-uri-to-buffer": "^4.0.0", 362 | "fetch-blob": "^3.1.2", 363 | "formdata-polyfill": "^4.0.10" 364 | }, 365 | "engines": { 366 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 367 | }, 368 | "funding": { 369 | "type": "opencollective", 370 | "url": "https://opencollective.com/node-fetch" 371 | } 372 | }, 373 | "node_modules/on-finished": { 374 | "version": "2.3.0", 375 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 376 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 377 | "dependencies": { 378 | "ee-first": "1.1.1" 379 | }, 380 | "engines": { 381 | "node": ">= 0.8" 382 | } 383 | }, 384 | "node_modules/parseurl": { 385 | "version": "1.3.3", 386 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 387 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 388 | "engines": { 389 | "node": ">= 0.8" 390 | } 391 | }, 392 | "node_modules/path-to-regexp": { 393 | "version": "0.1.7", 394 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 395 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 396 | }, 397 | "node_modules/proxy-addr": { 398 | "version": "2.0.7", 399 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 400 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 401 | "dependencies": { 402 | "forwarded": "0.2.0", 403 | "ipaddr.js": "1.9.1" 404 | }, 405 | "engines": { 406 | "node": ">= 0.10" 407 | } 408 | }, 409 | "node_modules/qs": { 410 | "version": "6.9.6", 411 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 412 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", 413 | "engines": { 414 | "node": ">=0.6" 415 | }, 416 | "funding": { 417 | "url": "https://github.com/sponsors/ljharb" 418 | } 419 | }, 420 | "node_modules/range-parser": { 421 | "version": "1.2.1", 422 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 423 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 424 | "engines": { 425 | "node": ">= 0.6" 426 | } 427 | }, 428 | "node_modules/raw-body": { 429 | "version": "2.4.2", 430 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 431 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 432 | "dependencies": { 433 | "bytes": "3.1.1", 434 | "http-errors": "1.8.1", 435 | "iconv-lite": "0.4.24", 436 | "unpipe": "1.0.0" 437 | }, 438 | "engines": { 439 | "node": ">= 0.8" 440 | } 441 | }, 442 | "node_modules/safe-buffer": { 443 | "version": "5.2.1", 444 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 445 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 446 | "funding": [ 447 | { 448 | "type": "github", 449 | "url": "https://github.com/sponsors/feross" 450 | }, 451 | { 452 | "type": "patreon", 453 | "url": "https://www.patreon.com/feross" 454 | }, 455 | { 456 | "type": "consulting", 457 | "url": "https://feross.org/support" 458 | } 459 | ] 460 | }, 461 | "node_modules/safer-buffer": { 462 | "version": "2.1.2", 463 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 464 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 465 | }, 466 | "node_modules/send": { 467 | "version": "0.17.2", 468 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 469 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 470 | "dependencies": { 471 | "debug": "2.6.9", 472 | "depd": "~1.1.2", 473 | "destroy": "~1.0.4", 474 | "encodeurl": "~1.0.2", 475 | "escape-html": "~1.0.3", 476 | "etag": "~1.8.1", 477 | "fresh": "0.5.2", 478 | "http-errors": "1.8.1", 479 | "mime": "1.6.0", 480 | "ms": "2.1.3", 481 | "on-finished": "~2.3.0", 482 | "range-parser": "~1.2.1", 483 | "statuses": "~1.5.0" 484 | }, 485 | "engines": { 486 | "node": ">= 0.8.0" 487 | } 488 | }, 489 | "node_modules/send/node_modules/ms": { 490 | "version": "2.1.3", 491 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 492 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 493 | }, 494 | "node_modules/serve-static": { 495 | "version": "1.14.2", 496 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 497 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 498 | "dependencies": { 499 | "encodeurl": "~1.0.2", 500 | "escape-html": "~1.0.3", 501 | "parseurl": "~1.3.3", 502 | "send": "0.17.2" 503 | }, 504 | "engines": { 505 | "node": ">= 0.8.0" 506 | } 507 | }, 508 | "node_modules/setprototypeof": { 509 | "version": "1.2.0", 510 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 511 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 512 | }, 513 | "node_modules/statuses": { 514 | "version": "1.5.0", 515 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 516 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 517 | "engines": { 518 | "node": ">= 0.6" 519 | } 520 | }, 521 | "node_modules/toidentifier": { 522 | "version": "1.0.1", 523 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 524 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 525 | "engines": { 526 | "node": ">=0.6" 527 | } 528 | }, 529 | "node_modules/type-is": { 530 | "version": "1.6.18", 531 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 532 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 533 | "dependencies": { 534 | "media-typer": "0.3.0", 535 | "mime-types": "~2.1.24" 536 | }, 537 | "engines": { 538 | "node": ">= 0.6" 539 | } 540 | }, 541 | "node_modules/unpipe": { 542 | "version": "1.0.0", 543 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 544 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 545 | "engines": { 546 | "node": ">= 0.8" 547 | } 548 | }, 549 | "node_modules/utils-merge": { 550 | "version": "1.0.1", 551 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 552 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 553 | "engines": { 554 | "node": ">= 0.4.0" 555 | } 556 | }, 557 | "node_modules/vary": { 558 | "version": "1.1.2", 559 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 560 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 561 | "engines": { 562 | "node": ">= 0.8" 563 | } 564 | }, 565 | "node_modules/web-streams-polyfill": { 566 | "version": "3.2.0", 567 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", 568 | "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==", 569 | "engines": { 570 | "node": ">= 8" 571 | } 572 | } 573 | }, 574 | "dependencies": { 575 | "accepts": { 576 | "version": "1.3.7", 577 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 578 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 579 | "requires": { 580 | "mime-types": "~2.1.24", 581 | "negotiator": "0.6.2" 582 | } 583 | }, 584 | "array-flatten": { 585 | "version": "1.1.1", 586 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 587 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 588 | }, 589 | "body-parser": { 590 | "version": "1.19.1", 591 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 592 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 593 | "requires": { 594 | "bytes": "3.1.1", 595 | "content-type": "~1.0.4", 596 | "debug": "2.6.9", 597 | "depd": "~1.1.2", 598 | "http-errors": "1.8.1", 599 | "iconv-lite": "0.4.24", 600 | "on-finished": "~2.3.0", 601 | "qs": "6.9.6", 602 | "raw-body": "2.4.2", 603 | "type-is": "~1.6.18" 604 | } 605 | }, 606 | "bytes": { 607 | "version": "3.1.1", 608 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 609 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" 610 | }, 611 | "content-disposition": { 612 | "version": "0.5.4", 613 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 614 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 615 | "requires": { 616 | "safe-buffer": "5.2.1" 617 | } 618 | }, 619 | "content-type": { 620 | "version": "1.0.4", 621 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 622 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 623 | }, 624 | "cookie": { 625 | "version": "0.4.1", 626 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 627 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 628 | }, 629 | "cookie-signature": { 630 | "version": "1.0.6", 631 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 632 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 633 | }, 634 | "data-uri-to-buffer": { 635 | "version": "4.0.0", 636 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", 637 | "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" 638 | }, 639 | "debug": { 640 | "version": "2.6.9", 641 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 642 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 643 | "requires": { 644 | "ms": "2.0.0" 645 | } 646 | }, 647 | "depd": { 648 | "version": "1.1.2", 649 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 650 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 651 | }, 652 | "destroy": { 653 | "version": "1.0.4", 654 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 655 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 656 | }, 657 | "ee-first": { 658 | "version": "1.1.1", 659 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 660 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 661 | }, 662 | "encodeurl": { 663 | "version": "1.0.2", 664 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 665 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 666 | }, 667 | "escape-html": { 668 | "version": "1.0.3", 669 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 670 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 671 | }, 672 | "etag": { 673 | "version": "1.8.1", 674 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 675 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 676 | }, 677 | "express": { 678 | "version": "4.17.2", 679 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 680 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 681 | "requires": { 682 | "accepts": "~1.3.7", 683 | "array-flatten": "1.1.1", 684 | "body-parser": "1.19.1", 685 | "content-disposition": "0.5.4", 686 | "content-type": "~1.0.4", 687 | "cookie": "0.4.1", 688 | "cookie-signature": "1.0.6", 689 | "debug": "2.6.9", 690 | "depd": "~1.1.2", 691 | "encodeurl": "~1.0.2", 692 | "escape-html": "~1.0.3", 693 | "etag": "~1.8.1", 694 | "finalhandler": "~1.1.2", 695 | "fresh": "0.5.2", 696 | "merge-descriptors": "1.0.1", 697 | "methods": "~1.1.2", 698 | "on-finished": "~2.3.0", 699 | "parseurl": "~1.3.3", 700 | "path-to-regexp": "0.1.7", 701 | "proxy-addr": "~2.0.7", 702 | "qs": "6.9.6", 703 | "range-parser": "~1.2.1", 704 | "safe-buffer": "5.2.1", 705 | "send": "0.17.2", 706 | "serve-static": "1.14.2", 707 | "setprototypeof": "1.2.0", 708 | "statuses": "~1.5.0", 709 | "type-is": "~1.6.18", 710 | "utils-merge": "1.0.1", 711 | "vary": "~1.1.2" 712 | } 713 | }, 714 | "fetch-blob": { 715 | "version": "3.1.3", 716 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", 717 | "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", 718 | "requires": { 719 | "web-streams-polyfill": "^3.0.3" 720 | } 721 | }, 722 | "finalhandler": { 723 | "version": "1.1.2", 724 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 725 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 726 | "requires": { 727 | "debug": "2.6.9", 728 | "encodeurl": "~1.0.2", 729 | "escape-html": "~1.0.3", 730 | "on-finished": "~2.3.0", 731 | "parseurl": "~1.3.3", 732 | "statuses": "~1.5.0", 733 | "unpipe": "~1.0.0" 734 | } 735 | }, 736 | "formdata-polyfill": { 737 | "version": "4.0.10", 738 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 739 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 740 | "requires": { 741 | "fetch-blob": "^3.1.2" 742 | } 743 | }, 744 | "forwarded": { 745 | "version": "0.2.0", 746 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 747 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 748 | }, 749 | "fresh": { 750 | "version": "0.5.2", 751 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 752 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 753 | }, 754 | "http-errors": { 755 | "version": "1.8.1", 756 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 757 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 758 | "requires": { 759 | "depd": "~1.1.2", 760 | "inherits": "2.0.4", 761 | "setprototypeof": "1.2.0", 762 | "statuses": ">= 1.5.0 < 2", 763 | "toidentifier": "1.0.1" 764 | } 765 | }, 766 | "iconv-lite": { 767 | "version": "0.4.24", 768 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 769 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 770 | "requires": { 771 | "safer-buffer": ">= 2.1.2 < 3" 772 | } 773 | }, 774 | "inherits": { 775 | "version": "2.0.4", 776 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 777 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 778 | }, 779 | "ipaddr.js": { 780 | "version": "1.9.1", 781 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 782 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 783 | }, 784 | "media-typer": { 785 | "version": "0.3.0", 786 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 787 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 788 | }, 789 | "merge-descriptors": { 790 | "version": "1.0.1", 791 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 792 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 793 | }, 794 | "methods": { 795 | "version": "1.1.2", 796 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 797 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 798 | }, 799 | "mime": { 800 | "version": "1.6.0", 801 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 802 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 803 | }, 804 | "mime-db": { 805 | "version": "1.51.0", 806 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 807 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 808 | }, 809 | "mime-types": { 810 | "version": "2.1.34", 811 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 812 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 813 | "requires": { 814 | "mime-db": "1.51.0" 815 | } 816 | }, 817 | "ms": { 818 | "version": "2.0.0", 819 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 820 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 821 | }, 822 | "negotiator": { 823 | "version": "0.6.2", 824 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 825 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 826 | }, 827 | "node-fetch": { 828 | "version": "3.1.0", 829 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", 830 | "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", 831 | "requires": { 832 | "data-uri-to-buffer": "^4.0.0", 833 | "fetch-blob": "^3.1.2", 834 | "formdata-polyfill": "^4.0.10" 835 | } 836 | }, 837 | "on-finished": { 838 | "version": "2.3.0", 839 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 840 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 841 | "requires": { 842 | "ee-first": "1.1.1" 843 | } 844 | }, 845 | "parseurl": { 846 | "version": "1.3.3", 847 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 848 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 849 | }, 850 | "path-to-regexp": { 851 | "version": "0.1.7", 852 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 853 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 854 | }, 855 | "proxy-addr": { 856 | "version": "2.0.7", 857 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 858 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 859 | "requires": { 860 | "forwarded": "0.2.0", 861 | "ipaddr.js": "1.9.1" 862 | } 863 | }, 864 | "qs": { 865 | "version": "6.9.6", 866 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 867 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" 868 | }, 869 | "range-parser": { 870 | "version": "1.2.1", 871 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 872 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 873 | }, 874 | "raw-body": { 875 | "version": "2.4.2", 876 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 877 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 878 | "requires": { 879 | "bytes": "3.1.1", 880 | "http-errors": "1.8.1", 881 | "iconv-lite": "0.4.24", 882 | "unpipe": "1.0.0" 883 | } 884 | }, 885 | "safe-buffer": { 886 | "version": "5.2.1", 887 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 888 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 889 | }, 890 | "safer-buffer": { 891 | "version": "2.1.2", 892 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 893 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 894 | }, 895 | "send": { 896 | "version": "0.17.2", 897 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 898 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 899 | "requires": { 900 | "debug": "2.6.9", 901 | "depd": "~1.1.2", 902 | "destroy": "~1.0.4", 903 | "encodeurl": "~1.0.2", 904 | "escape-html": "~1.0.3", 905 | "etag": "~1.8.1", 906 | "fresh": "0.5.2", 907 | "http-errors": "1.8.1", 908 | "mime": "1.6.0", 909 | "ms": "2.1.3", 910 | "on-finished": "~2.3.0", 911 | "range-parser": "~1.2.1", 912 | "statuses": "~1.5.0" 913 | }, 914 | "dependencies": { 915 | "ms": { 916 | "version": "2.1.3", 917 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 918 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 919 | } 920 | } 921 | }, 922 | "serve-static": { 923 | "version": "1.14.2", 924 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 925 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 926 | "requires": { 927 | "encodeurl": "~1.0.2", 928 | "escape-html": "~1.0.3", 929 | "parseurl": "~1.3.3", 930 | "send": "0.17.2" 931 | } 932 | }, 933 | "setprototypeof": { 934 | "version": "1.2.0", 935 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 936 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 937 | }, 938 | "statuses": { 939 | "version": "1.5.0", 940 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 941 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 942 | }, 943 | "toidentifier": { 944 | "version": "1.0.1", 945 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 946 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 947 | }, 948 | "type-is": { 949 | "version": "1.6.18", 950 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 951 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 952 | "requires": { 953 | "media-typer": "0.3.0", 954 | "mime-types": "~2.1.24" 955 | } 956 | }, 957 | "unpipe": { 958 | "version": "1.0.0", 959 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 960 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 961 | }, 962 | "utils-merge": { 963 | "version": "1.0.1", 964 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 965 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 966 | }, 967 | "vary": { 968 | "version": "1.1.2", 969 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 970 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 971 | }, 972 | "web-streams-polyfill": { 973 | "version": "3.2.0", 974 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", 975 | "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" 976 | } 977 | } 978 | } 979 | -------------------------------------------------------------------------------- /k8s-web-to-nginx/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "k8s-web-hello", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.mjs" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.17.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /nginx.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: nginx 5 | spec: 6 | selector: 7 | app: nginx 8 | ports: 9 | - port: 80 10 | --- 11 | apiVersion: apps/v1 12 | kind: Deployment 13 | metadata: 14 | name: nginx 15 | spec: 16 | replicas: 5 17 | selector: 18 | matchLabels: 19 | app: nginx 20 | template: 21 | metadata: 22 | labels: 23 | app: nginx 24 | spec: 25 | containers: 26 | - name: nginx 27 | image: nginx 28 | resources: 29 | limits: 30 | memory: "128Mi" 31 | cpu: "125m" 32 | ports: 33 | - containerPort: 80 34 | -------------------------------------------------------------------------------- /service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: k8s-web-hello 5 | spec: 6 | type: LoadBalancer 7 | selector: 8 | app: k8s-web-hello 9 | ports: 10 | - port: 3030 11 | targetPort: 3000 12 | --------------------------------------------------------------------------------