mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
dev: Docker Compose for Local Dev Environment Setup (#2409)
* local dev environment setup * api image fixes * yaml changed to yml * Readme & EnvSetup MD updates * Update README.md
This commit is contained in:
parent
0a8b99a074
commit
c6e021d41f
134
ENV_SETUP.md
Normal file
134
ENV_SETUP.md
Normal file
@ -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 <team@mailer.plane.so>"
|
||||||
|
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.
|
34
README.md
34
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).
|
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
|
### Steps
|
||||||
git clone https://github.com/makeplane/plane
|
Setting up local environment is extremely easy and straight forward. Follow the below step and you will be ready to contribute
|
||||||
cd plane
|
|
||||||
chmod +x setup.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
- 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 <feature-branch-name>`
|
||||||
|
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
|
You are ready to make changes to the code. Do not forget to refresh the browser (in case id does not auto-reload)
|
||||||
./setup.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
> If running in a cloud env replace localhost with public facing IP address of the VM
|
Thats it!
|
||||||
|
|
||||||
- Run Docker compose up
|
|
||||||
|
|
||||||
```bash
|
## 🍙 Self Hosting
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
<strong>You can use the default email and password for your first login `captain@plane.so` and `password123`.</strong>
|
For self hosting environment setup, visit the [Self Hosting](https://docs.plane.so/self-hosting) documentation page
|
||||||
|
|
||||||
## 🚀 Features
|
## 🚀 Features
|
||||||
|
|
||||||
|
52
apiserver/Dockerfile.dev
Normal file
52
apiserver/Dockerfile.dev
Normal file
@ -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" ]
|
||||||
|
|
@ -12,6 +12,10 @@ from .common import * # noqa
|
|||||||
|
|
||||||
DEBUG = int(os.environ.get("DEBUG", 1)) == 1
|
DEBUG = int(os.environ.get("DEBUG", 1)) == 1
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = [
|
||||||
|
"*",
|
||||||
|
]
|
||||||
|
|
||||||
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
||||||
|
|
||||||
|
|
||||||
|
178
docker-compose-local.yml
Normal file
178
docker-compose-local.yml
Normal file
@ -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
|
11
space/Dockerfile.dev
Normal file
11
space/Dockerfile.dev
Normal file
@ -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"]
|
@ -8,4 +8,4 @@ COPY . .
|
|||||||
RUN yarn global add turbo
|
RUN yarn global add turbo
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
CMD ["yarn","dev"]
|
CMD ["yarn", "dev", "--filter=web"]
|
||||||
|
Loading…
Reference in New Issue
Block a user