diff --git a/apps/rowboat/.dockerignore b/apps/rowboat/.dockerignore new file mode 100644 index 00000000..72e9aa42 --- /dev/null +++ b/apps/rowboat/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git \ No newline at end of file diff --git a/apps/rowboat/Dockerfile b/apps/rowboat/Dockerfile new file mode 100644 index 00000000..4db8d4bb --- /dev/null +++ b/apps/rowboat/Dockerfile @@ -0,0 +1,66 @@ +# syntax=docker.io/docker/dockerfile:1 + +FROM node:18-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +# ENV NEXT_TELEMETRY_DISABLED=1 + +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/config/next-config-js/output +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] \ No newline at end of file diff --git a/apps/rowboat/app/lib/utils.ts b/apps/rowboat/app/lib/utils.ts index ae314629..f48bed8e 100644 --- a/apps/rowboat/app/lib/utils.ts +++ b/apps/rowboat/app/lib/utils.ts @@ -1,17 +1,6 @@ import { Workflow } from "@/app/lib/types"; -import { projectsCollection } from "./mongodb"; -import crypto from 'crypto'; import { z } from "zod"; -export async function generateWebhookJwtSecret(projectId: string): Promise { - const secret = crypto.randomBytes(32).toString('hex'); - await projectsCollection.updateOne( - { _id: projectId }, - { $set: { webhookJwtSecret: secret, webhookJwtSecretUpdatedAt: new Date().toISOString() } } - ); - return secret; -} - export const baseWorkflow: z.infer = { projectId: "", createdAt: "", diff --git a/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx b/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx index c37943c4..71f578e3 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/workflow_editor.tsx @@ -1,6 +1,6 @@ "use client"; import { DataSource, Workflow, WorkflowAgent, WorkflowPrompt, WorkflowTool, WithStringId } from "@/app/lib/types"; -import { useReducer, Reducer, useState, useCallback, useEffect, useRef, Dispatch } from "react"; +import { useReducer, Reducer, useState, useCallback, useEffect, useRef } from "react"; import { produce, applyPatches, enablePatches, produceWithPatches, Patch } from 'immer'; import { AgentConfig } from "./agent_config"; import { ToolConfig } from "./tool_config"; diff --git a/apps/rowboat/next.config.mjs b/apps/rowboat/next.config.mjs index 4678774e..4e18a964 100644 --- a/apps/rowboat/next.config.mjs +++ b/apps/rowboat/next.config.mjs @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + output: 'standalone', +}; export default nextConfig; diff --git a/apps/rowboat/package-lock.json b/apps/rowboat/package-lock.json index b9eba327..3fc83cce 100644 --- a/apps/rowboat/package-lock.json +++ b/apps/rowboat/package-lock.json @@ -35,7 +35,7 @@ "react-markdown": "^9.0.1", "react-resizable-panels": "^2.1.7", "remark-gfm": "^4.0.0", - "rowboat-shared": "git+https://ramnique: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@github.com/rowboatlabs/shared.git", + "rowboat-shared": "github:rowboatlabs/shared", "sharp": "^0.33.4", "styled-components": "^5.3.11", "swr": "^2.2.5", @@ -13124,7 +13124,7 @@ }, "node_modules/rowboat-shared": { "version": "1.0.0", - "resolved": "git+https://ramnique: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@github.com/rowboatlabs/shared.git#211034b606f6894b77a316cca44170b10754d932", + "resolved": "git+ssh://git@github.com/rowboatlabs/shared.git#211034b606f6894b77a316cca44170b10754d932", "dependencies": { "zod": "^3.23.8" } diff --git a/apps/rowboat/package.json b/apps/rowboat/package.json index def4261c..86981c68 100644 --- a/apps/rowboat/package.json +++ b/apps/rowboat/package.json @@ -38,7 +38,7 @@ "react-markdown": "^9.0.1", "react-resizable-panels": "^2.1.7", "remark-gfm": "^4.0.0", - "rowboat-shared": "git+https://ramnique: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@github.com/rowboatlabs/shared.git", + "rowboat-shared": "github:rowboatlabs/shared", "sharp": "^0.33.4", "styled-components": "^5.3.11", "swr": "^2.2.5",