### Run Setup Script and Select Action Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/docker-compose.md Execute the setup script and choose the 'Install' option (1) to begin the installation process. ```bash ./setup.sh ``` ```bash Action [2]: 1 ``` -------------------------------- ### Install Plane Community Edition via Script Source: https://context7.com/makeplane/developer-docs/llms.txt Set up the Plane Community Edition by downloading and executing the setup script. Configure environment variables in `plane.env` before starting the server. ```bash # --- Community Edition (alternative) --- mkdir plane-selfhost && cd plane-selfhost curl -fsSL -o setup.sh https://github.com/makeplane/plane/releases/latest/download/setup.sh chmod +x setup.sh # Configure environment before starting # Edit plane.env - key variables: ``` -------------------------------- ### Start Plane Services Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/docker-compose.md Run the setup script and select the 'Start' option (2) to launch the Plane services. ```bash ./setup.sh ``` ```bash Action [2]: 2 ``` -------------------------------- ### Start Plane Instance Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/one-click.md Use the `plane-app start` operator to start the Plane server after installation. ```bash plane-app start ``` -------------------------------- ### Install Dependencies and Start Development Server Source: https://github.com/makeplane/developer-docs/blob/master/README.md Use these commands to install project dependencies with pnpm and start the local development server. The server runs at http://localhost:5173 with hot reload. ```bash pnpm install pnpm dev ``` -------------------------------- ### Example GET Request for Projects Source: https://github.com/makeplane/developer-docs/blob/master/docs/api-reference/introduction.md An example of how to construct a GET request to retrieve all projects within a workspace using the Plane API. ```text GET https://api.plane.so/api/v1/workspaces/{workspace_slug}/projects/ ``` -------------------------------- ### Download Plane Setup Script Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/community-to-airgapped.md Download the latest version of the setup script for managing Plane installations. ```bash curl -fsSL https://github.com/makeplane/plane/releases/latest/download/setup.sh -o setup.sh ``` -------------------------------- ### Install Plane v0.14.0 Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/upgrade-from-0.13.2-0.14.0.md Execute the setup script to install the new Plane version. ```bash ./setup.sh install ``` -------------------------------- ### Start Development Server Source: https://github.com/makeplane/developer-docs/blob/master/CONTRIBUTING.md Start the local development server to preview documentation changes. ```bash pnpm dev ``` -------------------------------- ### Exit Setup Script Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/docker-compose.md Exit the setup script after installation is complete. ```bash ./setup.sh ``` ```bash Action [2]: 8 ``` -------------------------------- ### Make Setup Script Executable Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/docker-compose.md Grant execute permissions to the downloaded setup script. ```bash chmod +x setup.sh ``` -------------------------------- ### Download Plane Setup Script Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/upgrade-plane.md Download the latest stable release setup script for Community Edition. This script is used to manage your Plane installation. ```bash curl -fsSL -o setup.sh https://github.com/makeplane/plane/releases/latest/download/setup.sh ``` -------------------------------- ### Run Community Edition Setup Script Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/prime-cli.md Executes the `setup.sh` script for the Community Edition of Plane, launching an interactive menu for installation and management tasks. ```bash ./setup.sh ``` -------------------------------- ### Prepare New Plane v0.14.0 Directory Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/upgrade-from-0.13.2-0.14.0.md Create a new directory for the v0.14.0 installation to ensure a clean setup. ```bash mkdir plane-selfhost cd plane-selfhost ``` -------------------------------- ### VitePress Configuration Example Source: https://github.com/makeplane/developer-docs/blob/master/CONTRIBUTING.md Example of frontmatter for a documentation page, including title and SEO description. ```yaml --- title: Page Title description: Brief description for SEO --- ``` -------------------------------- ### Install Plane SDKs Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/build-plane-app/sdks.md Install the Node.js or Python SDK using npm or pip respectively. ```bash npm install @makeplane/plane-node-sdk # or pip install plane-sdk ``` -------------------------------- ### Download and Run Plane Installer Script Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/install-methods-commercial/docker-compose.md Execute this command to download and run the Plane installation script. Follow the on-screen prompts to configure your domain and installation type (Express or Advanced). ```bash curl -fsSL https://prime.plane.so/install/ | sh - ``` -------------------------------- ### Build and Preview Documentation Source: https://github.com/makeplane/developer-docs/blob/master/CONTRIBUTING.md Build the documentation for production and preview it locally. ```bash pnpm build && pnpm preview ``` -------------------------------- ### Download and Prepare Installation Script Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/upgrade-from-0.13.2-0.14.0.md Set the release version and download the installation script, modifying it for the specified release. ```bash export RELEASE=v0.14-dev curl -fsSL https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh | sed -e 's@BRANCH=${BRANCH:-master}@BRANCH='"$RELEASE"'@' -e 's@APP_RELEASE="stable"@APP_RELEASE='"$RELEASE"'@' > setup.sh chmod +x setup.sh ``` -------------------------------- ### Backup Data (Community Edition Setup Script) Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/backup-restore.md Uses the setup script to back up PostgreSQL, Redis, and upload data for Community Edition. Backup files are stored locally. ```bash ./setup.sh ``` ```text Select an Action you want to perform: 1) Install (x86_64) 2) Start 3) Stop 4) Restart 5) Upgrade 6) View Logs 7) Backup Data 8) Exit Action [2]: 7 ``` ```text Backing Up plane-app_pgdata Backing Up plane-app_redisdata Backing Up plane-app_uploads Backup completed successfully. Backup files are stored in /....../plane-app/backup/20240502-1120 ``` -------------------------------- ### Configure GitHub Cloud Setup URL Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/govern/integrations/github.md Set this setup URL in your GitHub App to redirect users after installation, facilitating the connection process with Plane. ```bash https:///silo/api/github/auth/callback ``` -------------------------------- ### Python API Request Example Source: https://github.com/makeplane/developer-docs/blob/master/CONTRIBUTING.md Example of making a GET request to the Plane API using the requests library in Python. Ensure you include your API key in the headers. ```python import requests response = requests.get( "https://api.plane.so/api/v1/workspaces/", headers={"X-API-Key": "your-api-key"} ) ``` -------------------------------- ### Initialize Project with Workspace and Project Key Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/plane-compose.md Initialize a new Plane project and specify the workspace and project key directly via command-line arguments. ```bash plane init my-project --workspace myteam --project API ``` -------------------------------- ### Bot Token Flow: Get Workspace Details Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/build-plane-app/choose-token-flow.md Retrieve details about the workspace associated with the app installation. ```APIDOC ## GET /auth/o/app-installation/ ### Description Fetches details about the application installation, including workspace information. ### Method GET ### Endpoint https://api.plane.so/auth/o/app-installation/ ### Query Parameters - **id** (string) - Required - The `app_installation_id` obtained during the callback. ### Headers - **Authorization**: `Bearer YOUR_BOT_TOKEN` ``` -------------------------------- ### GitHub Enterprise Server Setup URL Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/govern/integrations/github.md This URL is used in the 'Post installation' section of your GitHub App. It redirects users to this URL after the GitHub app installation is complete. Use the correct URL for your Plane instance. ```bash https://silo.plane.so/api/oauth/github-enterprise/auth/callback ``` ```bash https:///silo/api/oauth/github-enterprise/auth/callback ``` -------------------------------- ### Quick Standard Setup Download Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/download-config.md Download the standard Plane Docker configuration files for a specific version and unzip them. Replace 'v2.4.0' with your desired release tag. ```bash curl "https://prime.plane.so/api/v2/setup/?version=v2.4.0" -o plane.zip unzip plane.zip ``` -------------------------------- ### Get Milestone Request Examples Source: https://github.com/makeplane/developer-docs/blob/master/docs/api-reference/milestones/get-milestone-detail.md Examples for retrieving a specific milestone using cURL, Python, and JavaScript. Ensure you replace placeholders with your actual workspace, project, milestone IDs, and API key or OAuth token. ```cURL curl -X GET \ "https://api.plane.so/api/v1/workspaces/my-workspace/projects/project-uuid/milestones/milestone-uuid/" \ -H "X-API-Key: $PLANE_API_KEY" \ # Or use -H "Authorization: Bearer $PLANE_OAUTH_TOKEN" ``` ```Python import requests response = requests.get( "https://api.plane.so/api/v1/workspaces/my-workspace/projects/project-uuid/milestones/milestone-uuid/", headers={"X-API-Key": "your-api-key"} ) print(response.json()) ``` ```JavaScript const response = await fetch( "https://api.plane.so/api/v1/workspaces/my-workspace/projects/project-uuid/milestones/milestone-uuid/", { method: "GET", headers: { "X-API-Key": "your-api-key", }, } ); const data = await response.json(); ``` -------------------------------- ### Example destination registry configurations Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/clone-docker-images.md Provides examples of how to set the `DESTINATION_REGISTRY` environment variable for various cloud providers and private registries. ```bash # Docker Hub export DESTINATION_REGISTRY="docker.io/yourcompany" # Google Container Registry export DESTINATION_REGISTRY="gcr.io/your-project" # Private registry export DESTINATION_REGISTRY="your-private-registry.com/plane" # AWS ECR export DESTINATION_REGISTRY="123456789012.dkr.ecr.us-east-1.amazonaws.com/plane" # Azure Container Registry export DESTINATION_REGISTRY="yourregistry.azurecr.io/plane" ``` -------------------------------- ### Example Action Payload Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/agents/signals-content-payload.md Illustrates a JSON payload for an 'action' activity, including the action name and its parameters. This can represent the start of an action or its result. ```json { "type": "action", "action": "searchDatabase", "parameters": { "query": "bug reports", "status": "open" } } ``` ```json { "type": "action", "action": "searchDatabase", "parameters": { "query": "bug reports", "status": "open", "result": "Found 12 matching work items" } } ``` -------------------------------- ### Create Backup Directories Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/upgrade-from-community.md Use these commands to create the necessary directories for storing your backups on the Community instance. ```bash mkdir -p ~/ce-backups/db mkdir -p ~/ce-backups/minio/uploads cd ~/ce-backups ``` -------------------------------- ### User Search Base Examples Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/govern/ldap.md Specify the starting point in your directory for Plane to search for users. Use the most specific path possible for optimal performance. ```plaintext ou=users,dc=example,dc=com ``` ```plaintext ou=employees,ou=people,dc=company,dc=com ``` ```plaintext cn=users,dc=company,dc=local ``` -------------------------------- ### Get Workspace Details with Bot Token Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/build-plane-app/choose-token-flow.md Retrieve workspace details using the bot token. This is useful for identifying the workspace slug and installation ID for future API calls. ```http GET https://api.plane.so/auth/o/app-installation/?id=APP_INSTALLATION_ID Authorization: Bearer YOUR_BOT_TOKEN ``` -------------------------------- ### Create a New Project Source: https://context7.com/makeplane/developer-docs/llms.txt Shows how to create a new project using a POST request. Requires `name` and `identifier`, and optionally accepts `description`, `project_lead`, and view settings. ```bash curl -X POST \ "https://api.plane.so/api/v1/workspaces/my-team/projects/" \ -H "X-API-Key: $PLANE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Backend API", "identifier": "BAPI", "description": "Backend API development project", "project_lead": "user-uuid-here", "cycle_view": true, "module_view": true, "page_view": true, "timezone": "America/New_York" }' # 201 Created # { # "id": "550e8400-e29b-41d4-a716-446655440000", # "name": "Backend API", # "identifier": "BAPI", # "project_lead": "user-uuid-here", # "created_at": "2024-01-01T00:00:00Z" # } ``` -------------------------------- ### Download and Edit values.yaml for Advanced Setup Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/kubernetes.md For advanced configuration, download the default values.yaml file to customize your Plane CE deployment. Edit this file with your preferred editor before proceeding with the Helm installation. ```bash helm show values makeplane/plane-ce > values.yaml vi values.yaml ``` -------------------------------- ### Download and Prepare Restore Script (Community Edition) Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/backup-restore.md Downloads the restore script for Community Edition and makes it executable. Save this script in the same directory as `setup.sh`. ```bash curl -fsSL -o restore.sh https://raw.githubusercontent.com/makeplane/plane/refs/heads/preview/deployments/cli/community/restore.sh chmod +x restore.sh ``` -------------------------------- ### OAuth 2.0 Bot Token Flow - Get Workspace Slug Source: https://context7.com/makeplane/developer-docs/llms.txt Retrieves the workspace slug using the App Installation ID and a bot token. This slug is required for subsequent API calls. ```bash curl -X GET "https://api.plane.so/auth/o/app-installation/?id=INSTALL_ID" \ -H "Authorization: Bearer pln_bot_xxxxxxxxxxxx" ``` -------------------------------- ### Initialize a New Plane Project Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/plane-compose.md Create a new Plane project directory with the default structure, including configuration and schema files. ```bash plane init my-project cd my-project ``` -------------------------------- ### Restore Plane Instance Data Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/migrate-plane.md Execute this command on the new server to restore your Plane instance from a backup file. Follow the on-screen prompts to ensure a correct setup. This command is intended for Docker installations managed by prime-cli. ```bash prime-cli restore ``` -------------------------------- ### Start Core Plane Dependencies Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/podman-quadlets.md Starts the core dependency services for Plane, including database, Redis, RabbitMQ, and MinIO. ```bash systemctl --user start plane-{db,redis,mq,minio}.service ``` -------------------------------- ### Python Flask App for Plane OAuth and Webhooks Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/build-plane-app/examples.md This Flask application provides the basic structure for handling Plane OAuth flows and webhook events. It includes setup for environment variables and placeholders for OAuth callback and webhook verification logic. Use this as a starting point for Python-based Plane integrations. ```python import os import hmac import hashlib import base64 import requests as http_requests from flask import Flask, request, redirect from urllib.parse import urlencode app = Flask(__name__) CLIENT_ID = os.getenv("PLANE_CLIENT_ID") CLIENT_SECRET = os.getenv("PLANE_CLIENT_SECRET") REDIRECT_URI = os.getenv("PLANE_REDIRECT_URI") WEBHOOK_SECRET = os.getenv("PLANE_WEBHOOK_SECRET") PLANE_API_URL = os.getenv("PLANE_API_URL", "https://api.plane.so") ``` -------------------------------- ### Monitor API Service Logs for Startup Confirmation Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/airgapped-edition.md Follow the logs of the API service to confirm its successful startup. The presence of the 'listening at' message indicates the API is ready to receive requests. ```bash docker compose logs -f api ``` -------------------------------- ### TypeScript Express App for Plane OAuth and Webhooks Source: https://github.com/makeplane/developer-docs/blob/master/docs/dev-tools/build-plane-app/examples.md This Express.js application handles Plane OAuth flows, including setup redirection and callback processing to exchange an app installation ID for a bot token. It also includes a webhook handler to verify signatures and process incoming events. Use this for server-side integrations with Plane. ```typescript import express from "express"; import axios from "axios"; import crypto from "crypto"; const app = express(); const CLIENT_ID = process.env.PLANE_CLIENT_ID!; const CLIENT_SECRET = process.env.PLANE_CLIENT_SECRET!; const REDIRECT_URI = process.env.PLANE_REDIRECT_URI!; const WEBHOOK_SECRET = process.env.PLANE_WEBHOOK_SECRET!; const PLANE_API_URL = process.env.PLANE_API_URL || "https://api.plane.so"; // In-memory storage (use a database in production) const installations = new Map< string, { botToken: string; workspaceSlug: string; appInstallationId: string; } >(); // Setup URL - redirect to Plane's consent screen app.get("/oauth/setup", (req, res) => { const params = new URLSearchParams({ client_id: CLIENT_ID, response_type: "code", redirect_uri: REDIRECT_URI, }); res.redirect(`${PLANE_API_URL}/auth/o/authorize-app/?${params}`); }); // OAuth callback - exchange app_installation_id for bot token app.get("/oauth/callback", async (req, res) => { const appInstallationId = req.query.app_installation_id as string; if (!appInstallationId) { return res.status(400).send("Missing app_installation_id"); } try { const basicAuth = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString("base64"); // Exchange for bot token const tokenRes = await axios.post( `${PLANE_API_URL}/auth/o/token/`, new URLSearchParams({ grant_type: "client_credentials", app_installation_id: appInstallationId, }).toString(), { headers: { Authorization: `Basic ${basicAuth}`, "Content-Type": "application/x-www-form-urlencoded", }, } ); const botToken = tokenRes.data.access_token; // Get workspace details const installRes = await axios.get(`${PLANE_API_URL}/auth/o/app-installation/?id=${appInstallationId}`, { headers: { Authorization: `Bearer ${botToken}` }, }); const installation = installRes.data[0]; const workspaceId = installation.workspace; const workspaceSlug = installation.workspace_detail.slug; // Store credentials installations.set(workspaceId, { botToken, workspaceSlug, appInstallationId }); console.log(`Installed in workspace: ${workspaceSlug}`); res.send("Installation successful! You can close this window."); } catch (error) { console.error("OAuth error:", error); res.status(500).send("Installation failed"); } }); // Webhook handler app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => { const signature = req.headers["x-plane-signature"] as string; const payload = req.body.toString(); // Verify signature const expected = crypto.createHmac("sha256", WEBHOOK_SECRET).update(payload).digest("hex"); if (!crypto.timingSafeEqual(Buffer.from(signature || ""), Buffer.from(expected))) { return res.status(403).send("Invalid signature"); } const event = JSON.parse(payload); console.log(`Received: ${event.event} ${event.action}`); // Get credentials for this workspace const creds = installations.get(event.workspace_id); if (creds) { // Process the event with creds.botToken } res.status(200).send("OK"); }); app.listen(3000, () => console.log("Server running on http://localhost:3000")); ``` -------------------------------- ### Install crane on Linux Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/clone-docker-images.md Downloads, extracts, and installs the latest `crane` release on Linux systems. Verifies the installation by checking the version. ```bash VERSION=$(curl -s https://api.github.com/repos/google/go-containerregistry/releases/latest | grep '"tag_name"' | cut -d'"' -f4) curl -sL "https://github.com/google/go-containerregistry/releases/download/${VERSION}/go-containerregistry_Linux_x86_64.tar.gz" | tar xz crane sudo mv crane /usr/local/bin/ # Verify installation crane version ``` -------------------------------- ### Community Edition Setup Script Menu Options Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/prime-cli.md Displays the interactive menu options available when running the `setup.sh` script for the Community Edition of Plane. ```bash Select a Action you want to perform: 1) Install 2) Start 3) Stop 4) Restart 5) Upgrade 6) View Logs 7) Backup Data 8) Exit ``` -------------------------------- ### Install Docker Engine Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/methods/docker-compose.md Use this command to install the Docker engine on your machine. This is a prerequisite for running Docker Compose, especially for the Community Edition installation. ```bash curl -fsSL https://get.docker.com | sh - ``` -------------------------------- ### View Logs for Plane Community Edition Services Source: https://github.com/makeplane/developer-docs/blob/master/docs/self-hosting/manage/view-logs.md Execute the setup script to access the main menu for Plane Community Edition. This allows you to select services like API, Worker, or Redis to view their logs. ```bash ./setup.sh ``` ```text Select a Action you want to perform: 1) Install (x86_64) 2) Start 3) Stop 4) Restart 5) Upgrade 6) View Logs 7) Backup Data 8) Exit Action [2]: 6 ``` ```text Select a Service you want to view the logs for: 1) Web 2) Space 3) API 4) Worker 5) Beat-Worker 6) Migrator 7) Proxy 8) Redis 9) Postgres 10) Minio 0) Back to Main Menu Service: ``` ```text api-1 | Waiting for database... api-1 | Database available! api-1 | Waiting for database migrations to complete... api-1 | Waiting for database migrations to complete... api-1 | Waiting for database migrations to complete... api-1 | Waiting for database migrations to complete... api-1 | Waiting for database migrations to complete... api-1 | Waiting for database migrations to complete... api-1 | Waiting for database migrations to complete... api-1 | No migrations Pending. Starting processes ... api-1 | Instance registered api-1 | ENABLE_SIGNUP loaded with value from environment variable. api-1 | ENABLE_EMAIL_PASSWORD loaded with value from environment variable. api-1 | ENABLE_MAGIC_LINK_LOGIN loaded with value from environment variable. api-1 | GOOGLE_CLIENT_ID loaded with value from environment variable. api-1 | GITHUB_CLIENT_ID loaded with value from environment variable. api-1 | GITHUB_CLIENT_SECRET loaded with value from environment variable. api-1 | EMAIL_HOST loaded with value from environment variable. api-1 | EMAIL_HOST_USER loaded with value from environment variable. api-1 | EMAIL_HOST_PASSWORD loaded with value from environment variable. api-1 | EMAIL_PORT loaded with value from environment variable. api-1 | EMAIL_FROM loaded with value from environment variable. api-1 | EMAIL_USE_TLS loaded with value from environment variable. api-1 | EMAIL_USE_SSL loaded with value from environment variable. api-1 | OPENAI_API_KEY loaded with value from environment variable. api-1 | GPT_ENGINE loaded with value from environment variable. api-1 | UNSPLASH_ACCESS_KEY loaded with value from environment variable. api-1 | Checking bucket... api-1 | Bucket 'uploads' does not exist. Creating bucket... api-1 | Bucket 'uploads' created successfully. api-1 | Public read access policy set for bucket 'uploads'. api-1 | Cache Cleared api-1 | [2024-05-02 03:56:01 +0000] [1] [INFO] Starting gunicorn 21.2.0 api-1 | [2024-05-02 03:56:01 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1) api-1 | [2024-05-02 03:56:01 +0000] [1] [INFO] Using worker: uvicorn.workers.UvicornWorker api-1 | [2024-05-02 03:56:01 +0000] [25] [INFO] Booting worker with pid: 25 api-1 | [2024-05-02 03:56:03 +0000] [25] [INFO] Started server process [25] api-1 | [2024-05-02 03:56:03 +0000] [25] [INFO] Waiting for application startup. api-1 | [2024-05-02 03:56:03 +0000] [25] [INFO] ASGI 'lifespan' protocol appears unsupported. api-1 | [2024-05-02 03:56:03 +0000] [25] [INFO] Application startup complete. ```