diff --git a/apps/bridge-frontend/Dockerfile b/apps/bridge-frontend/Dockerfile index 44f5b57..c130181 100644 --- a/apps/bridge-frontend/Dockerfile +++ b/apps/bridge-frontend/Dockerfile @@ -33,18 +33,15 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ apt-get install -y --no-install-recommends \ dumb-init RUN mkdir -p ${APP_DIR} -RUN chown -R node ${APP_DIR}/ - -USER node WORKDIR ${APP_DIR} COPY --from=installer ${APP_DIR}/node_modules/ ./node_modules/ COPY --from=installer ${APP_DIR}/apps/bridge-frontend/ ./apps/bridge-frontend/ COPY --from=installer ${APP_DIR}/package.json ./package.json -USER root +RUN chown -R node:node ${APP_DIR}/ WORKDIR ${APP_DIR}/apps/bridge-frontend/ RUN chmod +x docker-entrypoint.sh USER node EXPOSE 3000 ENV PORT 3000 ENV NODE_ENV production -ENTRYPOINT ["/opt/link/apps/bridge-frontend/docker-entrypoint.sh"] +ENTRYPOINT ["/opt/bridge-frontend/apps/bridge-frontend/docker-entrypoint.sh"] diff --git a/packages/bridge-common/database/migrate.ts b/apps/bridge-frontend/database/migrate.ts similarity index 100% rename from packages/bridge-common/database/migrate.ts rename to apps/bridge-frontend/database/migrate.ts diff --git a/packages/bridge-common/database/migrations/0001-add-next-auth.ts b/apps/bridge-frontend/database/migrations/0001-add-next-auth.ts similarity index 100% rename from packages/bridge-common/database/migrations/0001-add-next-auth.ts rename to apps/bridge-frontend/database/migrations/0001-add-next-auth.ts diff --git a/packages/bridge-common/database/migrations/0002-add-signal.ts b/apps/bridge-frontend/database/migrations/0002-add-signal.ts similarity index 100% rename from packages/bridge-common/database/migrations/0002-add-signal.ts rename to apps/bridge-frontend/database/migrations/0002-add-signal.ts diff --git a/packages/bridge-common/database/migrations/0003-add-whatsapp.ts b/apps/bridge-frontend/database/migrations/0003-add-whatsapp.ts similarity index 100% rename from packages/bridge-common/database/migrations/0003-add-whatsapp.ts rename to apps/bridge-frontend/database/migrations/0003-add-whatsapp.ts diff --git a/packages/bridge-common/database/migrations/0004-add-voice.ts b/apps/bridge-frontend/database/migrations/0004-add-voice.ts similarity index 100% rename from packages/bridge-common/database/migrations/0004-add-voice.ts rename to apps/bridge-frontend/database/migrations/0004-add-voice.ts diff --git a/packages/bridge-common/database/migrations/0005-add-facebook.ts b/apps/bridge-frontend/database/migrations/0005-add-facebook.ts similarity index 100% rename from packages/bridge-common/database/migrations/0005-add-facebook.ts rename to apps/bridge-frontend/database/migrations/0005-add-facebook.ts diff --git a/packages/bridge-common/database/migrations/0006-add-webhooks.ts b/apps/bridge-frontend/database/migrations/0006-add-webhooks.ts similarity index 100% rename from packages/bridge-common/database/migrations/0006-add-webhooks.ts rename to apps/bridge-frontend/database/migrations/0006-add-webhooks.ts diff --git a/packages/bridge-common/database/migrations/0007-add-settings.ts b/apps/bridge-frontend/database/migrations/0007-add-settings.ts similarity index 100% rename from packages/bridge-common/database/migrations/0007-add-settings.ts rename to apps/bridge-frontend/database/migrations/0007-add-settings.ts diff --git a/apps/bridge-frontend/docker-entrypoint.sh b/apps/bridge-frontend/docker-entrypoint.sh index b1cc6eb..10b1644 100644 --- a/apps/bridge-frontend/docker-entrypoint.sh +++ b/apps/bridge-frontend/docker-entrypoint.sh @@ -1,5 +1,7 @@ #!/bin/bash set -e +echo "running migrations" +npm run migrate:up:all echo "starting bridge-frontend" exec dumb-init npm run start diff --git a/apps/bridge-frontend/package.json b/apps/bridge-frontend/package.json index badc084..616d23a 100644 --- a/apps/bridge-frontend/package.json +++ b/apps/bridge-frontend/package.json @@ -6,7 +6,11 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "migrate:up:all": "tsx database/migrate.ts up:all", + "migrate:up:one": "tsx database/migrate.ts up:one", + "migrate:down:all": "tsx database/migrate.ts down:all", + "migrate:down:one": "tsx database/migrate.ts down:one" }, "dependencies": { "@auth/kysely-adapter": "^1.1.0", diff --git a/apps/bridge-worker/Dockerfile b/apps/bridge-worker/Dockerfile index 05f1cac..a6885d2 100644 --- a/apps/bridge-worker/Dockerfile +++ b/apps/bridge-worker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine as base +FROM node:20-bookworm AS base FROM base AS builder ARG APP_DIR=/opt/bridge-worker @@ -11,22 +11,26 @@ RUN turbo prune --scope=bridge-worker --docker FROM base AS installer ARG APP_DIR=/opt/bridge-worker WORKDIR ${APP_DIR} -COPY --from=builder ${APP_DIR}/.gitignore .gitignore COPY --from=builder ${APP_DIR}/out/json/ . -COPY --from=builder ${APP_DIR}/out/package-lock.json ./package-lock.json COPY --from=builder ${APP_DIR}/out/full/ . +COPY --from=builder ${APP_DIR}/out/package-lock.json ./package-lock.json RUN npm ci RUN npm i -g turbo RUN turbo run build --filter=bridge-worker -FROM graphile/worker:0.16.5 as runner +FROM base as runner +ARG BUILD_DATE +ARG VERSION ARG APP_DIR=/opt/bridge-worker RUN mkdir -p ${APP_DIR}/ -ARG BUILD_DIR=${APP_DIR}/apps/bridge-worker/build/main -RUN mkdir -p ${APP_DIR}/ -WORKDIR /worker -COPY --from=installer ${BUILD_DIR}/lib ${APP_DIR}/lib -COPY --from=installer ${BUILD_DIR}/tasks ${APP_DIR}/tasks -COPY --from=installer ${APP_DIR}/apps/bridge-worker/graphile.config.prod.js ./graphile.config.js -COPY --from=installer ${APP_DIR}/node_modules ${APP_DIR}/node_modules -COPY --from=installer ${APP_DIR}/package.json ${APP_DIR}/package.json +RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ + apt-get install -y --no-install-recommends \ + dumb-init +WORKDIR ${APP_DIR} +COPY --from=installer ${APP_DIR} ./ +RUN chown -R node:node ${APP_DIR} +WORKDIR ${APP_DIR}/apps/bridge-worker/ +RUN chmod +x docker-entrypoint.sh +USER node +ENV NODE_ENV production +ENTRYPOINT ["/opt/bridge-worker/apps/bridge-worker/docker-entrypoint.sh"] diff --git a/apps/bridge-worker/docker-entrypoint.sh b/apps/bridge-worker/docker-entrypoint.sh new file mode 100644 index 0000000..5a72275 --- /dev/null +++ b/apps/bridge-worker/docker-entrypoint.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e +echo "starting bridge-worker" +exec dumb-init npm run start diff --git a/apps/bridge-worker/graphile.config.prod.js b/apps/bridge-worker/graphile.config.prod.js index 9a10871..989c483 100644 --- a/apps/bridge-worker/graphile.config.prod.js +++ b/apps/bridge-worker/graphile.config.prod.js @@ -4,7 +4,7 @@ module.exports = { maxPoolSize: 10, pollInterval: 2000, concurrentJobs: 3, - taskDirectory: "/opt/bridge/tasks", + taskDirectory: "/opt/bridge-worker/apps/bridge-worker/build/main/tasks", fileExtensions: [".js", ".cjs", ".mjs"], }, }; diff --git a/apps/bridge-worker/index.ts b/apps/bridge-worker/index.ts new file mode 100644 index 0000000..3889416 --- /dev/null +++ b/apps/bridge-worker/index.ts @@ -0,0 +1,26 @@ +import { run } from "graphile-worker"; +import * as path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const startWorker = async () => { + await run({ + connectionString: process.env.DATABASE_URL, + concurrency: 10, + noHandleSignals: false, + pollInterval: 1000, + taskDirectory: `${__dirname}/tasks`, + // crontabFile: `${__dirname}/crontab`, + }); +}; + +const main = async () => { + await startWorker(); +}; + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/apps/bridge-worker/lib/common.ts b/apps/bridge-worker/lib/common.ts index b257f2a..26e4aeb 100644 --- a/apps/bridge-worker/lib/common.ts +++ b/apps/bridge-worker/lib/common.ts @@ -2,7 +2,7 @@ // import { SavedVoiceProvider } from "@digiresilience/bridge-db"; import Twilio from "twilio"; import { CallInstance } from "twilio/lib/rest/api/v2010/account/call"; -import { Zammad, getOrCreateUser } from "./zammad"; +import { Zammad, getOrCreateUser } from "./zammad.js"; type SavedVoiceProvider = any; diff --git a/apps/bridge-worker/package.json b/apps/bridge-worker/package.json index 5868d74..bf4e3b6 100644 --- a/apps/bridge-worker/package.json +++ b/apps/bridge-worker/package.json @@ -2,11 +2,13 @@ "name": "bridge-worker", "version": "0.2.0", "type": "module", + "main": "build/main/index.js", "author": "Darren Clarke ", "license": "AGPL-3.0-or-later", "scripts": { "build": "tsc -p tsconfig.json", - "dev": "dotenv -- graphile-worker" + "dev": "dotenv -- graphile-worker", + "start": "node build/main/index.js" }, "dependencies": { "@hapi/wreck": "^18.1.0", diff --git a/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts b/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts index a49f6bb..0d84a0d 100644 --- a/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts +++ b/apps/bridge-worker/tasks/leafcutter/import-label-studio.ts @@ -1,9 +1,9 @@ /* eslint-disable camelcase */ import { convert } from "html-to-text"; import { URLSearchParams } from "url"; -import { withDb, AppDatabase } from "../../lib/db"; +import { withDb, AppDatabase } from "../../lib/db.js"; // import { loadConfig } from "@digiresilience/bridge-config"; -import { tagMap } from "../../lib/tag-map"; +import { tagMap } from "../../lib/tag-map.js"; const config: any = {}; diff --git a/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts b/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts index 1d069f3..4e125d3 100644 --- a/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts +++ b/apps/bridge-worker/tasks/leafcutter/import-leafcutter.ts @@ -1,6 +1,6 @@ /* eslint-disable camelcase */ import { URLSearchParams } from "url"; -import { withDb, AppDatabase } from "../../lib/db"; +import { withDb, AppDatabase } from "../../lib/db.js"; // import { loadConfig } from "@digiresilience/bridge-config"; const config: any = {}; diff --git a/apps/bridge-worker/tasks/signal/receive-signal-message.ts b/apps/bridge-worker/tasks/signal/receive-signal-message.ts index 3065a61..0e0410e 100644 --- a/apps/bridge-worker/tasks/signal/receive-signal-message.ts +++ b/apps/bridge-worker/tasks/signal/receive-signal-message.ts @@ -1,4 +1,4 @@ -import { db, getWorkerUtils } from "bridge-common"; +// import { db, getWorkerUtils } from "bridge-common"; interface ReceiveSignalMessageTaskOptions { message: any; diff --git a/apps/bridge-worker/tasks/signal/send-signal-message.ts b/apps/bridge-worker/tasks/signal/send-signal-message.ts index 3f35d76..2e5e2b8 100644 --- a/apps/bridge-worker/tasks/signal/send-signal-message.ts +++ b/apps/bridge-worker/tasks/signal/send-signal-message.ts @@ -1,4 +1,4 @@ -import { db, getWorkerUtils } from "bridge-common"; +// import { db, getWorkerUtils } from "bridge-common"; interface SendSignalMessageTaskOptions { message: any; diff --git a/apps/bridge-worker/tasks/signal/signald-message.ts b/apps/bridge-worker/tasks/signal/signald-message.ts index a8f114c..190c0b6 100644 --- a/apps/bridge-worker/tasks/signal/signald-message.ts +++ b/apps/bridge-worker/tasks/signal/signald-message.ts @@ -1,8 +1,8 @@ /* eslint-disable camelcase */ // import logger from "../logger"; // import { IncomingMessagev1 } from "@digiresilience/node-signald/build/main/generated"; -import { withDb, AppDatabase } from "../../lib/db"; -import workerUtils from "../../lib/utils"; +import { withDb, AppDatabase } from "../../lib/db.js"; +import workerUtils from "../../lib/utils.js"; type IncomingMessagev1 = any; diff --git a/apps/bridge-worker/tasks/voice/receive-voice-message.ts b/apps/bridge-worker/tasks/voice/receive-voice-message.ts index 52175ec..c6231d6 100644 --- a/apps/bridge-worker/tasks/voice/receive-voice-message.ts +++ b/apps/bridge-worker/tasks/voice/receive-voice-message.ts @@ -1,4 +1,4 @@ -import { db, getWorkerUtils } from "bridge-common"; +// import { db, getWorkerUtils } from "bridge-common"; interface ReceiveVoiceMessageTaskOptions { message: any; diff --git a/apps/bridge-worker/tasks/voice/send-voice-message.ts b/apps/bridge-worker/tasks/voice/send-voice-message.ts index 0c7c23a..5521238 100644 --- a/apps/bridge-worker/tasks/voice/send-voice-message.ts +++ b/apps/bridge-worker/tasks/voice/send-voice-message.ts @@ -1,4 +1,4 @@ -import { db, getWorkerUtils } from "bridge-common"; +// import { db, getWorkerUtils } from "bridge-common"; interface SendVoiceMessageTaskOptions { message: any; diff --git a/apps/bridge-worker/tasks/voice/twilio-recording.ts b/apps/bridge-worker/tasks/voice/twilio-recording.ts index 60f0b6e..3472b8b 100644 --- a/apps/bridge-worker/tasks/voice/twilio-recording.ts +++ b/apps/bridge-worker/tasks/voice/twilio-recording.ts @@ -1,8 +1,8 @@ import Wreck from "@hapi/wreck"; -import { withDb, AppDatabase } from "../../lib/db"; -import { twilioClientFor } from "../../lib/common"; +import { withDb, AppDatabase } from "../../lib/db.js"; +import { twilioClientFor } from "../../lib/common.js"; import { CallInstance } from "twilio/lib/rest/api/v2010/account/call"; -import workerUtils from "../../lib/utils"; +import workerUtils from "../../lib/utils.js"; interface WebhookPayload { startTime: string; diff --git a/apps/bridge-worker/tasks/voice/voice-line-audio-update.ts b/apps/bridge-worker/tasks/voice/voice-line-audio-update.ts index 601f3db..cee33b1 100644 --- a/apps/bridge-worker/tasks/voice/voice-line-audio-update.ts +++ b/apps/bridge-worker/tasks/voice/voice-line-audio-update.ts @@ -1,6 +1,6 @@ import { createHash } from "crypto"; -import { withDb, AppDatabase } from "../../lib/db"; -import { convert } from "../../lib/media-convert"; +import { withDb, AppDatabase } from "../../lib/db.js"; +import { convert } from "../../lib/media-convert.js"; interface VoiceLineAudioUpdateTaskOptions { voiceLineId: string; diff --git a/apps/bridge-worker/tasks/voice/voice-line-delete.ts b/apps/bridge-worker/tasks/voice/voice-line-delete.ts index 6a2d444..d591028 100644 --- a/apps/bridge-worker/tasks/voice/voice-line-delete.ts +++ b/apps/bridge-worker/tasks/voice/voice-line-delete.ts @@ -1,6 +1,6 @@ import Twilio from "twilio"; // import config from "@digiresilience/bridge-config"; -import { withDb, AppDatabase } from "../../lib/db"; +import { withDb, AppDatabase } from "../../lib/db.js"; const config: any = {}; diff --git a/apps/bridge-worker/tasks/voice/voice-line-provider-update.ts b/apps/bridge-worker/tasks/voice/voice-line-provider-update.ts index c0a21b3..ce2af3e 100644 --- a/apps/bridge-worker/tasks/voice/voice-line-provider-update.ts +++ b/apps/bridge-worker/tasks/voice/voice-line-provider-update.ts @@ -1,6 +1,6 @@ import Twilio from "twilio"; // import config from "@digiresilience/bridge-config"; -import { withDb, AppDatabase } from "../../lib/db"; +import { withDb, AppDatabase } from "../../lib/db.js"; const config: any = {}; diff --git a/apps/bridge-worker/tasks/whatsapp/receive-whatsapp-message.ts b/apps/bridge-worker/tasks/whatsapp/receive-whatsapp-message.ts index de5a43d..90fd1b3 100644 --- a/apps/bridge-worker/tasks/whatsapp/receive-whatsapp-message.ts +++ b/apps/bridge-worker/tasks/whatsapp/receive-whatsapp-message.ts @@ -1,4 +1,4 @@ -import { db, getWorkerUtils } from "bridge-common"; +// import { db, getWorkerUtils } from "bridge-common"; interface ReceiveWhatsappMessageTaskOptions { message: any; diff --git a/apps/bridge-worker/tasks/whatsapp/send-whatsapp-message.ts b/apps/bridge-worker/tasks/whatsapp/send-whatsapp-message.ts index a2a3103..0cf2da8 100644 --- a/apps/bridge-worker/tasks/whatsapp/send-whatsapp-message.ts +++ b/apps/bridge-worker/tasks/whatsapp/send-whatsapp-message.ts @@ -1,4 +1,4 @@ -import { db, getWorkerUtils } from "bridge-common"; +// import { db, getWorkerUtils } from "bridge-common"; interface SendWhatsappMessageTaskOptions { message: any; diff --git a/apps/bridge-worker/tsconfig.json b/apps/bridge-worker/tsconfig.json index 185a31f..8dc7c2c 100644 --- a/apps/bridge-worker/tsconfig.json +++ b/apps/bridge-worker/tsconfig.json @@ -2,17 +2,19 @@ "extends": "ts-config", "compilerOptions": { "outDir": "build/main", - "module": "CommonJS", + "module": "esnext", + "target": "esnext", "esModuleInterop": true, - "skipLibCheck": true + "skipLibCheck": true, + "moduleResolution": "node" }, "ts-node": { "esm": true, "experimentalSpecifierResolution": "node", "transpileOnly": true, "compilerOptions": { - "module": "ESNext", - "target": "ESNext", + "module": "esNext", + "target": "esNext", "moduleResolution": "node" } }, diff --git a/apps/link/Dockerfile b/apps/link/Dockerfile index c68b22d..0649cb3 100644 --- a/apps/link/Dockerfile +++ b/apps/link/Dockerfile @@ -1,4 +1,3 @@ - FROM node:20-bookworm AS base FROM base AS builder diff --git a/packages/bridge-common/index.ts b/packages/bridge-common/index.ts index 57cfc7b..c6fd33b 100644 --- a/packages/bridge-common/index.ts +++ b/packages/bridge-common/index.ts @@ -1,4 +1,4 @@ -export { db } from "./lib/database"; +export { db } from "./lib/database.js"; export type { Database, FacebookBot, @@ -7,5 +7,5 @@ export type { VoiceLine, Webhook, User, -} from "./lib/database"; -export { getWorkerUtils } from "./lib/utils"; +} from "./lib/database.js"; +export { getWorkerUtils } from "./lib/utils.js"; diff --git a/packages/bridge-common/package.json b/packages/bridge-common/package.json index 23afc00..f2147f7 100644 --- a/packages/bridge-common/package.json +++ b/packages/bridge-common/package.json @@ -6,11 +6,7 @@ "author": "Darren Clarke ", "license": "AGPL-3.0-or-later", "scripts": { - "build": "tsc -p tsconfig.json", - "migrate:up:all": "tsx database/migrate.ts up:all", - "migrate:up:one": "tsx database/migrate.ts up:one", - "migrate:down:all": "tsx database/migrate.ts down:all", - "migrate:down:one": "tsx database/migrate.ts down:one" + "build": "tsc -p tsconfig.json" }, "dependencies": { "@auth/kysely-adapter": "^1.1.0",