From 942785b7c0e4da9b917f5bf175a7da3d09168dab Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:09:42 +0530 Subject: [PATCH 1/5] dev: remove slack ping (#3377) --- apiserver/plane/bgtasks/importer_task.py | 10 ------ apiserver/plane/bgtasks/user_welcome_task.py | 36 ------------------- .../bgtasks/workspace_invitation_task.py | 11 ------ apiserver/plane/db/models/user.py | 27 -------------- apiserver/plane/settings/common.py | 2 +- 5 files changed, 1 insertion(+), 85 deletions(-) delete mode 100644 apiserver/plane/bgtasks/user_welcome_task.py diff --git a/apiserver/plane/bgtasks/importer_task.py b/apiserver/plane/bgtasks/importer_task.py index 84d10ecd3..5fa44fefd 100644 --- a/apiserver/plane/bgtasks/importer_task.py +++ b/apiserver/plane/bgtasks/importer_task.py @@ -25,7 +25,6 @@ from plane.db.models import ( User, IssueProperty, ) -from plane.bgtasks.user_welcome_task import send_welcome_slack @shared_task @@ -55,15 +54,6 @@ def service_importer(service, importer_id): ignore_conflicts=True, ) - _ = [ - send_welcome_slack.delay( - str(user.id), - True, - f"{user.email} was imported to Plane from {service}", - ) - for user in new_users - ] - workspace_users = User.objects.filter( email__in=[ user.get("email").strip().lower() diff --git a/apiserver/plane/bgtasks/user_welcome_task.py b/apiserver/plane/bgtasks/user_welcome_task.py deleted file mode 100644 index 33f4b5686..000000000 --- a/apiserver/plane/bgtasks/user_welcome_task.py +++ /dev/null @@ -1,36 +0,0 @@ -# Django imports -from django.conf import settings - -# Third party imports -from celery import shared_task -from sentry_sdk import capture_exception -from slack_sdk import WebClient -from slack_sdk.errors import SlackApiError - -# Module imports -from plane.db.models import User - - -@shared_task -def send_welcome_slack(user_id, created, message): - try: - instance = User.objects.get(pk=user_id) - - if created and not instance.is_bot: - # Send message on slack as well - if settings.SLACK_BOT_TOKEN: - client = WebClient(token=settings.SLACK_BOT_TOKEN) - try: - _ = client.chat_postMessage( - channel="#trackers", - text=message, - ) - except SlackApiError as e: - print(f"Got an error: {e.response['error']}") - return - except Exception as e: - # Print logs if in DEBUG mode - if settings.DEBUG: - print(e) - capture_exception(e) - return diff --git a/apiserver/plane/bgtasks/workspace_invitation_task.py b/apiserver/plane/bgtasks/workspace_invitation_task.py index 7039cb875..b17c346fb 100644 --- a/apiserver/plane/bgtasks/workspace_invitation_task.py +++ b/apiserver/plane/bgtasks/workspace_invitation_task.py @@ -83,17 +83,6 @@ def workspace_invitation(email, workspace_id, token, current_site, invitor): msg.attach_alternative(html_content, "text/html") msg.send() - # Send message on slack as well - if settings.SLACK_BOT_TOKEN: - client = WebClient(token=settings.SLACK_BOT_TOKEN) - try: - _ = client.chat_postMessage( - channel="#trackers", - text=f"{workspace_member_invite.email} has been invited to {workspace.name} as a {workspace_member_invite.role}", - ) - except SlackApiError as e: - print(f"Got an error: {e.response['error']}") - return except (Workspace.DoesNotExist, WorkspaceMemberInvite.DoesNotExist) as e: print("Workspace or WorkspaceMember Invite Does not exists") diff --git a/apiserver/plane/db/models/user.py b/apiserver/plane/db/models/user.py index fe75a6a26..92f2fe839 100644 --- a/apiserver/plane/db/models/user.py +++ b/apiserver/plane/db/models/user.py @@ -6,16 +6,9 @@ import pytz # Django imports from django.db import models -from django.db.models.signals import post_save -from django.dispatch import receiver from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin from django.utils import timezone -from django.conf import settings -# Third party imports -from sentry_sdk import capture_exception -from slack_sdk import WebClient -from slack_sdk.errors import SlackApiError def get_default_onboarding(): @@ -122,23 +115,3 @@ class User(AbstractBaseUser, PermissionsMixin): self.is_staff = True super(User, self).save(*args, **kwargs) - - -@receiver(post_save, sender=User) -def send_welcome_slack(sender, instance, created, **kwargs): - try: - if created and not instance.is_bot: - # Send message on slack as well - if settings.SLACK_BOT_TOKEN: - client = WebClient(token=settings.SLACK_BOT_TOKEN) - try: - _ = client.chat_postMessage( - channel="#trackers", - text=f"New user {instance.email} has signed up and begun the onboarding journey.", - ) - except SlackApiError as e: - print(f"Got an error: {e.response['error']}") - return - except Exception as e: - capture_exception(e) - return diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index 971ed5543..938910a33 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -310,7 +310,7 @@ if bool(os.environ.get("SENTRY_DSN", False)) and os.environ.get( # Application Envs PROXY_BASE_URL = os.environ.get("PROXY_BASE_URL", False) # For External -SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN", False) + FILE_SIZE_LIMIT = int(os.environ.get("FILE_SIZE_LIMIT", 5242880)) # Unsplash Access key From c0cd201b7cbf6c2f1ca0452fe4e1c4cf6356010a Mon Sep 17 00:00:00 2001 From: rahulramesha <71900764+rahulramesha@users.noreply.github.com> Date: Wed, 17 Jan 2024 16:35:21 +0530 Subject: [PATCH 2/5] fix error meesage on successful error message (#3387) Co-authored-by: Rahul R --- .../issues/issue-layouts/roots/cycle-layout-root.tsx | 4 ++-- web/store/issues/project-issues/cycle/issue.store.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/components/issues/issue-layouts/roots/cycle-layout-root.tsx b/web/components/issues/issue-layouts/roots/cycle-layout-root.tsx index f77dfbed4..d301c3395 100644 --- a/web/components/issues/issue-layouts/roots/cycle-layout-root.tsx +++ b/web/components/issues/issue-layouts/roots/cycle-layout-root.tsx @@ -47,8 +47,8 @@ export const CycleLayoutRoot: React.FC = observer(() => { const activeLayout = issueFilters?.displayFilters?.layout; - const cycleDetails = cycleId ? cycleStore.cycle_details[cycleId.toString()] : undefined; - const cycleStatus = cycleDetails?.status.toLocaleLowerCase() ?? "draft"; + const cycleDetails = cycleId ? cycleStore?.cycle_details?.[cycleId.toString()] : undefined; + const cycleStatus = cycleDetails?.status?.toLocaleLowerCase() ?? "draft"; return ( <> diff --git a/web/store/issues/project-issues/cycle/issue.store.ts b/web/store/issues/project-issues/cycle/issue.store.ts index b5c0088bd..048371a86 100644 --- a/web/store/issues/project-issues/cycle/issue.store.ts +++ b/web/store/issues/project-issues/cycle/issue.store.ts @@ -200,7 +200,7 @@ export class CycleIssuesStore extends IssueBaseStore implements ICycleIssuesStor try { const response = await this.rootStore.projectIssues.createIssue(workspaceSlug, projectId, data); - const issueToCycle = await this.addIssueToCycle(workspaceSlug, cycleId, [response.id], false); + await this.addIssueToCycle(workspaceSlug, cycleId, [response.id], false); let _issues = this.issues; if (!_issues) _issues = {}; @@ -211,7 +211,7 @@ export class CycleIssuesStore extends IssueBaseStore implements ICycleIssuesStor this.issues = _issues; }); - return issueToCycle; + return response; } catch (error) { this.fetchIssues(workspaceSlug, projectId, "mutation", cycleId); throw error; @@ -298,7 +298,7 @@ export class CycleIssuesStore extends IssueBaseStore implements ICycleIssuesStor const response = await this.createIssue(workspaceSlug, projectId, data, cycleId); - if (this.issues) { + if (this.issues && response) { delete this.issues[cycleId][data.id as keyof IIssue]; let _issues = { ...this.issues }; From afff9790d44ee2f892dfcdc0688bdc91bceb506d Mon Sep 17 00:00:00 2001 From: Erhan Date: Wed, 17 Jan 2024 12:12:11 +0100 Subject: [PATCH 3/5] Fix self-hosting docker-compose doc link (#3389) Fixes the link as it leads to a 404 at the moment in the documentation / readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b96dbf6c..41ebdd169 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Thats it! ## 🍙 Self Hosting -For self hosting environment setup, visit the [Self Hosting](https://docs.plane.so/self-hosting/docker-compose) documentation page +For self hosting environment setup, visit the [Self Hosting](https://docs.plane.so/docker-compose) documentation page ## 🚀 Features From a19598fec1664eb78840c8948c6418f0478855e1 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Wed, 17 Jan 2024 16:44:31 +0530 Subject: [PATCH 4/5] fix: updated env variables at root (#3390) --- .env.example | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index 90070de19..71a9074a6 100644 --- a/.env.example +++ b/.env.example @@ -1,14 +1,12 @@ # Database Settings -PGUSER="plane" -PGPASSWORD="plane" -PGHOST="plane-db" -PGDATABASE="plane" -DATABASE_URL=postgresql://${PGUSER}:${PGPASSWORD}@${PGHOST}/${PGDATABASE} +POSTGRES_USER="plane" +POSTGRES_PASSWORD="plane" +POSTGRES_DB="plane" +PGDATA="/var/lib/postgresql/data" # Redis Settings REDIS_HOST="plane-redis" REDIS_PORT="6379" -REDIS_URL="redis://${REDIS_HOST}:6379/" # AWS Settings AWS_REGION="" From ee78b4fe524d228183192a825b8ee6e44d48c84b Mon Sep 17 00:00:00 2001 From: Manish Gupta <59428681+mguptahub@users.noreply.github.com> Date: Wed, 17 Jan 2024 19:03:57 +0530 Subject: [PATCH 5/5] dev: self host local build for other arch cpu (#3358) handled x86_64 along with amd64 --- deploy/selfhost/build.yml | 26 +++++++ deploy/selfhost/docker-compose.yml | 27 ++++--- deploy/selfhost/install.sh | 113 ++++++++++++++++++++++++++--- 3 files changed, 143 insertions(+), 23 deletions(-) create mode 100644 deploy/selfhost/build.yml diff --git a/deploy/selfhost/build.yml b/deploy/selfhost/build.yml new file mode 100644 index 000000000..92533a73b --- /dev/null +++ b/deploy/selfhost/build.yml @@ -0,0 +1,26 @@ +version: "3.8" + +services: + web: + image: ${DOCKERHUB_USER:-local}/plane-frontend:${APP_RELEASE:-latest} + build: + context: . + dockerfile: ./web/Dockerfile.web + + space: + image: ${DOCKERHUB_USER:-local}/plane-space:${APP_RELEASE:-latest} + build: + context: ./ + dockerfile: ./space/Dockerfile.space + + api: + image: ${DOCKERHUB_USER:-local}/plane-backend:${APP_RELEASE:-latest} + build: + context: ./apiserver + dockerfile: ./Dockerfile.api + + proxy: + image: ${DOCKERHUB_USER:-local}/plane-proxy:${APP_RELEASE:-latest} + build: + context: ./nginx + dockerfile: ./Dockerfile diff --git a/deploy/selfhost/docker-compose.yml b/deploy/selfhost/docker-compose.yml index 8b4ff77ef..e42f53c7a 100644 --- a/deploy/selfhost/docker-compose.yml +++ b/deploy/selfhost/docker-compose.yml @@ -65,8 +65,8 @@ x-app-env : &app-env services: web: <<: *app-env - platform: linux/amd64 - image: makeplane/plane-frontend:${APP_RELEASE:-latest} + image: ${DOCKERHUB_USER:-makeplane}/plane-frontend:${APP_RELEASE:-latest} + pull_policy: ${PULL_POLICY:-always} restart: unless-stopped command: /usr/local/bin/start.sh web/server.js web deploy: @@ -77,8 +77,8 @@ services: space: <<: *app-env - platform: linux/amd64 - image: makeplane/plane-space:${APP_RELEASE:-latest} + image: ${DOCKERHUB_USER:-makeplane}/plane-space:${APP_RELEASE:-latest} + pull_policy: ${PULL_POLICY:-always} restart: unless-stopped command: /usr/local/bin/start.sh space/server.js space deploy: @@ -90,8 +90,8 @@ services: api: <<: *app-env - platform: linux/amd64 - image: makeplane/plane-backend:${APP_RELEASE:-latest} + image: ${DOCKERHUB_USER:-makeplane}/plane-backend:${APP_RELEASE:-latest} + pull_policy: ${PULL_POLICY:-always} restart: unless-stopped command: ./bin/takeoff deploy: @@ -102,8 +102,8 @@ services: worker: <<: *app-env - platform: linux/amd64 - image: makeplane/plane-backend:${APP_RELEASE:-latest} + image: ${DOCKERHUB_USER:-makeplane}/plane-backend:${APP_RELEASE:-latest} + pull_policy: ${PULL_POLICY:-always} restart: unless-stopped command: ./bin/worker depends_on: @@ -113,8 +113,8 @@ services: beat-worker: <<: *app-env - platform: linux/amd64 - image: makeplane/plane-backend:${APP_RELEASE:-latest} + image: ${DOCKERHUB_USER:-makeplane}/plane-backend:${APP_RELEASE:-latest} + pull_policy: ${PULL_POLICY:-always} restart: unless-stopped command: ./bin/beat depends_on: @@ -125,6 +125,7 @@ services: plane-db: <<: *app-env image: postgres:15.2-alpine + pull_policy: if_not_present restart: unless-stopped command: postgres -c 'max_connections=1000' volumes: @@ -133,6 +134,7 @@ services: plane-redis: <<: *app-env image: redis:6.2.7-alpine + pull_policy: if_not_present restart: unless-stopped volumes: - redisdata:/data @@ -140,6 +142,7 @@ services: plane-minio: <<: *app-env image: minio/minio + pull_policy: if_not_present restart: unless-stopped command: server /export --console-address ":9090" volumes: @@ -148,8 +151,8 @@ services: # Comment this if you already have a reverse proxy running proxy: <<: *app-env - platform: linux/amd64 - image: makeplane/plane-proxy:${APP_RELEASE:-latest} + image: ${DOCKERHUB_USER:-makeplane}/plane-proxy:${APP_RELEASE:-latest} + pull_policy: ${PULL_POLICY:-always} ports: - ${NGINX_PORT}:80 depends_on: diff --git a/deploy/selfhost/install.sh b/deploy/selfhost/install.sh index 15150aa40..b52c9236b 100755 --- a/deploy/selfhost/install.sh +++ b/deploy/selfhost/install.sh @@ -3,13 +3,75 @@ BRANCH=master SCRIPT_DIR=$PWD PLANE_INSTALL_DIR=$PWD/plane-app +export APP_RELEASE=$BRANCH +export DOCKERHUB_USER=makeplane +export PULL_POLICY=always +USE_GLOBAL_IMAGES=1 -function install(){ - echo - echo "Installing on $PLANE_INSTALL_DIR" +RED='\033[0;31m' +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +function buildLocalImage() { + if [ "$1" == "--force-build" ]; then + DO_BUILD="1" + elif [ "$1" == "--skip-build" ]; then + DO_BUILD="2" + else + printf "\n" >&2 + printf "${YELLOW}You are on ${ARCH} cpu architecture. ${NC}\n" >&2 + printf "${YELLOW}Since the prebuilt ${ARCH} compatible docker images are not available for, we will be running the docker build on this system. ${NC} \n" >&2 + printf "${YELLOW}This might take ${YELLOW}5-30 min based on your system's hardware configuration. \n ${NC} \n" >&2 + printf "\n" >&2 + printf "${GREEN}Select an option to proceed: ${NC}\n" >&2 + printf " 1) Build Fresh Images \n" >&2 + printf " 2) Skip Building Images \n" >&2 + printf " 3) Exit \n" >&2 + printf "\n" >&2 + read -p "Select Option [1]: " DO_BUILD + until [[ -z "$DO_BUILD" || "$DO_BUILD" =~ ^[1-3]$ ]]; do + echo "$DO_BUILD: invalid selection." >&2 + read -p "Select Option [1]: " DO_BUILD + done + echo "" >&2 + fi + + if [ "$DO_BUILD" == "1" ] || [ "$DO_BUILD" == "" ]; + then + REPO=https://github.com/makeplane/plane.git + CURR_DIR=$PWD + PLANE_TEMP_CODE_DIR=$(mktemp -d) + git clone $REPO $PLANE_TEMP_CODE_DIR --branch $BRANCH --single-branch + + cp $PLANE_TEMP_CODE_DIR/deploy/selfhost/build.yml $PLANE_TEMP_CODE_DIR/build.yml + + cd $PLANE_TEMP_CODE_DIR + if [ "$BRANCH" == "master" ]; + then + APP_RELEASE=latest + fi + + docker compose -f build.yml build --no-cache >&2 + # cd $CURR_DIR + # rm -rf $PLANE_TEMP_CODE_DIR + echo "build_completed" + elif [ "$DO_BUILD" == "2" ]; + then + printf "${YELLOW}Build action skipped by you in lieu of using existing images. ${NC} \n" >&2 + echo "build_skipped" + elif [ "$DO_BUILD" == "3" ]; + then + echo "build_exited" + else + printf "INVALID OPTION SUPPLIED" >&2 + fi +} +function install() { + echo "Installing Plane.........." download } -function download(){ +function download() { cd $SCRIPT_DIR TS=$(date +%s) if [ -f "$PLANE_INSTALL_DIR/docker-compose.yaml" ] @@ -35,6 +97,21 @@ function download(){ rm $PLANE_INSTALL_DIR/temp.yaml fi + + if [ $USE_GLOBAL_IMAGES == 0 ]; then + local res=$(buildLocalImage) + # echo $res + + if [ "$res" == "build_exited" ]; + then + echo + echo "Install action cancelled by you. Exiting now." + echo + exit 0 + fi + else + docker compose -f $PLANE_INSTALL_DIR/docker-compose.yaml pull + fi echo "" echo "Latest version is now available for you to use" @@ -43,22 +120,22 @@ function download(){ echo "" } -function startServices(){ +function startServices() { cd $PLANE_INSTALL_DIR - docker compose up -d + docker compose up -d --quiet-pull cd $SCRIPT_DIR } -function stopServices(){ +function stopServices() { cd $PLANE_INSTALL_DIR docker compose down cd $SCRIPT_DIR } -function restartServices(){ +function restartServices() { cd $PLANE_INSTALL_DIR docker compose restart cd $SCRIPT_DIR } -function upgrade(){ +function upgrade() { echo "***** STOPPING SERVICES ****" stopServices @@ -69,10 +146,10 @@ function upgrade(){ echo "***** PLEASE VALIDATE AND START SERVICES ****" } -function askForAction(){ +function askForAction() { echo echo "Select a Action you want to perform:" - echo " 1) Install" + echo " 1) Install (${ARCH})" echo " 2) Start" echo " 3) Stop" echo " 4) Restart" @@ -115,6 +192,20 @@ function askForAction(){ fi } +# CPU ARCHITECHTURE BASED SETTINGS +ARCH=$(uname -m) +if [ $ARCH == "amd64" ] || [ $ARCH == "x86_64" ]; +then + USE_GLOBAL_IMAGES=1 + DOCKERHUB_USER=makeplane + PULL_POLICY=always +else + USE_GLOBAL_IMAGES=0 + DOCKERHUB_USER=myplane + PULL_POLICY=never +fi + +# REMOVE SPECIAL CHARACTERS FROM BRANCH NAME if [ "$BRANCH" != "master" ]; then PLANE_INSTALL_DIR=$PWD/plane-app-$(echo $BRANCH | sed -r 's@(\/|" "|\.)@-@g')