@@ -8,8 +8,7 @@ WORKDIR /app
8
8
# Copy workspace configuration
9
9
COPY package.json bun.lock ./
10
10
11
- # Copy package.json files for all packages
12
- COPY packages/db/package.json ./packages/db/
11
+ # Copy package.json files for all packages (exclude local db; use published @trycompai/db)
13
12
COPY packages/kv/package.json ./packages/kv/
14
13
COPY packages/ui/package.json ./packages/ui/
15
14
COPY packages/email/package.json ./packages/email/
@@ -23,7 +22,7 @@ COPY apps/app/package.json ./apps/app/
23
22
COPY apps/portal/package.json ./apps/portal/
24
23
25
24
# Install all dependencies
26
- RUN PRISMA_SKIP_POSTINSTALL_GENERATE=true bun install --frozen-lockfile
25
+ RUN PRISMA_SKIP_POSTINSTALL_GENERATE=true bun install
27
26
28
27
# =============================================================================
29
28
# STAGE 2: Ultra-Minimal Migrator - Only Prisma
@@ -32,20 +31,18 @@ FROM oven/bun:1.2.8 AS migrator
32
31
33
32
WORKDIR /app
34
33
35
- # Copy Prisma schema and migration files
34
+ # Copy local Prisma schema and migrations from workspace
36
35
COPY packages/db/prisma ./packages/db/prisma
37
36
38
- # Create minimal package.json for Prisma
39
- RUN echo '{"name":"migrator","type":"module","dependencies":{"prisma":"^6.13 .0","@prisma/client":"^6.13.0 "}}' > package.json
37
+ # Create minimal package.json for Prisma runtime (also used by seeder)
38
+ RUN echo '{"name":"migrator","type":"module","dependencies":{"prisma":"^6.14 .0","@prisma/client":"^6.14.0","@trycompai/db":"^1.3.4","zod":"^3.25.7 "}}' > package.json
40
39
41
40
# Install ONLY Prisma dependencies
42
41
RUN bun install
43
42
44
- # Generate Prisma client
45
- RUN cd packages/db && bunx prisma generate
46
-
47
- # Default command for migrations
48
- CMD ["bunx" , "prisma" , "migrate" , "deploy" , "--schema=packages/db/prisma/schema.prisma" ]
43
+ # Run migrations against the combined schema published by @trycompai/db
44
+ RUN echo "Running migrations against @trycompai/db combined schema"
45
+ CMD ["bunx" , "prisma" , "migrate" , "deploy" , "--schema=node_modules/@trycompai/db/dist/schema.prisma" ]
49
46
50
47
# =============================================================================
51
48
# STAGE 3: App Builder
@@ -58,28 +55,52 @@ WORKDIR /app
58
55
COPY packages ./packages
59
56
COPY apps/app ./apps/app
60
57
61
- # Generate Prisma client in the full workspace context
62
- RUN cd packages/db && bunx prisma generate
58
+ # Bring in node_modules for build and prisma prebuild
59
+ COPY --from=deps /app/node_modules ./node_modules
60
+
61
+ # Ensure Next build has required public env at build-time
62
+ ARG NEXT_PUBLIC_BETTER_AUTH_URL
63
+ ARG NEXT_PUBLIC_PORTAL_URL
64
+ ARG NEXT_PUBLIC_POSTHOG_KEY
65
+ ARG NEXT_PUBLIC_POSTHOG_HOST
66
+ ARG NEXT_PUBLIC_IS_DUB_ENABLED
67
+ ARG NEXT_PUBLIC_GTM_ID
68
+ ARG NEXT_PUBLIC_LINKEDIN_PARTNER_ID
69
+ ARG NEXT_PUBLIC_LINKEDIN_CONVERSION_ID
70
+ ARG NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL
71
+ ARG NEXT_PUBLIC_API_URL
72
+ ENV NEXT_PUBLIC_BETTER_AUTH_URL=$NEXT_PUBLIC_BETTER_AUTH_URL \
73
+ NEXT_PUBLIC_PORTAL_URL=$NEXT_PUBLIC_PORTAL_URL \
74
+ NEXT_PUBLIC_POSTHOG_KEY=$NEXT_PUBLIC_POSTHOG_KEY \
75
+ NEXT_PUBLIC_POSTHOG_HOST=$NEXT_PUBLIC_POSTHOG_HOST \
76
+ NEXT_PUBLIC_IS_DUB_ENABLED=$NEXT_PUBLIC_IS_DUB_ENABLED \
77
+ NEXT_PUBLIC_GTM_ID=$NEXT_PUBLIC_GTM_ID \
78
+ NEXT_PUBLIC_LINKEDIN_PARTNER_ID=$NEXT_PUBLIC_LINKEDIN_PARTNER_ID \
79
+ NEXT_PUBLIC_LINKEDIN_CONVERSION_ID=$NEXT_PUBLIC_LINKEDIN_CONVERSION_ID \
80
+ NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL=$NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL \
81
+ NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
82
+ NEXT_TELEMETRY_DISABLED=1 NODE_ENV=production \
83
+ NEXT_OUTPUT_STANDALONE=true \
84
+ NODE_OPTIONS=--max_old_space_size=6144
63
85
64
86
# Build the app
65
87
RUN cd apps/app && SKIP_ENV_VALIDATION=true bun run build
66
88
67
89
# =============================================================================
68
90
# STAGE 4: App Production
69
91
# =============================================================================
70
- FROM oven/bun:1.2.8 AS app
92
+ FROM node:22-alpine AS app
71
93
72
94
WORKDIR /app
73
95
74
- # Copy the built app and all necessary dependencies from builder
75
- COPY --from=app-builder /app/apps/app/.next ./apps/app/.next
76
- COPY --from=app-builder /app/apps/app/package.json ./apps/app/
77
- COPY --from=app-builder /app/package.json ./
78
- COPY --from=app-builder /app/node_modules ./node_modules
79
- COPY --from=app-builder /app/packages ./packages
96
+ # Copy Next standalone output
97
+ COPY --from=app-builder /app/apps/app/.next/standalone ./
98
+ COPY --from=app-builder /app/apps/app/.next/static ./apps/app/.next/static
99
+ COPY --from=app-builder /app/apps/app/public ./apps/app/public
100
+
80
101
81
102
EXPOSE 3000
82
- CMD ["bun " , "run" , "--cwd" , " apps/app" , "start " ]
103
+ CMD ["node " , "apps/app/server.js " ]
83
104
84
105
# =============================================================================
85
106
# STAGE 5: Portal Builder
@@ -92,25 +113,32 @@ WORKDIR /app
92
113
COPY packages ./packages
93
114
COPY apps/portal ./apps/portal
94
115
95
- # Generate Prisma client
96
- RUN cd packages/db && bunx prisma generate
116
+ # Bring in node_modules for build and prisma prebuild
117
+ COPY --from=deps /app/node_modules ./node_modules
118
+
119
+ # Ensure Next build has required public env at build-time
120
+ ARG NEXT_PUBLIC_BETTER_AUTH_URL
121
+ ENV NEXT_PUBLIC_BETTER_AUTH_URL=$NEXT_PUBLIC_BETTER_AUTH_URL \
122
+ NEXT_TELEMETRY_DISABLED=1 NODE_ENV=production \
123
+ NEXT_OUTPUT_STANDALONE=true \
124
+ NODE_OPTIONS=--max_old_space_size=6144
97
125
98
126
# Build the portal
99
127
RUN cd apps/portal && SKIP_ENV_VALIDATION=true bun run build
100
128
101
129
# =============================================================================
102
130
# STAGE 6: Portal Production
103
131
# =============================================================================
104
- FROM oven/bun:1.2.8 AS portal
132
+ FROM node:22-alpine AS portal
105
133
106
134
WORKDIR /app
107
135
108
- # Copy the built portal and all necessary dependencies from builder
109
- COPY --from=portal-builder /app/apps/portal/.next ./apps/portal/.next
110
- COPY --from=portal-builder /app/apps/portal/package.json ./apps/portal/
111
- COPY --from=portal-builder /app/package.json ./
112
- COPY --from=portal-builder /app/node_modules ./node_modules
113
- COPY --from=portal-builder /app/packages ./packages
136
+ # Copy Next standalone output for portal
137
+ COPY --from=portal-builder /app/apps/portal/.next/standalone ./
138
+ COPY --from=portal-builder /app/apps/portal/.next/static ./apps/portal/.next/static
139
+ COPY --from=portal-builder /app/apps/portal/public ./apps/portal/public
114
140
115
141
EXPOSE 3000
116
- CMD ["bun" , "run" , "--cwd" , "apps/portal" , "start" ]
142
+ CMD ["node" , "apps/portal/server.js" ]
143
+
144
+ # (Trigger.dev hosted; no local runner stage)
0 commit comments