开源项目管理工具Plane部署篇

昨天主要说了安利 Plane,今天主要讲讲如何部署。

言简意赅,直接 compose 部署,方便演示

services:
  plane-aio:
    container_name: plane-aio
    image: ysicing/plane:v1.3.0-33cb22cb6-2026050720
    ports:
      - "${LISTEN_HTTP_PORT:-8080}:8080"
    environment:
      # Django
      SECRET_KEY: ${SECRET_KEY:-sk-plane-gaea-local-test-secret-key-change-me}
      DJANGO_SETTINGS_MODULE: plane.settings.production
      GUNICORN_WORKERS: ${GUNICORN_WORKERS:-1}

      # Database
      DATABASE_URL: postgresql://${POSTGRES_USER:-plane}:${POSTGRES_PASSWORD:-plane}@plane-db:5432/${POSTGRES_DB:-plane}

      # Redis
      REDIS_URL: redis://plane-redis:6379/

      # Celery Broker — 支持 RabbitMQ 或 Redis,二选一:
      # 方案 A(推荐):复用 Redis,无需 plane-mq 服务
      #   AMQP_URL: redis://plane-redis:6379/1
      # 方案 B:独立 RabbitMQ
      #   AMQP_URL: amqp://plane:plane@plane-mq:5672/plane
      AMQP_URL: ${AMQP_URL:-redis://plane-redis:6379/1}

      # S3 / MinIO
      USE_MINIO: ${USE_MINIO:-0}
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-minio}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-pass4You}
      AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads}
      AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL:-http://mytest:9000}
      AWS_REGION: ${AWS_REGION:-}
      MINIO_ENDPOINT_SSL: ${MINIO_ENDPOINT_SSL:-0}

      # Live 服务
      LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-live-server-secret-key}

      # 文件大小限制
      FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880}

      # API 限流
      API_KEY_RATE_LIMIT: ${API_KEY_RATE_LIMIT:-60/minute}

      # 应用访问地址 — 必须与浏览器地址栏的协议+域名+端口完全一致,用于登录后重定向
      WEB_URL: ${WEB_URL:-http://mytest:8080}

      # CSRF / CORS 可信来源 — 必须与浏览器地址栏的协议+域名+端口完全一致
      # 多个来源用逗号分隔,例如: http://localhost:8080,https://plane.example.com
      CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:8080,http://mytest:8080}

      # 禁用 OpenTelemetry SDK,停止向 telemetry.plane.so 发送遥测数据
      OTEL_SDK_DISABLED: "true"
    depends_on:
      plane-db:
        condition: service_healthy
      plane-redis:
        condition: service_healthy
      plane-minio:
        condition: service_started
    restart: unless-stopped

  # ============================================================
  # 有状态外部服务
  # ============================================================
  plane-db:
    container_name: plane-db
    image: postgres:15.7-alpine
    restart: always
    command: postgres -c 'max_connections=1000'
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-plane}
      POSTGRES_DB: ${POSTGRES_DB:-plane}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-plane}
      PGDATA: /var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-plane} -d ${POSTGRES_DB:-plane}"]
      interval: 5s
      timeout: 3s
      retries: 5

  plane-redis:
    container_name: plane-redis
    image: valkey/valkey:7.2.11-alpine
    restart: always
    volumes:
      - redisdata:/data
    healthcheck:
      test: ["CMD", "valkey-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  plane-minio:
    container_name: plane-minio
    image: minio/minio
    restart: always
    command: server /export --console-address ":9090"
    ports:
      - "9000:9000"
      - "9090:9090"
    volumes:
      - uploads:/export
    environment:
      # 默认值必须与 plane-aio 的 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY 一致,
      # 否则 Django 用 minio/OoMoovoug5inge9K 签名、MinIO 识别不到 AccessKey → 403 InvalidAccessKeyId
      MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID:-minio}
      MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY:-pass4You}

volumes:
  pgdata:
  redisdata:
  uploads:

自定义配置文件,大部分场景下只需要修改如下即可

cat .env
WEB_URL=http://100.90.80.34:8080
CORS_ALLOWED_ORIGINS=http://localhost:8080,http://100.90.80.34:8080
AWS_S3_ENDPOINT_URL=http://100.90.80.34:9000

我已经提供了预构建的镜像,我们进行了一些容器化改造,容器进行了精简方便部署。

直接启动,稍等一段时间,启动有一点慢。整体容器资源使用不超过 3G 内存

docker compose up -d

启动完成后进入管理员页面 上帝模式 god-mode

在上帝模式里可以配置(仅列出我们在上游基础上做的调整的)

  • 支持管理员管理
  • 支持钉钉消息推送(根据我们其他系统适配钉钉登录,使用率没有 LDAP 高,暂时不会支持)
  • 登录支持 LDAP
  • AI 支持自定义 LLM 地址

使用侧功能昨天说了差不多了。

想尝试的可以体验看看,很简单。

Sponsor

Like this article? $1 reward

Comments