diff --git a/apps/app/Dockerfile.web b/apps/app/Dockerfile.web index e0b5f29c1..2b28e1fd1 100644 --- a/apps/app/Dockerfile.web +++ b/apps/app/Dockerfile.web @@ -33,8 +33,8 @@ RUN yarn turbo run build --filter=app ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \ BUILT_NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL - -RUN /usr/local/bin/replace-env-vars.sh http://NEXT_PUBLIC_WEBAPP_URL_PLACEHOLDER ${NEXT_PUBLIC_API_BASE_URL} +ENV NEXT_PUBLIC_DEPLOY_URL=${NEXT_PUBLIC_DEPLOY_URL} +RUN /usr/local/bin/replace-env-vars.sh http://NEXT_PUBLIC_WEBAPP_URL_PLACEHOLDER ${NEXT_PUBLIC_API_BASE_URL} app FROM node:18-alpine AS runner WORKDIR /app diff --git a/apps/app/components/tiptap/bubble-menu/index.tsx b/apps/app/components/tiptap/bubble-menu/index.tsx index cab089965..e68900782 100644 --- a/apps/app/components/tiptap/bubble-menu/index.tsx +++ b/apps/app/components/tiptap/bubble-menu/index.tsx @@ -15,36 +15,36 @@ export interface BubbleMenuItem { type EditorBubbleMenuProps = Omit; -export const EditorBubbleMenu: FC = (props) => { +export const EditorBubbleMenu: FC = (props: any) => { const items: BubbleMenuItem[] = [ { name: "bold", - isActive: () => props.editor!.isActive("bold"), - command: () => props.editor!.chain().focus().toggleBold().run(), + isActive: () => props.editor?.isActive("bold"), + command: () => props.editor?.chain().focus().toggleBold().run(), icon: BoldIcon, }, { name: "italic", - isActive: () => props.editor!.isActive("italic"), - command: () => props.editor!.chain().focus().toggleItalic().run(), + isActive: () => props.editor?.isActive("italic"), + command: () => props.editor?.chain().focus().toggleItalic().run(), icon: ItalicIcon, }, { name: "underline", - isActive: () => props.editor!.isActive("underline"), - command: () => props.editor!.chain().focus().toggleUnderline().run(), + isActive: () => props.editor?.isActive("underline"), + command: () => props.editor?.chain().focus().toggleUnderline().run(), icon: UnderlineIcon, }, { name: "strike", - isActive: () => props.editor!.isActive("strike"), - command: () => props.editor!.chain().focus().toggleStrike().run(), + isActive: () => props.editor?.isActive("strike"), + command: () => props.editor?.chain().focus().toggleStrike().run(), icon: StrikethroughIcon, }, { name: "code", - isActive: () => props.editor!.isActive("code"), - command: () => props.editor!.chain().focus().toggleCode().run(), + isActive: () => props.editor?.isActive("code"), + command: () => props.editor?.chain().focus().toggleCode().run(), icon: CodeIcon, }, ]; diff --git a/apps/space/Dockerfile.space b/apps/space/Dockerfile.space index 314f8f041..0240ddbf7 100644 --- a/apps/space/Dockerfile.space +++ b/apps/space/Dockerfile.space @@ -1,63 +1,70 @@ -FROM node:18-alpine AS base - -# [Stage 1] Prune the plane-deploy Project and lockfile out the monorepo. -FROM base AS builder -RUN apk add --no-cache libc6-compat -RUN apk update - -# Installing turbo, copying monorepo and executing prune +FROM node:18-alpine AS builder +RUN apk add --no-cache libc6-compat +# Set working directory WORKDIR /app +ENV NEXT_PUBLIC_API_BASE_URL=http://NEXT_PUBLIC_API_BASE_URL_PLACEHOLDER + RUN yarn global add turbo COPY . . -# plane-deploy pruned as /app/out/json (deps) and /app/out/full (plane-deploy) -RUN turbo prune --scope=plane-deploy --docker +RUN turbo prune --scope=space --docker + +# Add lockfile and package.json's of isolated subworkspace +FROM node:18-alpine AS installer -# [Stage 2] Install Dependencies from deps only files from /app/out/json -FROM base AS installer RUN apk add --no-cache libc6-compat -RUN apk add tree -RUN apk update WORKDIR /app +ARG NEXT_PUBLIC_API_BASE_URL=http://localhost:8000 -# Copying package.json and lockfile from plane-deploy and also from root, as /app/out/yarn-lock.json and /app/out/json +# First install the dependencies (as they change less often) +COPY .gitignore .gitignore COPY --from=builder /app/out/json/ . COPY --from=builder /app/out/yarn.lock ./yarn.lock -RUN yarn install +RUN yarn install --network-timeout 500000 -# Building the Project with standalone mode ( https://nextjs.org/docs/pages/api-reference/next-config-js/output ) -COPY --from=builder ./app/out/full . -RUN yarn turbo run build --filter=plane-deploy -# CMD tree ./apps -I 'node_modules' +# Build the project +COPY --from=builder /app/out/full/ . +COPY turbo.json turbo.json +COPY replace-env-vars.sh /usr/local/bin/ +USER root +RUN chmod +x /usr/local/bin/replace-env-vars.sh -# [Stage: 3] Running the project -FROM base AS runner +RUN yarn turbo run build --filter=space + +ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \ + BUILT_NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL + +RUN /usr/local/bin/replace-env-vars.sh http://NEXT_PUBLIC_WEBAPP_URL_PLACEHOLDER ${NEXT_PUBLIC_API_BASE_URL} space + +FROM node:18-alpine AS runner WORKDIR /app -# Creating user group for production, plane as usergroup and captain as user +# Don't run production as root RUN addgroup --system --gid 1001 plane RUN adduser --system --uid 1001 captain USER captain -# transporting package files from installer COPY --from=installer /app/apps/space/next.config.js . COPY --from=installer /app/apps/space/package.json . -# transporting builds from installer +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing COPY --from=installer --chown=captain:plane /app/apps/space/.next/standalone ./ + COPY --from=installer --chown=captain:plane /app/apps/space/.next ./apps/space/.next -# Start the server -CMD node apps/space/server.js - - - - - - - - +ARG NEXT_PUBLIC_API_BASE_URL=http://localhost:8000 +ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \ + BUILT_NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL +USER root +COPY replace-env-vars.sh /usr/local/bin/ +COPY start.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/replace-env-vars.sh +RUN chmod +x /usr/local/bin/start.sh +USER captain +ENV NEXT_TELEMETRY_DISABLED 1 +EXPOSE 3000 diff --git a/apps/space/app/[workspace_slug]/page.tsx b/apps/space/app/[workspace_slug]/page.tsx index c35662f5a..715027a89 100644 --- a/apps/space/app/[workspace_slug]/page.tsx +++ b/apps/space/app/[workspace_slug]/page.tsx @@ -1,7 +1,17 @@ "use client"; -const WorkspaceProjectPage = () => ( -
Plane Workspace Space
-); +// next imports +import { useRouter, useParams, useSearchParams } from "next/navigation"; + +const WorkspaceProjectPage = () => { + const routerParams = useParams(); + const { workspace_slug } = routerParams as { workspace_slug: string }; + + return ( +
+ Plane {workspace_slug || "nahh"} +
+ ); +}; export default WorkspaceProjectPage; diff --git a/apps/space/package.json b/apps/space/package.json index e0e702469..e37dfa54a 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -1,5 +1,5 @@ { - "name": "plane-deploy", + "name": "space", "version": "0.0.1", "private": true, "scripts": { diff --git a/docker-compose.yml b/docker-compose.yml index f48f36815..07aa79f36 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,12 +41,14 @@ services: dockerfile: ./apps/app/Dockerfile.web args: NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 + NEXT_PUBLIC_DEPLOY_URL: http://localhost/spaces restart: always - command: /usr/local/bin/start.sh + command: /usr/local/bin/start.sh apps/app/server.js app env_file: - .env environment: NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL} + NEXT_PUBLIC_DEPLOY_URL: ${NEXT_PUBLIC_DEPLOY_URL} NEXT_PUBLIC_GOOGLE_CLIENTID: "0" NEXT_PUBLIC_GITHUB_APP_NAME: "0" NEXT_PUBLIC_GITHUB_ID: "0" @@ -58,13 +60,15 @@ services: depends_on: - plane-api - plane-worker - public-deploy: - container_name: planepublicdeploy + plane-deploy: + container_name: planedeploy build: context: . dockerfile: ./apps/space/Dockerfile.space + args: + NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 restart: always - command: node apps/space/server.js + command: /usr/local/bin/start.sh apps/space/server.js space env_file: - .env environment: diff --git a/nginx/nginx.conf.template b/nginx/nginx.conf.template index 1da08f625..796c9e10d 100644 --- a/nginx/nginx.conf.template +++ b/nginx/nginx.conf.template @@ -15,8 +15,8 @@ server { proxy_pass http://planefrontend:3000/; } - location /spaces { - proxy_pass http://planepublicdeploy:4000/; + location /spaces/ { + proxy_pass http://planedeploy:3000/; } location /api/ { diff --git a/replace-env-vars.sh b/replace-env-vars.sh index 56c6d2025..afdc1492e 100644 --- a/replace-env-vars.sh +++ b/replace-env-vars.sh @@ -1,6 +1,7 @@ #!/bin/sh FROM=$1 TO=$2 +DIRECTORY=$3 if [ "${FROM}" = "${TO}" ]; then echo "Nothing to replace, the value is already set to ${TO}." @@ -11,4 +12,4 @@ fi # Only perform action if $FROM and $TO are different. echo "Replacing all statically built instances of $FROM with this string $TO ." -grep -R -la "${FROM}" apps/app/.next | xargs -I{} sed -i "s|$FROM|$TO|g" "{}" +grep -R -la "${FROM}" apps/$DIRECTORY/.next | xargs -I{} sed -i "s|$FROM|$TO|g" "{}" diff --git a/setup.sh b/setup.sh index a5a8e9b6a..235e1a977 100755 --- a/setup.sh +++ b/setup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# cp ./.env.example ./.env +cp ./.env.example ./.env # Export for tr error in mac export LC_ALL=C diff --git a/start.sh b/start.sh index 2e4a78772..dcb97db6d 100644 --- a/start.sh +++ b/start.sh @@ -3,7 +3,7 @@ set -x # Replace the statically built BUILT_NEXT_PUBLIC_API_BASE_URL with run-time NEXT_PUBLIC_API_BASE_URL # NOTE: if these values are the same, this will be skipped. -/usr/local/bin/replace-env-vars.sh "$BUILT_NEXT_PUBLIC_API_BASE_URL" "$NEXT_PUBLIC_API_BASE_URL" +/usr/local/bin/replace-env-vars.sh "$BUILT_NEXT_PUBLIC_API_BASE_URL" "$NEXT_PUBLIC_API_BASE_URL" $2 echo "Starting Plane Frontend.." -node apps/app/server.js & node apps/space/server.js +node $1