From cd3f653f3fc96e5fb83d45dc574984a6d61a4238 Mon Sep 17 00:00:00 2001 From: Emma Date: Thu, 4 May 2023 20:04:06 -0600 Subject: [PATCH] Create service dockerising stuff --- .gitignore | 2 + .vscode/settings.json | 36 +++++------ createMissingContainers.ts | 24 ++++++++ createService.ts | 69 +++++++++++++++++++--- deno.jsonc | 1 + deno.lock | 7 ++- docker-compose.yml | 17 ++++++ game-systems-service/Dockerfile | 15 +++++ game-systems-service/{index.ts => main.ts} | 0 game-systems-service/port | 1 + honors-service/Dockerfile | 15 +++++ honors-service/{index.ts => main.ts} | 0 honors-service/port | 1 + middleware/auth.ts | 2 +- rules-service/Dockerfile | 15 +++++ rules-service/{index.ts => main.ts} | 0 rules-service/port | 1 + user-service/Dockerfile | 15 +++++ user-service/{index.ts => main.ts} | 2 +- user-service/port | 1 + 20 files changed, 194 insertions(+), 30 deletions(-) create mode 100644 createMissingContainers.ts create mode 100644 docker-compose.yml create mode 100644 game-systems-service/Dockerfile rename game-systems-service/{index.ts => main.ts} (100%) create mode 100644 game-systems-service/port create mode 100644 honors-service/Dockerfile rename honors-service/{index.ts => main.ts} (100%) create mode 100644 honors-service/port create mode 100644 rules-service/Dockerfile rename rules-service/{index.ts => main.ts} (100%) create mode 100644 rules-service/port create mode 100644 user-service/Dockerfile rename user-service/{index.ts => main.ts} (96%) create mode 100644 user-service/port diff --git a/.gitignore b/.gitignore index 35dc577..83a1cf1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ secrets.json + +data/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 6691a8c..f83120c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,24 +1,24 @@ { "workbench.colorCustomizations": { - "activityBar.activeBackground": "#a210bb", - "activityBar.background": "#a210bb", - "activityBar.foreground": "#e7e7e7", - "activityBar.inactiveForeground": "#e7e7e799", - "activityBarBadge.background": "#3b3305", - "activityBarBadge.foreground": "#e7e7e7", - "commandCenter.border": "#e7e7e799", - "sash.hoverBorder": "#a210bb", - "statusBar.background": "#790c8c", - "statusBar.foreground": "#e7e7e7", - "statusBarItem.hoverBackground": "#a210bb", - "statusBarItem.remoteBackground": "#790c8c", - "statusBarItem.remoteForeground": "#e7e7e7", - "titleBar.activeBackground": "#790c8c", - "titleBar.activeForeground": "#e7e7e7", - "titleBar.inactiveBackground": "#790c8c99", - "titleBar.inactiveForeground": "#e7e7e799" + "activityBar.activeBackground": "#d2d1f5", + "activityBar.background": "#d2d1f5", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#dd6562", + "activityBarBadge.foreground": "#15202b", + "commandCenter.border": "#15202b99", + "sash.hoverBorder": "#d2d1f5", + "statusBar.background": "#a9a7ec", + "statusBar.foreground": "#15202b", + "statusBarItem.hoverBackground": "#807de3", + "statusBarItem.remoteBackground": "#a9a7ec", + "statusBarItem.remoteForeground": "#15202b", + "titleBar.activeBackground": "#a9a7ec", + "titleBar.activeForeground": "#15202b", + "titleBar.inactiveBackground": "#a9a7ec99", + "titleBar.inactiveForeground": "#15202b99" }, - "peacock.remoteColor": "#790c8c", + "peacock.remoteColor": "#a9a7ec", "deno.enable": true, "deno.unstable": true, "deno.config": "./deno.jsonc" diff --git a/createMissingContainers.ts b/createMissingContainers.ts new file mode 100644 index 0000000..a1b9447 --- /dev/null +++ b/createMissingContainers.ts @@ -0,0 +1,24 @@ +for await (const service of Deno.readDir('.')) { + if (service.isFile || !service.name.includes('-service')) continue; + + const serviceFile = './' + service.name + '/'; + const serviceName = service.name.replace('-service', ''); + const port = await Deno.readTextFile(serviceFile + 'port'); + const perms = (await Deno.readTextFile(serviceFile + 'perms')).split('\n'); + await Deno.writeTextFile(serviceFile + 'Dockerfile', ` +FROM denoland/deno:1.33.2 +${port ? 'EXPOSE ' + port : ''} + +WORKDIR /${serviceName} + +ADD ./user-service . +COPY ./deno.jsonc . +COPY ./secrets.json . +COPY ./key.txt . +ADD ./common ./common +ADD ./lib ./lib +ADD ./middleware ./middleware + +CMD ["run", "${perms.join('", "')}", main.ts${port ? `, "${port}"` : ''}] +`); +} \ No newline at end of file diff --git a/createService.ts b/createService.ts index 111a584..72b86b3 100644 --- a/createService.ts +++ b/createService.ts @@ -1,3 +1,5 @@ +import {parse, stringify} from 'yaml'; + (async () => { const serviceName = prompt('Service name? (This is used by the router to determine the route prefix)')?.replace('-service', ''); if (!serviceName) return; @@ -69,10 +71,15 @@ if (!confirm('Service does not have permissions to "net", is this correct?')) perms.push(getPermissionByNameOrShort('net')); } - + const serviceFile = `./${serviceName}-service/`; + let port; await Deno.mkdir(serviceFile); - await Deno.writeTextFile(serviceFile + 'index.ts', ` + port = await getAvailablePort(); + if (perms.find(p => p.name === 'net')) { + await Deno.writeTextFile(serviceFile + 'port', port) + } + await Deno.writeTextFile(serviceFile + 'main.ts', ` import { CGGService } from 'cgg/Application.ts'; import { Router } from 'oak'; @@ -85,6 +92,25 @@ console.log('User service running on ' + Deno.args.at(0)); `); await Deno.writeTextFile(serviceFile + 'perms', perms.map(p => p.denoPerm).join('\n')); await Deno.writeTextFile(serviceFile + 'prefix', serviceName); + + if (confirm('Containerize this service?')) { + await Deno.writeTextFile(serviceFile + 'Dockerfile', ` +FROM denoland/deno:1.33.2 +${port ? 'EXPOSE ' + port : ''} + +WORKDIR /${serviceName} + +ADD ./user-service . +COPY ./deno.jsonc . +COPY ./secrets.json . +COPY ./key.txt . +ADD ./common ./common +ADD ./lib ./lib +ADD ./middleware ./middleware + +CMD ["run", "${perms.join('", "')}", main.ts${port ? `, "${port}"` : ''}] +`); + } if (confirm('Does this service need DB access?')) await Deno.writeTextFile(serviceFile + 'data.ts', ` @@ -93,11 +119,36 @@ import { configDatabase } from 'lib/data.ts'; configDatabase(mongoose); `) +})(); -Deno.run({ - cmd: [ - 'mplayer', - './chimes.wav' - ] -}) -})(); \ No newline at end of file +async function getAvailablePort() { + let start = 6900; + + const missingPorts = []; + const takenPorts = []; + + for await (const dirEntry of Deno.readDir('.')) { + if (dirEntry.isFile || !dirEntry.name.includes('-service')) continue; + const dir = './' + dirEntry.name + '/'; + if (!Array.from(Deno.readDirSync(dir)).find(e => e.name === 'port')) { + missingPorts.push(dir); + continue; + } + + takenPorts.push(Number(await Deno.readTextFile(dir + 'port'))); + } + + takenPorts.sort(); + + for (const port of takenPorts) { + if (start === port) start++; + } + + for (const missing of missingPorts) { + Deno.writeTextFile(missing + 'port', start.toString()); + takenPorts.push(start); + while(takenPorts.includes(start)) start++; + } + + return start.toString(); +} diff --git a/deno.jsonc b/deno.jsonc index 0291061..c3752de 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -2,6 +2,7 @@ "imports": { "oak": "https://deno.land/x/oak@v12.2.0/mod.ts", "mongoose": "npm:mongoose", + "yaml": "npm:yaml", "/": "./", "./": "./", "common/": "./common/", diff --git a/deno.lock b/deno.lock index 3032a3f..b186b31 100644 --- a/deno.lock +++ b/deno.lock @@ -529,7 +529,8 @@ "specifiers": { "bcryptjs": "bcryptjs@2.4.3", "mongoose": "mongoose@7.0.4", - "play-sound": "play-sound@1.1.5" + "play-sound": "play-sound@1.1.5", + "yaml": "yaml@2.2.2" }, "packages": { "@types/node@18.11.18": { @@ -676,6 +677,10 @@ "tr46": "tr46@3.0.0", "webidl-conversions": "webidl-conversions@7.0.0" } + }, + "yaml@2.2.2": { + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dependencies": {} } } } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d3e5ce1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3.9' +services: + nginx: + image: 'jc21/nginx-proxy-manager:latest' + restart: unless-stopped + ports: + - '80:80' + - '81:81' + - '443:443' + volumes: + - ./data:/data + - ./letsencrypt:/etc/letsencrypt + user: + build: + context: ./ + dockerfile: ./user-service/Dockerfile + diff --git a/game-systems-service/Dockerfile b/game-systems-service/Dockerfile new file mode 100644 index 0000000..65431c0 --- /dev/null +++ b/game-systems-service/Dockerfile @@ -0,0 +1,15 @@ + +FROM denoland/deno:1.33.2 +EXPOSE 6903 + +WORKDIR /game-systems + +ADD ./user-service . +COPY ./deno.jsonc . +COPY ./secrets.json . +COPY ./key.txt . +ADD ./common ./common +ADD ./lib ./lib +ADD ./middleware ./middleware + +CMD ["run", "--allow-net", "--allow-read", "--allow-write", main.ts, "6903"] diff --git a/game-systems-service/index.ts b/game-systems-service/main.ts similarity index 100% rename from game-systems-service/index.ts rename to game-systems-service/main.ts diff --git a/game-systems-service/port b/game-systems-service/port new file mode 100644 index 0000000..0b2d26b --- /dev/null +++ b/game-systems-service/port @@ -0,0 +1 @@ +6903 \ No newline at end of file diff --git a/honors-service/Dockerfile b/honors-service/Dockerfile new file mode 100644 index 0000000..c5572c5 --- /dev/null +++ b/honors-service/Dockerfile @@ -0,0 +1,15 @@ + +FROM denoland/deno:1.33.2 +EXPOSE 6902 + +WORKDIR /honors + +ADD ./user-service . +COPY ./deno.jsonc . +COPY ./secrets.json . +COPY ./key.txt . +ADD ./common ./common +ADD ./lib ./lib +ADD ./middleware ./middleware + +CMD ["run", "--allow-net", main.ts, "6902"] diff --git a/honors-service/index.ts b/honors-service/main.ts similarity index 100% rename from honors-service/index.ts rename to honors-service/main.ts diff --git a/honors-service/port b/honors-service/port new file mode 100644 index 0000000..1bf144c --- /dev/null +++ b/honors-service/port @@ -0,0 +1 @@ +6902 \ No newline at end of file diff --git a/middleware/auth.ts b/middleware/auth.ts index 201e783..178f4d9 100644 --- a/middleware/auth.ts +++ b/middleware/auth.ts @@ -1,5 +1,5 @@ import { Context } from "oak"; -import { USER_TOKEN } from "../constsAndEnums.ts"; +import { USER_TOKEN } from "common/constsAndEnums.ts"; import { verifyUserSessionToken } from "../lib/jwt.ts"; export const authenticateUser = async (ctx: Context, next: () => any) => { diff --git a/rules-service/Dockerfile b/rules-service/Dockerfile new file mode 100644 index 0000000..01fa3df --- /dev/null +++ b/rules-service/Dockerfile @@ -0,0 +1,15 @@ + +FROM denoland/deno:1.33.2 +EXPOSE 6901 + +WORKDIR /rules + +ADD ./user-service . +COPY ./deno.jsonc . +COPY ./secrets.json . +COPY ./key.txt . +ADD ./common ./common +ADD ./lib ./lib +ADD ./middleware ./middleware + +CMD ["run", "--allow-net", main.ts, "6901"] diff --git a/rules-service/index.ts b/rules-service/main.ts similarity index 100% rename from rules-service/index.ts rename to rules-service/main.ts diff --git a/rules-service/port b/rules-service/port new file mode 100644 index 0000000..ee28b4d --- /dev/null +++ b/rules-service/port @@ -0,0 +1 @@ +6901 \ No newline at end of file diff --git a/user-service/Dockerfile b/user-service/Dockerfile new file mode 100644 index 0000000..b2b27c2 --- /dev/null +++ b/user-service/Dockerfile @@ -0,0 +1,15 @@ + +FROM denoland/deno:1.33.2 +EXPOSE 6900 + +WORKDIR /user + +ADD ./user-service . +COPY ./deno.jsonc . +COPY ./secrets.json . +COPY ./key.txt . +ADD ./common ./common +ADD ./lib ./lib +ADD ./middleware ./middleware + +CMD ["run", "--allow-read", "--allow-write", "--allow-net", "--allow-sys", "--allow-env", main.ts, "6900"] diff --git a/user-service/index.ts b/user-service/main.ts similarity index 96% rename from user-service/index.ts rename to user-service/main.ts index 1a5c2ba..fa440d1 100644 --- a/user-service/index.ts +++ b/user-service/main.ts @@ -1,7 +1,7 @@ import { Router } from 'oak'; import { CGGService } from 'cgg/Application.ts'; import { createUserSessionToken } from 'lib/jwt.ts'; -import { USER_TOKEN } from '../constsAndEnums.ts'; +import { USER_TOKEN } from 'common/constsAndEnums.ts'; import { User } from './data.ts'; import { bodyExists } from '../middleware/bodyExists.ts'; diff --git a/user-service/port b/user-service/port new file mode 100644 index 0000000..de925f4 --- /dev/null +++ b/user-service/port @@ -0,0 +1 @@ +6900 \ No newline at end of file