Plane logoProject Management

Plane

Issue, sprint, and roadmap management, suitable as a Linear or Jira alternative for small teams.

Review notes

It runs more services than small apps, so check VPS resources and schedule database backups.

Deployment guide

Plane runs multiple services, so use the official Docker Compose setup and at least 4 GB RAM.

  1. Clone the repo or download the official self-hosted bundle.
  2. Configure `.env` for domain, secrets, database, Redis, and object storage if used.
  3. Run migrations/setup from the docs before inviting users.
  4. Put HTTPS reverse proxy in front of the web and API services.
  5. Create a workspace and verify email/invite flows if enabled.
Backup:Back up PostgreSQL, Redis if queue state matters, and object storage attachments.

Copy and run on your server

Use each block separately: save the compose file, or copy the bash script to create it and start the container.

docker-compose.ymlyaml
services:
  plane:
    image: makeplane/plane-frontend:stable
    container_name: plane_frontend
    ports:
      - "3000:3000"
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    container_name: plane_postgres
    environment:
      POSTGRES_USER: plane
      POSTGRES_PASSWORD: plane_password
      POSTGRES_DB: plane
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: plane_redis
    restart: unless-stopped
setup.shbash
#!/usr/bin/env bash
set -euo pipefail

sudo mkdir -p /opt/plane
sudo chown "$USER":"$USER" /opt/plane
cd /opt/plane

cat > docker-compose.yml <<'COMPOSE'
services:
  plane:
    image: makeplane/plane-frontend:stable
    container_name: plane_frontend
    ports:
      - "3000:3000"
    restart: unless-stopped

  postgres:
    image: postgres:16-alpine
    container_name: plane_postgres
    environment:
      POSTGRES_USER: plane
      POSTGRES_PASSWORD: plane_password
      POSTGRES_DB: plane
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: plane_redis
    restart: unless-stopped
COMPOSE

docker compose up -d
echo "Plane starter stack is running on http://SERVER_IP:3000"

Stack

TypeScriptPythonPostgreSQLRedis