├── 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 |
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 |
--------------------------------------------------------------------------------