diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 0000000..013455f --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,26 @@ +FROM node:22-slim AS build +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable && corepack prepare pnpm@9.0.0 --activate + +WORKDIR /app +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json turbo.json ./ +COPY apps/web/ ./apps/web/ +COPY apps/api/ ./apps/api/ +COPY packages/ ./packages/ +RUN pnpm install --frozen-lockfile +RUN pnpm --filter @repo/api build +RUN pnpm --filter @repo/api-client build +ARG NEXT_PUBLIC_API_URL +ARG NEXT_PUBLIC_REALTIME_URL +ARG NEXT_PUBLIC_MAX_FILE_UPLOAD_SIZE +ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL +ENV NEXT_PUBLIC_REALTIME_URL=$NEXT_PUBLIC_REALTIME_URL +ENV NEXT_PUBLIC_MAX_FILE_UPLOAD_SIZE=$NEXT_PUBLIC_MAX_FILE_UPLOAD_SIZE +RUN pnpm --filter web build + +FROM nginx:alpine +COPY --from=build /app/apps/web/dist /usr/share/nginx/html +COPY apps/web/nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 3000 +CMD ["nginx", "-g", "daemon off;"] diff --git a/apps/web/nginx.conf b/apps/web/nginx.conf new file mode 100644 index 0000000..67a12b1 --- /dev/null +++ b/apps/web/nginx.conf @@ -0,0 +1,14 @@ +server { + listen 3000; + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} diff --git a/apps/web/package.json b/apps/web/package.json index b63adac..ff44376 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite --port 3000", "build": "vite build", - "start": "vite preview --port 3000", + "start": "vite preview --port 3000 --host", "check-types": "tsc --noEmit" }, "dependencies": { diff --git a/docker-compose.yml b/docker-compose.yml index cca16ac..c9f550f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -111,6 +111,20 @@ services: redis: condition: service_healthy + web: + build: + context: . + dockerfile: apps/web/Dockerfile + args: + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:8080} + NEXT_PUBLIC_REALTIME_URL: ${NEXT_PUBLIC_REALTIME_URL:-http://localhost:8000} + restart: unless-stopped + ports: + - "3000:3000" + depends_on: + api: + condition: service_started + volumes: postgres_data: redis_data: diff --git a/packages/env/src/server.ts b/packages/env/src/server.ts index 0269751..5e0b781 100644 --- a/packages/env/src/server.ts +++ b/packages/env/src/server.ts @@ -33,7 +33,7 @@ const serverSchema = z.object({ REALTIME_CORS_ORIGIN: z.string().default(DEFAULT_REALTIME_CORS_ORIGIN), REDIS_URL: z.string().url(), BETTER_AUTH_SECRET: z.string().min(1), - SELF_HOSTED: z.coerce.boolean().default(true), + SELF_HOSTED: z.coerce.boolean().default(false), MAX_FILE_UPLOAD_SIZE: z.coerce.number().default(DEFAULT_MAX_FILE_UPLOAD_SIZE), NEXT_PUBLIC_API_URL: z.string().min(1).transform(addProtocol), S3_ENDPOINT: z.string().url(),