From b6321438cec779a2993830258f297e1b4264278f Mon Sep 17 00:00:00 2001 From: pablohashescobar <118773738+pablohashescobar@users.noreply.github.com> Date: Fri, 26 May 2023 11:09:59 +0530 Subject: [PATCH] chore: docker setup (#1136) * chore: update docker environment variables and compose file for better readability * dev: update single dockerfile * dev: update WEB_URL configuration * dev: move database settings to environment variable * chore: remove port configuration from default compose file * dev: update example env to add EMAIL_FROM and default values for AWS --- .env.example | 15 +- Dockerfile | 13 +- apiserver/plane/api/views/asset.py | 8 +- apiserver/plane/api/views/issue.py | 4 +- .../plane/bgtasks/email_verification_task.py | 2 +- .../plane/bgtasks/forgot_password_task.py | 2 +- .../plane/bgtasks/magic_link_code_task.py | 2 +- .../plane/bgtasks/project_invitation_task.py | 2 +- .../bgtasks/workspace_invitation_task.py | 2 +- apiserver/plane/settings/local.py | 2 +- apiserver/plane/settings/production.py | 4 +- docker-compose-hub.yml | 56 ++-- docker-compose.yml | 283 +++++++++--------- nginx/nginx.conf | 2 +- setup.sh | 2 +- 15 files changed, 204 insertions(+), 195 deletions(-) diff --git a/.env.example b/.env.example index 727ea0806..8e65a6900 100644 --- a/.env.example +++ b/.env.example @@ -26,16 +26,23 @@ EMAIL_HOST="" EMAIL_HOST_USER="" EMAIL_HOST_PASSWORD="" EMAIL_PORT=587 +EMAIL_FROM="Team Plane " # AWS Settings AWS_REGION="" -AWS_ACCESS_KEY_ID="" -AWS_SECRET_ACCESS_KEY="" -AWS_S3_BUCKET_NAME="" +AWS_ACCESS_KEY_ID="access-key" +AWS_SECRET_ACCESS_KEY="secret-key" +AWS_S3_BUCKET_NAME="uploads" AWS_S3_ENDPOINT_URL="" # GPT settings OPENAI_API_KEY="" GPT_ENGINE="" -# Auto generated and Required \ No newline at end of file +# Github +GITHUB_CLIENT_SECRET="" # For fetching release notes + +# Settings related to Docker +DOCKERIZED=1 + +# Auto generated and Required that will be generated from setup.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index cb7ef6887..0610aab1c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,6 @@ RUN turbo prune --scope=app --docker # Add lockfile and package.json's of isolated subworkspace FROM node:18-alpine AS installer - RUN apk add --no-cache libc6-compat RUN apk update WORKDIR /app @@ -44,6 +43,8 @@ FROM python:3.11.1-alpine3.17 AS backend ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV PIP_DISABLE_PIP_VERSION_CHECK=1 +ENV DJANGO_SETTINGS_MODULE plane.settings.production +ENV DOCKERIZED 1 WORKDIR /code @@ -88,11 +89,6 @@ RUN chmod +x ./bin/takeoff ./bin/worker RUN chmod -R 777 /code # Expose container port and run entry point script -EXPOSE 8000 -EXPOSE 3000 -EXPOSE 80 - - WORKDIR /app @@ -126,9 +122,6 @@ COPY start.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/replace-env-vars.sh RUN chmod +x /usr/local/bin/start.sh +EXPOSE 80 CMD ["supervisord","-c","/code/supervisor.conf"] - - - - diff --git a/apiserver/plane/api/views/asset.py b/apiserver/plane/api/views/asset.py index 705735e51..0102867d7 100644 --- a/apiserver/plane/api/views/asset.py +++ b/apiserver/plane/api/views/asset.py @@ -35,8 +35,8 @@ class FileAssetEndpoint(BaseAPIView): serializer.save(workspace_id=request.user.last_workspace_id) response_data = serializer.data - if settings.DOCKERIZED and "minio:9000" in response_data["asset"]: - response_data["asset"] = response_data["asset"].replace("minio:9000", settings.WEB_URL) + if settings.DOCKERIZED and settings.AWS_S3_ENDPOINT_URL in response_data["asset"]: + response_data["asset"] = response_data["asset"].replace(settings.AWS_S3_ENDPOINT_URL, settings.WEB_URL) return Response(response_data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except Exception as e: @@ -86,8 +86,8 @@ class UserAssetsEndpoint(BaseAPIView): if serializer.is_valid(): serializer.save() response_data = serializer.data - if settings.DOCKERIZED and "minio:9000" in response_data["asset"]: - response_data["asset"] = response_data["asset"].replace("minio:9000", settings.WEB_URL) + if settings.DOCKERIZED and settings.AWS_S3_ENDPOINT_URL in response_data["asset"]: + response_data["asset"] = response_data["asset"].replace(settings.AWS_S3_ENDPOINT_URL, settings.WEB_URL) return Response(response_data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except Exception as e: diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 4f519ce69..2a2b3e3a9 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -789,8 +789,8 @@ class IssueAttachmentEndpoint(BaseAPIView): if serializer.is_valid(): serializer.save(project_id=project_id, issue_id=issue_id) response_data = serializer.data - if settings.DOCKERIZED and "minio:9000" in response_data["asset"]: - response_data["asset"] = response_data["asset"].replace("minio:9000", settings.WEB_URL) + if settings.DOCKERIZED and settings.AWS_S3_ENDPOINT_URL in response_data["asset"]: + response_data["asset"] = response_data["asset"].replace(settings.AWS_S3_ENDPOINT_URL, settings.WEB_URL) issue_activity.delay( type="attachment.activity.created", requested_data=None, diff --git a/apiserver/plane/bgtasks/email_verification_task.py b/apiserver/plane/bgtasks/email_verification_task.py index 1da3a7510..89551044b 100644 --- a/apiserver/plane/bgtasks/email_verification_task.py +++ b/apiserver/plane/bgtasks/email_verification_task.py @@ -19,7 +19,7 @@ def email_verification(first_name, email, token, current_site): try: realtivelink = "/request-email-verification/" + "?token=" + str(token) - abs_url = "http://" + current_site + realtivelink + abs_url = current_site + realtivelink from_email_string = settings.EMAIL_FROM diff --git a/apiserver/plane/bgtasks/forgot_password_task.py b/apiserver/plane/bgtasks/forgot_password_task.py index f13f1b89a..d3f00e666 100644 --- a/apiserver/plane/bgtasks/forgot_password_task.py +++ b/apiserver/plane/bgtasks/forgot_password_task.py @@ -17,7 +17,7 @@ def forgot_password(first_name, email, uidb64, token, current_site): try: realtivelink = f"/email-verify/?uidb64={uidb64}&token={token}/" - abs_url = "http://" + current_site + realtivelink + abs_url = current_site + realtivelink from_email_string = settings.EMAIL_FROM diff --git a/apiserver/plane/bgtasks/magic_link_code_task.py b/apiserver/plane/bgtasks/magic_link_code_task.py index 00a4e6807..29851c435 100644 --- a/apiserver/plane/bgtasks/magic_link_code_task.py +++ b/apiserver/plane/bgtasks/magic_link_code_task.py @@ -13,7 +13,7 @@ from sentry_sdk import capture_exception def magic_link(email, key, token, current_site): try: realtivelink = f"/magic-sign-in/?password={token}&key={key}" - abs_url = "http://" + current_site + realtivelink + abs_url = current_site + realtivelink from_email_string = settings.EMAIL_FROM diff --git a/apiserver/plane/bgtasks/project_invitation_task.py b/apiserver/plane/bgtasks/project_invitation_task.py index 2015ffe5e..7f1125f80 100644 --- a/apiserver/plane/bgtasks/project_invitation_task.py +++ b/apiserver/plane/bgtasks/project_invitation_task.py @@ -21,7 +21,7 @@ def project_invitation(email, project_id, token, current_site): ) relativelink = f"/project-member-invitation/{project_member_invite.id}" - abs_url = "http://" + current_site + relativelink + abs_url = current_site + relativelink from_email_string = settings.EMAIL_FROM diff --git a/apiserver/plane/bgtasks/workspace_invitation_task.py b/apiserver/plane/bgtasks/workspace_invitation_task.py index 0ce32eee0..3386a59d5 100644 --- a/apiserver/plane/bgtasks/workspace_invitation_task.py +++ b/apiserver/plane/bgtasks/workspace_invitation_task.py @@ -25,7 +25,7 @@ def workspace_invitation(email, workspace_id, token, current_site, invitor): realtivelink = ( f"/workspace-member-invitation/{workspace_member_invite.id}?email={email}" ) - abs_url = "http://" + current_site + realtivelink + abs_url = current_site + realtivelink from_email_string = settings.EMAIL_FROM diff --git a/apiserver/plane/settings/local.py b/apiserver/plane/settings/local.py index 87e04e1ed..70a4be49a 100644 --- a/apiserver/plane/settings/local.py +++ b/apiserver/plane/settings/local.py @@ -70,7 +70,7 @@ MEDIA_ROOT = os.path.join(BASE_DIR, "uploads") if DOCKERIZED: REDIS_URL = os.environ.get("REDIS_URL") -WEB_URL = os.environ.get("WEB_URL", "localhost:3000") +WEB_URL = os.environ.get("WEB_URL", "http://localhost:3000") PROXY_BASE_URL = os.environ.get("PROXY_BASE_URL", False) ANALYTICS_SECRET_KEY = os.environ.get("ANALYTICS_SECRET_KEY", False) diff --git a/apiserver/plane/settings/production.py b/apiserver/plane/settings/production.py index 4d7da6ce3..81a3c2082 100644 --- a/apiserver/plane/settings/production.py +++ b/apiserver/plane/settings/production.py @@ -90,7 +90,7 @@ if DOCKERIZED: # The name of the bucket to store files in. AWS_STORAGE_BUCKET_NAME = os.environ.get("AWS_S3_BUCKET_NAME", "uploads") # The full URL to the S3 endpoint. Leave blank to use the default region URL. - AWS_S3_ENDPOINT_URL = os.environ.get("AWS_S3_ENDPOINT_URL", "http://minio:9000") + AWS_S3_ENDPOINT_URL = os.environ.get("AWS_S3_ENDPOINT_URL", "http://plane-minio:9000") # Default permissions AWS_DEFAULT_ACL = "public-read" AWS_QUERYSTRING_AUTH = False @@ -223,7 +223,7 @@ else: } -WEB_URL = os.environ.get("WEB_URL") +WEB_URL = os.environ.get("WEB_URL", "https://app.plane.so") PROXY_BASE_URL = os.environ.get("PROXY_BASE_URL", False) diff --git a/docker-compose-hub.yml b/docker-compose-hub.yml index 53a7ee0f2..465f9d3f3 100644 --- a/docker-compose-hub.yml +++ b/docker-compose-hub.yml @@ -3,7 +3,7 @@ version: "3.8" services: plane-web: container_name: planefrontend - image: makeplane/plane-frontend:0.6 + image: makeplane/plane-frontend:latest restart: always command: /usr/local/bin/start.sh environment: @@ -19,12 +19,12 @@ services: plane-api: container_name: planebackend - image: makeplane/plane-backend:0.6 + image: makeplane/plane-backend:latest restart: always command: ./bin/takeoff environment: DJANGO_SETTINGS_MODULE: plane.settings.production - DATABASE_URL: postgres://plane:xyzzyspoon@plane-db:5432/plane + DATABASE_URL: postgres://${PGUSER}:${PGPASSWORD}@plane-db:5432/plane REDIS_URL: redis://plane-redis:6379/ EMAIL_HOST: ${EMAIL_HOST} EMAIL_HOST_USER: ${EMAIL_HOST_USER} @@ -33,7 +33,7 @@ services: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} - WEB_URL: localhost/ + WEB_URL: ${WEB_URL} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} DISABLE_COLLECTSTATIC: 1 DOCKERIZED: 1 @@ -48,12 +48,12 @@ services: plane-worker: container_name: planerqworker - image: makeplane/plane-worker:0.6 + image: makeplane/plane-worker:latest restart: always command: ./bin/worker environment: DJANGO_SETTINGS_MODULE: plane.settings.production - DATABASE_URL: postgres://plane:xyzzyspoon@plane-db:5432/plane + DATABASE_URL: postgres://${PGUSER}:${PGPASSWORD}@plane-db:5432/plane REDIS_URL: redis://plane-redis:6379/ EMAIL_HOST: ${EMAIL_HOST} EMAIL_HOST_USER: ${EMAIL_HOST_USER} @@ -62,7 +62,7 @@ services: AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} - WEB_URL: localhost/ + WEB_URL: ${WEB_URL} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} DISABLE_COLLECTSTATIC: 1 DOCKERIZED: 1 @@ -80,9 +80,9 @@ services: restart: always command: postgres -c 'max_connections=1000' environment: - POSTGRES_USER: plane + POSTGRES_USER: ${PGUSER} POSTGRES_DB: plane - POSTGRES_PASSWORD: xyzzyspoon + POSTGRES_PASSWORD: ${PGPASSWORD} volumes: - pgdata:/var/lib/postgresql/data @@ -94,25 +94,30 @@ services: - redisdata:/data plane-minio: - container_name: plane-minio - image: minio/minio - environment: - MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} - MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} - command: server /export --console-address ":9090" + container_name: plane-minio + image: minio/minio + volumes: + - uploads:/export + environment: + MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} + MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} + command: server /export --console-address ":9090" + ports: + - 9000:9000 createbuckets: - image: minio/mc - depends_on: - - minio - entrypoint: > - /bin/sh -c " - /usr/bin/mc config host add plane-minio http://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; - " + image: minio/mc + depends_on: + - plane-minio + 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; + " +# Comment this if you already have a reverse proxy running nginx: container_name: nginx build: @@ -128,3 +133,4 @@ services: volumes: pgdata: redisdata: + uploads: diff --git a/docker-compose.yml b/docker-compose.yml index 68f06a3c8..44252ad6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,145 +1,148 @@ version: "3.8" services: - nginx: - container_name: nginx - build: - context: ./nginx - dockerfile: Dockerfile - restart: always - ports: - - 80:80 - depends_on: - - plane-web - - plane-api - db: - image: postgres:15.2-alpine - container_name: db - restart: always - volumes: - - pgdata:/var/lib/postgresql/data - environment: - POSTGRES_USER: plane - POSTGRES_DB: plane - POSTGRES_PASSWORD: xyzzyspoon - PGDATA: /var/lib/postgresql/data - command: postgres -c 'max_connections=1000' - ports: - - 5432:5432 - redis: - image: redis:6.2.7-alpine - container_name: redis - restart: always - ports: - - 6379:6379 - volumes: - - redisdata:/data - plane-web: - container_name: planefrontend - build: - context: . - dockerfile: ./apps/app/Dockerfile.web - args: - NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 - command: [ "/usr/local/bin/start.sh" ] - ports: - - 3000:3000 - environment: - NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL} - NEXT_PUBLIC_GOOGLE_CLIENTID: "0" - NEXT_PUBLIC_GITHUB_APP_NAME: "0" - NEXT_PUBLIC_GITHUB_ID: "0" - NEXT_PUBLIC_SENTRY_DSN: "0" - NEXT_PUBLIC_ENABLE_OAUTH: "0" - NEXT_PUBLIC_ENABLE_SENTRY: "0" - NEXT_PUBLIC_ENABLE_SESSION_RECORDER: "0" - NEXT_PUBLIC_TRACK_EVENTS: "0" - plane-api: - container_name: planebackend - build: - context: ./apiserver - dockerfile: Dockerfile.api - restart: always - ports: - - 8000:8000 - environment: - DJANGO_SETTINGS_MODULE: plane.settings.production - DATABASE_URL: postgres://plane:xyzzyspoon@db:5432/plane - REDIS_URL: redis://redis:6379/ - EMAIL_HOST: ${EMAIL_HOST} - EMAIL_HOST_USER: ${EMAIL_HOST_USER} - EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} - AWS_REGION: ${AWS_REGION} - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} - AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} - AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL} - WEB_URL: ${WEB_URL} - GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} - DISABLE_COLLECTSTATIC: 1 - DOCKERIZED: 1 - OPENAI_API_KEY: ${OPENAI_API_KEY} - GPT_ENGINE: ${GPT_ENGINE} - SECRET_KEY: ${SECRET_KEY} - depends_on: - - db - - redis - command: ./bin/takeoff - links: - - db:db - - redis:redis - plane-worker: - container_name: planebgworker - build: - context: ./apiserver - dockerfile: Dockerfile.api - depends_on: - - redis - - db - - plane-api - command: ./bin/worker - links: - - redis:redis - - db:db - environment: - DJANGO_SETTINGS_MODULE: plane.settings.production - DATABASE_URL: postgres://plane:xyzzyspoon@db:5432/plane - REDIS_URL: redis://redis:6379/ - EMAIL_HOST: ${EMAIL_HOST} - EMAIL_HOST_USER: ${EMAIL_HOST_USER} - EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} - AWS_REGION: ${AWS_REGION} - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} - AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} - AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL} - WEB_URL: ${WEB_URL} - GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} - DISABLE_COLLECTSTATIC: 1 - DOCKERIZED: 1 - OPENAI_API_KEY: ${OPENAI_API_KEY} - GPT_ENGINE: ${GPT_ENGINE} - SECRET_KEY: ${SECRET_KEY} - minio: - image: minio/minio - ports: - - 9000:9000 - environment: - MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} - MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} - command: server /export --console-address ":9090" + plane-web: + container_name: planefrontend + build: + context: . + dockerfile: ./apps/app/Dockerfile.web + args: + NEXT_PUBLIC_API_BASE_URL: http://localhost:8000 + restart: always + command: [ "/usr/local/bin/start.sh" ] + environment: + NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL} + NEXT_PUBLIC_GOOGLE_CLIENTID: "0" + NEXT_PUBLIC_GITHUB_APP_NAME: "0" + NEXT_PUBLIC_GITHUB_ID: "0" + NEXT_PUBLIC_SENTRY_DSN: "0" + NEXT_PUBLIC_ENABLE_OAUTH: "0" + NEXT_PUBLIC_ENABLE_SENTRY: "0" + NEXT_PUBLIC_ENABLE_SESSION_RECORDER: "0" + NEXT_PUBLIC_TRACK_EVENTS: "0" + + plane-api: + container_name: planebackend + build: + context: ./apiserver + dockerfile: Dockerfile.api + restart: always + command: ./bin/takeoff + environment: + DJANGO_SETTINGS_MODULE: plane.settings.production + DATABASE_URL: postgres://${PGUSER}:${PGPASSWORD}@plane-db:5432/plane + REDIS_URL: redis://redis:6379/ + EMAIL_HOST: ${EMAIL_HOST} + EMAIL_HOST_USER: ${EMAIL_HOST_USER} + EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} + AWS_REGION: ${AWS_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} + AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL} + WEB_URL: ${WEB_URL} + GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} + DISABLE_COLLECTSTATIC: 1 + DOCKERIZED: 1 + OPENAI_API_KEY: ${OPENAI_API_KEY} + GPT_ENGINE: ${GPT_ENGINE} + SECRET_KEY: ${SECRET_KEY} + depends_on: + - plane-db + - plane-redis + + plane-worker: + container_name: planebgworker + build: + context: ./apiserver + dockerfile: Dockerfile.api + restart: always + command: ./bin/worker + environment: + DJANGO_SETTINGS_MODULE: plane.settings.production + DATABASE_URL: postgres://${PGUSER}:${PGPASSWORD}@plane-db:5432/plane + REDIS_URL: redis://redis:6379/ + EMAIL_HOST: ${EMAIL_HOST} + EMAIL_HOST_USER: ${EMAIL_HOST_USER} + EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD} + AWS_REGION: ${AWS_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME} + AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL} + WEB_URL: ${WEB_URL} + GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} + DISABLE_COLLECTSTATIC: 1 + DOCKERIZED: 1 + OPENAI_API_KEY: ${OPENAI_API_KEY} + GPT_ENGINE: ${GPT_ENGINE} + SECRET_KEY: ${SECRET_KEY} + depends_on: + - plane-api + - plane-db + - plane-redis + + plane-db: + container_name: plane-db + image: postgres:15.2-alpine + restart: always + command: postgres -c 'max_connections=1000' + volumes: + - pgdata:/var/lib/postgresql/data + environment: + POSTGRES_USER: ${PGUSER} + POSTGRES_DB: plane + POSTGRES_PASSWORD: ${PGPASSWORD} + PGDATA: /var/lib/postgresql/data + ports: + - 5432:5432 + + plane-redis: + container_name: redis + image: redis:6.2.7-alpine + restart: always + volumes: + - redisdata:/data + ports: + - 6379:6379 + + plane-minio: + container_name: plane-minio + image: minio/minio + restart: always + command: server /export --console-address ":9090" + volumes: + - uploads:/export + environment: + MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} + MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} + + createbuckets: + image: minio/mc + 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; + " + depends_on: + - plane-minio + + nginx: + container_name: nginx + build: + context: ./nginx + dockerfile: Dockerfile + restart: always + ports: + - 80:80 + depends_on: + - plane-web + - plane-api + - createbuckets: - image: minio/mc - depends_on: - - minio - entrypoint: > - /bin/sh -c " - /usr/bin/mc config host add plane-minio http://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; - " volumes: - pgdata: - redisdata: + pgdata: + redisdata: + uploads: diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 8f5fc2910..b57dc97f2 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -17,7 +17,7 @@ server { } location /uploads/ { - proxy_pass http://minio:9000/uploads/; + proxy_pass http://plane-minio:9000/uploads/; } } } \ No newline at end of file diff --git a/setup.sh b/setup.sh index f4ca1ea6d..7fc5847e0 100755 --- a/setup.sh +++ b/setup.sh @@ -7,7 +7,7 @@ export LC_CTYPE=C # Generate the NEXT_PUBLIC_API_BASE_URL with given IP -echo -e "\nNEXT_PUBLIC_API_BASE_URL=http://$1" >> ./.env +echo -e "\nNEXT_PUBLIC_API_BASE_URL=$1" >> ./.env # Generate the SECRET_KEY that will be used by django echo -e "SECRET_KEY=\"$(tr -dc 'a-z0-9!@#$%^&*(-_=+)' < /dev/urandom | head -c50)\"" >> ./.env