{
  "manifest_version": "1.0.0",
  "template": {
    "id": "e6434eea-ed48-4166-b5eb-0d2200dfe19e",
    "slug": "plane-self-hosted-jiralinear-alternative",
    "name": "Plane (Self-Hosted Jira/Linear Alternative)",
    "description": "Self-hosted Jira/Linear alternative for issue tracking. [Updated Aug '26]",
    "url": "https://railway.com/deploy/plane-self-hosted-jiralinear-alternative",
    "upstream": {
      "image": "makeplane/plane-proxy:v1.4.1"
    }
  },
  "services": [
    {
      "name": "api",
      "source": {
        "image": "makeplane/plane-backend:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "admin",
      "source": {
        "image": "makeplane/plane-admin:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "beat",
      "source": {
        "image": "makeplane/plane-backend:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "rabbitmq",
      "source": {
        "image": "rabbitmq:3.13.6-management-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/rabbitmq",
      "http": false
    },
    {
      "name": "proxy",
      "source": {
        "image": "makeplane/plane-proxy:v1.4.1"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "postgres",
      "source": {
        "image": "postgres:15.7-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "minio",
      "source": {
        "image": "minio/minio:RELEASE.2025-04-08T15-41-24Z"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "valkey",
      "source": {
        "image": "valkey/valkey:7.2.11-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "web",
      "source": {
        "image": "makeplane/plane-frontend:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "space",
      "source": {
        "image": "makeplane/plane-space:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "worker",
      "source": {
        "image": "makeplane/plane-backend:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "live",
      "source": {
        "image": "makeplane/plane-live:v1.4.1"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "api",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8000"
    },
    {
      "key": "DEBUG",
      "service": "api",
      "description": "Provide a value for DEBUG.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "WEB_URL",
      "service": "api",
      "description": "Provide a value for WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AMQP_URL",
      "service": "api",
      "description": "Provide a value for AMQP_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_URL",
      "service": "api",
      "description": "Provide a value for REDIS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "USE_MINIO",
      "service": "api",
      "description": "Provide a value for USE_MINIO.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "AWS_REGION",
      "service": "api",
      "description": "Provide a value for AWS_REGION.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "SECRET_KEY",
      "service": "api",
      "description": "Provide a value for SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DATABASE_URL",
      "service": "api",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_SIZE_LIMIT",
      "service": "api",
      "description": "Provide a value for FILE_SIZE_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "5242880"
    },
    {
      "key": "GUNICORN_WORKERS",
      "service": "api",
      "description": "Provide a value for GUNICORN_WORKERS.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "AWS_ACCESS_KEY_ID",
      "service": "api",
      "description": "Provide a value for AWS_ACCESS_KEY_ID.",
      "secret": true,
      "strategy": "default",
      "default": "plane-minio"
    },
    {
      "key": "API_KEY_RATE_LIMIT",
      "service": "api",
      "description": "Provide a value for API_KEY_RATE_LIMIT.",
      "secret": true,
      "strategy": "default",
      "default": "60/minute"
    },
    {
      "key": "AWS_S3_BUCKET_NAME",
      "service": "api",
      "description": "Provide a value for AWS_S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "uploads"
    },
    {
      "key": "MINIO_ENDPOINT_SSL",
      "service": "api",
      "description": "Provide a value for MINIO_ENDPOINT_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "AWS_S3_ENDPOINT_URL",
      "service": "api",
      "description": "Provide a value for AWS_S3_ENDPOINT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CORS_ALLOWED_ORIGINS",
      "service": "api",
      "description": "Provide a value for CORS_ALLOWED_ORIGINS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AWS_SECRET_ACCESS_KEY",
      "service": "api",
      "description": "Provide a value for AWS_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LIVE_SERVER_SECRET_KEY",
      "service": "api",
      "description": "Provide a value for LIVE_SERVER_SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PORT",
      "service": "admin",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "DEBUG",
      "service": "beat",
      "description": "Provide a value for DEBUG.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "WEB_URL",
      "service": "beat",
      "description": "Provide a value for WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AMQP_URL",
      "service": "beat",
      "description": "Provide a value for AMQP_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_URL",
      "service": "beat",
      "description": "Provide a value for REDIS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "USE_MINIO",
      "service": "beat",
      "description": "Provide a value for USE_MINIO.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "AWS_REGION",
      "service": "beat",
      "description": "Provide a value for AWS_REGION.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "SECRET_KEY",
      "service": "beat",
      "description": "Provide a value for SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "beat",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_SIZE_LIMIT",
      "service": "beat",
      "description": "Provide a value for FILE_SIZE_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "5242880"
    },
    {
      "key": "GUNICORN_WORKERS",
      "service": "beat",
      "description": "Provide a value for GUNICORN_WORKERS.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "AWS_ACCESS_KEY_ID",
      "service": "beat",
      "description": "Provide a value for AWS_ACCESS_KEY_ID.",
      "secret": true,
      "strategy": "default",
      "default": "plane-minio"
    },
    {
      "key": "API_KEY_RATE_LIMIT",
      "service": "beat",
      "description": "Provide a value for API_KEY_RATE_LIMIT.",
      "secret": true,
      "strategy": "default",
      "default": "60/minute"
    },
    {
      "key": "AWS_S3_BUCKET_NAME",
      "service": "beat",
      "description": "Provide a value for AWS_S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "uploads"
    },
    {
      "key": "MINIO_ENDPOINT_SSL",
      "service": "beat",
      "description": "Provide a value for MINIO_ENDPOINT_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "AWS_S3_ENDPOINT_URL",
      "service": "beat",
      "description": "Provide a value for AWS_S3_ENDPOINT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CORS_ALLOWED_ORIGINS",
      "service": "beat",
      "description": "Provide a value for CORS_ALLOWED_ORIGINS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AWS_SECRET_ACCESS_KEY",
      "service": "beat",
      "description": "Provide a value for AWS_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LIVE_SERVER_SECRET_KEY",
      "service": "beat",
      "description": "Provide a value for LIVE_SERVER_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RABBITMQ_DEFAULT_PASS",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_PASS.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "RABBITMQ_DEFAULT_USER",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "plane"
    },
    {
      "key": "RABBITMQ_DEFAULT_VHOST",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_VHOST.",
      "secret": false,
      "strategy": "default",
      "default": "plane"
    },
    {
      "key": "PORT",
      "service": "proxy",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "BUCKET_NAME",
      "service": "proxy",
      "description": "Provide a value for BUCKET_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "uploads"
    },
    {
      "key": "API_UPSTREAM",
      "service": "proxy",
      "description": "Provide a value for API_UPSTREAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEB_UPSTREAM",
      "service": "proxy",
      "description": "Provide a value for WEB_UPSTREAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CADDYFILE_B64",
      "service": "proxy",
      "description": "Provide a value for CADDYFILE_B64.",
      "secret": false,
      "strategy": "default",
      "default": "OnskUE9SVH0gewoJcmVxdWVzdF9ib2R5IHsKCQltYXhfc2l6ZSB7JEZJTEVfU0laRV9MSU1JVH0KCX0KCXJlZGlyIC9zcGFjZXMgL3NwYWNlcy8gcGVybWFuZW50CglyZXZlcnNlX3Byb3h5IC9zcGFjZXMvKiB7JFNQQUNFX1VQU1RSRUFNfQoJcmVkaXIgL2dvZC1tb2RlIC9nb2QtbW9kZS8gcGVybWFuZW50CglyZXZlcnNlX3Byb3h5IC9nb2QtbW9kZS8qIHskQURNSU5fVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC9saXZlLyogeyRMSVZFX1VQU1RSRUFNfQoJcmV2ZXJzZV9wcm94eSAvYXBpLyogeyRBUElfVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC9hdXRoLyogeyRBUElfVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC9zdGF0aWMvKiB7JEFQSV9VUFNUUkVBTX0KCXJldmVyc2VfcHJveHkgL3skQlVDS0VUX05BTUV9LyogeyRNSU5JT19VUFNUUkVBTX0KCXJldmVyc2VfcHJveHkgL3skQlVDS0VUX05BTUV9IHskTUlOSU9fVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC8qIHskV0VCX1VQU1RSRUFNfQp9Cg=="
    },
    {
      "key": "LIVE_UPSTREAM",
      "service": "proxy",
      "description": "Provide a value for LIVE_UPSTREAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ADMIN_UPSTREAM",
      "service": "proxy",
      "description": "Provide a value for ADMIN_UPSTREAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MINIO_UPSTREAM",
      "service": "proxy",
      "description": "Provide a value for MINIO_UPSTREAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SPACE_UPSTREAM",
      "service": "proxy",
      "description": "Provide a value for SPACE_UPSTREAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_SIZE_LIMIT",
      "service": "proxy",
      "description": "Provide a value for FILE_SIZE_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "5242880"
    },
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "default",
      "default": "plane"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "default",
      "default": "plane"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "minio",
      "description": "Provide a value for MINIO_ROOT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "plane-minio"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "minio",
      "description": "Provide a value for MINIO_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "web",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "PORT",
      "service": "space",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "DEBUG",
      "service": "worker",
      "description": "Provide a value for DEBUG.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "WEB_URL",
      "service": "worker",
      "description": "Provide a value for WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AMQP_URL",
      "service": "worker",
      "description": "Provide a value for AMQP_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_URL",
      "service": "worker",
      "description": "Provide a value for REDIS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "USE_MINIO",
      "service": "worker",
      "description": "Provide a value for USE_MINIO.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "AWS_REGION",
      "service": "worker",
      "description": "Provide a value for AWS_REGION.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "SECRET_KEY",
      "service": "worker",
      "description": "Provide a value for SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DATABASE_URL",
      "service": "worker",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FILE_SIZE_LIMIT",
      "service": "worker",
      "description": "Provide a value for FILE_SIZE_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "5242880"
    },
    {
      "key": "GUNICORN_WORKERS",
      "service": "worker",
      "description": "Provide a value for GUNICORN_WORKERS.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "AWS_ACCESS_KEY_ID",
      "service": "worker",
      "description": "Provide a value for AWS_ACCESS_KEY_ID.",
      "secret": true,
      "strategy": "default",
      "default": "plane-minio"
    },
    {
      "key": "API_KEY_RATE_LIMIT",
      "service": "worker",
      "description": "Provide a value for API_KEY_RATE_LIMIT.",
      "secret": true,
      "strategy": "default",
      "default": "60/minute"
    },
    {
      "key": "AWS_S3_BUCKET_NAME",
      "service": "worker",
      "description": "Provide a value for AWS_S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "uploads"
    },
    {
      "key": "MINIO_ENDPOINT_SSL",
      "service": "worker",
      "description": "Provide a value for MINIO_ENDPOINT_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "AWS_S3_ENDPOINT_URL",
      "service": "worker",
      "description": "Provide a value for AWS_S3_ENDPOINT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CORS_ALLOWED_ORIGINS",
      "service": "worker",
      "description": "Provide a value for CORS_ALLOWED_ORIGINS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AWS_SECRET_ACCESS_KEY",
      "service": "worker",
      "description": "Provide a value for AWS_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LIVE_SERVER_SECRET_KEY",
      "service": "worker",
      "description": "Provide a value for LIVE_SERVER_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "live",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "REDIS_URL",
      "service": "live",
      "description": "Provide a value for REDIS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "API_BASE_URL",
      "service": "live",
      "description": "Provide a value for API_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LIVE_SERVER_SECRET_KEY",
      "service": "live",
      "description": "Provide a value for LIVE_SERVER_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "plane-self-hosted-jiralinear-alternative"
      }
    },
    "cli": "railway deploy --template plane-self-hosted-jiralinear-alternative",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "e6434eea-ed48-4166-b5eb-0d2200dfe19e",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "1057cd02-e19f-4ace-ad40-4506ad8d4526": {
                  "icon": null,
                  "name": "api",
                  "deploy": {
                    "startCommand": "./bin/docker-entrypoint-api.sh",
                    "healthcheckPath": null,
                    "preDeployCommand": [
                      "sh -c 'i=0; until ./bin/docker-entrypoint-migrator.sh; do i=$((i+1)); [ $i -ge 25 ] && exit 1; echo \"migrate retry $i\"; sleep 8; done'"
                    ],
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-backend:v1.4.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8000"
                    },
                    "DEBUG": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AMQP_URL": {
                      "isOptional": false,
                      "defaultValue": "amqp://plane:${{rabbitmq.RABBITMQ_DEFAULT_PASS}}@${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}:5672/plane"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://${{valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/"
                    },
                    "USE_MINIO": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "AWS_REGION": {
                      "isOptional": false,
                      "defaultValue": "us-east-1"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{SECRET_KEY}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://plane:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/plane"
                    },
                    "FILE_SIZE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "5242880"
                    },
                    "GUNICORN_WORKERS": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "AWS_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "defaultValue": "plane-minio"
                    },
                    "API_KEY_RATE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "60/minute"
                    },
                    "AWS_S3_BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "uploads"
                    },
                    "MINIO_ENDPOINT_SSL": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "AWS_S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "CORS_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "defaultValue": "https://${{proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AWS_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LIVE_SERVER_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{LIVE_SERVER_SECRET_KEY}}"
                    }
                  }
                },
                "158fca30-5628-48ef-8bcd-f2279fc0076d": {
                  "icon": null,
                  "name": "admin",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-admin:v1.4.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "3000"
                    }
                  }
                },
                "1c67dc2b-db5a-4592-a6d1-cb88f47b4a43": {
                  "icon": null,
                  "name": "beat",
                  "deploy": {
                    "startCommand": "./bin/docker-entrypoint-beat.sh",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-backend:v1.4.1"
                  },
                  "variables": {
                    "DEBUG": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AMQP_URL": {
                      "isOptional": false,
                      "defaultValue": "amqp://plane:${{rabbitmq.RABBITMQ_DEFAULT_PASS}}@${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}:5672/plane"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://${{valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/"
                    },
                    "USE_MINIO": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "AWS_REGION": {
                      "isOptional": false,
                      "defaultValue": "us-east-1"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{api.SECRET_KEY}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://plane:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/plane"
                    },
                    "FILE_SIZE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "5242880"
                    },
                    "GUNICORN_WORKERS": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "AWS_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "defaultValue": "plane-minio"
                    },
                    "API_KEY_RATE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "60/minute"
                    },
                    "AWS_S3_BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "uploads"
                    },
                    "MINIO_ENDPOINT_SSL": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "AWS_S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "CORS_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "defaultValue": "https://${{proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AWS_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LIVE_SERVER_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{api.LIVE_SERVER_SECRET_KEY}}"
                    }
                  }
                },
                "25b2c2cf-5532-4844-aa13-76b258e17c6e": {
                  "icon": null,
                  "name": "rabbitmq",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "rabbitmq:3.13.6-management-alpine"
                  },
                  "variables": {
                    "RABBITMQ_DEFAULT_PASS": {
                      "isOptional": false,
                      "defaultValue": "{{RABBITMQ_DEFAULT_PASS}}"
                    },
                    "RABBITMQ_DEFAULT_USER": {
                      "isOptional": false,
                      "defaultValue": "plane"
                    },
                    "RABBITMQ_DEFAULT_VHOST": {
                      "isOptional": false,
                      "defaultValue": "plane"
                    }
                  },
                  "volumeMounts": {
                    "25b2c2cf-5532-4844-aa13-76b258e17c6e": {
                      "mountPath": "/var/lib/rabbitmq"
                    }
                  }
                },
                "2a45319e-66ae-4852-aaf9-37cffe5f0d35": {
                  "icon": null,
                  "name": "proxy",
                  "deploy": {
                    "startCommand": "sh -c 'echo \"$CADDYFILE_B64\" | base64 -d > /etc/caddy/Caddyfile && exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-proxy:v1.4.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8080"
                    },
                    "BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "uploads"
                    },
                    "API_UPSTREAM": {
                      "isOptional": false,
                      "defaultValue": "${{api.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    },
                    "WEB_UPSTREAM": {
                      "isOptional": false,
                      "defaultValue": "${{web.RAILWAY_PRIVATE_DOMAIN}}:3000"
                    },
                    "CADDYFILE_B64": {
                      "isOptional": false,
                      "defaultValue": "OnskUE9SVH0gewoJcmVxdWVzdF9ib2R5IHsKCQltYXhfc2l6ZSB7JEZJTEVfU0laRV9MSU1JVH0KCX0KCXJlZGlyIC9zcGFjZXMgL3NwYWNlcy8gcGVybWFuZW50CglyZXZlcnNlX3Byb3h5IC9zcGFjZXMvKiB7JFNQQUNFX1VQU1RSRUFNfQoJcmVkaXIgL2dvZC1tb2RlIC9nb2QtbW9kZS8gcGVybWFuZW50CglyZXZlcnNlX3Byb3h5IC9nb2QtbW9kZS8qIHskQURNSU5fVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC9saXZlLyogeyRMSVZFX1VQU1RSRUFNfQoJcmV2ZXJzZV9wcm94eSAvYXBpLyogeyRBUElfVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC9hdXRoLyogeyRBUElfVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC9zdGF0aWMvKiB7JEFQSV9VUFNUUkVBTX0KCXJldmVyc2VfcHJveHkgL3skQlVDS0VUX05BTUV9LyogeyRNSU5JT19VUFNUUkVBTX0KCXJldmVyc2VfcHJveHkgL3skQlVDS0VUX05BTUV9IHskTUlOSU9fVVBTVFJFQU19CglyZXZlcnNlX3Byb3h5IC8qIHskV0VCX1VQU1RSRUFNfQp9Cg=="
                    },
                    "LIVE_UPSTREAM": {
                      "isOptional": false,
                      "defaultValue": "${{live.RAILWAY_PRIVATE_DOMAIN}}:3000"
                    },
                    "ADMIN_UPSTREAM": {
                      "isOptional": false,
                      "defaultValue": "${{admin.RAILWAY_PRIVATE_DOMAIN}}:3000"
                    },
                    "MINIO_UPSTREAM": {
                      "isOptional": false,
                      "defaultValue": "${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "SPACE_UPSTREAM": {
                      "isOptional": false,
                      "defaultValue": "${{space.RAILWAY_PRIVATE_DOMAIN}}:3000"
                    },
                    "FILE_SIZE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "5242880"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "4055ecea-5c27-43b0-99c3-246f582422a6": {
                  "icon": null,
                  "name": "postgres",
                  "deploy": {
                    "startCommand": "docker-entrypoint.sh postgres -c 'max_connections=1000'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "postgres:15.7-alpine"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "defaultValue": "plane"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "defaultValue": "plane"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "4055ecea-5c27-43b0-99c3-246f582422a6": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "5d840d75-240a-4e61-8c56-7435e12f0cda": {
                  "icon": null,
                  "name": "minio",
                  "deploy": {
                    "startCommand": "sh -c 'minio server /data --console-address \":9090\"'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "minio/minio:RELEASE.2025-04-08T15-41-24Z"
                  },
                  "variables": {
                    "MINIO_ROOT_USER": {
                      "isOptional": false,
                      "defaultValue": "plane-minio"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "5d840d75-240a-4e61-8c56-7435e12f0cda": {
                      "mountPath": "/data"
                    }
                  }
                },
                "663325a3-be23-4b80-94a4-058ebefccc59": {
                  "icon": null,
                  "name": "valkey",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "valkey/valkey:7.2.11-alpine"
                  },
                  "variables": {},
                  "volumeMounts": {
                    "663325a3-be23-4b80-94a4-058ebefccc59": {
                      "mountPath": "/data"
                    }
                  }
                },
                "670ad378-8e48-4a34-8b46-eebc0919c38e": {
                  "icon": null,
                  "name": "web",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-frontend:v1.4.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "3000"
                    }
                  }
                },
                "81737d43-6819-4cc7-b9e5-9ca08e4ed29e": {
                  "icon": null,
                  "name": "space",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-space:v1.4.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "3000"
                    }
                  }
                },
                "914594b0-d58f-4c44-83c1-51aa4c403b54": {
                  "icon": null,
                  "name": "worker",
                  "deploy": {
                    "startCommand": "./bin/docker-entrypoint-worker.sh",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-backend:v1.4.1"
                  },
                  "variables": {
                    "DEBUG": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AMQP_URL": {
                      "isOptional": false,
                      "defaultValue": "amqp://plane:${{rabbitmq.RABBITMQ_DEFAULT_PASS}}@${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}:5672/plane"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://${{valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/"
                    },
                    "USE_MINIO": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "AWS_REGION": {
                      "isOptional": false,
                      "defaultValue": "us-east-1"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{api.SECRET_KEY}}"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://plane:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/plane"
                    },
                    "FILE_SIZE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "5242880"
                    },
                    "GUNICORN_WORKERS": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "AWS_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "defaultValue": "plane-minio"
                    },
                    "API_KEY_RATE_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "60/minute"
                    },
                    "AWS_S3_BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "uploads"
                    },
                    "MINIO_ENDPOINT_SSL": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "AWS_S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{minio.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "CORS_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "defaultValue": "https://${{proxy.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AWS_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{minio.MINIO_ROOT_PASSWORD}}"
                    },
                    "LIVE_SERVER_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{api.LIVE_SERVER_SECRET_KEY}}"
                    }
                  }
                },
                "d562964f-2af9-4d4c-8448-803f7c2ca79a": {
                  "icon": null,
                  "name": "live",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "makeplane/plane-live:v1.4.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "3000"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://${{valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/"
                    },
                    "API_BASE_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8000"
                    },
                    "LIVE_SERVER_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{api.LIVE_SERVER_SECRET_KEY}}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 12,
    "needs_volume": true
  },
  "generated_at": "2026-09-20T10:14:37.339Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-19T16:37:33.971Z",
  "success_rate_30d": 0.3333,
  "validation": {
    "last_run_id": "run_3ee4b4e0813d40dda058",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "QUEUED,QUEUED,DEPLOYING,DEPLOYING,QUEUED,SUCCESS,DEPLOYING,QUEUED,DEPLOYING,SUCCESS,QUEUED,FAILED"
      }
    ],
    "typical_ready_seconds": 174,
    "typical_build_seconds": 0,
    "typical_start_seconds": 5,
    "slowest_service": "worker"
  }
}
