├── LICENSE.md ├── README.md ├── api ├── .gitignore ├── index.js ├── package.json └── yarn.lock ├── docker-compose.yml └── nginx └── default.conf /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Minh Chu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Local dev environment using Docker, NodeJs, Redis, MongoDB, Nginx 2 | 3 | # Instruction 4 | You must have Docker to run this repo 5 | 6 | # Usage 7 | - Clone this repo 8 | - `cd api` then `yarn install` 9 | - `cd ..` then `docker-compose up` 10 | - Open your browser at [localhost](http://localhost/hello/world) 11 | 12 | 13 | Buy Me A Coffee 14 | -------------------------------------------------------------------------------- /api/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://docs.npmjs.com/cli/shrinkwrap#caveats 27 | node_modules 28 | 29 | # Debug log from npm 30 | npm-debug.log 31 | 32 | # Env files 33 | .env 34 | 35 | # IDE directories 36 | .vscode 37 | .idea 38 | 39 | -------------------------------------------------------------------------------- /api/index.js: -------------------------------------------------------------------------------- 1 | const restify = require('restify'); 2 | 3 | function respond(req, res, next) { 4 | res.send('hello ' + req.params.name); 5 | next(); 6 | } 7 | 8 | const server = restify.createServer(); 9 | server.get('/hello/:name', respond); 10 | server.head('/hello/:name', respond); 11 | 12 | server.listen(3000, function() { 13 | console.log('%s listening at %s', server.name, server.url); 14 | }); 15 | 16 | -------------------------------------------------------------------------------- /api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "Minh Chu ", 6 | "license": "MIT", 7 | "private": true, 8 | "scripts": { 9 | "start": "node index.js" 10 | }, 11 | "dependencies": { 12 | "restify": "^6.2.3" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /api/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | asn1@~0.2.3: 6 | version "0.2.4" 7 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 8 | dependencies: 9 | safer-buffer "~2.1.0" 10 | 11 | assert-plus@1.0.0, assert-plus@^1.0.0: 12 | version "1.0.0" 13 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 14 | 15 | balanced-match@^1.0.0: 16 | version "1.0.0" 17 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 18 | 19 | bcrypt-pbkdf@^1.0.0: 20 | version "1.0.2" 21 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 22 | dependencies: 23 | tweetnacl "^0.14.3" 24 | 25 | brace-expansion@^1.1.7: 26 | version "1.1.8" 27 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 28 | dependencies: 29 | balanced-match "^1.0.0" 30 | concat-map "0.0.1" 31 | 32 | bunyan@^1.8.12: 33 | version "1.8.12" 34 | resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" 35 | optionalDependencies: 36 | dtrace-provider "~0.8" 37 | moment "^2.10.6" 38 | mv "~2" 39 | safe-json-stringify "~1" 40 | 41 | clone-regexp@^1.0.0: 42 | version "1.0.0" 43 | resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c" 44 | dependencies: 45 | is-regexp "^1.0.0" 46 | is-supported-regexp-flag "^1.0.0" 47 | 48 | concat-map@0.0.1: 49 | version "0.0.1" 50 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 51 | 52 | core-util-is@1.0.2, core-util-is@~1.0.0: 53 | version "1.0.2" 54 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 55 | 56 | csv-generate@^1.1.2: 57 | version "1.1.2" 58 | resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-1.1.2.tgz#ec6b00edaed6e59ad9c20582f4c364e28b146240" 59 | 60 | csv-parse@^1.3.3: 61 | version "1.3.3" 62 | resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-1.3.3.tgz#d1cfd8743c2f849a0abb2fd544db56695d19a490" 63 | 64 | csv-stringify@^1.1.2: 65 | version "1.1.2" 66 | resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-1.1.2.tgz#77a41526581bce3380f12b00d7c5bbac70c82b58" 67 | dependencies: 68 | lodash.get "~4.4.2" 69 | 70 | csv@^1.1.1: 71 | version "1.2.1" 72 | resolved "https://registry.yarnpkg.com/csv/-/csv-1.2.1.tgz#5231edfc1c7152512ec45781076a7a97ff525c0c" 73 | dependencies: 74 | csv-generate "^1.1.2" 75 | csv-parse "^1.3.3" 76 | csv-stringify "^1.1.2" 77 | stream-transform "^0.2.2" 78 | 79 | dashdash@^1.12.0: 80 | version "1.14.1" 81 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 82 | dependencies: 83 | assert-plus "^1.0.0" 84 | 85 | debug@^2.6.8: 86 | version "2.6.9" 87 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 88 | dependencies: 89 | ms "2.0.0" 90 | 91 | detect-node@^2.0.3: 92 | version "2.0.3" 93 | resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" 94 | 95 | dtrace-provider@^0.8.1, dtrace-provider@~0.8: 96 | version "0.8.5" 97 | resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.5.tgz#98ebba221afac46e1c39fd36858d8f9367524b92" 98 | dependencies: 99 | nan "^2.3.3" 100 | 101 | ecc-jsbn@~0.1.1: 102 | version "0.1.2" 103 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 104 | dependencies: 105 | jsbn "~0.1.0" 106 | safer-buffer "^2.1.0" 107 | 108 | escape-regexp-component@^1.0.2: 109 | version "1.0.2" 110 | resolved "https://registry.yarnpkg.com/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz#9c63b6d0b25ff2a88c3adbd18c5b61acc3b9faa2" 111 | 112 | ewma@^2.0.1: 113 | version "2.0.1" 114 | resolved "https://registry.yarnpkg.com/ewma/-/ewma-2.0.1.tgz#9876c1c491ac5733c8666001a3961a04c97cf1e8" 115 | dependencies: 116 | assert-plus "^1.0.0" 117 | 118 | extsprintf@1.2.0: 119 | version "1.2.0" 120 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529" 121 | 122 | extsprintf@1.3.0, extsprintf@^1.2.0: 123 | version "1.3.0" 124 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 125 | 126 | formidable@^1.1.1: 127 | version "1.1.1" 128 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" 129 | 130 | getpass@^0.1.1: 131 | version "0.1.7" 132 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 133 | dependencies: 134 | assert-plus "^1.0.0" 135 | 136 | glob@^6.0.1: 137 | version "6.0.4" 138 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 139 | dependencies: 140 | inflight "^1.0.4" 141 | inherits "2" 142 | minimatch "2 || 3" 143 | once "^1.3.0" 144 | path-is-absolute "^1.0.0" 145 | 146 | handle-thing@^1.2.5: 147 | version "1.2.5" 148 | resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" 149 | 150 | hpack.js@^2.1.6: 151 | version "2.1.6" 152 | resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" 153 | dependencies: 154 | inherits "^2.0.1" 155 | obuf "^1.0.0" 156 | readable-stream "^2.0.1" 157 | wbuf "^1.1.0" 158 | 159 | http-deceiver@^1.2.7: 160 | version "1.2.7" 161 | resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" 162 | 163 | http-signature@^1.2.0: 164 | version "1.2.0" 165 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 166 | dependencies: 167 | assert-plus "^1.0.0" 168 | jsprim "^1.2.2" 169 | sshpk "^1.7.0" 170 | 171 | inflight@^1.0.4: 172 | version "1.0.6" 173 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 174 | dependencies: 175 | once "^1.3.0" 176 | wrappy "1" 177 | 178 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 179 | version "2.0.3" 180 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 181 | 182 | is-regexp@^1.0.0: 183 | version "1.0.0" 184 | resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 185 | 186 | is-supported-regexp-flag@^1.0.0: 187 | version "1.0.0" 188 | resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8" 189 | 190 | isarray@~1.0.0: 191 | version "1.0.0" 192 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 193 | 194 | jsbn@~0.1.0: 195 | version "0.1.1" 196 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 197 | 198 | json-schema@0.2.3: 199 | version "0.2.3" 200 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 201 | 202 | jsprim@^1.2.2: 203 | version "1.4.1" 204 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 205 | dependencies: 206 | assert-plus "1.0.0" 207 | extsprintf "1.3.0" 208 | json-schema "0.2.3" 209 | verror "1.10.0" 210 | 211 | lodash.get@~4.4.2: 212 | version "4.4.2" 213 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 214 | 215 | lodash@^4.17.4, lodash@^4.2.1: 216 | version "4.17.21" 217 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 218 | 219 | lru-cache@^4.1.1: 220 | version "4.1.1" 221 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 222 | dependencies: 223 | pseudomap "^1.0.2" 224 | yallist "^2.1.2" 225 | 226 | mime@^1.4.1: 227 | version "1.4.1" 228 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 229 | 230 | minimalistic-assert@^1.0.0: 231 | version "1.0.0" 232 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" 233 | 234 | "minimatch@2 || 3": 235 | version "3.0.4" 236 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 237 | dependencies: 238 | brace-expansion "^1.1.7" 239 | 240 | minimist@0.0.8: 241 | version "0.0.8" 242 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 243 | 244 | mkdirp@~0.5.1: 245 | version "0.5.1" 246 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 247 | dependencies: 248 | minimist "0.0.8" 249 | 250 | moment@^2.10.6: 251 | version "2.25.1" 252 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.25.1.tgz#1cb546dca1eccdd607c9324747842200b683465d" 253 | 254 | ms@2.0.0: 255 | version "2.0.0" 256 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 257 | 258 | mv@~2: 259 | version "2.1.1" 260 | resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" 261 | dependencies: 262 | mkdirp "~0.5.1" 263 | ncp "~2.0.0" 264 | rimraf "~2.4.0" 265 | 266 | nan@^2.3.3: 267 | version "2.7.0" 268 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" 269 | 270 | ncp@~2.0.0: 271 | version "2.0.0" 272 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" 273 | 274 | negotiator@^0.6.1: 275 | version "0.6.1" 276 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 277 | 278 | obuf@^1.0.0, obuf@^1.1.1: 279 | version "1.1.1" 280 | resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" 281 | 282 | once@^1.3.0, once@^1.4.0: 283 | version "1.4.0" 284 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 285 | dependencies: 286 | wrappy "1" 287 | 288 | path-is-absolute@^1.0.0: 289 | version "1.0.1" 290 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 291 | 292 | pidusage@^1.1.6: 293 | version "1.2.0" 294 | resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-1.2.0.tgz#65ee96ace4e08a4cd3f9240996c85b367171ee92" 295 | 296 | process-nextick-args@~1.0.6: 297 | version "1.0.7" 298 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 299 | 300 | pseudomap@^1.0.2: 301 | version "1.0.2" 302 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 303 | 304 | qs@^6.5.1: 305 | version "6.5.1" 306 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 307 | 308 | readable-stream@^2.0.1, readable-stream@^2.2.9: 309 | version "2.3.3" 310 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 311 | dependencies: 312 | core-util-is "~1.0.0" 313 | inherits "~2.0.3" 314 | isarray "~1.0.0" 315 | process-nextick-args "~1.0.6" 316 | safe-buffer "~5.1.1" 317 | string_decoder "~1.0.3" 318 | util-deprecate "~1.0.1" 319 | 320 | restify-errors@^5.0.0: 321 | version "5.0.0" 322 | resolved "https://registry.yarnpkg.com/restify-errors/-/restify-errors-5.0.0.tgz#668717e100683eec6ce0d515f89ff1dbec254a8d" 323 | dependencies: 324 | assert-plus "^1.0.0" 325 | lodash "^4.2.1" 326 | verror "^1.8.1" 327 | optionalDependencies: 328 | safe-json-stringify "^1.0.3" 329 | 330 | restify@^6.2.3: 331 | version "6.2.3" 332 | resolved "https://registry.yarnpkg.com/restify/-/restify-6.2.3.tgz#6cfb4735979d6b2d22bf87f7bdfca7e93932b678" 333 | dependencies: 334 | assert-plus "^1.0.0" 335 | bunyan "^1.8.12" 336 | clone-regexp "^1.0.0" 337 | csv "^1.1.1" 338 | escape-regexp-component "^1.0.2" 339 | ewma "^2.0.1" 340 | formidable "^1.1.1" 341 | http-signature "^1.2.0" 342 | lodash "^4.17.4" 343 | lru-cache "^4.1.1" 344 | mime "^1.4.1" 345 | negotiator "^0.6.1" 346 | once "^1.4.0" 347 | pidusage "^1.1.6" 348 | qs "^6.5.1" 349 | restify-errors "^5.0.0" 350 | semver "^5.4.1" 351 | spdy "^3.4.7" 352 | uuid "^3.1.0" 353 | vasync "^1.6.4" 354 | verror "^1.10.0" 355 | optionalDependencies: 356 | dtrace-provider "^0.8.1" 357 | 358 | rimraf@~2.4.0: 359 | version "2.4.5" 360 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" 361 | dependencies: 362 | glob "^6.0.1" 363 | 364 | safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 365 | version "5.1.1" 366 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 367 | 368 | safe-json-stringify@^1.0.3, safe-json-stringify@~1: 369 | version "1.0.4" 370 | resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz#81a098f447e4bbc3ff3312a243521bc060ef5911" 371 | 372 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 373 | version "2.1.2" 374 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 375 | 376 | select-hose@^2.0.0: 377 | version "2.0.0" 378 | resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" 379 | 380 | semver@^5.4.1: 381 | version "5.4.1" 382 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 383 | 384 | spdy-transport@^2.0.18: 385 | version "2.0.20" 386 | resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" 387 | dependencies: 388 | debug "^2.6.8" 389 | detect-node "^2.0.3" 390 | hpack.js "^2.1.6" 391 | obuf "^1.1.1" 392 | readable-stream "^2.2.9" 393 | safe-buffer "^5.0.1" 394 | wbuf "^1.7.2" 395 | 396 | spdy@^3.4.7: 397 | version "3.4.7" 398 | resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" 399 | dependencies: 400 | debug "^2.6.8" 401 | handle-thing "^1.2.5" 402 | http-deceiver "^1.2.7" 403 | safe-buffer "^5.0.1" 404 | select-hose "^2.0.0" 405 | spdy-transport "^2.0.18" 406 | 407 | sshpk@^1.7.0: 408 | version "1.16.1" 409 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 410 | dependencies: 411 | asn1 "~0.2.3" 412 | assert-plus "^1.0.0" 413 | bcrypt-pbkdf "^1.0.0" 414 | dashdash "^1.12.0" 415 | ecc-jsbn "~0.1.1" 416 | getpass "^0.1.1" 417 | jsbn "~0.1.0" 418 | safer-buffer "^2.0.2" 419 | tweetnacl "~0.14.0" 420 | 421 | stream-transform@^0.2.2: 422 | version "0.2.2" 423 | resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-0.2.2.tgz#75867487f49528f8bf1d82499658753d02df7838" 424 | 425 | string_decoder@~1.0.3: 426 | version "1.0.3" 427 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 428 | dependencies: 429 | safe-buffer "~5.1.0" 430 | 431 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 432 | version "0.14.5" 433 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 434 | 435 | util-deprecate@~1.0.1: 436 | version "1.0.2" 437 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 438 | 439 | uuid@^3.1.0: 440 | version "3.1.0" 441 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 442 | 443 | vasync@^1.6.4: 444 | version "1.6.4" 445 | resolved "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz#dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f" 446 | dependencies: 447 | verror "1.6.0" 448 | 449 | verror@1.10.0, verror@^1.10.0, verror@^1.8.1: 450 | version "1.10.0" 451 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 452 | dependencies: 453 | assert-plus "^1.0.0" 454 | core-util-is "1.0.2" 455 | extsprintf "^1.2.0" 456 | 457 | verror@1.6.0: 458 | version "1.6.0" 459 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.6.0.tgz#7d13b27b1facc2e2da90405eb5ea6e5bdd252ea5" 460 | dependencies: 461 | extsprintf "1.2.0" 462 | 463 | wbuf@^1.1.0, wbuf@^1.7.2: 464 | version "1.7.2" 465 | resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" 466 | dependencies: 467 | minimalistic-assert "^1.0.0" 468 | 469 | wrappy@1: 470 | version "1.0.2" 471 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 472 | 473 | yallist@^2.1.2: 474 | version "2.1.2" 475 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 476 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Node, Mongo, Redis, Nginx 2 | # Minh Chu 3 | 4 | version: "2" 5 | services: 6 | api: 7 | image: node:boron 8 | depends_on: 9 | - mongodb 10 | - redis 11 | volumes: 12 | - ./api:/home/node/api/ 13 | working_dir: /home/node/api 14 | command: yarn start 15 | networks: 16 | - backend 17 | logging: 18 | driver: "json-file" 19 | options: 20 | max-size: "100MB" 21 | max-file: "3" 22 | 23 | mongodb: 24 | image: mongo:3.0 25 | volumes: 26 | - mongodb:/data/db/ 27 | networks: 28 | - backend 29 | logging: 30 | driver: "json-file" 31 | options: 32 | max-size: "100MB" 33 | max-file: "3" 34 | 35 | redis: 36 | image: redis:3.2-alpine 37 | networks: 38 | - backend 39 | volumes: 40 | - redis:/data/ 41 | logging: 42 | driver: "json-file" 43 | options: 44 | max-size: "100MB" 45 | max-file: "3" 46 | 47 | nginx: 48 | image: nginx:stable-alpine 49 | depends_on: 50 | - api 51 | networks: 52 | - backend 53 | volumes: 54 | - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro 55 | ports: 56 | - "80:80" 57 | - "443:443" 58 | logging: 59 | driver: "json-file" 60 | options: 61 | max-size: "100MB" 62 | max-file: "3" 63 | 64 | networks: 65 | backend: 66 | 67 | volumes: 68 | mongodb: 69 | redis: 70 | -------------------------------------------------------------------------------- /nginx/default.conf: -------------------------------------------------------------------------------- 1 | upstream backend { 2 | server api:3000; 3 | } 4 | 5 | server { 6 | listen 80 default_server; 7 | 8 | location / { 9 | proxy_pass http://backend; 10 | proxy_http_version 1.1; 11 | proxy_set_header Upgrade $http_upgrade; 12 | proxy_set_header Connection 'upgrade'; 13 | proxy_set_header Host $host; 14 | proxy_cache_bypass $http_upgrade; 15 | } 16 | } 17 | --------------------------------------------------------------------------------