diff --git a/ENV_SETUP.md b/ENV_SETUP.md new file mode 100644 index 000000000..6796c3db6 --- /dev/null +++ b/ENV_SETUP.md @@ -0,0 +1,134 @@ +# Environment Variables +​ +Environment variables are distributed in various files. Please refer them carefully. + +## {PROJECT_FOLDER}/.env +File is available in the project root folder​ + +``` +# Database Settings +PGUSER="plane" +PGPASSWORD="plane" +PGHOST="plane-db" +PGDATABASE="plane" +DATABASE_URL=postgresql://${PGUSER}:${PGPASSWORD}@${PGHOST}/${PGDATABASE} +​ +# Redis Settings +REDIS_HOST="plane-redis" +REDIS_PORT="6379" +REDIS_URL="redis://${REDIS_HOST}:6379/" +​ +# AWS Settings +AWS_REGION="" +AWS_ACCESS_KEY_ID="access-key" +AWS_SECRET_ACCESS_KEY="secret-key" +AWS_S3_ENDPOINT_URL="http://plane-minio:9000" +# Changing this requires change in the nginx.conf for uploads if using minio setup +AWS_S3_BUCKET_NAME="uploads" +# Maximum file upload limit +FILE_SIZE_LIMIT=5242880 +​ +# GPT settings +OPENAI_API_BASE="https://api.openai.com/v1" # change if using a custom endpoint +OPENAI_API_KEY="sk-" # add your openai key here +GPT_ENGINE="gpt-3.5-turbo" # use "gpt-4" if you have access +​ +# Settings related to Docker +DOCKERIZED=1 +# set to 1 If using the pre-configured minio setup +USE_MINIO=1 +​ +# Nginx Configuration +NGINX_PORT=80 +``` +​ +## {PROJECT_FOLDER}/web/.env.example +​ +``` +# Enable/Disable OAUTH - default 0 for selfhosted instance +NEXT_PUBLIC_ENABLE_OAUTH=0 +# Public boards deploy URL +NEXT_PUBLIC_DEPLOY_URL="http://localhost/spaces" +``` +​ +## {PROJECT_FOLDER}/spaces/.env.example +​ +``` +# Flag to toggle OAuth +NEXT_PUBLIC_ENABLE_OAUTH=0 +``` +​ +## {PROJECT_FOLDER}/apiserver/.env +​ +``` +# Backend +# Debug value for api server use it as 0 for production use +DEBUG=0 +DJANGO_SETTINGS_MODULE="plane.settings.selfhosted" +​ +# Error logs +SENTRY_DSN="" +​ +# Database Settings +PGUSER="plane" +PGPASSWORD="plane" +PGHOST="plane-db" +PGDATABASE="plane" +DATABASE_URL=postgresql://${PGUSER}:${PGPASSWORD}@${PGHOST}/${PGDATABASE} +​ +# Redis Settings +REDIS_HOST="plane-redis" +REDIS_PORT="6379" +REDIS_URL="redis://${REDIS_HOST}:6379/" +​ +# Email Settings +EMAIL_HOST="" +EMAIL_HOST_USER="" +EMAIL_HOST_PASSWORD="" +EMAIL_PORT=587 +EMAIL_FROM="Team Plane " +EMAIL_USE_TLS="1" +EMAIL_USE_SSL="0" +​ +# AWS Settings +AWS_REGION="" +AWS_ACCESS_KEY_ID="access-key" +AWS_SECRET_ACCESS_KEY="secret-key" +AWS_S3_ENDPOINT_URL="http://plane-minio:9000" +# Changing this requires change in the nginx.conf for uploads if using minio setup +AWS_S3_BUCKET_NAME="uploads" +# Maximum file upload limit +FILE_SIZE_LIMIT=5242880 +​ +# GPT settings +OPENAI_API_BASE="https://api.openai.com/v1" # change if using a custom endpoint +OPENAI_API_KEY="sk-" # add your openai key here +GPT_ENGINE="gpt-3.5-turbo" # use "gpt-4" if you have access +​ +# Github +GITHUB_CLIENT_SECRET="" # For fetching release notes +​ +# Settings related to Docker +DOCKERIZED=1 +# set to 1 If using the pre-configured minio setup +USE_MINIO=1 +​ +# Nginx Configuration +NGINX_PORT=80 +​ +# Default Creds +DEFAULT_EMAIL="captain@plane.so" +DEFAULT_PASSWORD="password123" +​ +# SignUps +ENABLE_SIGNUP="1" +​ +# Email Redirection URL +WEB_URL="http://localhost" +``` +## Updates​ +- The environment variable NEXT_PUBLIC_API_BASE_URL has been removed from both the web and space projects. +- The naming convention for containers and images has been updated. +- The plane-worker image will no longer be maintained, as it has been merged with plane-backend. +- The Tiptap pro-extension dependency has been removed, eliminating the need for Tiptap API keys. +- The image name for Plane deployment has been changed to plane-space. diff --git a/README.md b/README.md index f9d969d72..79d1ef431 100644 --- a/README.md +++ b/README.md @@ -39,33 +39,31 @@ Meet [Plane](https://plane.so). An open-source software development tool to mana The easiest way to get started with Plane is by creating a [Plane Cloud](https://app.plane.so) account. Plane Cloud offers a hosted solution for Plane. If you prefer to self-host Plane, please refer to our [deployment documentation](https://docs.plane.so/self-hosting). -## ⚡️ Quick start with Docker Compose +## ⚡️ Contributors Quick Start -### Docker Compose Setup +### Prerequisite +Development system must have docker engine installed and running. -- Clone the repository -```bash -git clone https://github.com/makeplane/plane -cd plane -chmod +x setup.sh -``` +### Steps +Setting up local environment is extremely easy and straight forward. Follow the below step and you will be ready to contribute -- Run setup.sh +1. Clone the code locally using `git clone https://github.com/makeplane/plane.git` +1. Switch to the code folder `cd plane` +1. Create your feature or fix branch you plan to work on using `git checkout -b ` +1. Open terminal and run `./setup.sh` +1. Open the code on VSCode or similar equivalent IDE +1. Review the `.env` files available in various folders. Visit [Environment Setup](./ENV_SETUP.md) to know about various environment variables used in system +1. Run the docker command to initiate various services `docker compose -f docker-compose-local.yml up -d` -```bash -./setup.sh -``` +You are ready to make changes to the code. Do not forget to refresh the browser (in case id does not auto-reload) -> If running in a cloud env replace localhost with public facing IP address of the VM +Thats it! -- Run Docker compose up -```bash -docker compose up -d -``` +## 🍙 Self Hosting -You can use the default email and password for your first login `captain@plane.so` and `password123`. +For self hosting environment setup, visit the [Self Hosting](https://docs.plane.so/self-hosting) documentation page ## 🚀 Features diff --git a/apiserver/Dockerfile.dev b/apiserver/Dockerfile.dev new file mode 100644 index 000000000..f1c9b4cac --- /dev/null +++ b/apiserver/Dockerfile.dev @@ -0,0 +1,52 @@ +FROM python:3.11.1-alpine3.17 AS backend + +# set environment variables +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 +ENV PIP_DISABLE_PIP_VERSION_CHECK=1 + +RUN apk --no-cache add \ + "bash~=5.2" \ + "libpq~=15" \ + "libxslt~=1.1" \ + "nodejs-current~=19" \ + "xmlsec~=1.2" \ + "libffi-dev" \ + "bash~=5.2" \ + "g++~=12.2" \ + "gcc~=12.2" \ + "cargo~=1.64" \ + "git~=2" \ + "make~=4.3" \ + "postgresql13-dev~=13" \ + "libc-dev" \ + "linux-headers" + +WORKDIR /code + +COPY requirements.txt ./requirements.txt +ADD requirements ./requirements + +RUN pip install -r requirements.txt --compile --no-cache-dir + +RUN addgroup -S plane && \ + adduser -S captain -G plane + +RUN chown captain.plane /code + +USER captain + +# Add in Django deps and generate Django's static files + +USER root + +# RUN chmod +x ./bin/takeoff ./bin/worker ./bin/beat +RUN chmod -R 777 /code + +USER captain + +# Expose container port and run entry point script +EXPOSE 8000 + +# CMD [ "./bin/takeoff" ] + diff --git a/apiserver/plane/settings/local.py b/apiserver/plane/settings/local.py index 6f4833a6c..76586b0fe 100644 --- a/apiserver/plane/settings/local.py +++ b/apiserver/plane/settings/local.py @@ -12,6 +12,10 @@ from .common import * # noqa DEBUG = int(os.environ.get("DEBUG", 1)) == 1 +ALLOWED_HOSTS = [ + "*", +] + EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" diff --git a/docker-compose-local.yml b/docker-compose-local.yml new file mode 100644 index 000000000..4f433e3ac --- /dev/null +++ b/docker-compose-local.yml @@ -0,0 +1,178 @@ +version: "3.8" + +networks: + dev_env: + driver: bridge + +volumes: + redisdata: + uploads: + pgdata: + + +services: + plane-redis: + container_name: plane-redis + image: redis:6.2.7-alpine + restart: unless-stopped + networks: + - dev_env + volumes: + - redisdata:/data + + plane-minio: + container_name: plane-minio + image: minio/minio + restart: unless-stopped + networks: + - dev_env + command: server /export --console-address ":9090" + volumes: + - uploads:/export + env_file: + - .env + environment: + MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} + MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} + + createbuckets: + image: minio/mc + networks: + - dev_env + entrypoint: > + /bin/sh -c " /usr/bin/mc config host add plane-minio http://plane-minio:9000 \$AWS_ACCESS_KEY_ID \$AWS_SECRET_ACCESS_KEY; /usr/bin/mc mb plane-minio/\$AWS_S3_BUCKET_NAME; /usr/bin/mc anonymous set download plane-minio/\$AWS_S3_BUCKET_NAME; exit 0; " + env_file: + - .env + depends_on: + - plane-minio + + plane-db: + container_name: plane-db + image: postgres:15.2-alpine + restart: unless-stopped + networks: + - dev_env + command: postgres -c 'max_connections=1000' + volumes: + - pgdata:/var/lib/postgresql/data + env_file: + - .env + environment: + POSTGRES_USER: ${PGUSER} + POSTGRES_DB: ${PGDATABASE} + POSTGRES_PASSWORD: ${PGPASSWORD} + PGDATA: /var/lib/postgresql/data + + web: + container_name: web + build: + context: . + dockerfile: ./web/Dockerfile.dev + restart: unless-stopped + networks: + - dev_env + volumes: + - .:/app + command: yarn dev --filter=web + env_file: + - ./web/.env + depends_on: + - api + - worker + + space: + build: + context: . + dockerfile: ./space/Dockerfile.dev + container_name: space + restart: unless-stopped + networks: + - dev_env + volumes: + - .:/app + command: yarn dev --filter=space + env_file: + - ./space/.env + depends_on: + - api + - worker + - web + + api: + container_name: api + build: + context: ./apiserver + dockerfile: Dockerfile.dev + args: + DOCKER_BUILDKIT: 1 + restart: unless-stopped + networks: + - dev_env + volumes: + - ./apiserver:/code + command: /bin/sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000 --settings=plane.settings.local" + env_file: + - ./apiserver/.env + depends_on: + - plane-db + - plane-redis + + worker: + container_name: bgworker + build: + context: ./apiserver + dockerfile: Dockerfile.dev + args: + DOCKER_BUILDKIT: 1 + restart: unless-stopped + networks: + - dev_env + volumes: + - ./apiserver:/code + command: /bin/sh -c "celery -A plane worker -l info" + env_file: + - ./apiserver/.env + depends_on: + - api + - plane-db + - plane-redis + + beat-worker: + container_name: beatworker + build: + context: ./apiserver + dockerfile: Dockerfile.dev + args: + DOCKER_BUILDKIT: 1 + restart: unless-stopped + networks: + - dev_env + volumes: + - ./apiserver:/code + command: /bin/sh -c "celery -A plane beat -l info" + env_file: + - ./apiserver/.env + depends_on: + - api + - plane-db + - plane-redis + + proxy: + container_name: proxy + build: + context: ./nginx + dockerfile: Dockerfile + restart: unless-stopped + networks: + - dev_env + ports: + - ${NGINX_PORT}:80 + env_file: + - .env + environment: + FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} + BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} + depends_on: + - web + - api + - space diff --git a/space/Dockerfile.dev b/space/Dockerfile.dev new file mode 100644 index 000000000..d1128a588 --- /dev/null +++ b/space/Dockerfile.dev @@ -0,0 +1,11 @@ +FROM node:18-alpine +RUN apk add --no-cache libc6-compat +# Set working directory +WORKDIR /app + + +COPY . . +RUN yarn global add turbo +RUN yarn install +EXPOSE 3000 +CMD ["yarn","dev", "--filter=space"] diff --git a/web/Dockerfile.dev b/web/Dockerfile.dev index d4281c9a3..29faedef7 100644 --- a/web/Dockerfile.dev +++ b/web/Dockerfile.dev @@ -8,4 +8,4 @@ COPY . . RUN yarn global add turbo RUN yarn install EXPOSE 3000 -CMD ["yarn","dev"] +CMD ["yarn", "dev", "--filter=web"]