Browse Source

Fix caddy

ghorsington 3 years ago
parent
commit
fd607c185d

+ 4 - 1
.env.template

@@ -20,4 +20,7 @@ ERRORS_ADDR=
 
 NOCTBOT_ADDR=
 RPC_PORT=
-WEB_AUTH_URI=
+WEB_COOKIE_KEY=
+WEB_AUTH_URI=
+HCAPTCHA_SITEKEY=
+HCAPTCHA_SECRET=

+ 2 - 0
Makefile

@@ -14,6 +14,8 @@ build_bot: build_shared
 build_web: build_shared
 	cd web && npm run build
 
+build_local: build_shared build_bot build_web
+
 build:
 	$(dc) build
 

+ 0 - 2
caddy_config/Caddyfile

@@ -1,2 +0,0 @@
-:443
-reverse_proxy web:3000

+ 7 - 1
docker-compose.dev.yml

@@ -11,4 +11,10 @@ services:
 
   facedetect:
     ports:
-      - 8081:80
+      - 8081:80
+
+  caddy:
+    ports:
+      - "3000:80"
+    environment:
+      DOMAINS: "localhost:80"

+ 10 - 5
docker-compose.yml

@@ -36,13 +36,17 @@ services:
 
   caddy:
     image: caddy
+    depends_on: 
+      - web
+    ports:
+      - "443:443"
+      - "80:80"
+    environment:
+      DOMAINS: ":443"
     volumes:
       - caddy-data:/data
       - caddy-config:/config
-      - ./caddy_config/Caddyfile:/etc/caddy/Caddyfile
-    ports: 
-      - "80:80"
-      - "443:443"
+      - ./web_config/Caddyfile:/etc/caddy/Caddyfile
 
   web:
     image: noctbot_web
@@ -51,7 +55,6 @@ services:
       dockerfile: ./web/Dockerfile
     restart: unless-stopped
     depends_on:
-      - caddy
       - db
       - noctbot
     env_file:
@@ -62,6 +65,8 @@ services:
       TYPEORM_USERNAME: ${DB_USERNAME}
       TYPEORM_PASSWORD: ${DB_PASSWORD}
       TYPEORM_DATABASE: ${DB_NAME}
+      WEB_DATA_PATH: /web_data
+      PORT: "80"
     volumes:
       - web-data:/web_data
 

+ 6 - 6
web/src/routes/login/discord.ts

@@ -1,14 +1,14 @@
 import { Request as ExpressRequest, Response as ExpressResponse } from "express";
 import { DiscordAPI } from "src/utils/util";
-import { ENVIRONMENT } from "src/utils/environment";
 import { Option, tryDo } from "@shared/common/async_utils";
 import { logger } from "src/utils/logging";
 import { rpcClient } from "src/utils/rpc";
+import { ENV } from "src/utils/environment";
 
 export const get = async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {
     res.redirect(DiscordAPI.getAuthUrl({
-        client_id: ENVIRONMENT.clientId,
-        redirect_url: ENVIRONMENT.redirectUrl,
+        client_id: ENV.BOT_CLIENT_ID,
+        redirect_url: ENV.WEB_AUTH_URI,
         response_type: "code",
         scope: "identify",
     }));
@@ -33,12 +33,12 @@ export const post = async (req: ExpressRequest, res: ExpressResponse):
         });
     }
     const tokenResult = await DiscordAPI.getToken({
-        client_id: ENVIRONMENT.clientId,
-        client_secret: ENVIRONMENT.clientSecret,
+        client_id: ENV.BOT_CLIENT_ID,
+        client_secret: ENV.BOT_CLIENT_SECRET,
         grant_type: "authorization_code",
         code: req.session.authTokenCode,
         scope: "identify",
-        redirect_uri: ENVIRONMENT.redirectUrl,
+        redirect_uri: ENV.WEB_AUTH_URI,
     });
     if (!tokenResult.ok) {
         return res.json(tokenResult);

+ 2 - 2
web/src/routes/rules/md.ts

@@ -1,15 +1,15 @@
 import { Request as ExpressRequest, Response as ExpressResponse } from "express";
 import { existsSync, promises } from "fs";
 import { join } from "path";
-import { ENVIRONMENT } from "src/utils/environment";
 import { Option } from "@shared/common/async_utils";
 import { rpcClient } from "src/utils/rpc";
+import { ENV } from "src/utils/environment";
 
 export interface MDText {
     text: string;
 }
 
-const FILE_PATH = join(ENVIRONMENT.dataPath, "rules.md");
+const FILE_PATH = join(ENV.WEB_DATA_PATH, "rules.md");
 
 type GetResult = Promise<ExpressResponse<Option<MDText, { error: string }>>>;
 export const get = async (req: ExpressRequest, res: ExpressResponse): GetResult => {

+ 4 - 4
web/src/routes/rules/verify.ts

@@ -1,9 +1,9 @@
 import { Request as ExpressRequest, Response as ExpressResponse } from "express";
-import { ENVIRONMENT } from "src/utils/environment";
 import { Option, tryDo } from "@shared/common/async_utils";
 import { rpcClient } from "src/utils/rpc";
 import got from "got";
 import { logger } from "src/utils/logging";
+import { ENV } from "src/utils/environment";
 
 export interface VerifyInfo {
     captchaSitekey: string;
@@ -25,12 +25,12 @@ type GetResult = Promise<ExpressResponse<VerifyInfo>>;
 export const get = async (req: ExpressRequest, res: ExpressResponse): GetResult => {
     if (!req.session?.userId) {
         return res.json({
-            captchaSitekey: ENVIRONMENT.hCaptchaSitekey,
+            captchaSitekey: ENV.HCAPTCHA_SITEKEY,
             userVerified: true,
         });
     }
     return res.json({
-        captchaSitekey: ENVIRONMENT.hCaptchaSitekey,
+        captchaSitekey: ENV.HCAPTCHA_SITEKEY,
         userVerified: (await rpcClient.userVerified({ userId: req.session.userId })).verified,
     });
 };
@@ -58,7 +58,7 @@ export const post = async (req: ExpressRequest, res: ExpressResponse): PostResul
         method: "post",
         responseType: "json",
         form: {
-            secret: ENVIRONMENT.hCaptchaSecret,
+            secret: ENV.HCAPTCHA_SECRET,
             response: req.body.captchaResponse,
         },
     }));

