diff --git a/.github/workflows/build-branch-ee.yml b/.github/workflows/build-branch-ee.yml index df55fa7431..6f8072ea93 100644 --- a/.github/workflows/build-branch-ee.yml +++ b/.github/workflows/build-branch-ee.yml @@ -18,17 +18,17 @@ jobs: name: Build-Push Web/Space/API/Proxy Docker Image runs-on: ubuntu-latest outputs: - gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }} + gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }} gh_buildx_driver: ${{ steps.set_env_variables.outputs.BUILDX_DRIVER }} gh_buildx_version: ${{ steps.set_env_variables.outputs.BUILDX_VERSION }} gh_buildx_platforms: ${{ steps.set_env_variables.outputs.BUILDX_PLATFORMS }} gh_buildx_endpoint: ${{ steps.set_env_variables.outputs.BUILDX_ENDPOINT }} - build_frontend: ${{ steps.changed_files.outputs.frontend_any_changed }} + build_web: ${{ steps.changed_files.outputs.web_any_changed }} build_space: ${{ steps.changed_files.outputs.space_any_changed }} build_backend: ${{ steps.changed_files.outputs.backend_any_changed }} build_proxy: ${{ steps.changed_files.outputs.proxy_any_changed }} - docker_upload_to_s3: ${{ steps.set_env_variables.outputs.docker_upload_to_s3 }} - docker_tar_suffix: ${{ steps.set_env_variables.outputs.docker_tar_suffix }} + artifact_upload_to_s3: ${{ steps.set_env_variables.outputs.artifact_upload_to_s3 }} + artifact_s3_suffix: ${{ steps.set_env_variables.outputs.artifact_s3_suffix }} steps: - id: set_env_variables @@ -45,17 +45,21 @@ jobs: echo "BUILDX_PLATFORMS=linux/amd64" >> $GITHUB_OUTPUT echo "BUILDX_ENDPOINT=" >> $GITHUB_OUTPUT fi - echo "TARGET_BRANCH=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT + BR_NAME=$( echo "${{ env.TARGET_BRANCH }}" | tr / -) + echo "TARGET_BRANCH=$BR_NAME" >> $GITHUB_OUTPUT if [ "${{ github.event_name }}" == "release" ]; then - echo "docker_upload_to_s3=true" >> $GITHUB_OUTPUT - echo "docker_tar_suffix=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT + echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - echo "docker_upload_to_s3=true" >> $GITHUB_OUTPUT - echo "docker_tar_suffix=latest" >> $GITHUB_OUTPUT + echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=latest" >> $GITHUB_OUTPUT + elif [ "${{ env.TARGET_BRANCH }}" == "preview" ] || [ "${{ env.TARGET_BRANCH }}" == "develop" ]; then + echo "artifact_upload_to_s3=true" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT else - echo "docker_upload_to_s3=false" >> $GITHUB_OUTPUT - echo "docker_tar_suffix=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT + echo "artifact_upload_to_s3=false" >> $GITHUB_OUTPUT + echo "artifact_s3_suffix=$BR_NAME" >> $GITHUB_OUTPUT fi - id: checkout_files @@ -67,7 +71,7 @@ jobs: uses: tj-actions/changed-files@v42 with: files_yaml: | - frontend: + web: - web/** - packages/** - 'package.json' @@ -86,28 +90,33 @@ jobs: proxy: - nginx/** - branch_build_push_frontend: - if: ${{ needs.branch_build_setup.outputs.build_frontend == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + branch_build_push_web: + if: ${{ needs.branch_build_setup.outputs.build_web == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - FRONTEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + WEB_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} BUILDX_PLATFORMS: ${{ needs.branch_build_setup.outputs.gh_buildx_platforms }} BUILDX_ENDPOINT: ${{ needs.branch_build_setup.outputs.gh_buildx_endpoint }} steps: - - name: Set Frontend Docker Tag + - name: Set Web Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/web-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:latest else - TAG=${{ env.FRONTEND_TAG }} + TAG=${{ env.WEB_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/web-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi - echo "FRONTEND_TAG=${TAG}" >> $GITHUB_ENV + echo "WEB_TAG=${TAG}" >> $GITHUB_ENV - name: Login to Docker Hub uses: docker/login-action@v3 @@ -115,6 +124,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -125,13 +141,13 @@ jobs: - name: Check out the repo uses: actions/checkout@v4 - - name: Build and Push Frontend to Docker Container Registry + - name: Build and Push Web to Docker Container Registry uses: docker/build-push-action@v5.1.0 with: context: . file: ./web/Dockerfile.web platforms: ${{ env.BUILDX_PLATFORMS }} - tags: ${{ env.FRONTEND_TAG }} + tags: ${{ env.WEB_TAG }} push: true env: DOCKER_BUILDKIT: 1 @@ -139,11 +155,11 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_space: - if: ${{ needs.branch_build_setup.outputs.build_space == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_space == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - SPACE_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + SPACE_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -153,11 +169,16 @@ jobs: - name: Set Space Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/space-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:latest else TAG=${{ env.SPACE_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/space-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "SPACE_TAG=${TAG}" >> $GITHUB_ENV @@ -167,6 +188,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -191,11 +219,11 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_backend: - if: ${{ needs.branch_build_setup.outputs.build_backend == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_backend == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - BACKEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + BACKEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -205,11 +233,16 @@ jobs: - name: Set Backend Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/backend-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:latest else TAG=${{ env.BACKEND_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/backend-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "BACKEND_TAG=${TAG}" >> $GITHUB_ENV @@ -219,6 +252,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -243,11 +283,11 @@ jobs: DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} branch_build_push_proxy: - if: ${{ needs.branch_build_setup.outputs.build_proxy == 'true' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} + if: ${{ needs.branch_build_setup.outputs.build_proxy == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' || needs.branch_build_setup.outputs.gh_branch_name == 'master' }} runs-on: ubuntu-20.04 needs: [branch_build_setup] env: - PROXY_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:${{ needs.branch_build_setup.outputs.gh_branch_name }} + PROXY_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} TARGET_BRANCH: ${{ needs.branch_build_setup.outputs.gh_branch_name }} BUILDX_DRIVER: ${{ needs.branch_build_setup.outputs.gh_buildx_driver }} BUILDX_VERSION: ${{ needs.branch_build_setup.outputs.gh_buildx_version }} @@ -257,11 +297,16 @@ jobs: - name: Set Proxy Docker Tag run: | if [ "${{ github.event_name }}" == "release" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:stable,${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:${{ github.event.release.tag_name }} + TAG=${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:stable + TAG=${TAG},${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:${{ github.event.release.tag_name }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:stable + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:${{ github.event.release.tag_name }} elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then - TAG=${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:latest + TAG=${{ secrets.DOCKERHUB_USERNAME }}/proxy-enterprise:latest + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:latest else TAG=${{ env.PROXY_TAG }} + TAG=${TAG},${{ vars.HARBOR_REGISTRY }}/${{ vars.HARBOR_PROJECT }}/proxy-enterprise:${{ needs.branch_build_setup.outputs.gh_branch_name }} fi echo "PROXY_TAG=${TAG}" >> $GITHUB_ENV @@ -271,6 +316,13 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Harbor + uses: docker/login-action@v3 + with: + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_TOKEN }} + registry: ${{ vars.HARBOR_REGISTRY }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: @@ -294,47 +346,45 @@ jobs: DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - convert_docker_to_tar: - if: ${{ needs.branch_build_setup.outputs.docker_upload_to_s3 == 'true' }} - name: Convert Docker TAR to S3 Bucket + upload_artifacts_s3: + if: ${{ needs.branch_build_setup.outputs.artifact_upload_to_s3 == 'true' }} + name: Upload artifacts to S3 Bucket runs-on: ubuntu-latest - needs: [branch_build_setup, branch_build_push_frontend, branch_build_push_space, branch_build_push_backend, branch_build_push_proxy] + needs: + [ + branch_build_setup, + branch_build_push_web, + branch_build_push_space, + branch_build_push_backend, + branch_build_push_proxy, + ] container: image: docker:20.10.7 credentials: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} env: - TAR_SUFFIX: ${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - FRONTEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-frontend-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - SPACE_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-space-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - BACKEND_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-backend-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - PROXY_TAG: ${{ secrets.DOCKERHUB_USERNAME }}/plane-proxy-ee:${{ needs.branch_build_setup.outputs.docker_tar_suffix }} - AWS_ACCESS_KEY_ID: ${{ secrets.PLANE_DOCKER_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.PLANE_DOCKER_SECRET_ACCESS_KEY }} + ARTIFACT_SUFFIX: ${{ needs.branch_build_setup.outputs.artifact_s3_suffix }} + AWS_ACCESS_KEY_ID: ${{ secrets.SELF_HOST_BUCKET_ACCESS_KEY }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.SELF_HOST_BUCKET_SECRET_KEY }} + TARGET_BRANCH: ${{ github.ref_name || github.event.release.target_commitish }} steps: - - name: Save Image as Tar + - id: checkout_files + name: Checkout Files + uses: actions/checkout@v4 + + - name: Upload artifacts run: | apk update apk add --no-cache aws-cli - mkdir -p ~/${{ env.TAR_SUFFIX }} + mkdir -p ~/${{ env.ARTIFACT_SUFFIX }} - echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + cp deploy/cli-install/variables.env ~/${{ env.ARTIFACT_SUFFIX }}/variables.env + cp deploy/cli-install/Caddyfile ~/${{ env.ARTIFACT_SUFFIX }}/Caddyfile + sed -e 's@${APP_RELEASE_VERSION}@'${{ env.ARTIFACT_SUFFIX }}'@' deploy/cli-install/docker-compose.yml > ~/${{ env.ARTIFACT_SUFFIX }}/docker-compose.yml + sed -e 's@${APP_RELEASE_VERSION}@'${{ env.ARTIFACT_SUFFIX }}'@' deploy/cli-install/docker-compose-caddy.yml > ~/${{ env.ARTIFACT_SUFFIX }}/docker-compose-caddy.yml - docker pull ${{ env.FRONTEND_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-frontend-ee.tar ${{ env.FRONTEND_TAG }} + aws s3 cp ~/${{ env.ARTIFACT_SUFFIX }} s3://${{ vars.SELF_HOST_BUCKET_NAME }}/plane-enterprise/${{ env.ARTIFACT_SUFFIX }} --recursive - docker pull ${{ env.SPACE_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-space-ee.tar ${{ env.SPACE_TAG }} - - docker pull ${{ env.BACKEND_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-backend-ee.tar ${{ env.BACKEND_TAG }} - - docker pull ${{ env.PROXY_TAG }} - docker save -o ~/${{ env.TAR_SUFFIX }}/plane-proxy-ee.tar ${{ env.PROXY_TAG }} - - aws s3 cp ~/${{ env.TAR_SUFFIX }} s3://${{ secrets.PLANE_DOCKER_BUCKET }}/plane-ee/${{ env.TAR_SUFFIX }} --recursive - - rm -rf ~/${{ env.TAR_SUFFIX }} - \ No newline at end of file + rm -rf ~/${{ env.ARTIFACT_SUFFIX }} diff --git a/deploy/cli-install/Caddyfile b/deploy/cli-install/Caddyfile new file mode 100644 index 0000000000..2ab9d05032 --- /dev/null +++ b/deploy/cli-install/Caddyfile @@ -0,0 +1,18 @@ +{ + email {$CERT_EMAIL} + {$CERT_ACME_DNS} +} + +{$APP_PROTOCOL}://{$DOMAIN_NAME} { + request_body { + max_size {$FILE_SIZE_LIMIT} + } + + reverse_proxy /spaces/* space:3000 + + reverse_proxy /api/* api:8000 + + reverse_proxy /{$BUCKET_NAME}/* plane-minio:9000 + + reverse_proxy /* web:3000 +} diff --git a/deploy/cli-install/docker-compose-caddy.yml b/deploy/cli-install/docker-compose-caddy.yml new file mode 100644 index 0000000000..e96d092df7 --- /dev/null +++ b/deploy/cli-install/docker-compose-caddy.yml @@ -0,0 +1,161 @@ +x-proxy-env: &proxy-env + environment: + - DOMAIN_NAME=${DOMAIN_NAME:-localhost} + - CERT_EMAIL=${CERT_EMAIL:-admin@localhost} + - APP_PROTOCOL=${APP_PROTOCOL:-http} + - CERT_ACME_DNS=${CERT_ACME_DNS:-} + - BUCKET_NAME=${BUCKET_NAME:-uploads} + - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} + - LISTEN_HTTP_PORT=${LISTEN_HTTP_PORT:-80} + - LISTEN_HTTPS_PORT=${LISTEN_HTTPS_PORT:-443} + +x-app-env: &app-env + environment: + - NGINX_PORT=${NGINX_PORT:-80} + - WEB_URL=${WEB_URL:-http://localhost} + - DEBUG=${DEBUG:-0} + - SENTRY_DSN=${SENTRY_DSN:-""} + - SENTRY_ENVIRONMENT=${SENTRY_ENVIRONMENT:-"production"} + - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-} + # Gunicorn Workers + - GUNICORN_WORKERS=${GUNICORN_WORKERS:-2} + #DB SETTINGS + - PGHOST=${PGHOST:-plane-db} + - PGDATABASE=${PGDATABASE:-plane} + - POSTGRES_USER=${POSTGRES_USER:-plane} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-plane} + - POSTGRES_DB=${POSTGRES_DB:-plane} + - PGDATA=${PGDATA:-/var/lib/postgresql/data} + - DATABASE_URL=${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} + # REDIS SETTINGS + - REDIS_HOST=${REDIS_HOST:-plane-redis} + - REDIS_PORT=${REDIS_PORT:-6379} + - REDIS_URL=${REDIS_URL:-redis://plane-redis:6379/} + # Application secret + - SECRET_KEY=${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5} + # DATA STORE SETTINGS + - USE_MINIO=${USE_MINIO:-1} + - AWS_REGION=${AWS_REGION:-""} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-"access-key"} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-"secret-key"} + - AWS_S3_ENDPOINT_URL=${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000} + - AWS_S3_BUCKET_NAME=${AWS_S3_BUCKET_NAME:-uploads} + - MINIO_ROOT_USER=${MINIO_ROOT_USER:-"access-key"} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-"secret-key"} + - BUCKET_NAME=${BUCKET_NAME:-uploads} + - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} + +services: + web: + <<: *app-env + image: registry.plane.tools/plane-enterprise/web-enterprise:${APP_RELEASE_VERSION} + restart: unless-stopped + command: /usr/local/bin/start.sh web/server.js web + deploy: + replicas: ${WEB_REPLICAS:-1} + depends_on: + - api + - worker + + space: + <<: *app-env + image: registry.plane.tools/plane-enterprise/space-enterprise:${APP_RELEASE_VERSION} + restart: unless-stopped + command: /usr/local/bin/start.sh space/server.js space + deploy: + replicas: ${SPACE_REPLICAS:-1} + depends_on: + - api + - worker + - web + + api: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + restart: unless-stopped + command: ./bin/takeoff + deploy: + replicas: ${API_REPLICAS:-1} + # volumes: + # - ${INSTALL_DIR}/logs/api:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + worker: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + restart: unless-stopped + command: ./bin/worker + # volumes: + # - ${INSTALL_DIR}/logs/worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + beat-worker: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + restart: unless-stopped + command: ./bin/beat + # volumes: + # - ${INSTALL_DIR}/logs/beat-worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + migrator: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + restart: no + command: > + sh -c "python manage.py wait_for_db && + python manage.py migrate" + # volumes: + # - ${INSTALL_DIR}/logs/migrator:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + plane-db: + <<: *app-env + image: postgres:15.5-alpine + restart: unless-stopped + command: postgres -c 'max_connections=1000' + volumes: + - ${INSTALL_DIR}/data/db:/var/lib/postgresql/data + + plane-redis: + <<: *app-env + image: redis:7.2.4-alpine + restart: unless-stopped + volumes: + - ${INSTALL_DIR}/data/redis:/data + + plane-minio: + <<: *app-env + image: minio/minio:latest + restart: unless-stopped + command: server /export --console-address ":9090" + volumes: + - ${INSTALL_DIR}/data/minio/uploads:/export + - ${INSTALL_DIR}/data/minio/data:/data + + # Comment this if you already have a reverse proxy running + proxy: + <<: *proxy-env + image: makeplane/caddy:latest + restart: unless-stopped + ports: + - ${LISTEN_HTTP_PORT:-80}:80 + - ${LISTEN_HTTPS_PORT:-443}:443 + volumes: + - ${INSTALL_DIR}/Caddyfile:/etc/caddy/Caddyfile + - ${INSTALL_DIR}/caddy/config:/config + - ${INSTALL_DIR}/caddy/data:/data + depends_on: + - web + - api + - space diff --git a/deploy/cli-install/docker-compose.yml b/deploy/cli-install/docker-compose.yml new file mode 100644 index 0000000000..b0ea017f3a --- /dev/null +++ b/deploy/cli-install/docker-compose.yml @@ -0,0 +1,156 @@ +# version: "3.8" + +x-app-env: &app-env + environment: + - NGINX_PORT=${NGINX_PORT:-80} + - WEB_URL=${WEB_URL:-http://localhost} + - DEBUG=${DEBUG:-0} + - SENTRY_DSN=${SENTRY_DSN:-""} + - SENTRY_ENVIRONMENT=${SENTRY_ENVIRONMENT:-"production"} + - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:-} + # Gunicorn Workers + - GUNICORN_WORKERS=${GUNICORN_WORKERS:-2} + #DB SETTINGS + - PGHOST=${PGHOST:-plane-db} + - PGDATABASE=${PGDATABASE:-plane} + - POSTGRES_USER=${POSTGRES_USER:-plane} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-plane} + - POSTGRES_DB=${POSTGRES_DB:-plane} + - PGDATA=${PGDATA:-/var/lib/postgresql/data} + - DATABASE_URL=${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} + # REDIS SETTINGS + - REDIS_HOST=${REDIS_HOST:-plane-redis} + - REDIS_PORT=${REDIS_PORT:-6379} + - REDIS_URL=${REDIS_URL:-redis://plane-redis:6379/} + # Application secret + - SECRET_KEY=${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5} + # DATA STORE SETTINGS + - USE_MINIO=${USE_MINIO:-1} + - AWS_REGION=${AWS_REGION:-""} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-"access-key"} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-"secret-key"} + - AWS_S3_ENDPOINT_URL=${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000} + - AWS_S3_BUCKET_NAME=${AWS_S3_BUCKET_NAME:-uploads} + - MINIO_ROOT_USER=${MINIO_ROOT_USER:-"access-key"} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-"secret-key"} + - BUCKET_NAME=${BUCKET_NAME:-uploads} + - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880} + +services: + web: + <<: *app-env + image: registry.plane.tools/plane-enterprise/web-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: /usr/local/bin/start.sh web/server.js web + deploy: + replicas: ${WEB_REPLICAS:-1} + depends_on: + - api + - worker + + space: + <<: *app-env + image: registry.plane.tools/plane-enterprise/space-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: /usr/local/bin/start.sh space/server.js space + deploy: + replicas: ${SPACE_REPLICAS:-1} + depends_on: + - api + - worker + - web + + api: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: ./bin/takeoff + deploy: + replicas: ${API_REPLICAS:-1} + # volumes: + # - ${INSTALL_DIR}/logs/api:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + worker: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: ./bin/worker + # volumes: + # - ${INSTALL_DIR}/logs/worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + beat-worker: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + command: ./bin/beat + # volumes: + # - ${INSTALL_DIR}/logs/beat-worker:/code/plane/logs + depends_on: + - api + - plane-db + - plane-redis + + migrator: + <<: *app-env + image: registry.plane.tools/plane-enterprise/backend-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: no + command: > + sh -c "python manage.py wait_for_db && + python manage.py migrate" + # volumes: + # - ${INSTALL_DIR}/logs/migrator:/code/plane/logs + depends_on: + - plane-db + - plane-redis + + plane-db: + <<: *app-env + image: postgres:15.5-alpine + pull_policy: if_not_present + restart: unless-stopped + command: postgres -c 'max_connections=1000' + volumes: + - ${INSTALL_DIR}/data/db:/var/lib/postgresql/data + plane-redis: + <<: *app-env + image: redis:7.2.4-alpine + pull_policy: if_not_present + restart: unless-stopped + volumes: + - ${INSTALL_DIR}/data/redis:/data + + plane-minio: + <<: *app-env + image: minio/minio:latest + pull_policy: if_not_present + restart: unless-stopped + command: server /export --console-address ":9090" + volumes: + - ${INSTALL_DIR}/data/minio/uploads:/export + - ${INSTALL_DIR}/data/minio/data:/data + + # Comment this if you already have a reverse proxy running + proxy: + <<: *app-env + image: registry.plane.tools/plane-enterprise/proxy-enterprise:${APP_RELEASE_VERSION} + pull_policy: if_not_present + restart: unless-stopped + ports: + - ${NGINX_PORT}:80 + depends_on: + - web + - api + - space diff --git a/deploy/cli-install/variables.env b/deploy/cli-install/variables.env new file mode 100644 index 0000000000..8490ea273d --- /dev/null +++ b/deploy/cli-install/variables.env @@ -0,0 +1,56 @@ +INSTALL_DIR=/opt/plane + +WEB_REPLICAS=1 +SPACE_REPLICAS=1 +API_REPLICAS=1 + +NGINX_PORT=80 +LISTEN_HTTP_PORT=80 +LISTEN_HTTPS_PORT=443 + +APP_PROTOCOL=http + +# If SSL Cert to be generated, set CERT_EMAIL and APP_PROTOCOL to https +CERT_EMAIL=admin@localhost + +# For DNS Challenge based certificate generation, set the CERT_ACME_DNS +# CERT_ACME_DNS=acme_dns CERT_DNS_PROVIDER CERT_DNS_PROVIDER_API_KEY +CERT_ACME_DNS= + +WEB_URL=http://localhost +DEBUG=0 +SENTRY_DSN= +SENTRY_ENVIRONMENT=production +CORS_ALLOWED_ORIGINS=http://localhost + +#DB SETTINGS +PGHOST=plane-db +PGDATABASE=plane +POSTGRES_USER=plane +POSTGRES_PASSWORD=plane +POSTGRES_DB=plane +PGDATA=/var/lib/postgresql/data +DATABASE_URL= + +# REDIS SETTINGS +REDIS_HOST=plane-redis +REDIS_PORT=6379 +REDIS_URL= + +# Secret Key +SECRET_KEY=60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5 + +# DATA STORE SETTINGS +USE_MINIO=1 +AWS_REGION= +AWS_ACCESS_KEY_ID=access-key +AWS_SECRET_ACCESS_KEY=secret-key +AWS_S3_ENDPOINT_URL=http://plane-minio:9000 +AWS_S3_BUCKET_NAME=uploads +MINIO_ROOT_USER=access-key +MINIO_ROOT_PASSWORD=secret-key +BUCKET_NAME=uploads +FILE_SIZE_LIMIT=5242880 + +# Gunicorn Workers +GUNICORN_WORKERS=2