Merge pull request #185 from AlecM33/local-docker-compose

Local docker compose
This commit is contained in:
Alec
2024-03-04 20:50:09 -05:00
committed by GitHub
11 changed files with 118 additions and 75 deletions

4
.dockerignore Normal file
View File

@@ -0,0 +1,4 @@
.git
*Dockerfile*
*docker-compose*
node_modules

3
.env Normal file
View File

@@ -0,0 +1,3 @@
CONTAINER_PORT_1=5000
CONTAINER_PORT_2=5001
WEB_PORT=5000

View File

@@ -1,4 +1,4 @@
# Use the official lightweight Node.js 12 image. # Use the official lightweight Node.js 14 image.
# https://hub.docker.com/_/node # https://hub.docker.com/_/node
FROM node:14-slim FROM node:14-slim

15
Dockerfile.dev Normal file
View File

@@ -0,0 +1,15 @@
FROM node:14-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . ./
ENV NODE_ENV development
ENV REDIS_URL_DEV "redis://redis:6379"
ENV WEB_PORT 5000
CMD [ "npm", "run", "start:dev:docker" ]

View File

@@ -51,6 +51,16 @@ Instances of this app are part of a stateless architecture that scales up and do
### Running Locally ### Running Locally
#### Using Docker
If you have Docker Desktop installed, running `docker compose up` will spin up, by default, two
web servers and one redis server for them to connect to. The app can then be accessed at `localhost:5000`
or `localhost:5001`. Otherwise, read below for setup that does not use Docker.
![image](https://github.com/AlecM33/Werewolf/assets/24642328/36161f89-20a4-4236-ad24-e395985d48c3)
#### Without Docker
The entrypoint for the application is `index.js` at the root. The entrypoint for the application is `index.js` at the root.
Before starting the Node.js server, you'll need a Redis server running locally on the default port. This is what's used Before starting the Node.js server, you'll need a Redis server running locally on the default port. This is what's used

15
compose.yaml Normal file
View File

@@ -0,0 +1,15 @@
services:
redis:
image: "redis:alpine"
ports:
- "6379:6379"
web:
build:
dockerfile: Dockerfile.dev
ports:
- "${CONTAINER_PORT_1}:${WEB_PORT}"
web-2:
build:
dockerfile: Dockerfile.dev
ports:
- "${CONTAINER_PORT_2}:${WEB_PORT}"

View File

@@ -41,6 +41,6 @@
}); });
})().then(() => console.log('Server startup complete.')) })().then(() => console.log('Server startup complete.'))
.catch((e) => { .catch((e) => {
console.error('SERVER FAILED TO START: ' + e); console.error('SERVER FAILED TO START: ' + e.stack);
process.exit(-1); process.exit(-1);
}); });

125
package-lock.json generated
View File