+ 1 - 1
web/src/server.ts

@@ -16,7 +16,7 @@ const PORT = process.env.PORT; // eslint-disable-line prefer-destructuring
 // replaces `process.env.NODE_ENV` with `"production"` during `prod`
 const dev = process.env.NODE_ENV === "development";
 
-logger.info("Staring webserver");
+logger.info("Staring webserver to port %s", PORT);
 
 const key = process.env.WEB_COOKIE_KEY;
 

+ 22 - 22
web/src/utils/environment.ts

@@ -11,32 +11,32 @@ if (process.env.NODE_ENV === "development") {
     process.env.TYPEORM_HOST = "localhost";
     process.env.NOCTBOT_ADDR = "localhost";
     process.env.WEB_DATA_PATH = "./web_data";
+    process.env.PORT = "3000";
     process.env.TYPEORM_USERNAME = process.env.DB_USERNAME;
     process.env.TYPEORM_PASSWORD = process.env.DB_PASSWORD;
     process.env.TYPEORM_DATABASE = process.env.DB_NAME;
 }
 
-export interface BotEnvironment {
-    clientId: string;
-    redirectUrl: string;
-    clientSecret: string;
-    dataPath: string;
-    hCaptchaSitekey: string;
-    hCaptchaSecret: string;
-}
-
-export const ENVIRONMENT: BotEnvironment = {
-    clientId: process.env.BOT_CLIENT_ID ?? "",
-    redirectUrl: process.env.WEB_AUTH_URI ?? "",
-    clientSecret: process.env.BOT_CLIENT_SECRET ?? "",
-    dataPath: process.env.WEB_DATA_PATH ?? "",
-    hCaptchaSitekey: process.env.HCAPTCHA_SITEKEY ?? "",
-    hCaptchaSecret: process.env.HCAPTCHA_SECRET ?? "",
+export const ENV = {
+    BOT_CLIENT_ID: "",
+    BOT_CLIENT_SECRET: "",
+    WEB_AUTH_URI: "",
+    WEB_DATA_PATH: "",
+    HCAPTCHA_SITEKEY: "",
+    HCAPTCHA_SECRET: "",
 };
 
-export const IS_VALID = process.env.BOT_CLIENT_ID !== undefined
-                        && process.env.WEB_AUTH_URI !== undefined
-                        && process.env.BOT_CLIENT_SECRET !== undefined
-                        && process.env.WEB_DATA_PATH !== undefined
-                        && process.env.HCAPTCHA_SITEKEY !== undefined
-                        && process.env.HCAPTCHA_SECRET !== undefined;
+function isValid(): boolean {
+    let valid = true;
+    Object.keys(ENV).forEach((envKey) => {
+        if (!process.env[envKey]) {
+            valid = false;
+            return;
+        }
+        const c = envKey as keyof typeof ENV;
+        ENV[c] = process.env[envKey] as string;
+    });
+    return valid;
+}
+
+export const IS_VALID = isValid();

+ 4 - 0
web_config/Caddyfile

@@ -0,0 +1,4 @@
+
+{$DOMAINS} {
+    reverse_proxy http://web:80
+}