{
  "manifest_version": "1.0.0",
  "template": {
    "id": "6e581f58-00e4-4dc2-b08c-bff0bfee931b",
    "slug": "dify-llm-app-platform-minio",
    "name": "Dify LLM App Platform + MinIO",
    "description": "Dify LLM app platform with pgvector, plugin daemon, sandbox and MinIO",
    "url": "https://railway.com/deploy/dify-llm-app-platform-minio",
    "upstream": {
      "image": "langgenius/dify-web:1.17.1"
    }
  },
  "services": [
    {
      "name": "dify-web",
      "source": {
        "image": "langgenius/dify-web:1.17.1"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "dify-api",
      "source": {
        "image": "langgenius/dify-api:1.17.1"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "dify-sandbox",
      "source": {
        "image": "langgenius/dify-sandbox:0.2.15"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Redis",
      "source": {
        "image": "redis:7-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "pgvector/pgvector:pg16"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "tcp_ports": [
        5432
      ],
      "http": false
    },
    {
      "name": "dify-worker",
      "source": {
        "image": "langgenius/dify-api:1.17.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "MinIO",
      "source": {
        "image": "quay.io/minio/minio:RELEASE.2025-03-12T18-04-18Z"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "dify-plugin-daemon",
      "source": {
        "image": "langgenius/dify-plugin-daemon:0.6.10-local"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/storage",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "dify-web",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "HOSTNAME",
      "service": "dify-web",
      "description": "Next.js standalone binds $HOSTNAME, and the container image sets it to the container id.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "FILES_URL",
      "service": "dify-web",
      "description": "Provide a value for FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_API_URL",
      "service": "dify-web",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "dify-web",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "MARKETPLACE_URL",
      "service": "dify-web",
      "description": "Provide a value for MARKETPLACE_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "dify-web",
      "description": "Provide a value for MARKETPLACE_API_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "NEXT_PUBLIC_SOCKET_URL",
      "service": "dify-web",
      "description": "Provide a value for NEXT_PUBLIC_SOCKET_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVER_CONSOLE_API_URL",
      "service": "dify-web",
      "description": "Provide a value for SERVER_CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NEXT_TELEMETRY_DISABLED",
      "service": "dify-web",
      "description": "Provide a value for NEXT_TELEMETRY_DISABLED.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "NEXT_PUBLIC_ENABLE_AGENT_V2",
      "service": "dify-web",
      "description": "Agent v2 needs the agent backend and shell sandbox services, which this template does not deploy.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "MODE",
      "service": "dify-api",
      "description": "Provide a value for MODE.",
      "secret": false,
      "strategy": "default",
      "default": "api"
    },
    {
      "key": "PORT",
      "service": "dify-api",
      "description": "Port Railway's healthcheck and edge proxy probe. Must equal DIFY_PORT, or the healthcheck fails with 'service unavailable'.",
      "secret": false,
      "strategy": "default",
      "default": "5001"
    },
    {
      "key": "DB_HOST",
      "service": "dify-api",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_PORT",
      "service": "dify-api",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "REDIS_DB",
      "service": "dify-api",
      "description": "Provide a value for REDIS_DB.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DIFY_PORT",
      "service": "dify-api",
      "description": "Provide a value for DIFY_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5001"
    },
    {
      "key": "FILES_URL",
      "service": "dify-api",
      "description": "Provide a value for FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LOG_LEVEL",
      "service": "dify-api",
      "description": "Provide a value for LOG_LEVEL.",
      "secret": false,
      "strategy": "default",
      "default": "INFO"
    },
    {
      "key": "S3_REGION",
      "service": "dify-api",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "dify-api",
      "description": "Provide a value for DEPLOY_ENV.",
      "secret": false,
      "strategy": "default",
      "default": "PRODUCTION"
    },
    {
      "key": "REDIS_HOST",
      "service": "dify-api",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "dify-api",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "SECRET_KEY",
      "service": "dify-api",
      "description": "Used to encrypt session cookies and sensitive data. Must match the dify-worker SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "APP_API_URL",
      "service": "dify-api",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_WEB_URL",
      "service": "dify-api",
      "description": "Provide a value for APP_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DB_DATABASE",
      "service": "dify-api",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "DB_PASSWORD",
      "service": "dify-api",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "dify-api",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "dify-api",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "dify-api",
      "description": "Uploaded files live in the MinIO service so the API and the worker read the same objects.",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "VECTOR_STORE",
      "service": "dify-api",
      "description": "Provide a value for VECTOR_STORE.",
      "secret": false,
      "strategy": "default",
      "default": "pgvector"
    },
    {
      "key": "PGVECTOR_HOST",
      "service": "dify-api",
      "description": "Provide a value for PGVECTOR_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGVECTOR_PORT",
      "service": "dify-api",
      "description": "Provide a value for PGVECTOR_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGVECTOR_USER",
      "service": "dify-api",
      "description": "Provide a value for PGVECTOR_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "REDIS_USE_SSL",
      "service": "dify-api",
      "description": "Provide a value for REDIS_USE_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "dify-api",
      "description": "Provide a value for S3_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "dify-api",
      "description": "Provide a value for S3_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BROKER_USE_SSL",
      "service": "dify-api",
      "description": "Provide a value for BROKER_USE_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "dify-api",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "dify-api",
      "description": "Provide a value for S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "dify-api",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "dify-api",
      "description": "Provide a value for CONSOLE_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "dify-api",
      "description": "Provide a value for SERVICE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "dify-api",
      "description": "MinIO serves buckets as a path, not a subdomain.",
      "secret": false,
      "strategy": "default",
      "default": "path"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "dify-api",
      "description": "Provide a value for CELERY_BROKER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DIFY_BIND_ADDRESS",
      "service": "dify-api",
      "description": "Bracketed IPv6 any-address. gunicorn rejects a bare '::' here.",
      "secret": false,
      "strategy": "default",
      "default": "[::]"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "dify-api",
      "description": "Provide a value for MIGRATION_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PGVECTOR_DATABASE",
      "service": "dify-api",
      "description": "Provide a value for PGVECTOR_DATABASE.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "PGVECTOR_PASSWORD",
      "service": "dify-api",
      "description": "Provide a value for PGVECTOR_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "dify-api",
      "description": "Shared key between the API and the plugin daemon.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "dify-api",
      "description": "Provide a value for PLUGIN_DAEMON_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "dify-api",
      "description": "Provide a value for MARKETPLACE_API_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "dify-api",
      "description": "Provide a value for ENDPOINT_URL_TEMPLATE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "dify-api",
      "description": "Provide a value for CODE_EXECUTION_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "dify-api",
      "description": "Provide a value for CODE_EXECUTION_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_KEY",
      "service": "dify-api",
      "description": "Inner API key used by the plugin daemon to call back into the API.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_URL",
      "service": "dify-api",
      "description": "Provide a value for PLUGIN_DIFY_INNER_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CONSOLE_CORS_ALLOW_ORIGINS",
      "service": "dify-api",
      "description": "Provide a value for CONSOLE_CORS_ALLOW_ORIGINS.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "WEB_API_CORS_ALLOW_ORIGINS",
      "service": "dify-api",
      "description": "Provide a value for WEB_API_CORS_ALLOW_ORIGINS.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "API_KEY",
      "service": "dify-sandbox",
      "description": "Shared secret the API and worker present to the sandbox.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GIN_MODE",
      "service": "dify-sandbox",
      "description": "Provide a value for GIN_MODE.",
      "secret": false,
      "strategy": "default",
      "default": "release"
    },
    {
      "key": "SANDBOX_PORT",
      "service": "dify-sandbox",
      "description": "Provide a value for SANDBOX_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8194"
    },
    {
      "key": "ENABLE_NETWORK",
      "service": "dify-sandbox",
      "description": "Let code nodes reach the internet.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "WORKER_TIMEOUT",
      "service": "dify-sandbox",
      "description": "Seconds a single code block may run.",
      "secret": false,
      "strategy": "default",
      "default": "15"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "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": "dify"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MODE",
      "service": "dify-worker",
      "description": "Provide a value for MODE.",
      "secret": false,
      "strategy": "default",
      "default": "worker"
    },
    {
      "key": "DB_HOST",
      "service": "dify-worker",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_PORT",
      "service": "dify-worker",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "REDIS_DB",
      "service": "dify-worker",
      "description": "Provide a value for REDIS_DB.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "FILES_URL",
      "service": "dify-worker",
      "description": "Provide a value for FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LOG_LEVEL",
      "service": "dify-worker",
      "description": "Provide a value for LOG_LEVEL.",
      "secret": false,
      "strategy": "default",
      "default": "INFO"
    },
    {
      "key": "S3_REGION",
      "service": "dify-worker",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "dify-worker",
      "description": "Provide a value for DEPLOY_ENV.",
      "secret": false,
      "strategy": "default",
      "default": "PRODUCTION"
    },
    {
      "key": "REDIS_HOST",
      "service": "dify-worker",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "dify-worker",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "SECRET_KEY",
      "service": "dify-worker",
      "description": "Must match dify-api SECRET_KEY so encrypted data stays compatible.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_API_URL",
      "service": "dify-worker",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_WEB_URL",
      "service": "dify-worker",
      "description": "Provide a value for APP_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DB_DATABASE",
      "service": "dify-worker",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "DB_PASSWORD",
      "service": "dify-worker",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "dify-worker",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "dify-worker",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "dify-worker",
      "description": "Uploaded files live in the MinIO service so the API and the worker read the same objects.",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "VECTOR_STORE",
      "service": "dify-worker",
      "description": "Provide a value for VECTOR_STORE.",
      "secret": false,
      "strategy": "default",
      "default": "pgvector"
    },
    {
      "key": "PGVECTOR_HOST",
      "service": "dify-worker",
      "description": "Provide a value for PGVECTOR_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGVECTOR_PORT",
      "service": "dify-worker",
      "description": "Provide a value for PGVECTOR_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGVECTOR_USER",
      "service": "dify-worker",
      "description": "Provide a value for PGVECTOR_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "REDIS_USE_SSL",
      "service": "dify-worker",
      "description": "Provide a value for REDIS_USE_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "dify-worker",
      "description": "Provide a value for S3_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "dify-worker",
      "description": "Provide a value for S3_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BROKER_USE_SSL",
      "service": "dify-worker",
      "description": "Provide a value for BROKER_USE_SSL.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "dify-worker",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "dify-worker",
      "description": "Provide a value for S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "dify-worker",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "dify-worker",
      "description": "Provide a value for CONSOLE_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "dify-worker",
      "description": "Provide a value for SERVICE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "dify-worker",
      "description": "MinIO serves buckets as a path, not a subdomain.",
      "secret": false,
      "strategy": "default",
      "default": "path"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "dify-worker",
      "description": "Provide a value for CELERY_BROKER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "dify-worker",
      "description": "Provide a value for MIGRATION_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PGVECTOR_DATABASE",
      "service": "dify-worker",
      "description": "Provide a value for PGVECTOR_DATABASE.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "PGVECTOR_PASSWORD",
      "service": "dify-worker",
      "description": "Provide a value for PGVECTOR_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "dify-worker",
      "description": "Provide a value for PLUGIN_DAEMON_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "dify-worker",
      "description": "Provide a value for PLUGIN_DAEMON_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "dify-worker",
      "description": "Provide a value for MARKETPLACE_API_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "dify-worker",
      "description": "Provide a value for ENDPOINT_URL_TEMPLATE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "dify-worker",
      "description": "Provide a value for CODE_EXECUTION_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "dify-worker",
      "description": "Provide a value for CODE_EXECUTION_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_KEY",
      "service": "dify-worker",
      "description": "Provide a value for PLUGIN_DIFY_INNER_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_URL",
      "service": "dify-worker",
      "description": "Provide a value for PLUGIN_DIFY_INNER_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CONSOLE_CORS_ALLOW_ORIGINS",
      "service": "dify-worker",
      "description": "Provide a value for CONSOLE_CORS_ALLOW_ORIGINS.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "WEB_API_CORS_ALLOW_ORIGINS",
      "service": "dify-worker",
      "description": "Provide a value for WEB_API_CORS_ALLOW_ORIGINS.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "MinIO",
      "description": "Provide a value for MINIO_ROOT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "minio"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "MinIO",
      "description": "Provide a value for MINIO_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DB_HOST",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_PORT",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "REDIS_HOST",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "SERVER_KEY",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for SERVER_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_DATABASE",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "DB_PASSWORD",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_SSL_MODE",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DB_SSL_MODE.",
      "secret": false,
      "strategy": "default",
      "default": "disable"
    },
    {
      "key": "DB_USERNAME",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "SERVER_PORT",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for SERVER_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5002"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_INNER_API_KEY",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DIFY_INNER_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_INNER_API_URL",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for DIFY_INNER_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for MARKETPLACE_API_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "PLUGIN_STORAGE_TYPE",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for PLUGIN_STORAGE_TYPE.",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "PLUGIN_WORKING_PATH",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for PLUGIN_WORKING_PATH.",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage/cwd"
    },
    {
      "key": "FORCE_VERIFYING_SIGNATURE",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for FORCE_VERIFYING_SIGNATURE.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_STORAGE_LOCAL_ROOT",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for PLUGIN_STORAGE_LOCAL_ROOT.",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_HOST",
      "service": "dify-plugin-daemon",
      "description": "Required — the plugin daemon refuses to start if this is empty.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_PORT",
      "service": "dify-plugin-daemon",
      "description": "Provide a value for PLUGIN_REMOTE_INSTALLING_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5003"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "dify-llm-app-platform-minio"
      }
    },
    "cli": "railway deploy --template dify-llm-app-platform-minio",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "6e581f58-00e4-4dc2-b08c-bff0bfee931b",
            "serializedConfig": {
              "services": {
                "078976d1-2e17-44ea-89ce-f2c7bdf1f642": {
                  "icon": "https://cdn.simpleicons.org/dify",
                  "name": "dify-web",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 5
                  },
                  "source": {
                    "image": "langgenius/dify-web:1.17.1"
                  },
                  "variables": {
                    "PORT": {
                      "defaultValue": "3000"
                    },
                    "HOSTNAME": {
                      "description": "Next.js standalone binds $HOSTNAME, and the container image sets it to the container id.",
                      "defaultValue": "0.0.0.0"
                    },
                    "FILES_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "MARKETPLACE_URL": {
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "MARKETPLACE_API_URL": {
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "NEXT_PUBLIC_SOCKET_URL": {
                      "defaultValue": "wss://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVER_CONSOLE_API_URL": {
                      "defaultValue": "http://${{dify-api.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "NEXT_TELEMETRY_DISABLED": {
                      "defaultValue": "1"
                    },
                    "NEXT_PUBLIC_ENABLE_AGENT_V2": {
                      "description": "Agent v2 needs the agent backend and shell sandbox services, which this template does not deploy.",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {
                      "dify-web-dom": {
                        "port": 3000
                      }
                    }
                  }
                },
                "0bb44f36-254a-40a7-90f2-564ee82e7660": {
                  "icon": "https://cdn.simpleicons.org/dify",
                  "name": "dify-api",
                  "deploy": {
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "healthcheckTimeout": 300,
                    "restartPolicyMaxRetries": 5
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.17.1"
                  },
                  "variables": {
                    "MODE": {
                      "defaultValue": "api"
                    },
                    "PORT": {
                      "description": "Port Railway's healthcheck and edge proxy probe. Must equal DIFY_PORT, or the healthcheck fails with 'service unavailable'.",
                      "defaultValue": "5001"
                    },
                    "DB_HOST": {
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_PORT": {
                      "defaultValue": "5432"
                    },
                    "REDIS_DB": {
                      "defaultValue": "0"
                    },
                    "DIFY_PORT": {
                      "defaultValue": "5001"
                    },
                    "FILES_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LOG_LEVEL": {
                      "defaultValue": "INFO"
                    },
                    "S3_REGION": {
                      "defaultValue": "us-east-1"
                    },
                    "DEPLOY_ENV": {
                      "defaultValue": "PRODUCTION"
                    },
                    "REDIS_HOST": {
                      "defaultValue": "${{Redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "defaultValue": "6379"
                    },
                    "SECRET_KEY": {
                      "description": "Used to encrypt session cookies and sensitive data. Must match the dify-worker SECRET_KEY.",
                      "defaultValue": "{{SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_WEB_URL": {
                      "defaultValue": "https://${{dify-web.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DB_DATABASE": {
                      "defaultValue": "dify"
                    },
                    "DB_PASSWORD": {
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "defaultValue": "postgres"
                    },
                    "S3_ENDPOINT": {
                      "defaultValue": "http://${{MinIO.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "STORAGE_TYPE": {
                      "description": "Uploaded files live in the MinIO service so the API and the worker read the same objects.",
                      "defaultValue": "s3"
                    },
                    "VECTOR_STORE": {
                      "defaultValue": "pgvector"
                    },
                    "PGVECTOR_HOST": {
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGVECTOR_PORT": {
                      "defaultValue": "5432"
                    },
                    "PGVECTOR_USER": {
                      "defaultValue": "postgres"
                    },
                    "REDIS_USE_SSL": {
                      "defaultValue": "false"
                    },
                    "S3_ACCESS_KEY": {
                      "defaultValue": "${{MinIO.MINIO_ROOT_USER}}"
                    },
                    "S3_SECRET_KEY": {
                      "defaultValue": "${{MinIO.MINIO_ROOT_PASSWORD}}"
                    },
                    "BROKER_USE_SSL": {
                      "defaultValue": "false"
                    },
                    "REDIS_PASSWORD": {
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "defaultValue": "dify"
                    },
                    "CONSOLE_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "defaultValue": "https://${{dify-web.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVICE_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "description": "MinIO serves buckets as a path, not a subdomain.",
                      "defaultValue": "path"
                    },
                    "CELERY_BROKER_URL": {
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "DIFY_BIND_ADDRESS": {
                      "description": "Bracketed IPv6 any-address. gunicorn rejects a bare '::' here.",
                      "defaultValue": "[::]"
                    },
                    "MIGRATION_ENABLED": {
                      "defaultValue": "true"
                    },
                    "PGVECTOR_DATABASE": {
                      "defaultValue": "dify"
                    },
                    "PGVECTOR_PASSWORD": {
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "description": "Shared key between the API and the plugin daemon.",
                      "defaultValue": "{{PLUGIN_DAEMON_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "defaultValue": "http://${{dify-plugin-daemon.RAILWAY_PRIVATE_DOMAIN}}:5002"
                    },
                    "MARKETPLACE_API_URL": {
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}/e/{hook_id}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "defaultValue": "${{dify-sandbox.API_KEY}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "defaultValue": "http://${{dify-sandbox.RAILWAY_PRIVATE_DOMAIN}}:8194"
                    },
                    "PLUGIN_DIFY_INNER_API_KEY": {
                      "description": "Inner API key used by the plugin daemon to call back into the API.",
                      "defaultValue": "{{PLUGIN_DIFY_INNER_API_KEY}}"
                    },
                    "PLUGIN_DIFY_INNER_API_URL": {
                      "defaultValue": "http://${{dify-api.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "CONSOLE_CORS_ALLOW_ORIGINS": {
                      "defaultValue": "*"
                    },
                    "WEB_API_CORS_ALLOW_ORIGINS": {
                      "defaultValue": "*"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {
                      "dify-api-dom": {
                        "port": 5001
                      }
                    }
                  },
                  "volumeMounts": {}
                },
                "572c0473-fd6e-4a32-912f-8893b56a17e2": {
                  "icon": "https://cdn.simpleicons.org/dify",
                  "name": "dify-sandbox",
                  "build": {},
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE"
                  },
                  "source": {
                    "image": "langgenius/dify-sandbox:0.2.15"
                  },
                  "variables": {
                    "API_KEY": {
                      "description": "Shared secret the API and worker present to the sandbox.",
                      "defaultValue": "{{API_KEY}}"
                    },
                    "GIN_MODE": {
                      "defaultValue": "release"
                    },
                    "SANDBOX_PORT": {
                      "defaultValue": "8194"
                    },
                    "ENABLE_NETWORK": {
                      "isOptional": true,
                      "description": "Let code nodes reach the internet.",
                      "defaultValue": "true"
                    },
                    "WORKER_TIMEOUT": {
                      "description": "Seconds a single code block may run.",
                      "defaultValue": "15"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {}
                  },
                  "volumeMounts": {}
                },
                "5dbf3736-f2bb-4147-9def-0ea2658de266": {
                  "icon": "https://devicons.railway.app/i/redis.svg",
                  "name": "Redis",
                  "deploy": {
                    "startCommand": "sh -c 'docker-entrypoint.sh redis-server --requirepass \"$REDIS_PASSWORD\" --save 60 1 --dir /data --bind :: 0.0.0.0'",
                    "requiredMountPath": "/data",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 5
                  },
                  "source": {
                    "image": "redis:7-alpine"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "88c9b1bd-dd1b-41c9-a0af-0f4b5099cd16": {
                      "mountPath": "/data"
                    }
                  }
                },
                "716e03c2-af6e-4f9b-a02e-bc28b86cca25": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "requiredMountPath": "/var/lib/postgresql/data",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 5
                  },
                  "source": {
                    "image": "pgvector/pgvector:pg16"
                  },
                  "variables": {
                    "PGDATA": {
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "defaultValue": "dify"
                    },
                    "POSTGRES_USER": {
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "tcpProxies": {
                      "5432": {}
                    },
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "b02ae5c6-cedc-4458-8134-ee2627676152": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "856938d5-ffe0-4725-888b-106085386d21": {
                  "icon": "https://cdn.simpleicons.org/dify",
                  "name": "dify-worker",
                  "deploy": {
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 5
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.17.1"
                  },
                  "variables": {
                    "MODE": {
                      "defaultValue": "worker"
                    },
                    "DB_HOST": {
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_PORT": {
                      "defaultValue": "5432"
                    },
                    "REDIS_DB": {
                      "defaultValue": "0"
                    },
                    "FILES_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LOG_LEVEL": {
                      "defaultValue": "INFO"
                    },
                    "S3_REGION": {
                      "defaultValue": "us-east-1"
                    },
                    "DEPLOY_ENV": {
                      "defaultValue": "PRODUCTION"
                    },
                    "REDIS_HOST": {
                      "defaultValue": "${{Redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "defaultValue": "6379"
                    },
                    "SECRET_KEY": {
                      "description": "Must match dify-api SECRET_KEY so encrypted data stays compatible.",
                      "defaultValue": "${{dify-api.SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_WEB_URL": {
                      "defaultValue": "https://${{dify-web.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DB_DATABASE": {
                      "defaultValue": "dify"
                    },
                    "DB_PASSWORD": {
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "defaultValue": "postgres"
                    },
                    "S3_ENDPOINT": {
                      "defaultValue": "http://${{MinIO.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "STORAGE_TYPE": {
                      "description": "Uploaded files live in the MinIO service so the API and the worker read the same objects.",
                      "defaultValue": "s3"
                    },
                    "VECTOR_STORE": {
                      "defaultValue": "pgvector"
                    },
                    "PGVECTOR_HOST": {
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGVECTOR_PORT": {
                      "defaultValue": "5432"
                    },
                    "PGVECTOR_USER": {
                      "defaultValue": "postgres"
                    },
                    "REDIS_USE_SSL": {
                      "defaultValue": "false"
                    },
                    "S3_ACCESS_KEY": {
                      "defaultValue": "${{MinIO.MINIO_ROOT_USER}}"
                    },
                    "S3_SECRET_KEY": {
                      "defaultValue": "${{MinIO.MINIO_ROOT_PASSWORD}}"
                    },
                    "BROKER_USE_SSL": {
                      "defaultValue": "false"
                    },
                    "REDIS_PASSWORD": {
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "defaultValue": "dify"
                    },
                    "CONSOLE_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "defaultValue": "https://${{dify-web.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVICE_API_URL": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "description": "MinIO serves buckets as a path, not a subdomain.",
                      "defaultValue": "path"
                    },
                    "CELERY_BROKER_URL": {
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379/1"
                    },
                    "MIGRATION_ENABLED": {
                      "defaultValue": "false"
                    },
                    "PGVECTOR_DATABASE": {
                      "defaultValue": "dify"
                    },
                    "PGVECTOR_PASSWORD": {
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "defaultValue": "${{dify-api.PLUGIN_DAEMON_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "defaultValue": "http://${{dify-plugin-daemon.RAILWAY_PRIVATE_DOMAIN}}:5002"
                    },
                    "MARKETPLACE_API_URL": {
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "defaultValue": "https://${{dify-api.RAILWAY_PUBLIC_DOMAIN}}/e/{hook_id}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "defaultValue": "${{dify-sandbox.API_KEY}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "defaultValue": "http://${{dify-sandbox.RAILWAY_PRIVATE_DOMAIN}}:8194"
                    },
                    "PLUGIN_DIFY_INNER_API_KEY": {
                      "defaultValue": "${{dify-api.PLUGIN_DIFY_INNER_API_KEY}}"
                    },
                    "PLUGIN_DIFY_INNER_API_URL": {
                      "defaultValue": "http://${{dify-api.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "CONSOLE_CORS_ALLOW_ORIGINS": {
                      "defaultValue": "*"
                    },
                    "WEB_API_CORS_ALLOW_ORIGINS": {
                      "defaultValue": "*"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {}
                  },
                  "volumeMounts": {}
                },
                "c8169c5d-ee38-4f59-a601-e64956760810": {
                  "icon": "https://cdn.simpleicons.org/dify",
                  "name": "MinIO",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c \"mkdir -p /data/dify && exec minio server /data --address :9000\"",
                    "requiredMountPath": "/data",
                    "restartPolicyType": "ON_FAILURE"
                  },
                  "source": {
                    "image": "quay.io/minio/minio:RELEASE.2025-03-12T18-04-18Z"
                  },
                  "variables": {
                    "MINIO_ROOT_USER": {
                      "defaultValue": "minio"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "4cb7e3c6-a7d6-4f9d-abf9-8a181a9f13c9": {
                      "mountPath": "/data"
                    }
                  }
                },
                "d0c7d43e-6dbf-4b31-bd6b-8a41a9227200": {
                  "icon": "https://cdn.simpleicons.org/dify",
                  "name": "dify-plugin-daemon",
                  "deploy": {
                    "requiredMountPath": "/app/storage",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 5
                  },
                  "source": {
                    "image": "langgenius/dify-plugin-daemon:0.6.10-local"
                  },
                  "variables": {
                    "DB_HOST": {
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_PORT": {
                      "defaultValue": "5432"
                    },
                    "REDIS_HOST": {
                      "defaultValue": "${{Redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "defaultValue": "6379"
                    },
                    "SERVER_KEY": {
                      "defaultValue": "${{dify-api.PLUGIN_DAEMON_KEY}}"
                    },
                    "DB_DATABASE": {
                      "defaultValue": "dify"
                    },
                    "DB_PASSWORD": {
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_SSL_MODE": {
                      "defaultValue": "disable"
                    },
                    "DB_USERNAME": {
                      "defaultValue": "postgres"
                    },
                    "SERVER_PORT": {
                      "defaultValue": "5002"
                    },
                    "REDIS_PASSWORD": {
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "DIFY_INNER_API_KEY": {
                      "defaultValue": "${{dify-api.PLUGIN_DIFY_INNER_API_KEY}}"
                    },
                    "DIFY_INNER_API_URL": {
                      "defaultValue": "http://${{dify-api.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "MARKETPLACE_API_URL": {
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "PLUGIN_STORAGE_TYPE": {
                      "defaultValue": "local"
                    },
                    "PLUGIN_WORKING_PATH": {
                      "defaultValue": "/app/storage/cwd"
                    },
                    "FORCE_VERIFYING_SIGNATURE": {
                      "defaultValue": "true"
                    },
                    "PLUGIN_STORAGE_LOCAL_ROOT": {
                      "defaultValue": "/app/storage"
                    },
                    "PLUGIN_REMOTE_INSTALLING_HOST": {
                      "description": "Required — the plugin daemon refuses to start if this is empty.",
                      "defaultValue": "0.0.0.0"
                    },
                    "PLUGIN_REMOTE_INSTALLING_PORT": {
                      "defaultValue": "5003"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "b6982fd2-295b-477c-87fc-a4fba3ecce11": {
                      "mountPath": "/app/storage"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "dify-api",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 8,
    "needs_volume": true
  },
  "generated_at": "2026-09-21T04:14:46.774Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-21T03:24:28.755Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_c7d6d1c43699412bba68",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "healthcheck",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 98,
    "typical_build_seconds": 0,
    "typical_start_seconds": 30,
    "slowest_service": "dify-worker"
  }
}
