开源项目管理工具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 地址
使用侧功能昨天说了差不多了。
想尝试的可以体验看看,很简单。
