From 51f136daeaa69827f84dc8fb8acd93aac97e53b3 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 30 Apr 2026 16:11:05 +0200 Subject: [PATCH] fix(tasks): remove trpc cron-job api on port 3002 --- .env.example | 4 - apps/tasks/package.json | 1 - apps/tasks/src/main.ts | 40 --------- packages/api/package.json | 1 - packages/api/src/router/cron-jobs.ts | 35 ++++---- packages/cron-job-api/eslint.config.js | 9 -- packages/cron-job-api/package.json | 48 ---------- packages/cron-job-api/src/client.ts | 20 ----- packages/cron-job-api/src/constants.ts | 3 - packages/cron-job-api/src/env.ts | 11 --- packages/cron-job-api/src/index.ts | 90 ------------------- packages/cron-job-api/tsconfig.json | 8 -- packages/cron-jobs/package.json | 8 +- packages/cron-jobs/src/index.ts | 68 ++++++++------ .../cron-jobs}/src/job-manager.ts | 3 +- packages/cron-jobs/src/schemas.ts | 6 ++ pnpm-lock.yaml | 70 ++------------- scripts/run.sh | 2 - 18 files changed, 81 insertions(+), 346 deletions(-) delete mode 100644 packages/cron-job-api/eslint.config.js delete mode 100644 packages/cron-job-api/package.json delete mode 100644 packages/cron-job-api/src/client.ts delete mode 100644 packages/cron-job-api/src/constants.ts delete mode 100644 packages/cron-job-api/src/env.ts delete mode 100644 packages/cron-job-api/src/index.ts delete mode 100644 packages/cron-job-api/tsconfig.json rename {apps/tasks => packages/cron-jobs}/src/job-manager.ts (97%) create mode 100644 packages/cron-jobs/src/schemas.ts diff --git a/.env.example b/.env.example index d643c1194..ff3c38f3d 100644 --- a/.env.example +++ b/.env.example @@ -12,10 +12,6 @@ AUTH_SECRET="supersecret" # or starting the project without any (which will show a randomly generated one). SECRET_ENCRYPTION_KEY=0000000000000000000000000000000000000000000000000000000000000000 -# Cron job API key is generated every time the container starts as it is required for communication between nextjs-api and tasks-api -# export CRON_JOB_API_KEY=$(openssl rand -base64 32) -# CRON_JOB_API_KEY="your-generated-api-key" - LOG_LEVEL='info' # This is how you can use the sqlite driver: diff --git a/apps/tasks/package.json b/apps/tasks/package.json index e44dda008..552beb0f1 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -23,7 +23,6 @@ "@homarr/auth": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/core": "workspace:^", - "@homarr/cron-job-api": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/cron-jobs-core": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", diff --git a/apps/tasks/src/main.ts b/apps/tasks/src/main.ts index 4c60f1646..55416e689 100644 --- a/apps/tasks/src/main.ts +++ b/apps/tasks/src/main.ts @@ -1,52 +1,12 @@ // This import has to be the first import in the file so that the agent is overridden before any other modules are imported. import "./overrides"; -import type { FastifyTRPCPluginOptions } from "@trpc/server/adapters/fastify"; -import { fastifyTRPCPlugin } from "@trpc/server/adapters/fastify"; -import fastify from "fastify"; - -import { createLogger } from "@homarr/core/infrastructure/logs"; -import { ErrorWithMetadata } from "@homarr/core/infrastructure/logs/error"; -import type { JobRouter } from "@homarr/cron-job-api"; -import { jobRouter } from "@homarr/cron-job-api"; -import { CRON_JOB_API_KEY_HEADER, CRON_JOB_API_PATH, CRON_JOB_API_PORT } from "@homarr/cron-job-api/constants"; import { jobGroup } from "@homarr/cron-jobs"; -import { db } from "@homarr/db"; -import { JobManager } from "./job-manager"; import { onStartAsync } from "./on-start"; -const logger = createLogger({ module: "tasksMain" }); - -const server = fastify({ - maxParamLength: 5000, -}); -server.register(fastifyTRPCPlugin, { - prefix: CRON_JOB_API_PATH, - trpcOptions: { - router: jobRouter, - createContext: ({ req }) => ({ - manager: new JobManager(db, jobGroup), - apiKey: req.headers[CRON_JOB_API_KEY_HEADER] as string | undefined, - }), - onError({ path, error }) { - logger.error(new ErrorWithMetadata("Error in tasks tRPC handler", { path }, { cause: error })); - }, - } satisfies FastifyTRPCPluginOptions["trpcOptions"], -}); - void (async () => { await onStartAsync(); await jobGroup.initializeAsync(); await jobGroup.startAllAsync(); - - try { - await server.listen({ port: CRON_JOB_API_PORT }); - logger.info("Tasks web server started successfully", { port: CRON_JOB_API_PORT }); - } catch (err) { - logger.error( - new ErrorWithMetadata("Failed to start tasks web server", { port: CRON_JOB_API_PORT }, { cause: err }), - ); - process.exit(1); - } })(); diff --git a/packages/api/package.json b/packages/api/package.json index e90bc7278..1c137c154 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -25,7 +25,6 @@ "@homarr/auth": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0", - "@homarr/cron-job-api": "workspace:^0.1.0", "@homarr/cron-job-status": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", diff --git a/packages/api/src/router/cron-jobs.ts b/packages/api/src/router/cron-jobs.ts index 5428ac374..4fd3fba5b 100644 --- a/packages/api/src/router/cron-jobs.ts +++ b/packages/api/src/router/cron-jobs.ts @@ -2,33 +2,36 @@ import { observable } from "@trpc/server/observable"; import z from "zod/v4"; import { createLogger } from "@homarr/core/infrastructure/logs"; -import { cronExpressionSchema, jobGroupKeys, jobNameSchema } from "@homarr/cron-job-api"; -import { cronJobApi } from "@homarr/cron-job-api/client"; import type { TaskStatus } from "@homarr/cron-job-status"; import { createCronJobStatusChannel } from "@homarr/cron-job-status"; +import { cronExpressionSchema, jobGroup } from "@homarr/cron-jobs"; +import { JobManager } from "@homarr/cron-jobs/job-manager"; import { createTRPCRouter, permissionRequiredProcedure } from "../trpc"; +const jobGroupKeys = jobGroup.getKeys(); +const jobNameSchema = z.enum(jobGroup.getKeys()); + const logger = createLogger({ module: "cronJobsRouter" }); export const cronJobsRouter = createTRPCRouter({ triggerJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.trigger.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).triggerAsync(input); }), startJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.start.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).startAsync(input); }), stopJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.stop.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).stopAsync(input); }), updateJobInterval: permissionRequiredProcedure .requiresPermission("admin") @@ -38,23 +41,23 @@ export const cronJobsRouter = createTRPCRouter({ cron: cronExpressionSchema, }), ) - .mutation(async ({ input }) => { - await cronJobApi.updateInterval.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).updateIntervalAsync(input.name, input.cron); }), disableJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.disable.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).disableAsync(input); }), enableJob: permissionRequiredProcedure .requiresPermission("admin") .input(jobNameSchema) - .mutation(async ({ input }) => { - await cronJobApi.enable.mutate(input); + .mutation(async ({ input, ctx }) => { + await new JobManager(ctx.db, jobGroup).enableAsync(input); }), - getJobs: permissionRequiredProcedure.requiresPermission("admin").query(async () => { - return await cronJobApi.getAll.query(); + getJobs: permissionRequiredProcedure.requiresPermission("admin").query(async ({ ctx }) => { + return await new JobManager(ctx.db, jobGroup).getAllAsync(); }), subscribeToStatusUpdates: permissionRequiredProcedure.requiresPermission("admin").subscription(() => { return observable((emit) => { diff --git a/packages/cron-job-api/eslint.config.js b/packages/cron-job-api/eslint.config.js deleted file mode 100644 index 5b19b6f8a..000000000 --- a/packages/cron-job-api/eslint.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import baseConfig from "@homarr/eslint-config/base"; - -/** @type {import('typescript-eslint').Config} */ -export default [ - { - ignores: [], - }, - ...baseConfig, -]; diff --git a/packages/cron-job-api/package.json b/packages/cron-job-api/package.json deleted file mode 100644 index 09bde876b..000000000 --- a/packages/cron-job-api/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@homarr/cron-job-api", - "version": "0.1.0", - "private": true, - "license": "Apache-2.0", - "type": "module", - "exports": { - ".": "./src/index.ts", - "./env": "./src/env.ts", - "./constants": "./src/constants.ts", - "./client": "./src/client.ts" - }, - "typesVersions": { - "*": { - "*": [ - "src/*" - ] - } - }, - "scripts": { - "clean": "rm -rf .turbo node_modules", - "format": "prettier --check . --ignore-path ../../.gitignore", - "lint": "eslint", - "typecheck": "tsc --noEmit" - }, - "prettier": "@homarr/prettier-config", - "dependencies": { - "@homarr/common": "workspace:^0.1.0", - "@homarr/core": "workspace:^0.1.0", - "@homarr/cron-jobs": "workspace:^0.1.0", - "@tanstack/react-query": "catalog:", - "@trpc/client": "catalog:", - "@trpc/server": "catalog:", - "@trpc/tanstack-react-query": "catalog:", - "node-cron": "catalog:", - "react": "catalog:", - "zod": "catalog:" - }, - "devDependencies": { - "@homarr/eslint-config": "workspace:^0.2.0", - "@homarr/prettier-config": "workspace:^0.1.0", - "@homarr/tsconfig": "workspace:^0.1.0", - "@types/node-cron": "catalog:", - "@types/react": "catalog:", - "eslint": "catalog:", - "typescript": "catalog:" - } -} diff --git a/packages/cron-job-api/src/client.ts b/packages/cron-job-api/src/client.ts deleted file mode 100644 index 0d376a328..000000000 --- a/packages/cron-job-api/src/client.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createTRPCClient, httpLink } from "@trpc/client"; - -import type { JobRouter } from "."; -import { CRON_JOB_API_KEY_HEADER, CRON_JOB_API_PATH, CRON_JOB_API_PORT } from "./constants"; -import { env } from "./env"; - -export const cronJobApi = createTRPCClient({ - links: [ - httpLink({ - url: `${getBaseUrl()}${CRON_JOB_API_PATH}`, - headers: { - [CRON_JOB_API_KEY_HEADER]: env.CRON_JOB_API_KEY, - }, - }), - ], -}); - -function getBaseUrl() { - return `http://localhost:${CRON_JOB_API_PORT}`; -} diff --git a/packages/cron-job-api/src/constants.ts b/packages/cron-job-api/src/constants.ts deleted file mode 100644 index 8ce789e72..000000000 --- a/packages/cron-job-api/src/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const CRON_JOB_API_PORT = 3002; -export const CRON_JOB_API_PATH = "/trpc"; -export const CRON_JOB_API_KEY_HEADER = "cron-job-api-key"; diff --git a/packages/cron-job-api/src/env.ts b/packages/cron-job-api/src/env.ts deleted file mode 100644 index 7efb3f6e2..000000000 --- a/packages/cron-job-api/src/env.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { z } from "zod/v4"; - -import { env as commonEnv } from "@homarr/common/env"; -import { createEnv } from "@homarr/core/infrastructure/env"; - -export const env = createEnv({ - server: { - CRON_JOB_API_KEY: commonEnv.NODE_ENV === "development" ? z.string().default("test") : z.string(), - }, - experimental__runtimeEnv: process.env, -}); diff --git a/packages/cron-job-api/src/index.ts b/packages/cron-job-api/src/index.ts deleted file mode 100644 index 270a51242..000000000 --- a/packages/cron-job-api/src/index.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { initTRPC, TRPCError } from "@trpc/server"; -import { validate } from "node-cron"; -import { z } from "zod/v4"; - -import type { JobGroupKeys } from "@homarr/cron-jobs"; -import { jobGroup } from "@homarr/cron-jobs"; - -import { env } from "./env"; - -export const jobGroupKeys = jobGroup.getKeys(); -export const jobNameSchema = z.enum(jobGroup.getKeys()); - -export interface IJobManager { - startAsync(name: JobGroupKeys): Promise; - triggerAsync(name: JobGroupKeys): Promise; - stopAsync(name: JobGroupKeys): Promise; - updateIntervalAsync(name: JobGroupKeys, cron: string): Promise; - disableAsync(name: JobGroupKeys): Promise; - enableAsync(name: JobGroupKeys): Promise; - getAllAsync(): Promise< - { - name: JobGroupKeys; - cron: string; - preventManualExecution: boolean; - preventCustomInterval: boolean; - isEnabled: boolean; - }[] - >; -} - -const t = initTRPC - .context<{ - manager: IJobManager; - apiKey?: string; - }>() - .create(); - -const createTrpcRouter = t.router; -const apiKeyProcedure = t.procedure.use(({ ctx, next }) => { - if (ctx.apiKey !== env.CRON_JOB_API_KEY) { - throw new TRPCError({ - code: "FORBIDDEN", - message: "Missing or invalid API key", - }); - } - - return next({ - ctx: { - ...ctx, - apiKey: undefined, // Clear the API key after checking - }, - }); -}); - -export const cronExpressionSchema = z.string().refine((expression) => validate(expression), { - error: "Invalid cron expression", -}); - -export const jobRouter = createTrpcRouter({ - start: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.startAsync(input); - }), - trigger: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.triggerAsync(input); - }), - stop: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.stopAsync(input); - }), - updateInterval: apiKeyProcedure - .input( - z.object({ - name: jobNameSchema, - cron: cronExpressionSchema, - }), - ) - .mutation(async ({ input, ctx }) => { - await ctx.manager.updateIntervalAsync(input.name, input.cron); - }), - disable: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.disableAsync(input); - }), - enable: apiKeyProcedure.input(jobNameSchema).mutation(async ({ input, ctx }) => { - await ctx.manager.enableAsync(input); - }), - getAll: apiKeyProcedure.query(({ ctx }) => { - return ctx.manager.getAllAsync(); - }), -}); - -export type JobRouter = typeof jobRouter; diff --git a/packages/cron-job-api/tsconfig.json b/packages/cron-job-api/tsconfig.json deleted file mode 100644 index cbe8483d9..000000000 --- a/packages/cron-job-api/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "@homarr/tsconfig/base.json", - "compilerOptions": { - "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" - }, - "include": ["*.ts", "src"], - "exclude": ["node_modules"] -} diff --git a/packages/cron-jobs/package.json b/packages/cron-jobs/package.json index d0a55d25a..99e91bd16 100644 --- a/packages/cron-jobs/package.json +++ b/packages/cron-jobs/package.json @@ -5,7 +5,8 @@ "license": "Apache-2.0", "type": "module", "exports": { - ".": "./index.ts" + ".": "./index.ts", + "./job-manager": "./src/job-manager.ts" }, "typesVersions": { "*": { @@ -38,12 +39,15 @@ "@homarr/server-settings": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "semver-parser": "catalog:" + "node-cron": "catalog:", + "semver-parser": "catalog:", + "zod": "catalog:" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", + "@types/node-cron": "catalog:", "eslint": "catalog:", "typescript": "catalog:" } diff --git a/packages/cron-jobs/src/index.ts b/packages/cron-jobs/src/index.ts index 7f2b2349f..0abe74a36 100644 --- a/packages/cron-jobs/src/index.ts +++ b/packages/cron-jobs/src/index.ts @@ -27,33 +27,45 @@ import { updateCheckerJob } from "./jobs/update-checker"; import { weatherJob } from "./jobs/weather"; import { createCronJobGroup } from "./lib"; -export const jobGroup = createCronJobGroup({ - analytics: analyticsJob, - iconsUpdater: iconsUpdaterJob, - ping: pingJob, - smartHomeEntityState: smartHomeEntityStateJob, - mediaServer: mediaServerJob, - mediaOrganizer: mediaOrganizerJob, - downloads: downloadsJob, - dnsHole: dnsHoleJob, - mediaRequestStats: mediaRequestStatsJob, - mediaRequestList: mediaRequestListJob, - rssFeeds: rssFeedsJob, - indexerManager: indexerManagerJob, - healthMonitoring: healthMonitoringJob, - updateChecker: updateCheckerJob, - mediaTranscoding: mediaTranscodingJob, - minecraftServerStatus: minecraftServerStatusJob, - dockerContainers: dockerContainersJob, - networkController: networkControllerJob, - firewallCpu: firewallCpuJob, - firewallMemory: firewallMemoryJob, - firewallVersion: firewallVersionJob, - firewallInterfaces: firewallInterfacesJob, - refreshNotifications: refreshNotificationsJob, - weather: weatherJob, - timetable: timetableJob, - tracearr: tracearrJob, -}); +const getJobGroup = () => { + return createCronJobGroup({ + analytics: analyticsJob, + iconsUpdater: iconsUpdaterJob, + ping: pingJob, + smartHomeEntityState: smartHomeEntityStateJob, + mediaServer: mediaServerJob, + mediaOrganizer: mediaOrganizerJob, + downloads: downloadsJob, + dnsHole: dnsHoleJob, + mediaRequestStats: mediaRequestStatsJob, + mediaRequestList: mediaRequestListJob, + rssFeeds: rssFeedsJob, + indexerManager: indexerManagerJob, + healthMonitoring: healthMonitoringJob, + updateChecker: updateCheckerJob, + mediaTranscoding: mediaTranscodingJob, + minecraftServerStatus: minecraftServerStatusJob, + dockerContainers: dockerContainersJob, + networkController: networkControllerJob, + firewallCpu: firewallCpuJob, + firewallMemory: firewallMemoryJob, + firewallVersion: firewallVersionJob, + firewallInterfaces: firewallInterfacesJob, + refreshNotifications: refreshNotificationsJob, + weather: weatherJob, + timetable: timetableJob, + tracearr: tracearrJob, + }); +}; + +// Add global type augmentation for homarr +declare global { + var cronJobs: ReturnType | undefined; +} + +global.cronJobs ??= getJobGroup(); + +export const jobGroup = global.cronJobs; export type JobGroupKeys = ReturnType<(typeof jobGroup)["getKeys"]>[number]; +export * from "./schemas"; diff --git a/apps/tasks/src/job-manager.ts b/packages/cron-jobs/src/job-manager.ts similarity index 97% rename from apps/tasks/src/job-manager.ts rename to packages/cron-jobs/src/job-manager.ts index f4ec8bf97..19ef8f6e8 100644 --- a/apps/tasks/src/job-manager.ts +++ b/packages/cron-jobs/src/job-manager.ts @@ -1,7 +1,6 @@ import { schedule, validate as validateCron } from "node-cron"; import { createLogger } from "@homarr/core/infrastructure/logs"; -import type { IJobManager } from "@homarr/cron-job-api"; import type { jobGroup as cronJobGroup, JobGroupKeys } from "@homarr/cron-jobs"; import type { Database, InferInsertModel } from "@homarr/db"; import { eq } from "@homarr/db"; @@ -9,7 +8,7 @@ import { cronJobConfigurations } from "@homarr/db/schema"; const logger = createLogger({ module: "jobManager" }); -export class JobManager implements IJobManager { +export class JobManager { constructor( private db: Database, private jobGroup: typeof cronJobGroup, diff --git a/packages/cron-jobs/src/schemas.ts b/packages/cron-jobs/src/schemas.ts new file mode 100644 index 000000000..af9f8b727 --- /dev/null +++ b/packages/cron-jobs/src/schemas.ts @@ -0,0 +1,6 @@ +import { validate } from "node-cron"; +import z from "zod"; + +export const cronExpressionSchema = z.string().refine((expression) => validate(expression), { + error: "Invalid cron expression", +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 290e776d5..9c61810f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -953,9 +953,6 @@ importers: '@homarr/core': specifier: workspace:^ version: link:../../packages/core - '@homarr/cron-job-api': - specifier: workspace:^0.1.0 - version: link:../../packages/cron-job-api '@homarr/cron-jobs': specifier: workspace:^0.1.0 version: link:../../packages/cron-jobs @@ -1154,9 +1151,6 @@ importers: '@homarr/core': specifier: workspace:^0.1.0 version: link:../core - '@homarr/cron-job-api': - specifier: workspace:^0.1.0 - version: link:../cron-job-api '@homarr/cron-job-status': specifier: workspace:^0.1.0 version: link:../cron-job-status @@ -1509,61 +1503,6 @@ importers: specifier: 'catalog:' version: 5.9.3 - packages/cron-job-api: - dependencies: - '@homarr/common': - specifier: workspace:^0.1.0 - version: link:../common - '@homarr/core': - specifier: workspace:^0.1.0 - version: link:../core - '@homarr/cron-jobs': - specifier: workspace:^0.1.0 - version: link:../cron-jobs - '@tanstack/react-query': - specifier: 'catalog:' - version: 5.100.5(react@19.2.5) - '@trpc/client': - specifier: 'catalog:' - version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) - '@trpc/server': - specifier: 'catalog:' - version: 11.16.0(typescript@5.9.3) - '@trpc/tanstack-react-query': - specifier: 'catalog:' - version: 11.16.0(@tanstack/react-query@5.100.5(react@19.2.5))(@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.16.0(typescript@5.9.3))(react@19.2.5)(typescript@5.9.3) - node-cron: - specifier: 'catalog:' - version: 4.2.1 - react: - specifier: 'catalog:' - version: 19.2.5 - zod: - specifier: 'catalog:' - version: 4.3.6 - devDependencies: - '@homarr/eslint-config': - specifier: workspace:^0.2.0 - version: link:../../tooling/eslint - '@homarr/prettier-config': - specifier: workspace:^0.1.0 - version: link:../../tooling/prettier - '@homarr/tsconfig': - specifier: workspace:^0.1.0 - version: link:../../tooling/typescript - '@types/node-cron': - specifier: 'catalog:' - version: 3.0.11 - '@types/react': - specifier: 'catalog:' - version: 19.2.14 - eslint: - specifier: 'catalog:' - version: 9.39.4 - typescript: - specifier: 'catalog:' - version: 5.9.3 - packages/cron-job-status: dependencies: '@homarr/redis': @@ -1636,9 +1575,15 @@ importers: '@homarr/validation': specifier: workspace:^0.1.0 version: link:../validation + node-cron: + specifier: 'catalog:' + version: 4.2.1 semver-parser: specifier: 'catalog:' version: 4.1.8 + zod: + specifier: 'catalog:' + version: 4.3.6 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1649,6 +1594,9 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript + '@types/node-cron': + specifier: 'catalog:' + version: 3.0.11 eslint: specifier: 'catalog:' version: 9.39.4 diff --git a/scripts/run.sh b/scripts/run.sh index 12e638fa7..fc6e80ba4 100644 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -16,8 +16,6 @@ fi # Auth secret is generated every time the container starts as it is required, but not used because we don't need JWTs or Mail hashing export AUTH_SECRET=$(openssl rand -base64 32) -# Cron job API key is generated every time the container starts as it is required for communication between nextjs-api and tasks-api -export CRON_JOB_API_KEY=$(openssl rand -base64 32) # Support secret file for encryption key (is not empty and file exists) if [ -n "$SECRET_ENCRYPTION_KEY_FILE" ] && [ -f "$SECRET_ENCRYPTION_KEY_FILE" ]; then