@@ -2551,9 +2551,9 @@
} }
}, },
"node_modules/browserslist": { "node_modules/browserslist": {
"version": "4.21.3", "version": "4.22.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
"integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -2562,13 +2562,17 @@
{ {
"type": "tidelift", "type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist" "url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
} }
], ],
"dependencies": { "dependencies": {
"caniuse-lite": "^1.0.30001370", "caniuse-lite": "^1.0.30001565",
"electron-to-chromium": "^1.4.202", "electron-to-chromium": "^1.4.601",
"node-releases": "^2.0.6", "node-releases": "^2.0.14",
"update-browserslist-db": "^1.0.5" "update-browserslist-db": "^1.0.13"
}, },
"bin": { "bin": {
"browserslist": "cli.js" "browserslist": "cli.js"
@@ -2612,9 +2616,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001388", "version": "1.0.30001566",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz",
"integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -2623,6 +2627,10 @@
{ {
"type": "tidelift", "type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite" "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
} }
] ]
}, },
@@ -2905,28 +2913,18 @@
} }
}, },
"node_modules/core-js-compat": { "node_modules/core-js-compat": {
"version": "3.20.0", "version": "3.34.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.0.tgz", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz",
"integrity": "sha512-relrah5h+sslXssTTOkvqcC/6RURifB0W5yhYBdBkaPYa5/2KBMiog3XiD+s3TwEHWxInWVv4Jx2/Lw0vng+IQ==", "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"browserslist": "^4.19.1", "browserslist": "^4.22.2"
"semver": "7.0.0"
}, },
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/core-js" "url": "https://opencollective.com/core-js"
} }
}, },
"node_modules/core-js-compat/node_modules/semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/core-util-is": { "node_modules/core-util-is": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -3072,9 +3070,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.240", "version": "1.4.605",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.240.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.605.tgz",
"integrity": "sha512-r20dUOtZ4vUPTqAajDGonIM1uas5tf85Up+wPdtNBNvBSqGCfkpvMVvQ1T8YJzPV9/Y9g3FbUDcXb94Rafycow==" "integrity": "sha512-V52j+P5z6cdRqTjPR/bYNxx7ETCHIkm5VIGuyCy3CMrfSnbEpIlLnk5oHmZo7gYvDfh2TfHeanB6rawyQ23ktg=="
}, },
"node_modules/emoji-regex": { "node_modules/emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
@@ -5564,9 +5562,9 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
}, },
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.6", "version": "2.0.14",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
}, },
"node_modules/normalize-path": { "node_modules/normalize-path": {
"version": "3.0.0", "version": "3.0.0",
@@ -7064,9 +7062,9 @@
} }
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.0.7", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -7075,6 +7073,10 @@
{ {
"type": "tidelift", "type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist" "url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
} }
], ],
"dependencies": { "dependencies": {
@@ -7082,7 +7084,7 @@
"picocolors": "^1.0.0" "picocolors": "^1.0.0"
}, },
"bin": { "bin": {
"browserslist-lint": "cli.js" "update-browserslist-db": "cli.js"
}, },
"peerDependencies": { "peerDependencies": {
"browserslist": ">= 4.21.0" "browserslist": ">= 4.21.0"
@@ -9289,14 +9291,14 @@
} }
}, },
"browserslist": { "browserslist": {
"version": "4.21.3", "version": "4.22.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
"integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
"requires": { "requires": {
"caniuse-lite": "^1.0.30001370", "caniuse-lite": "^1.0.30001565",
"electron-to-chromium": "^1.4.202", "electron-to-chromium": "^1.4.601",
"node-releases": "^2.0.6", "node-releases": "^2.0.14",
"update-browserslist-db": "^1.0.5" "update-browserslist-db": "^1.0.13"
} }
}, },
"buffer-from": { "buffer-from": {
@@ -9325,9 +9327,9 @@
"dev": true "dev": true
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001388", "version": "1.0.30001566",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz",
"integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==" "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA=="
}, },
"chalk": { "chalk": {
"version": "2.4.2", "version": "2.4.2",
@@ -9531,21 +9533,12 @@
"dev": true "dev": true
}, },
"core-js-compat": { "core-js-compat": {
"version": "3.20.0", "version": "3.34.0",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.0.tgz", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz",
"integrity": "sha512-relrah5h+sslXssTTOkvqcC/6RURifB0W5yhYBdBkaPYa5/2KBMiog3XiD+s3TwEHWxInWVv4Jx2/Lw0vng+IQ==", "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.19.1", "browserslist": "^4.22.2"
"semver": "7.0.0"
},
"dependencies": {
"semver": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
"integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"dev": true
}
} }
}, },
"core-util-is": { "core-util-is": {
@@ -9662,9 +9655,9 @@
} }
}, },
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.4.240", "version": "1.4.605",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.240.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.605.tgz",
"integrity": "sha512-r20dUOtZ4vUPTqAajDGonIM1uas5tf85Up+wPdtNBNvBSqGCfkpvMVvQ1T8YJzPV9/Y9g3FbUDcXb94Rafycow==" "integrity": "sha512-V52j+P5z6cdRqTjPR/bYNxx7ETCHIkm5VIGuyCy3CMrfSnbEpIlLnk5oHmZo7gYvDfh2TfHeanB6rawyQ23ktg=="
}, },
"emoji-regex": { "emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
@@ -11481,9 +11474,9 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
}, },
"node-releases": { "node-releases": {
"version": "2.0.6", "version": "2.0.14",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
}, },
"normalize-path": { "normalize-path": {
"version": "3.0.0", "version": "3.0.0",
@@ -12583,9 +12576,9 @@
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
}, },
"update-browserslist-db": { "update-browserslist-db": {
"version": "1.0.7", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"requires": { "requires": {
"escalade": "^3.1.1", "escalade": "^3.1.1",
"picocolors": "^1.0.0" "picocolors": "^1.0.0"

View File

@@ -7,11 +7,12 @@
"bundle": "webpack --config client/webpack/webpack-prod.config.js", "bundle": "webpack --config client/webpack/webpack-prod.config.js",
"gcp-build": "webpack --config client/webpack/webpack-prod.config.js", "gcp-build": "webpack --config client/webpack/webpack-prod.config.js",
"build:dev": "webpack --watch --config client/webpack/webpack-dev.config.js --mode=development", "build:dev": "webpack --watch --config client/webpack/webpack-dev.config.js --mode=development",
"start:dev": "NODE_ENV=development && webpack --config client/webpack/webpack-dev.config.js --mode=development && nodemon index.js", "start:dev:docker": "webpack --config client/webpack/webpack-dev.config.js --mode=development && node index.js -- loglevel=debug",
"start:dev:no-hot-reload": "NODE_ENV=development && webpack --config client/webpack/webpack-dev.config.js --mode=development && node index.js", "start:dev": "NODE_ENV=development REDIS_URL_DEV=redis://127.0.0.1:6379 && webpack --config client/webpack/webpack-dev.config.js --mode=development && nodemon index.js",
"start:dev:windows": "SET NODE_ENV=development && webpack --config client/webpack/webpack-dev.config.js --mode=development && nodemon index.js -- loglevel=debug", "start:dev:no-hot-reload": "NODE_ENV=development REDIS_URL_DEV=redis://127.0.0.1:6379 && webpack --config client/webpack/webpack-dev.config.js --mode=development && node index.js",
"start:dev:windows:no-hot-reload:debug": "SET NODE_ENV=development && webpack --config client/webpack/webpack-dev.config.js --mode=development && node --inspect index.js", "start:dev:windows": "SET NODE_ENV=development & SET REDIS_URL_DEV=redis://127.0.0.1:6379 && webpack --config client/webpack/webpack-dev.config.js --mode=development && nodemon index.js -- loglevel=debug",
"start:dev:windows:no-hot-reload": "SET NODE_ENV=development && webpack --config client/webpack/webpack-dev.config.js --mode=development && node index.js", "start:dev:windows:no-hot-reload:debug": "SET NODE_ENV=development & SET REDIS_URL_DEV=redis://127.0.0.1:6379 && webpack --config client/webpack/webpack-dev.config.js --mode=development && node --inspect index.js",
"start:dev:windows:no-hot-reload": "SET NODE_ENV=development & SET REDIS_URL_DEV=redis://127.0.0.1:6379 && webpack --config client/webpack/webpack-dev.config.js --mode=development && node index.js",
"start": "NODE_ENV=production node index.js -- loglevel=debug", "start": "NODE_ENV=production node index.js -- loglevel=debug",
"start:windows": "SET NODE_ENV=production && node index.js -- loglevel=debug port=8080", "start:windows": "SET NODE_ENV=production && node index.js -- loglevel=debug port=8080",
"test": "jasmine && karma start --single-run --browsers ChromeHeadless karma.conf.js", "test": "jasmine && karma start --single-run --browsers ChromeHeadless karma.conf.js",

View File

@@ -35,7 +35,7 @@ const ServerBootstrapper = {
try { try {
const args = Array.from(process.argv.map((arg) => arg.trim().toLowerCase())); const args = Array.from(process.argv.map((arg) => arg.trim().toLowerCase()));
const useHttps = args.includes('protocol=https'); const useHttps = args.includes('protocol=https');
const port = process.env.PORT || args const port = process.env.WEB_PORT || args
.filter((arg) => { .filter((arg) => {
return /port=\d+/.test(arg); return /port=\d+/.test(arg);
}) })

View File

@@ -25,7 +25,9 @@ class EventManager {
createRedisPublisher = async () => { createRedisPublisher = async () => {
this.publisher = process.env.NODE_ENV.trim() === 'development' this.publisher = process.env.NODE_ENV.trim() === 'development'
? redis.createClient() ? redis.createClient({
url: process.env.REDIS_URL_DEV
})
: redis.createClient({ : redis.createClient({
url: process.env.REDIS_URL url: process.env.REDIS_URL
}); });