From 51d7160c3e5f9f121fa8cb26438cef6d704016e7 Mon Sep 17 00:00:00 2001 From: qwreey Date: Wed, 21 Feb 2024 00:19:16 +0900 Subject: [PATCH 1/8] Add Dockerfile support --- .dockerignore | 6 ++++++ Dockerfile | 18 ++++++++++++++++++ package.json | 2 ++ src/index.ts | 36 ++++++++++++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e075137 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.vscode/ +.gitignore +.git +README.md +config.example.json + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..15457d3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +ARG NODE_TAG=node:21-alpine + +FROM --platform=$BUILDPLATFORM $NODE_TAG AS base + +ADD . /app +WORKDIR /app + +# Enable yarn and install system packages +RUN corepack enable && apk add openssl1.1-compat-dev + +# Resolve packages +RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install + +# Build sources +RUN yarn docker:build + +CMD [ "yarn", "docker:start" ] + diff --git a/package.json b/package.json index ce2c142..3810c49 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,8 @@ "scripts": { "update": "git pull && yarn && yarn build && pm2 reload webhook-proxy webhook-proxy-processor || true", "build": "prisma migrate deploy && prisma generate && rimraf dist && tsc", + "docker:build": "prisma generate && rimraf dist && tsc", + "docker:start": "prisma migrate && node dist", "start": "yarn build && node dist" }, "dependencies": { diff --git a/src/index.ts b/src/index.ts index f958402..49b5e00 100644 --- a/src/index.ts +++ b/src/index.ts @@ -33,11 +33,11 @@ const VERSION = (() => { })(); const app = Express(); -const config = JSON.parse(fs.readFileSync('./config.json', 'utf8')) as { +let config = {} as { port: number; trustProxy: boolean; autoBlock: boolean; - queue: { + queue?: { enabled: boolean; rabbitmq: string; queue: string; @@ -46,6 +46,38 @@ const config = JSON.parse(fs.readFileSync('./config.json', 'utf8')) as { abuseThreshold: number; }; +if (fs.existsSync('./config.json')) { + config = JSON.parse(fs.readFileSync('./config.json', 'utf8')); +} + +function parseConfigBoolean(value:string|any):boolean { + if (value === "1") return true; + if (value === "0") return false; + if (value.toLowerCase() === "true") return true; + if (value.toLowerCase() === "false") return false; + if (value.toLowerCase() === "yes") return true; + if (value.toLowerCase() === "no") return false; + if (value.toLowerCase() === "y") return true; + if (value.toLowerCase() === "n") return false; +} + +// Read configuration from env variable +for (const envItem of [ + [ 'PORT', (value:string) => { config.port = parseInt(value) } ], + [ 'TRUST_PROXY', (value:string) => { config.trustProxy = parseConfigBoolean(value) } ], + [ 'AUTO_BLOCK', (value:string) => { config.autoBlock = parseConfigBoolean(value) } ], + [ 'QUEUE_ENABLED', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).enabled = parseConfigBoolean(value) } ], + [ 'QUEUE_RABBITMQ', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).rabbitmq = value } ], + [ 'QUEUE', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).queue = value } ], + [ 'REDIS', (value:string) => { config.redis = value } ], + [ 'ABUSE_THRESHOLD', (value:string) => { config.abuseThreshold = parseInt(value) } ], +] as Array<[string, (value:string)=>undefined ]>) { + const value = process.env[envItem[0]]; + if (value !== undefined) { + envItem[1](value); + } +} + const db = new PrismaClient(); const redis = new Redis(config.redis); beforeShutdown(async () => { From f0c485f62f968cc70d1f1416361ca655d7c11673 Mon Sep 17 00:00:00 2001 From: qwreey Date: Wed, 21 Feb 2024 00:28:05 +0900 Subject: [PATCH 2/8] Add example docker-compose file --- .gitignore | 4 +++- docker-compose_example.yml | 49 ++++++++++++++++++++++++++++++++++++++ src/index.ts | 2 +- 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 docker-compose_example.yml diff --git a/.gitignore b/.gitignore index 8c9383a..88f0704 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ config.json blocklist.json proxy.db -proxy.db-journal \ No newline at end of file +proxy.db-journal +redis/ + diff --git a/docker-compose_example.yml b/docker-compose_example.yml new file mode 100644 index 0000000..8d48369 --- /dev/null +++ b/docker-compose_example.yml @@ -0,0 +1,49 @@ +version: '3.8' +networks: + external: + internal: + internal: true + +services: + # You can configure reverse proxy to establish https connection + # Consider, use caddy + # caddy: + # networks: + # - external + # - internal + # port: + # - 80:80 + # ... + + webhook-proxy: + depends_on: + webhook-proxy-redis: + condition: service_healthy + build: . + restart: unless-stopped + networks: + - external + - internal + environment: + PORT: 80 + TRUST_PROXY: false + AUTO_BLOCK: false + QUEUE_ENABLED: false + QUEUE_RABBITMQ: "amqp://localhost" + QUEUE_QUEUE: "webhook-proxy" + REDIS: "redis://redis/0" + ABUSE_THRESHOLD: 12 + + webhook-proxy-redis: + image: redis:7-alpine + restart: unless-stopped + networks: + - internal + volumes: + - ./redis:/data + healthcheck: + test: "redis-cli ping" + interval: 10s + retries: 20 + hostname: redis + diff --git a/src/index.ts b/src/index.ts index 49b5e00..bc68897 100644 --- a/src/index.ts +++ b/src/index.ts @@ -68,7 +68,7 @@ for (const envItem of [ [ 'AUTO_BLOCK', (value:string) => { config.autoBlock = parseConfigBoolean(value) } ], [ 'QUEUE_ENABLED', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).enabled = parseConfigBoolean(value) } ], [ 'QUEUE_RABBITMQ', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).rabbitmq = value } ], - [ 'QUEUE', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).queue = value } ], + [ 'QUEUE_QUEUE', (value:string) => { (config.queue ?? ( config.queue = {} as typeof config["queue"] )).queue = value } ], [ 'REDIS', (value:string) => { config.redis = value } ], [ 'ABUSE_THRESHOLD', (value:string) => { config.abuseThreshold = parseInt(value) } ], ] as Array<[string, (value:string)=>undefined ]>) { From e26fa95b705d5099a9d16c45e3762ae92f6c00f7 Mon Sep 17 00:00:00 2001 From: qwreey Date: Wed, 21 Feb 2024 00:36:22 +0900 Subject: [PATCH 3/8] Update compose file --- .gitignore | 1 + Dockerfile | 9 +++++++++ docker-compose_example.yml | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 88f0704..bec8b66 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ blocklist.json proxy.db proxy.db-journal redis/ +docker-compose.yml diff --git a/Dockerfile b/Dockerfile index 15457d3..31fb314 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,11 +8,20 @@ WORKDIR /app # Enable yarn and install system packages RUN corepack enable && apk add openssl1.1-compat-dev +FROM base AS builder + # Resolve packages RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install # Build sources RUN yarn docker:build +FROM base AS prod + +# Resolve packages, without devDependencies +RUN --mount=type=cache,target=/root.yarn YARN_CACHE_FOLDER=/root.yarn yarn install --production + +COPY --from=builder /app/dist /app/dist + CMD [ "yarn", "docker:start" ] diff --git a/docker-compose_example.yml b/docker-compose_example.yml index 8d48369..be2034b 100644 --- a/docker-compose_example.yml +++ b/docker-compose_example.yml @@ -11,7 +11,7 @@ services: # networks: # - external # - internal - # port: + # ports: # - 80:80 # ... @@ -33,6 +33,8 @@ services: QUEUE_QUEUE: "webhook-proxy" REDIS: "redis://redis/0" ABUSE_THRESHOLD: 12 + ports: + - 80:80 webhook-proxy-redis: image: redis:7-alpine From 110ed5df5bedc37800c01f3a068d88d2533ccabf Mon Sep 17 00:00:00 2001 From: qwreey Date: Wed, 21 Feb 2024 00:49:39 +0900 Subject: [PATCH 4/8] Change data path in docker --- .gitignore | 1 + Dockerfile | 2 ++ docker-compose_example.yml | 3 +++ package.json | 2 +- src/index.ts | 2 +- 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index bec8b66..03985d6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ proxy.db proxy.db-journal redis/ docker-compose.yml +data/ diff --git a/Dockerfile b/Dockerfile index 31fb314..96380aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ FROM --platform=$BUILDPLATFORM $NODE_TAG AS base ADD . /app WORKDIR /app +ENV DATABASE_URL "file:/data/proxy.db" # Enable yarn and install system packages RUN corepack enable && apk add openssl1.1-compat-dev @@ -22,6 +23,7 @@ FROM base AS prod RUN --mount=type=cache,target=/root.yarn YARN_CACHE_FOLDER=/root.yarn yarn install --production COPY --from=builder /app/dist /app/dist +ENV VERSION "docker" CMD [ "yarn", "docker:start" ] diff --git a/docker-compose_example.yml b/docker-compose_example.yml index be2034b..e91d23b 100644 --- a/docker-compose_example.yml +++ b/docker-compose_example.yml @@ -35,6 +35,9 @@ services: ABUSE_THRESHOLD: 12 ports: - 80:80 + volumes: + - ./proxy.db:/app/proxy.db + - ./proxy.db-journal:/app/proxy.db-journal webhook-proxy-redis: image: redis:7-alpine diff --git a/package.json b/package.json index 3810c49..ad8fe73 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "update": "git pull && yarn && yarn build && pm2 reload webhook-proxy webhook-proxy-processor || true", "build": "prisma migrate deploy && prisma generate && rimraf dist && tsc", "docker:build": "prisma generate && rimraf dist && tsc", - "docker:start": "prisma migrate && node dist", + "docker:start": "prisma migrate deploy && node dist", "start": "yarn build && node dist" }, "dependencies": { diff --git a/src/index.ts b/src/index.ts index bc68897..88828b9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,7 +19,7 @@ import { robloxRanges } from './robloxRanges'; import 'express-async-errors'; import { setup } from './rmq'; -const VERSION = (() => { +const VERSION = process.env.VERSION || (() => { const rev = fs.readFileSync('.git/HEAD').toString().trim(); if (rev.indexOf(':') === -1) { return rev; From a291ff9f81ff2142a4ffa5be66a2373dafd6e976 Mon Sep 17 00:00:00 2001 From: qwreey Date: Wed, 21 Feb 2024 01:17:33 +0900 Subject: [PATCH 5/8] Fix hardcoded db url --- Dockerfile | 1 - docker-compose_example.yml | 8 ++++---- package.json | 6 +++--- prisma/schema.prisma | 4 ++-- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 96380aa..98ac0fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,6 @@ FROM --platform=$BUILDPLATFORM $NODE_TAG AS base ADD . /app WORKDIR /app -ENV DATABASE_URL "file:/data/proxy.db" # Enable yarn and install system packages RUN corepack enable && apk add openssl1.1-compat-dev diff --git a/docker-compose_example.yml b/docker-compose_example.yml index e91d23b..3721861 100644 --- a/docker-compose_example.yml +++ b/docker-compose_example.yml @@ -16,6 +16,8 @@ services: # ... webhook-proxy: + links: + - webhook-proxy-redis:redis depends_on: webhook-proxy-redis: condition: service_healthy @@ -31,13 +33,12 @@ services: QUEUE_ENABLED: false QUEUE_RABBITMQ: "amqp://localhost" QUEUE_QUEUE: "webhook-proxy" - REDIS: "redis://redis/0" + REDIS: "redis://redis" ABUSE_THRESHOLD: 12 ports: - 80:80 volumes: - - ./proxy.db:/app/proxy.db - - ./proxy.db-journal:/app/proxy.db-journal + - ./data:/data webhook-proxy-redis: image: redis:7-alpine @@ -50,5 +51,4 @@ services: test: "redis-cli ping" interval: 10s retries: 20 - hostname: redis diff --git a/package.json b/package.json index ad8fe73..df20b10 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "scripts": { "update": "git pull && yarn && yarn build && pm2 reload webhook-proxy webhook-proxy-processor || true", - "build": "prisma migrate deploy && prisma generate && rimraf dist && tsc", + "build": "DATABASE_URL=file:./proxy.db prisma migrate deploy && prisma generate && rimraf dist && tsc", "docker:build": "prisma generate && rimraf dist && tsc", - "docker:start": "prisma migrate deploy && node dist", - "start": "yarn build && node dist" + "docker:start": "DATABASE_URL=file:/data/proxy.db prisma migrate deploy && DATABASE_URL=file:/data/proxy.db node dist", + "start": "yarn build && DATABASE_URL=file:./proxy.db node dist" }, "dependencies": { "@prisma/client": "^3.14.0", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7283428..184c1d3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -3,7 +3,7 @@ datasource db { provider = "sqlite" - url = "file:./proxy.db" + url = env("DATABASE_URL") } generator client { @@ -31,4 +31,4 @@ model BannedGame { model WebhooksSeen { id String @id -} \ No newline at end of file +} From dbbeeeea3608ac173520553a7360fbf4c6de0aa0 Mon Sep 17 00:00:00 2001 From: qwreey Date: Wed, 21 Feb 2024 01:35:37 +0900 Subject: [PATCH 6/8] Change distro to support libssl1.1 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 98ac0fc..100fb27 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG NODE_TAG=node:21-alpine +ARG NODE_TAG=node:21-bullseye FROM --platform=$BUILDPLATFORM $NODE_TAG AS base @@ -6,7 +6,7 @@ ADD . /app WORKDIR /app # Enable yarn and install system packages -RUN corepack enable && apk add openssl1.1-compat-dev +RUN corepack enable && apt install -y libssl1.1 FROM base AS builder From 97ea749172d9f8af4e1bf7a6af9f56778a61a3a5 Mon Sep 17 00:00:00 2001 From: Qwreey Date: Wed, 21 Feb 2024 01:40:31 +0900 Subject: [PATCH 7/8] Fix indent --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df20b10..e5e210d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "update": "git pull && yarn && yarn build && pm2 reload webhook-proxy webhook-proxy-processor || true", "build": "DATABASE_URL=file:./proxy.db prisma migrate deploy && prisma generate && rimraf dist && tsc", "docker:build": "prisma generate && rimraf dist && tsc", - "docker:start": "DATABASE_URL=file:/data/proxy.db prisma migrate deploy && DATABASE_URL=file:/data/proxy.db node dist", + "docker:start": "DATABASE_URL=file:/data/proxy.db prisma migrate deploy && DATABASE_URL=file:/data/proxy.db node dist", "start": "yarn build && DATABASE_URL=file:./proxy.db node dist" }, "dependencies": { From 37d4ba9611567a8d8290d17cd4257c085f86ed44 Mon Sep 17 00:00:00 2001 From: Qwreey Date: Wed, 21 Feb 2024 01:41:57 +0900 Subject: [PATCH 8/8] Remove useless empty line --- prisma/schema.prisma | 1 - 1 file changed, 1 deletion(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 184c1d3..89ae637 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,7 +12,6 @@ generator client { model BannedWebhook { id String @id - reason String }