feat: Finally support a docker compose files that works (#555)

This commit is contained in:
Rotimi Best
2025-05-20 01:37:58 +01:00
committed by GitHub
parent 512fe06722
commit 9aeefc9f4f
15 changed files with 215 additions and 605 deletions
+83
View File
@@ -0,0 +1,83 @@
# ----------- Build Stage -----------
FROM node:18.17.0-alpine AS builder
# Add build arguments
ARG PUBLIC_SUPABASE_URL
ARG PUBLIC_SUPABASE_ANON_KEY
ARG PRIVATE_SUPABASE_SERVICE_ROLE
ARG PRIVATE_APP_HOST
ARG PRIVATE_APP_SUBDOMAINS
ARG UNSPLASH_API_KEY
ARG OPENAI_API_KEY
ARG PUBLIC_SERVER_URL
ARG PUBLIC_IP_REGISTRY_KEY
WORKDIR /cio
# Install pnpm
RUN corepack enable && corepack prepare pnpm@latest --activate
# Copy monorepo files
COPY pnpm-lock.yaml package.json pnpm-workspace.yaml ./
COPY apps/dashboard/package.json apps/dashboard/
COPY packages/tsconfig ./packages/tsconfig
COPY packages/shared ./packages/shared
# Install all dependencies (monorepo context)
RUN pnpm install
# Copy the rest of the dashboard app
COPY apps/dashboard ./apps/dashboard
# Set env vars for SvelteKit to use Node adapter
ENV IS_SELFHOSTED=true \
DEPLOYMENT_PROVIDER=docker \
PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL \
PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY \
PRIVATE_SUPABASE_SERVICE_ROLE=$PRIVATE_SUPABASE_SERVICE_ROLE \
PRIVATE_APP_HOST=$PRIVATE_APP_HOST \
PRIVATE_APP_SUBDOMAINS=$PRIVATE_APP_SUBDOMAINS \
UNSPLASH_API_KEY=$UNSPLASH_API_KEY \
OPENAI_API_KEY=$OPENAI_API_KEY \
PUBLIC_SERVER_URL=$PUBLIC_SERVER_URL \
PUBLIC_IP_REGISTRY_KEY=$PUBLIC_IP_REGISTRY_KEY
# Build the dashboard app
WORKDIR /cio/apps/dashboard
RUN pnpm install
RUN NODE_OPTIONS=--max-old-space-size=4096 pnpm build
# ----------- Production Stage -----------
FROM node:18.17.0-alpine AS runner
WORKDIR /app
# Install pnpm
RUN corepack enable && corepack prepare pnpm@latest --activate
# Copy only production node_modules for dashboard
COPY --from=builder ./cio/node_modules ./node_modules
COPY --from=builder ./cio/package.json ./package.json
COPY --from=builder ./cio/apps/dashboard/node_modules ./apps/dashboard/node_modules
COPY --from=builder ./cio/apps/dashboard/package.json ./apps/dashboard/package.json
COPY --from=builder ./cio/apps/dashboard/build ./apps/dashboard/build
# Expose the port (default for SvelteKit Node adapter)
EXPOSE 3000
# Set environment variables for production
ENV NODE_ENV=production \
IS_SELFHOSTED=true \
DEPLOYMENT_PROVIDER=docker \
PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL \
PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY \
PRIVATE_SUPABASE_SERVICE_ROLE=$PRIVATE_SUPABASE_SERVICE_ROLE \
PRIVATE_APP_HOST=$PRIVATE_APP_HOST \
PRIVATE_APP_SUBDOMAINS=$PRIVATE_APP_SUBDOMAINS \
UNSPLASH_API_KEY=$UNSPLASH_API_KEY \
OPENAI_API_KEY=$OPENAI_API_KEY \
PUBLIC_SERVER_URL=$PUBLIC_SERVER_URL \
PUBLIC_IP_REGISTRY_KEY=$PUBLIC_IP_REGISTRY_KEY
# Start the app
CMD ["pnpm", "dashboard:start"]
-42
View File
@@ -1,42 +0,0 @@
FROM node:18-alpine
WORKDIR /app
RUN npm install -g pnpm
COPY ./package.json ./
COPY ./pnpm-lock.yaml ./
# Set environment variables
ENV IS_SELFHOSTED=true
ENV DEPLOYMENT_PROVIDER=docker
ENV PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL
ENV PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY
ENV PRIVATE_SUPABASE_SERVICE_ROLE=$PRIVATE_SUPABASE_SERVICE_ROLE
ENV PRIVATE_APP_HOST=$PRIVATE_APP_HOST
ENV PRIVATE_APP_SUBDOMAINS=$PRIVATE_APP_SUBDOMAINS
ENV UNSPLASH_API_KEY=$UNSPLASH_API_KEY
ENV OPENAI_API_KEY=$OPENAI_API_KEY
ENV PUBLIC_SERVER_URL=$PUBLIC_SERVER_URL
ENV PUBLIC_IP_REGISTRY_KEY=$PUBLIC_IP_REGISTRY_KEY
ENV NODE_OPTIONS="--max-old-space-size=8192"
RUN pnpm i
COPY . .
WORKDIR /app/apps/dashboard
RUN pnpm i
RUN pnpm build
RUN pnpm prune --production
EXPOSE 5000
ENV NODE_ENV=production
CMD [ "node", "apps/dashboard/build" ]
# EXPOSE 5000
# CMD ["pnpm", "start"]
# CMD [ "sh", "-c", "ls -la && cd apps/dashboard && pnpm build && pnpm start" ]
-55
View File
@@ -1,55 +0,0 @@
# FROM node:18-alpine
# WORKDIR /app
# RUN npm install -g pnpm
# COPY . .
# # Install dependencies and build
# RUN pnpm install --frozen-lockfile && \
# cd apps/dashboard && \
# pnpm build || { echo "Build failed! Error output above."; exit 1; }
# EXPOSE 5004
# ENV NODE_ENV=production
# CMD [ "pnpm", "dashboard:start" ]
FROM node:18-alpine AS builder
WORKDIR /app
RUN npm install -g pnpm
COPY package.json .
COPY pnpm-lock.yaml .
RUN pnpm install --frozen-lockfile
COPY . .
# Set environment variables
ENV IS_SELFHOSTED=true
ENV DEPLOYMENT_PROVIDER=docker
ENV PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL
ENV PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY
ENV PRIVATE_SUPABASE_SERVICE_ROLE=$PRIVATE_SUPABASE_SERVICE_ROLE
ENV PRIVATE_APP_HOST=$PRIVATE_APP_HOST
ENV PRIVATE_APP_SUBDOMAINS=$PRIVATE_APP_SUBDOMAINS
ENV UNSPLASH_API_KEY=$UNSPLASH_API_KEY
ENV OPENAI_API_KEY=$OPENAI_API_KEY
ENV PUBLIC_SERVER_URL=$PUBLIC_SERVER_URL
ENV PUBLIC_IP_REGISTRY_KEY=$PUBLIC_IP_REGISTRY_KEY
ENV NODE_OPTIONS="--max-old-space-size=10240"
WORKDIR /app/apps/dashboard
RUN pnpm install --frozen-lockfile
RUN IS_SELFHOSTED=true DEPLOYMENT_PROVIDER=docker pnpm build
RUN pnpm prune --production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/apps/dashboard/build build/
COPY --from=builder /app/apps/dashboard/node_modules node_modules/
COPY package.json .
EXPOSE 3004
ENV NODE_ENV=production
CMD [ "node", "build" ]
-3
View File
@@ -23,9 +23,6 @@
"@carbon/charts-svelte": "^1.13.6",
"@lemonsqueezy/lemonsqueezy.js": "^2.2.0",
"@polar-sh/sveltekit": "^0.2.1",
"@sentry/browser": "^7.61.0",
"@sentry/integrations": "^7.61.0",
"@sentry/vite-plugin": "^2.6.2",
"@supabase/supabase-js": "^2.31.0",
"@sveltejs/adapter-auto": "^2.1.0",
"@sveltejs/adapter-node": "^1.3.1",
@@ -1,26 +1,26 @@
import { dev } from '$app/environment';
import * as Sentry from '@sentry/browser';
import { CaptureConsole } from '@sentry/integrations';
// import * as Sentry from '@sentry/browser';
// import { CaptureConsole } from '@sentry/integrations';
export const initSentry = (): void => {
if (dev) return;
Sentry.init({
dsn: 'https://c966f7e8cb1d4306be20b26bb4f0cc96@o476906.ingest.sentry.io/5999999',
integrations: [
new CaptureConsole({
levels: ['error']
}),
new Sentry.Replay()
],
environment: 'production',
replaysSessionSampleRate: 0.5,
replaysOnErrorSampleRate: 1.0
});
// Sentry.init({
// dsn: 'https://c966f7e8cb1d4306be20b26bb4f0cc96@o476906.ingest.sentry.io/5999999',
// integrations: [
// new CaptureConsole({
// levels: ['error']
// }),
// new Sentry.Replay()
// ],
// environment: 'production',
// replaysSessionSampleRate: 0.5,
// replaysOnErrorSampleRate: 1.0
// });
};
export const setSentryUser = (user: Record<string, any>): void => {
if (dev) return;
Sentry.setUser(user);
// Sentry.setUser(user);
};
+4 -4
View File
@@ -9,14 +9,14 @@ export default ({ mode }) => {
css: {
preprocessorOptions: {
scss: {
silenceDeprecations: ['legacy-js-api'],
},
},
silenceDeprecations: ['legacy-js-api']
}
}
},
plugins: [sveltekit()],
server: getServer(process.env),
build: {
sourcemap: true
sourcemap: false
},
optimizeDeps: {
entries: ['src/routes/**/+*.{js,ts,svelte}']