diff --git a/blueprints/plane/docker-compose.yml b/blueprints/plane/docker-compose.yml index 9502c010..f424490a 100644 --- a/blueprints/plane/docker-compose.yml +++ b/blueprints/plane/docker-compose.yml @@ -1,137 +1,251 @@ version: "3.8" +x-db-env: &db-env + PGHOST: ${PGHOST:-plane-db} + PGDATABASE: ${PGDATABASE:-plane} + POSTGRES_USER: ${POSTGRES_USER:-plane} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-plane} + POSTGRES_DB: ${POSTGRES_DB:-plane} + POSTGRES_PORT: ${POSTGRES_PORT:-5432} + PGDATA: ${PGDATA:-/var/lib/postgresql/data} + +x-redis-env: &redis-env + REDIS_HOST: ${REDIS_HOST:-plane-redis} + REDIS_PORT: ${REDIS_PORT:-6379} + REDIS_URL: ${REDIS_URL:-redis://plane-redis:6379/} + +x-minio-env: &minio-env + MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID:-access-key} + MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY:-secret-key} + +x-aws-s3-env: &aws-s3-env + AWS_REGION: ${AWS_REGION:-} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-access-key} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-secret-key} + AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000} + AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} + +x-proxy-env: &proxy-env + APP_DOMAIN: ${APP_DOMAIN:-localhost} + FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} + BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} + +x-mq-env: &mq-env + RABBITMQ_HOST: ${RABBITMQ_HOST:-plane-mq} + RABBITMQ_PORT: ${RABBITMQ_PORT:-5672} + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-plane} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-plane} + RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST:-plane} + RABBITMQ_VHOST: ${RABBITMQ_VHOST:-plane} + +x-live-env: &live-env + API_BASE_URL: ${API_BASE_URL:-http://api:8000} + LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-dev-only-change-me} + +x-app-env: &app-env + WEB_URL: ${WEB_URL:-http://localhost} + DEBUG: ${DEBUG:-0} + CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost} + GUNICORN_WORKERS: ${GUNICORN_WORKERS:-1} + USE_MINIO: ${USE_MINIO:-1} + DATABASE_URL: ${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} + SECRET_KEY: ${SECRET_KEY:-dev-only-change-me} + AMQP_URL: ${AMQP_URL:-amqp://plane:plane@plane-mq:5672/plane} + API_KEY_RATE_LIMIT: ${API_KEY_RATE_LIMIT:-60/minute} + MINIO_ENDPOINT_SSL: ${MINIO_ENDPOINT_SSL:-0} + LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-dev-only-change-me} + WEBHOOK_ALLOWED_IPS: ${WEBHOOK_ALLOWED_IPS:-} + WEBHOOK_ALLOWED_HOSTS: ${WEBHOOK_ALLOWED_HOSTS:-} + services: web: - image: makeplane/plane-frontend:${APP_RELEASE:-v0.27.1} - command: node web/server.js web + image: makeplane/plane-frontend:${APP_RELEASE:-v1.3.1} + restart: unless-stopped depends_on: - - api - - worker - env_file: - - .env + api: + condition: service_started + worker: + condition: service_started space: - image: makeplane/plane-space:${APP_RELEASE:-v0.27.1} - command: node space/server.js space + image: makeplane/plane-space:${APP_RELEASE:-v1.3.1} + restart: unless-stopped depends_on: - - api - - worker - - web - env_file: - - .env + api: + condition: service_started + worker: + condition: service_started + web: + condition: service_started admin: - image: makeplane/plane-admin:${APP_RELEASE:-v0.27.1} - command: node admin/server.js admin + image: makeplane/plane-admin:${APP_RELEASE:-v1.3.1} + restart: unless-stopped depends_on: - - api - - web - env_file: - - .env + api: + condition: service_started + web: + condition: service_started live: - image: makeplane/plane-live:${APP_RELEASE:-v0.27.1} - command: node live/dist/server.js live + image: makeplane/plane-live:${APP_RELEASE:-v1.3.1} + restart: unless-stopped + environment: + <<: [*live-env, *redis-env] depends_on: - - api - - web - env_file: - - .env + api: + condition: service_started + web: + condition: service_started api: - image: makeplane/plane-backend:${APP_RELEASE:-v0.27.1} + image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1} + restart: unless-stopped command: ./bin/docker-entrypoint-api.sh volumes: - logs_api:/code/plane/logs + environment: + <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - - plane-db - - plane-redis - - plane-mq - env_file: - - .env + plane-db: + condition: service_healthy + plane-redis: + condition: service_healthy + plane-mq: + condition: service_healthy + migrator: + condition: service_completed_successfully worker: - image: makeplane/plane-backend:${APP_RELEASE:-v0.27.1} + image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1} + restart: unless-stopped command: ./bin/docker-entrypoint-worker.sh volumes: - logs_worker:/code/plane/logs + environment: + <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - - api - - plane-db - - plane-redis - - plane-mq - env_file: - - .env + plane-db: + condition: service_healthy + plane-redis: + condition: service_healthy + plane-mq: + condition: service_healthy + migrator: + condition: service_completed_successfully beat-worker: - image: makeplane/plane-backend:${APP_RELEASE:-v0.27.1} + image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1} + restart: unless-stopped command: ./bin/docker-entrypoint-beat.sh volumes: - logs_beat-worker:/code/plane/logs + environment: + <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - - api - - plane-db - - plane-redis - - plane-mq - env_file: - - .env + plane-db: + condition: service_healthy + plane-redis: + condition: service_healthy + plane-mq: + condition: service_healthy + migrator: + condition: service_completed_successfully migrator: - image: makeplane/plane-backend:${APP_RELEASE:-v0.27.1} + image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1} + restart: on-failure command: ./bin/docker-entrypoint-migrator.sh volumes: - logs_migrator:/code/plane/logs + environment: + <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - - plane-db - - plane-redis - env_file: - - .env + plane-db: + condition: service_healthy + plane-redis: + condition: service_healthy plane-db: image: postgres:17-alpine + restart: unless-stopped command: postgres -c 'max_connections=1000' + environment: + <<: *db-env volumes: - pgdata:/var/lib/postgresql/data - env_file: - - .env + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-plane} -d ${POSTGRES_DB:-plane}"] + interval: 5s + timeout: 5s + retries: 10 + start_period: 10s plane-redis: - image: valkey/valkey:7.2.5-alpine + image: valkey/valkey:7.2.11-alpine + restart: unless-stopped volumes: - redisdata:/data - env_file: - - .env + healthcheck: + test: ["CMD-SHELL", "valkey-cli ping | grep -q PONG"] + interval: 5s + timeout: 3s + retries: 5 + start_period: 5s plane-mq: image: rabbitmq:3.13.6-management-alpine + restart: unless-stopped + environment: + <<: *mq-env volumes: - rabbitmq_data:/var/lib/rabbitmq - env_file: - - .env + healthcheck: + test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] + interval: 10s + timeout: 10s + retries: 10 + start_period: 30s plane-minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-04-22T22-12-26Z + restart: unless-stopped command: server /export --console-address ":9090" + environment: + <<: *minio-env volumes: - uploads:/export - env_file: - - .env proxy: - image: makeplane/plane-proxy:${APP_RELEASE:-v0.27.1} + image: makeplane/plane-proxy:${APP_RELEASE:-v1.3.1} + restart: unless-stopped + expose: + - "80" + environment: + <<: *proxy-env + volumes: + - proxy_config:/config + - proxy_data:/data depends_on: - - web - - api - - space - env_file: - - .env + web: + condition: service_started + api: + condition: service_started + space: + condition: service_started + admin: + condition: service_started + live: + condition: service_started volumes: pgdata: redisdata: uploads: + rabbitmq_data: logs_api: logs_worker: logs_beat-worker: logs_migrator: - rabbitmq_data: + proxy_config: + proxy_data: diff --git a/blueprints/plane/plane.png b/blueprints/plane/plane.png index 3c6a00b4..2c76d49c 100644 Binary files a/blueprints/plane/plane.png and b/blueprints/plane/plane.png differ diff --git a/blueprints/plane/template.toml b/blueprints/plane/template.toml index a12f4564..442bab07 100644 --- a/blueprints/plane/template.toml +++ b/blueprints/plane/template.toml @@ -1,57 +1,56 @@ [variables] +app_release = "v1.3.1" main_domain = "${domain}" -db_password = "${password:32}" +postgres_password = "${password:32}" minio_password = "${password:32}" -rabbitmq_user = "${username}" -rabbitmq_pass = "${password:32}" +rabbitmq_password = "${password:32}" secret_key = "${base64:48}" +live_secret_key = "${base64:48}" [config] -env = [ -"Domain=${domain}", -"WEB_URL=${Domain}", -"PGHOST=plane-db", -"PGDATABASE=plane", -"POSTGRES_USER=${username}", -"POSTGRES_PASSWORD=${db_password}", -"POSTGRES_DB=plane", -"POSTGRES_PORT=5432", -"PGDATA=/var/lib/postgresql/data", -"REDIS_HOST=plane-redis", -"REDIS_PORT=6379", -"REDIS_URL=redis://plane-redis:6379/", -"MINIO_ROOT_USER=access-key", -"MINIO_ROOT_PASSWORD=${minio_password}", -"AWS_REGION=", -"AWS_ACCESS_KEY_ID=${MINIO_ROOT_USER}", -"AWS_SECRET_ACCESS_KEY=${minio_password}", -"AWS_S3_ENDPOINT_URL=http://plane-minio:9000", -"AWS_S3_BUCKET_NAME=uploads", -"NGINX_PORT=80", -"BUCKET_NAME=uploads", -"FILE_SIZE_LIMIT=5242880", -"RABBITMQ_HOST=plane-mq", -"RABBITMQ_PORT=5672", -"RABBITMQ_DEFAULT_USER=rabbitmq_user", -"RABBITMQ_DEFAULT_PASS=${rabbitmq_pass}", -"RABBITMQ_DEFAULT_VHOST=plane", -"RABBITMQ_VHOST=plane", -"API_BASE_URL=http://api:8000", -"DEBUG=0", -"SENTRY_DSN=", -"SENTRY_ENVIRONMENT=production", -"CORS_ALLOWED_ORIGINS=https://${Domain}", -"GUNICORN_WORKERS=1", -"USE_MINIO=1", -"DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@plane-db/plane", -"SECRET_KEY=${secret_key}", -"AMQP_URL=amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@plane-mq:5672/plane", -"API_KEY_RATE_LIMIT=60/minute", -"MINIO_ENDPOINT_SSL=0" -] -mounts = [] - [[config.domains]] serviceName = "proxy" port = 80 host = "${main_domain}" + +env = [ + "APP_RELEASE=${app_release}", + "APP_DOMAIN=${main_domain}", + "WEB_URL=https://${main_domain}", + "CORS_ALLOWED_ORIGINS=https://${main_domain}", + "API_BASE_URL=http://api:8000", + "SECRET_KEY=${secret_key}", + "LIVE_SERVER_SECRET_KEY=${live_secret_key}", + "POSTGRES_USER=plane", + "POSTGRES_PASSWORD=${postgres_password}", + "POSTGRES_DB=plane", + "POSTGRES_PORT=5432", + "PGHOST=plane-db", + "PGDATABASE=plane", + "PGDATA=/var/lib/postgresql/data", + "DATABASE_URL=postgresql://plane:${postgres_password}@plane-db:5432/plane", + "REDIS_HOST=plane-redis", + "REDIS_PORT=6379", + "REDIS_URL=redis://plane-redis:6379/", + "RABBITMQ_HOST=plane-mq", + "RABBITMQ_PORT=5672", + "RABBITMQ_USER=plane", + "RABBITMQ_PASSWORD=${rabbitmq_password}", + "RABBITMQ_VHOST=plane", + "AMQP_URL=amqp://plane:${rabbitmq_password}@plane-mq:5672/plane", + "USE_MINIO=1", + "AWS_REGION=", + "AWS_ACCESS_KEY_ID=access-key", + "AWS_SECRET_ACCESS_KEY=${minio_password}", + "AWS_S3_ENDPOINT_URL=http://plane-minio:9000", + "AWS_S3_BUCKET_NAME=uploads", + "FILE_SIZE_LIMIT=5242880", + "MINIO_ENDPOINT_SSL=0", + "DEBUG=0", + "GUNICORN_WORKERS=1", + "API_KEY_RATE_LIMIT=60/minute", + "WEBHOOK_ALLOWED_IPS=", + "WEBHOOK_ALLOWED_HOSTS=", +] + +mounts = [] diff --git a/meta.json b/meta.json index 8be7825d..cf06a7bc 100644 --- a/meta.json +++ b/meta.json @@ -5066,7 +5066,7 @@ { "id": "plane", "name": "Plane", - "version": "v0.27.1", + "version": "v1.3.1", "description": "Easy, flexible, open source project management software", "logo": "plane.png", "links": {