{
  "manifest_version": "1.0.0",
  "template": {
    "id": "a6023001-6527-4b01-8585-e2276737e061",
    "slug": "dify-ai-workflow",
    "name": "Dify | Open-Source AI/LLM App Builder",
    "description": "Self-host Dify on Railway — open-source LLM app builder with RAG and agents",
    "url": "https://railway.com/deploy/dify-ai-workflow",
    "upstream": {
      "image": "nginx:latest"
    }
  },
  "services": [
    {
      "name": "Nginx",
      "source": {
        "image": "nginx:latest"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Sandbox",
      "source": {
        "image": "langgenius/dify-sandbox:0.2.14"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Plugin-Daemon",
      "source": {
        "image": "langgenius/dify-plugin-daemon:0.5.3-local"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Dify-Web",
      "source": {
        "image": "langgenius/dify-web:1.13.3"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Dify-API",
      "source": {
        "image": "langgenius/dify-api:1.13.3"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Dify-Worker",
      "source": {
        "image": "langgenius/dify-api:1.13.3"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Weaviate",
      "source": {
        "image": "semitechnologies/weaviate:1.27.0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "MinIO",
      "source": {
        "image": "minio/minio:latest"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Redis",
      "source": {
        "image": "redis:8.2.1"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ssl:17"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "Nginx",
      "description": "HTTP listen port",
      "secret": false,
      "strategy": "default",
      "default": "80"
    },
    {
      "key": "NGINX_PORT",
      "service": "Nginx",
      "description": "HTTP listen port",
      "secret": false,
      "strategy": "default",
      "default": "80"
    },
    {
      "key": "API_KEY",
      "service": "Sandbox",
      "description": "Sandbox API auth key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GIN_MODE",
      "service": "Sandbox",
      "description": "Go web framework mode",
      "secret": false,
      "strategy": "default",
      "default": "release"
    },
    {
      "key": "SANDBOX_PORT",
      "service": "Sandbox",
      "description": "Sandbox listen port",
      "secret": false,
      "strategy": "default",
      "default": "8194"
    },
    {
      "key": "ENABLE_NETWORK",
      "service": "Sandbox",
      "description": "Allow network from sandbox",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "WORKER_TIMEOUT",
      "service": "Sandbox",
      "description": "Code exec timeout seconds",
      "secret": false,
      "strategy": "default",
      "default": "15"
    },
    {
      "key": "DB_HOST",
      "service": "Plugin-Daemon",
      "description": "Managed Postgres internal host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Plugin-Daemon",
      "description": "Managed Postgres port",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLATFORM",
      "service": "Plugin-Daemon",
      "description": "Platform mode",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "REDIS_HOST",
      "service": "Plugin-Daemon",
      "description": "Managed Redis internal host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Plugin-Daemon",
      "description": "Managed Redis port",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_KEY",
      "service": "Plugin-Daemon",
      "description": "Daemon API auth key (API refs this)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DB_DATABASE",
      "service": "Plugin-Daemon",
      "description": "Shared DB with API",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Plugin-Daemon",
      "description": "Managed Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Plugin-Daemon",
      "description": "Managed Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_PORT",
      "service": "Plugin-Daemon",
      "description": "Daemon listen port",
      "secret": false,
      "strategy": "default",
      "default": "5002"
    },
    {
      "key": "PPROF_ENABLED",
      "service": "Plugin-Daemon",
      "description": "Disable Go profiler",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Plugin-Daemon",
      "description": "Managed Redis password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ROUTINE_POOL_SIZE",
      "service": "Plugin-Daemon",
      "description": "Goroutine pool size",
      "secret": false,
      "strategy": "default",
      "default": "10000"
    },
    {
      "key": "DB_PLUGIN_DATABASE",
      "service": "Plugin-Daemon",
      "description": "Same DB as API (no conflict)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_INNER_API_KEY",
      "service": "Plugin-Daemon",
      "description": "Inner API auth key (API refs this)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DIFY_INNER_API_URL",
      "service": "Plugin-Daemon",
      "description": "Reference API service",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "Plugin-Daemon",
      "description": "Marketplace endpoint",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "MARKETPLACE_ENABLED",
      "service": "Plugin-Daemon",
      "description": "Enable marketplace",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_STORAGE_TYPE",
      "service": "Plugin-Daemon",
      "description": "Plugin storage backend",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "PLUGIN_WORKING_PATH",
      "service": "Plugin-Daemon",
      "description": "Plugin working dir",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage/cwd"
    },
    {
      "key": "PLUGIN_INSTALLED_PATH",
      "service": "Plugin-Daemon",
      "description": "Installed plugin subdir",
      "secret": false,
      "strategy": "default",
      "default": "plugin"
    },
    {
      "key": "MAX_PLUGIN_PACKAGE_SIZE",
      "service": "Plugin-Daemon",
      "description": "Max plugin size bytes",
      "secret": false,
      "strategy": "default",
      "default": "52428800"
    },
    {
      "key": "PLUGIN_MEDIA_CACHE_PATH",
      "service": "Plugin-Daemon",
      "description": "Asset cache subdir",
      "secret": false,
      "strategy": "default",
      "default": "assets"
    },
    {
      "key": "PYTHON_ENV_INIT_TIMEOUT",
      "service": "Plugin-Daemon",
      "description": "Python env init timeout",
      "secret": false,
      "strategy": "default",
      "default": "120"
    },
    {
      "key": "PYTHON_INTERPRETER_PATH",
      "service": "Plugin-Daemon",
      "description": "Python interpreter",
      "secret": false,
      "strategy": "default",
      "default": "/usr/bin/python3"
    },
    {
      "key": "FORCE_VERIFYING_SIGNATURE",
      "service": "Plugin-Daemon",
      "description": "Skip signature verification",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PLUGIN_PACKAGE_CACHE_PATH",
      "service": "Plugin-Daemon",
      "description": "Plugin cache subdir",
      "secret": false,
      "strategy": "default",
      "default": "plugin_packages"
    },
    {
      "key": "PLUGIN_STORAGE_LOCAL_ROOT",
      "service": "Plugin-Daemon",
      "description": "Plugin storage root",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage"
    },
    {
      "key": "LIFETIME_STATE_GC_INTERVAL",
      "service": "Plugin-Daemon",
      "description": "State GC interval",
      "secret": false,
      "strategy": "default",
      "default": "300"
    },
    {
      "key": "PLUGIN_MAX_EXECUTION_TIMEOUT",
      "service": "Plugin-Daemon",
      "description": "Plugin exec timeout seconds",
      "secret": false,
      "strategy": "default",
      "default": "600"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_HOST",
      "service": "Plugin-Daemon",
      "description": "Remote install bind host",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_PORT",
      "service": "Plugin-Daemon",
      "description": "Remote install port",
      "secret": false,
      "strategy": "default",
      "default": "5003"
    },
    {
      "key": "LIFETIME_COLLECTION_GC_INTERVAL",
      "service": "Plugin-Daemon",
      "description": "GC sweep interval",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "LIFETIME_COLLECTION_HEARTBEAT_INTERVAL",
      "service": "Plugin-Daemon",
      "description": "Heartbeat interval",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "PORT",
      "service": "Dify-Web",
      "description": "Web frontend port",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "APP_API_URL",
      "service": "Dify-Web",
      "description": "App API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Dify-Web",
      "description": "Console API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_EDITION",
      "service": "Dify-Web",
      "description": "Edition flag",
      "secret": false,
      "strategy": "default",
      "default": "SELF_HOSTED"
    },
    {
      "key": "NEXT_PUBLIC_API_PREFIX",
      "service": "Dify-Web",
      "description": "Console API prefix",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_DEPLOY_ENV",
      "service": "Dify-Web",
      "description": "Frontend deploy env",
      "secret": false,
      "strategy": "default",
      "default": "PRODUCTION"
    },
    {
      "key": "NEXT_PUBLIC_PUBLIC_API_PREFIX",
      "service": "Dify-Web",
      "description": "Public API prefix",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "MODE",
      "service": "Dify-API",
      "description": "API server mode",
      "secret": false,
      "strategy": "default",
      "default": "api"
    },
    {
      "key": "DB_HOST",
      "service": "Dify-API",
      "description": "Managed Postgres internal host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Dify-API",
      "description": "Managed Postgres port",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Dify-API",
      "description": "Database backend type",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "REDIS_DB",
      "service": "Dify-API",
      "description": "Redis logical DB index",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DIFY_PORT",
      "service": "Dify-API",
      "description": "API listen port",
      "secret": false,
      "strategy": "default",
      "default": "5001"
    },
    {
      "key": "FILES_URL",
      "service": "Dify-API",
      "description": "Public file URL prefix",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LOG_LEVEL",
      "service": "Dify-API",
      "description": "Application log verbosity",
      "secret": false,
      "strategy": "default",
      "default": "INFO"
    },
    {
      "key": "S3_REGION",
      "service": "Dify-API",
      "description": "S3 region (any value)",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "Dify-API",
      "description": "Production deployment flag",
      "secret": false,
      "strategy": "default",
      "default": "PRODUCTION"
    },
    {
      "key": "REDIS_HOST",
      "service": "Dify-API",
      "description": "Managed Redis internal host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Dify-API",
      "description": "Managed Redis port",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "Dify-API",
      "description": "Flask session signing key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "APP_API_URL",
      "service": "Dify-API",
      "description": "App API base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_WEB_URL",
      "service": "Dify-API",
      "description": "App web base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DB_DATABASE",
      "service": "Dify-API",
      "description": "Managed Postgres default DB",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Dify-API",
      "description": "Managed Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Dify-API",
      "description": "Managed Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Dify-API",
      "description": "MinIO internal endpoint",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "Dify-API",
      "description": "Storage backend (NOT opendal)",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "VECTOR_STORE",
      "service": "Dify-API",
      "description": "Vector DB backend",
      "secret": false,
      "strategy": "default",
      "default": "weaviate"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "Dify-API",
      "description": "MinIO access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "Dify-API",
      "description": "MinIO secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Dify-API",
      "description": "Managed Redis password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "Dify-API",
      "description": "MinIO bucket name",
      "secret": false,
      "strategy": "default",
      "default": "dify-storage"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Dify-API",
      "description": "Console API base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Dify-API",
      "description": "Console web base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "Dify-API",
      "description": "Service API base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "GUNICORN_TIMEOUT",
      "service": "Dify-API",
      "description": "Worker request timeout seconds",
      "secret": false,
      "strategy": "default",
      "default": "360"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "Dify-API",
      "description": "MinIO requires path-style",
      "secret": false,
      "strategy": "default",
      "default": "path"
    },
    {
      "key": "WEAVIATE_API_KEY",
      "service": "Dify-API",
      "description": "Weaviate API key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Dify-API",
      "description": "Celery broker URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_BIND_ADDRESS",
      "service": "Dify-API",
      "description": "API bind interface",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "Dify-API",
      "description": "Auto-run DB migrations on boot",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "Dify-API",
      "description": "Plugin daemon auth",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "Dify-API",
      "description": "Plugin daemon URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEAVIATE_ENDPOINT",
      "service": "Dify-API",
      "description": "Weaviate internal URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "Dify-API",
      "description": "Internal file URL",
      "secret": false,
      "strategy": "default",
      "default": "http://Dify-API.railway.internal:5001"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "Dify-API",
      "description": "Marketplace endpoint",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "MARKETPLACE_ENABLED",
      "service": "Dify-API",
      "description": "Enable plugin marketplace",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SERVER_WORKER_AMOUNT",
      "service": "Dify-API",
      "description": "Gunicorn worker count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "SQLALCHEMY_POOL_SIZE",
      "service": "Dify-API",
      "description": "DB connection pool size",
      "secret": false,
      "strategy": "default",
      "default": "30"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "Dify-API",
      "description": "Sandbox auth key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "Dify-API",
      "description": "Sandbox internal URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SQLALCHEMY_MAX_OVERFLOW",
      "service": "Dify-API",
      "description": "DB pool overflow allowance",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "SQLALCHEMY_POOL_RECYCLE",
      "service": "Dify-API",
      "description": "DB connection recycle seconds",
      "secret": false,
      "strategy": "default",
      "default": "3600"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_KEY",
      "service": "Dify-API",
      "description": "Inner API key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_URL",
      "service": "Dify-API",
      "description": "Own internal URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CONSOLE_CORS_ALLOW_ORIGINS",
      "service": "Dify-API",
      "description": "CORS for console API",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "WEB_API_CORS_ALLOW_ORIGINS",
      "service": "Dify-API",
      "description": "CORS for web API",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "MODE",
      "service": "Dify-Worker",
      "description": "Celery worker mode",
      "secret": false,
      "strategy": "default",
      "default": "worker"
    },
    {
      "key": "DB_HOST",
      "service": "Dify-Worker",
      "description": "Managed Postgres internal host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Dify-Worker",
      "description": "Managed Postgres port",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Dify-Worker",
      "description": "Database backend type",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "REDIS_DB",
      "service": "Dify-Worker",
      "description": "Redis logical DB index",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "FILES_URL",
      "service": "Dify-Worker",
      "description": "Public file URL prefix",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LOG_LEVEL",
      "service": "Dify-Worker",
      "description": "Application log verbosity",
      "secret": false,
      "strategy": "default",
      "default": "INFO"
    },
    {
      "key": "S3_REGION",
      "service": "Dify-Worker",
      "description": "S3 region (any value)",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "DEPLOY_ENV",
      "service": "Dify-Worker",
      "description": "Production deployment flag",
      "secret": false,
      "strategy": "default",
      "default": "PRODUCTION"
    },
    {
      "key": "REDIS_HOST",
      "service": "Dify-Worker",
      "description": "Managed Redis internal host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Dify-Worker",
      "description": "Managed Redis port",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "Dify-Worker",
      "description": "Must match API secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_API_URL",
      "service": "Dify-Worker",
      "description": "App API base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_WEB_URL",
      "service": "Dify-Worker",
      "description": "App web base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DB_DATABASE",
      "service": "Dify-Worker",
      "description": "Managed Postgres default DB",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Dify-Worker",
      "description": "Managed Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Dify-Worker",
      "description": "Managed Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Dify-Worker",
      "description": "MinIO internal endpoint",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "Dify-Worker",
      "description": "Storage backend (NOT opendal)",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "VECTOR_STORE",
      "service": "Dify-Worker",
      "description": "Vector DB backend",
      "secret": false,
      "strategy": "default",
      "default": "weaviate"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "Dify-Worker",
      "description": "MinIO access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "Dify-Worker",
      "description": "MinIO secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Dify-Worker",
      "description": "Managed Redis password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "Dify-Worker",
      "description": "MinIO bucket name",
      "secret": false,
      "strategy": "default",
      "default": "dify-storage"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Dify-Worker",
      "description": "Console API base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Dify-Worker",
      "description": "Console web base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "Dify-Worker",
      "description": "Service API base URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "Dify-Worker",
      "description": "MinIO requires path-style",
      "secret": false,
      "strategy": "default",
      "default": "path"
    },
    {
      "key": "WEAVIATE_API_KEY",
      "service": "Dify-Worker",
      "description": "Weaviate API key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Dify-Worker",
      "description": "Celery broker URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "Dify-Worker",
      "description": "Auto-run DB migrations on boot",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "Dify-Worker",
      "description": "Plugin daemon auth",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "Dify-Worker",
      "description": "Plugin daemon URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEAVIATE_ENDPOINT",
      "service": "Dify-Worker",
      "description": "Weaviate internal URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "Dify-Worker",
      "description": "Internal file URL",
      "secret": false,
      "strategy": "default",
      "default": "http://Dify-API.railway.internal:5001"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "Dify-Worker",
      "description": "Marketplace endpoint",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "MARKETPLACE_ENABLED",
      "service": "Dify-Worker",
      "description": "Enable plugin marketplace",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CELERY_WORKER_AMOUNT",
      "service": "Dify-Worker",
      "description": "Number of Celery workers",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "SQLALCHEMY_POOL_SIZE",
      "service": "Dify-Worker",
      "description": "DB connection pool size",
      "secret": false,
      "strategy": "default",
      "default": "30"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "Dify-Worker",
      "description": "Sandbox auth key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "Dify-Worker",
      "description": "Sandbox internal URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SQLALCHEMY_MAX_OVERFLOW",
      "service": "Dify-Worker",
      "description": "DB pool overflow allowance",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "SQLALCHEMY_POOL_RECYCLE",
      "service": "Dify-Worker",
      "description": "DB connection recycle seconds",
      "secret": false,
      "strategy": "default",
      "default": "3600"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_KEY",
      "service": "Dify-Worker",
      "description": "Inner API key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DIFY_INNER_API_URL",
      "service": "Dify-Worker",
      "description": "Reference API service",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PORT",
      "service": "Weaviate",
      "description": "Weaviate REST port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "CLUSTER_HOSTNAME",
      "service": "Weaviate",
      "description": "Single-node hostname",
      "secret": false,
      "strategy": "default",
      "default": "node1"
    },
    {
      "key": "DISABLE_TELEMETRY",
      "service": "Weaviate",
      "description": "Disable telemetry",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "QUERY_DEFAULTS_LIMIT",
      "service": "Weaviate",
      "description": "Default query limit",
      "secret": false,
      "strategy": "default",
      "default": "25"
    },
    {
      "key": "PERSISTENCE_DATA_PATH",
      "service": "Weaviate",
      "description": "Vector DB data dir",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/weaviate"
    },
    {
      "key": "DEFAULT_VECTORIZER_MODULE",
      "service": "Weaviate",
      "description": "No built-in vectorizer",
      "secret": false,
      "strategy": "default",
      "default": "none"
    },
    {
      "key": "AUTHENTICATION_APIKEY_USERS",
      "service": "Weaviate",
      "description": "Mapped user emails",
      "secret": true,
      "strategy": "default",
      "default": "dify@railway.app"
    },
    {
      "key": "AUTHENTICATION_APIKEY_ENABLED",
      "service": "Weaviate",
      "description": "Enable API key auth",
      "secret": true,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "AUTHORIZATION_ADMINLIST_USERS",
      "service": "Weaviate",
      "description": "Admin user emails",
      "secret": false,
      "strategy": "default",
      "default": "dify@railway.app"
    },
    {
      "key": "AUTHORIZATION_ADMINLIST_ENABLED",
      "service": "Weaviate",
      "description": "Enable admin allowlist",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "AUTHENTICATION_APIKEY_ALLOWED_KEYS",
      "service": "Weaviate",
      "description": "API keys list",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED",
      "service": "Weaviate",
      "description": "Disable anon access",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "MinIO",
      "description": "Root username",
      "secret": false,
      "strategy": "default",
      "default": "minioadmin"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "MinIO",
      "description": "Root password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "REDISHOST",
      "service": "Redis",
      "description": "Internal Redis service hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "Redis",
      "description": "Redis server listening port",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "Redis",
      "description": "Redis default authentication user",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "Redis",
      "description": "Internal Redis connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "Redis",
      "description": "Redis password environment reference",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Password for Redis authentication",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "REDIS_PUBLIC_URL",
      "service": "Redis",
      "description": "Public Redis connection URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "Postgres data storage directory",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "Postgres",
      "description": "Internal Postgres host address",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres",
      "description": "Postgres server listening port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "Postgres",
      "description": "Default Postgres username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres",
      "description": "Default database name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres",
      "description": "Password for Postgres user",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Initial database created on startup",
      "secret": false,
      "strategy": "default",
      "default": "railway"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres",
      "description": "Internal Postgres connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Default database superuser name",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "SSL_CERT_DAYS",
      "service": "Postgres",
      "description": "Self-signed SSL certificate validity",
      "secret": false,
      "strategy": "default",
      "default": "820"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Postgres database user password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "DATABASE_PUBLIC_URL",
      "service": "Postgres",
      "description": "Public Postgres connection string",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres",
      "description": "Graceful shutdown draining duration",
      "secret": false,
      "strategy": "default",
      "default": "60"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "dify-ai-workflow"
      }
    },
    "cli": "railway deploy --template dify-ai-workflow",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "a6023001-6527-4b01-8585-e2276737e061",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "133188bd-4059-467b-b8ad-d4bebb77c116": {
                  "icon": "https://devicons.railway.app/NGINX%20Static%20Site?variant=light",
                  "name": "Nginx",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"echo c2VydmVyIHsKICAgIGxpc3RlbiA4MDsKICAgIHNlcnZlcl9uYW1lIF87CiAgICBjbGllbnRfbWF4X2JvZHlfc2l6ZSAxMDBNOwoKICAgIHJlc29sdmVyIF9fUkVTT0xWRVJfXyB2YWxpZD0xMHMgaXB2Nj1vZmY7CgogICAgbG9jYXRpb24gL2NvbnNvbGUvYXBpIHsKICAgICAgICBzZXQgJHVwc3RyZWFtX2FwaSBEaWZ5LUFQSS5yYWlsd2F5LmludGVybmFsOjUwMDE7CiAgICAgICAgcHJveHlfcGFzcyBodHRwOi8vJHVwc3RyZWFtX2FwaTsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgJGhvc3Q7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtUHJvdG8gaHR0cHM7CiAgICAgICAgcHJveHlfaHR0cF92ZXJzaW9uIDEuMTsKICAgICAgICBwcm94eV9idWZmZXJpbmcgb2ZmOwogICAgICAgIHByb3h5X3JlYWRfdGltZW91dCAzNjAwczsKICAgICAgICBwcm94eV9zZW5kX3RpbWVvdXQgMzYwMHM7CiAgICB9CiAgICBsb2NhdGlvbiAvYXBpIHsKICAgICAgICBzZXQgJHVwc3RyZWFtX2FwaSBEaWZ5LUFQSS5yYWlsd2F5LmludGVybmFsOjUwMDE7CiAgICAgICAgcHJveHlfcGFzcyBodHRwOi8vJHVwc3RyZWFtX2FwaTsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgJGhvc3Q7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtUHJvdG8gaHR0cHM7CiAgICAgICAgcHJveHlfaHR0cF92ZXJzaW9uIDEuMTsKICAgICAgICBwcm94eV9idWZmZXJpbmcgb2ZmOwogICAgICAgIHByb3h5X3JlYWRfdGltZW91dCAzNjAwczsKICAgICAgICBwcm94eV9zZW5kX3RpbWVvdXQgMzYwMHM7CiAgICB9CiAgICBsb2NhdGlvbiAvdjEgewogICAgICAgIHNldCAkdXBzdHJlYW1fYXBpIERpZnktQVBJLnJhaWx3YXkuaW50ZXJuYWw6NTAwMTsKICAgICAgICBwcm94eV9wYXNzIGh0dHA6Ly8kdXBzdHJlYW1fYXBpOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdDsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHI7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Gb3IgJHByb3h5X2FkZF94X2ZvcndhcmRlZF9mb3I7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Qcm90byBodHRwczsKICAgICAgICBwcm94eV9odHRwX3ZlcnNpb24gMS4xOwogICAgICAgIHByb3h5X2J1ZmZlcmluZyBvZmY7CiAgICAgICAgcHJveHlfcmVhZF90aW1lb3V0IDM2MDBzOwogICAgICAgIHByb3h5X3NlbmRfdGltZW91dCAzNjAwczsKICAgIH0KICAgIGxvY2F0aW9uIC9maWxlcyB7CiAgICAgICAgc2V0ICR1cHN0cmVhbV9hcGkgRGlmeS1BUEkucmFpbHdheS5pbnRlcm5hbDo1MDAxOwogICAgICAgIHByb3h5X3Bhc3MgaHR0cDovLyR1cHN0cmVhbV9hcGk7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0ICRob3N0OwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1SZWFsLUlQICRyZW1vdGVfYWRkcjsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLUZvciAkcHJveHlfYWRkX3hfZm9yd2FyZGVkX2ZvcjsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLVByb3RvIGh0dHBzOwogICAgICAgIHByb3h5X2h0dHBfdmVyc2lvbiAxLjE7CiAgICAgICAgcHJveHlfYnVmZmVyaW5nIG9mZjsKICAgIH0KICAgIGxvY2F0aW9uIC9lIHsKICAgICAgICBzZXQgJHVwc3RyZWFtX3BkIFBsdWdpbi1EYWVtb24ucmFpbHdheS5pbnRlcm5hbDo1MDAyOwogICAgICAgIHByb3h5X3Bhc3MgaHR0cDovLyR1cHN0cmVhbV9wZDsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgJGhvc3Q7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtUHJvdG8gaHR0cHM7CiAgICAgICAgcHJveHlfaHR0cF92ZXJzaW9uIDEuMTsKICAgIH0KICAgIGxvY2F0aW9uIC8gewogICAgICAgIHNldCAkdXBzdHJlYW1fd2ViIERpZnktV2ViLnJhaWx3YXkuaW50ZXJuYWw6MzAwMDsKICAgICAgICBwcm94eV9wYXNzIGh0dHA6Ly8kdXBzdHJlYW1fd2ViOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdDsKICAgICAgICBwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHI7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Gb3IgJHByb3h5X2FkZF94X2ZvcndhcmRlZF9mb3I7CiAgICAgICAgcHJveHlfc2V0X2hlYWRlciBYLUZvcndhcmRlZC1Qcm90byBodHRwczsKICAgICAgICBwcm94eV9odHRwX3ZlcnNpb24gMS4xOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgVXBncmFkZSAkaHR0cF91cGdyYWRlOwogICAgICAgIHByb3h5X3NldF9oZWFkZXIgQ29ubmVjdGlvbiAidXBncmFkZSI7CiAgICB9Cn0K | base64 -d > /etc/nginx/conf.d/default.conf && RESOLVER=\\$(awk '/^nameserver/ {print \\$2; exit}' /etc/resolv.conf) && case \\$RESOLVER in *:*) RESOLVER=[\\$RESOLVER] ;; esac && echo Using resolver \\$RESOLVER && sed -i \\\"s|__RESOLVER__|\\$RESOLVER|g\\\" /etc/nginx/conf.d/default.conf && head -8 /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nginx:latest"
                  },
                  "variables": {
                    "PORT": {
                      "description": "HTTP listen port",
                      "defaultValue": "80"
                    },
                    "NGINX_PORT": {
                      "isOptional": false,
                      "description": "HTTP listen port",
                      "defaultValue": "80"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "1ea97ae0-3cd9-42dd-a81c-c6f818861d81": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/main/web/public/logo/logo-embedded-chat-avatar.png",
                  "name": "Sandbox",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-sandbox:0.2.14"
                  },
                  "variables": {
                    "API_KEY": {
                      "isOptional": false,
                      "description": "Sandbox API auth key",
                      "defaultValue": "{{API_KEY}}"
                    },
                    "GIN_MODE": {
                      "isOptional": false,
                      "description": "Go web framework mode",
                      "defaultValue": "release"
                    },
                    "SANDBOX_PORT": {
                      "isOptional": false,
                      "description": "Sandbox listen port",
                      "defaultValue": "8194"
                    },
                    "ENABLE_NETWORK": {
                      "isOptional": false,
                      "description": "Allow network from sandbox",
                      "defaultValue": "true"
                    },
                    "WORKER_TIMEOUT": {
                      "isOptional": false,
                      "description": "Code exec timeout seconds",
                      "defaultValue": "15"
                    }
                  }
                },
                "35d8eae5-0fbf-4460-be76-a17c334ffe4d": {
                  "icon": "https://raw.githubusercontent.com/langgenius/dify/main/web/public/logo/logo-embedded-chat-avatar.png",
                  "name": "Plugin-Daemon",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-plugin-daemon:0.5.3-local"
                  },
                  "variables": {
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Managed Postgres internal host",
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Managed Postgres port",
                      "defaultValue": "${{Postgres.PGPORT}}"
                    },
                    "PLATFORM": {
                      "isOptional": false,
                      "description": "Platform mode",
                      "defaultValue": "local"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Managed Redis internal host",
                      "defaultValue": "${{Redis.REDISHOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Managed Redis port",
                      "defaultValue": "${{Redis.REDISPORT}}"
                    },
                    "SERVER_KEY": {
                      "isOptional": false,
                      "description": "Daemon API auth key (API refs this)",
                      "defaultValue": "{{SERVER_KEY}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Shared DB with API",
                      "defaultValue": "${{Postgres.PGDATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Managed Postgres password",
                      "defaultValue": "${{Postgres.PGPASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Managed Postgres user",
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "SERVER_PORT": {
                      "isOptional": false,
                      "description": "Daemon listen port",
                      "defaultValue": "5002"
                    },
                    "PPROF_ENABLED": {
                      "isOptional": false,
                      "description": "Disable Go profiler",
                      "defaultValue": "false"
                    },
                    "PIP_MIRROR_URL": {
                      "isOptional": true,
                      "description": "Optional pip mirror",
                      "defaultValue": ""
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Managed Redis password",
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "ROUTINE_POOL_SIZE": {
                      "isOptional": false,
                      "description": "Goroutine pool size",
                      "defaultValue": "10000"
                    },
                    "DB_PLUGIN_DATABASE": {
                      "isOptional": false,
                      "description": "Same DB as API (no conflict)",
                      "defaultValue": "${{Postgres.PGDATABASE}}"
                    },
                    "DIFY_INNER_API_KEY": {
                      "isOptional": false,
                      "description": "Inner API auth key (API refs this)",
                      "defaultValue": "{{DIFY_INNER_API_KEY}}"
                    },
                    "DIFY_INNER_API_URL": {
                      "isOptional": false,
                      "description": "Reference API service",
                      "defaultValue": "http://${{Dify-API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "MARKETPLACE_API_URL": {
                      "isOptional": false,
                      "description": "Marketplace endpoint",
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "MARKETPLACE_ENABLED": {
                      "isOptional": false,
                      "description": "Enable marketplace",
                      "defaultValue": "true"
                    },
                    "PLUGIN_STORAGE_TYPE": {
                      "isOptional": false,
                      "description": "Plugin storage backend",
                      "defaultValue": "local"
                    },
                    "PLUGIN_WORKING_PATH": {
                      "isOptional": false,
                      "description": "Plugin working dir",
                      "defaultValue": "/app/storage/cwd"
                    },
                    "PLUGIN_INSTALLED_PATH": {
                      "isOptional": false,
                      "description": "Installed plugin subdir",
                      "defaultValue": "plugin"
                    },
                    "MAX_PLUGIN_PACKAGE_SIZE": {
                      "isOptional": false,
                      "description": "Max plugin size bytes",
                      "defaultValue": "52428800"
                    },
                    "PLUGIN_MEDIA_CACHE_PATH": {
                      "isOptional": false,
                      "description": "Asset cache subdir",
                      "defaultValue": "assets"
                    },
                    "PYTHON_ENV_INIT_TIMEOUT": {
                      "isOptional": false,
                      "description": "Python env init timeout",
                      "defaultValue": "120"
                    },
                    "PYTHON_INTERPRETER_PATH": {
                      "isOptional": false,
                      "description": "Python interpreter",
                      "defaultValue": "/usr/bin/python3"
                    },
                    "FORCE_VERIFYING_SIGNATURE": {
                      "isOptional": false,
                      "description": "Skip signature verification",
                      "defaultValue": "false"
                    },
                    "PLUGIN_PACKAGE_CACHE_PATH": {
                      "isOptional": false,
                      "description": "Plugin cache subdir",
                      "defaultValue": "plugin_packages"
                    },
                    "PLUGIN_STORAGE_LOCAL_ROOT": {
                      "isOptional": false,
                      "description": "Plugin storage root",
                      "defaultValue": "/app/storage"
                    },
                    "LIFETIME_STATE_GC_INTERVAL": {
                      "isOptional": false,
                      "description": "State GC interval",
                      "defaultValue": "300"
                    },
                    "PLUGIN_MAX_EXECUTION_TIMEOUT": {
                      "isOptional": false,
                      "description": "Plugin exec timeout seconds",
                      "defaultValue": "600"
                    },
                    "PLUGIN_REMOTE_INSTALLING_HOST": {
                      "isOptional": false,
                      "description": "Remote install bind host",
                      "defaultValue": "0.0.0.0"
                    },
                    "PLUGIN_REMOTE_INSTALLING_PORT": {
                      "isOptional": false,
                      "description": "Remote install port",
                      "defaultValue": "5003"
                    },
                    "LIFETIME_COLLECTION_GC_INTERVAL": {
                      "isOptional": false,
                      "description": "GC sweep interval",
                      "defaultValue": "60"
                    },
                    "LIFETIME_COLLECTION_HEARTBEAT_INTERVAL": {
                      "isOptional": false,
                      "description": "Heartbeat interval",
                      "defaultValue": "5"
                    }
                  }
                },
                "41077eb0-4f3c-4783-ba84-fd325ea7acac": {
                  "icon": "https://cdn.zeabur.com/dify-icon.png",
                  "name": "Dify-Web",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-web:1.13.3"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Web frontend port",
                      "defaultValue": "3000"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "App API URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "NEXT_PUBLIC_EDITION": {
                      "isOptional": false,
                      "description": "Edition flag",
                      "defaultValue": "SELF_HOSTED"
                    },
                    "NEXT_PUBLIC_API_PREFIX": {
                      "isOptional": false,
                      "description": "Console API prefix",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}/console/api"
                    },
                    "NEXT_PUBLIC_DEPLOY_ENV": {
                      "isOptional": false,
                      "description": "Frontend deploy env",
                      "defaultValue": "PRODUCTION"
                    },
                    "NEXT_PUBLIC_PUBLIC_API_PREFIX": {
                      "isOptional": false,
                      "description": "Public API prefix",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}/api"
                    }
                  }
                },
                "6944f919-7c84-4b7b-90fc-741defc56857": {
                  "icon": "https://cdn.zeabur.com/dify-icon.png",
                  "name": "Dify-API",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.13.3"
                  },
                  "variables": {
                    "MODE": {
                      "isOptional": false,
                      "description": "API server mode",
                      "defaultValue": "api"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Managed Postgres internal host",
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Managed Postgres port",
                      "defaultValue": "${{Postgres.PGPORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "description": "Database backend type",
                      "defaultValue": "postgresql"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "description": "Redis logical DB index",
                      "defaultValue": "0"
                    },
                    "DIFY_PORT": {
                      "isOptional": false,
                      "description": "API listen port",
                      "defaultValue": "5001"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "description": "Public file URL prefix",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "Application log verbosity",
                      "defaultValue": "INFO"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region (any value)",
                      "defaultValue": "us-east-1"
                    },
                    "DEPLOY_ENV": {
                      "isOptional": false,
                      "description": "Production deployment flag",
                      "defaultValue": "PRODUCTION"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Managed Redis internal host",
                      "defaultValue": "${{Redis.REDISHOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Managed Redis port",
                      "defaultValue": "${{Redis.REDISPORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "description": "Flask session signing key",
                      "defaultValue": "{{SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "App API base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "description": "App web base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Managed Postgres default DB",
                      "defaultValue": "${{Postgres.PGDATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Managed Postgres password",
                      "defaultValue": "${{Postgres.PGPASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Managed Postgres user",
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO internal endpoint",
                      "defaultValue": "http://${{MinIO.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "description": "Storage backend (NOT opendal)",
                      "defaultValue": "s3"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "description": "Vector DB backend",
                      "defaultValue": "weaviate"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "MinIO access key",
                      "defaultValue": "${{MinIO.MINIO_ROOT_USER}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "MinIO secret key",
                      "defaultValue": "${{MinIO.MINIO_ROOT_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Managed Redis password",
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "MinIO bucket name",
                      "defaultValue": "dify-storage"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "description": "Console web base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "description": "Service API base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "GUNICORN_TIMEOUT": {
                      "isOptional": false,
                      "description": "Worker request timeout seconds",
                      "defaultValue": "360"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "description": "MinIO requires path-style",
                      "defaultValue": "path"
                    },
                    "WEAVIATE_API_KEY": {
                      "isOptional": false,
                      "description": "Weaviate API key",
                      "defaultValue": "${{Weaviate.AUTHENTICATION_APIKEY_ALLOWED_KEYS}}"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Celery broker URL",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.REDISHOST}}:${{Redis.REDISPORT}}/1"
                    },
                    "DIFY_BIND_ADDRESS": {
                      "isOptional": false,
                      "description": "API bind interface",
                      "defaultValue": "0.0.0.0"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "description": "Auto-run DB migrations on boot",
                      "defaultValue": "true"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "description": "Plugin daemon auth",
                      "defaultValue": "${{Plugin-Daemon.SERVER_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "description": "Plugin daemon URL",
                      "defaultValue": "http://${{Plugin-Daemon.RAILWAY_PRIVATE_DOMAIN}}:5002"
                    },
                    "WEAVIATE_ENDPOINT": {
                      "isOptional": false,
                      "description": "Weaviate internal URL",
                      "defaultValue": "http://${{Weaviate.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "description": "Internal file URL",
                      "defaultValue": "http://Dify-API.railway.internal:5001"
                    },
                    "MARKETPLACE_API_URL": {
                      "isOptional": false,
                      "description": "Marketplace endpoint",
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "MARKETPLACE_ENABLED": {
                      "isOptional": false,
                      "description": "Enable plugin marketplace",
                      "defaultValue": "true"
                    },
                    "SERVER_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "Gunicorn worker count",
                      "defaultValue": "1"
                    },
                    "SQLALCHEMY_POOL_SIZE": {
                      "isOptional": false,
                      "description": "DB connection pool size",
                      "defaultValue": "30"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "description": "Sandbox auth key",
                      "defaultValue": "${{Sandbox.API_KEY}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "description": "Sandbox internal URL",
                      "defaultValue": "http://${{Sandbox.RAILWAY_PRIVATE_DOMAIN}}:8194"
                    },
                    "SQLALCHEMY_MAX_OVERFLOW": {
                      "isOptional": false,
                      "description": "DB pool overflow allowance",
                      "defaultValue": "10"
                    },
                    "SQLALCHEMY_POOL_RECYCLE": {
                      "isOptional": false,
                      "description": "DB connection recycle seconds",
                      "defaultValue": "3600"
                    },
                    "PLUGIN_DIFY_INNER_API_KEY": {
                      "isOptional": false,
                      "description": "Inner API key",
                      "defaultValue": "${{Plugin-Daemon.DIFY_INNER_API_KEY}}"
                    },
                    "PLUGIN_DIFY_INNER_API_URL": {
                      "isOptional": false,
                      "description": "Own internal URL",
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "CONSOLE_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "CORS for console API",
                      "defaultValue": "*"
                    },
                    "WEB_API_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "CORS for web API",
                      "defaultValue": "*"
                    }
                  }
                },
                "6e35ab2c-cac8-436b-9f7d-7f83bd6eac05": {
                  "icon": "https://cdn.zeabur.com/dify-icon.png",
                  "name": "Dify-Worker",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.13.3"
                  },
                  "variables": {
                    "MODE": {
                      "isOptional": false,
                      "description": "Celery worker mode",
                      "defaultValue": "worker"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Managed Postgres internal host",
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "Managed Postgres port",
                      "defaultValue": "${{Postgres.PGPORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "description": "Database backend type",
                      "defaultValue": "postgresql"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "description": "Redis logical DB index",
                      "defaultValue": "0"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "description": "Public file URL prefix",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LOG_LEVEL": {
                      "isOptional": false,
                      "description": "Application log verbosity",
                      "defaultValue": "INFO"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region (any value)",
                      "defaultValue": "us-east-1"
                    },
                    "DEPLOY_ENV": {
                      "isOptional": false,
                      "description": "Production deployment flag",
                      "defaultValue": "PRODUCTION"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Managed Redis internal host",
                      "defaultValue": "${{Redis.REDISHOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "description": "Managed Redis port",
                      "defaultValue": "${{Redis.REDISPORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "description": "Must match API secret key",
                      "defaultValue": "${{Dify-API.SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "description": "App API base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "description": "App web base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "description": "Managed Postgres default DB",
                      "defaultValue": "${{Postgres.PGDATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "description": "Managed Postgres password",
                      "defaultValue": "${{Postgres.PGPASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "description": "Managed Postgres user",
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "MinIO internal endpoint",
                      "defaultValue": "http://${{MinIO.RAILWAY_PRIVATE_DOMAIN}}:9000"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "description": "Storage backend (NOT opendal)",
                      "defaultValue": "s3"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "description": "Vector DB backend",
                      "defaultValue": "weaviate"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "MinIO access key",
                      "defaultValue": "${{MinIO.MINIO_ROOT_USER}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "MinIO secret key",
                      "defaultValue": "${{MinIO.MINIO_ROOT_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Managed Redis password",
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "MinIO bucket name",
                      "defaultValue": "dify-storage"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "description": "Console API base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "description": "Console web base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "description": "Service API base URL",
                      "defaultValue": "https://${{Nginx.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "description": "MinIO requires path-style",
                      "defaultValue": "path"
                    },
                    "WEAVIATE_API_KEY": {
                      "isOptional": false,
                      "description": "Weaviate API key",
                      "defaultValue": "${{Weaviate.AUTHENTICATION_APIKEY_ALLOWED_KEYS}}"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "description": "Celery broker URL",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.REDISHOST}}:${{Redis.REDISPORT}}/1"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "description": "Auto-run DB migrations on boot",
                      "defaultValue": "true"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "description": "Plugin daemon auth",
                      "defaultValue": "${{Plugin-Daemon.SERVER_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "description": "Plugin daemon URL",
                      "defaultValue": "http://${{Plugin-Daemon.RAILWAY_PRIVATE_DOMAIN}}:5002"
                    },
                    "WEAVIATE_ENDPOINT": {
                      "isOptional": false,
                      "description": "Weaviate internal URL",
                      "defaultValue": "http://${{Weaviate.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "description": "Internal file URL",
                      "defaultValue": "http://Dify-API.railway.internal:5001"
                    },
                    "MARKETPLACE_API_URL": {
                      "isOptional": false,
                      "description": "Marketplace endpoint",
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "MARKETPLACE_ENABLED": {
                      "isOptional": false,
                      "description": "Enable plugin marketplace",
                      "defaultValue": "true"
                    },
                    "CELERY_WORKER_AMOUNT": {
                      "isOptional": false,
                      "description": "Number of Celery workers",
                      "defaultValue": "1"
                    },
                    "SQLALCHEMY_POOL_SIZE": {
                      "isOptional": false,
                      "description": "DB connection pool size",
                      "defaultValue": "30"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "description": "Sandbox auth key",
                      "defaultValue": "${{Sandbox.API_KEY}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "description": "Sandbox internal URL",
                      "defaultValue": "http://${{Sandbox.RAILWAY_PRIVATE_DOMAIN}}:8194"
                    },
                    "SQLALCHEMY_MAX_OVERFLOW": {
                      "isOptional": false,
                      "description": "DB pool overflow allowance",
                      "defaultValue": "10"
                    },
                    "SQLALCHEMY_POOL_RECYCLE": {
                      "isOptional": false,
                      "description": "DB connection recycle seconds",
                      "defaultValue": "3600"
                    },
                    "PLUGIN_DIFY_INNER_API_KEY": {
                      "isOptional": false,
                      "description": "Inner API key",
                      "defaultValue": "${{Plugin-Daemon.DIFY_INNER_API_KEY}}"
                    },
                    "PLUGIN_DIFY_INNER_API_URL": {
                      "isOptional": false,
                      "description": "Reference API service",
                      "defaultValue": "http://${{Dify-API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    }
                  }
                },
                "93e3b6b5-16a4-4e0c-a135-5440ac5d2742": {
                  "icon": "https://d11a6trkgmumsb.cloudfront.net/original/4X/8/1/1/811ef156e2525559c859ecdb7a5cd26d5e459e46.png",
                  "name": "Weaviate",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "semitechnologies/weaviate:1.27.0"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Weaviate REST port",
                      "defaultValue": "8080"
                    },
                    "CLUSTER_HOSTNAME": {
                      "isOptional": false,
                      "description": "Single-node hostname",
                      "defaultValue": "node1"
                    },
                    "DISABLE_TELEMETRY": {
                      "isOptional": false,
                      "description": "Disable telemetry",
                      "defaultValue": "true"
                    },
                    "QUERY_DEFAULTS_LIMIT": {
                      "isOptional": false,
                      "description": "Default query limit",
                      "defaultValue": "25"
                    },
                    "PERSISTENCE_DATA_PATH": {
                      "isOptional": false,
                      "description": "Vector DB data dir",
                      "defaultValue": "/var/lib/weaviate"
                    },
                    "DEFAULT_VECTORIZER_MODULE": {
                      "isOptional": false,
                      "description": "No built-in vectorizer",
                      "defaultValue": "none"
                    },
                    "AUTHENTICATION_APIKEY_USERS": {
                      "isOptional": false,
                      "description": "Mapped user emails",
                      "defaultValue": "dify@railway.app"
                    },
                    "AUTHENTICATION_APIKEY_ENABLED": {
                      "isOptional": false,
                      "description": "Enable API key auth",
                      "defaultValue": "true"
                    },
                    "AUTHORIZATION_ADMINLIST_USERS": {
                      "isOptional": false,
                      "description": "Admin user emails",
                      "defaultValue": "dify@railway.app"
                    },
                    "AUTHORIZATION_ADMINLIST_ENABLED": {
                      "isOptional": false,
                      "description": "Enable admin allowlist",
                      "defaultValue": "true"
                    },
                    "AUTHENTICATION_APIKEY_ALLOWED_KEYS": {
                      "isOptional": false,
                      "description": "API keys list",
                      "defaultValue": "{{AUTHENTICATION_APIKEY_ALLOWED_KEYS}}"
                    },
                    "AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED": {
                      "isOptional": false,
                      "description": "Disable anon access",
                      "defaultValue": "false"
                    }
                  }
                },
                "ca7abb8d-166d-4e93-9ba4-a892fd799e68": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/minio-light.svg",
                  "name": "MinIO",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"minio server /data --console-address :9001 & sleep 5 && mc alias set local http://localhost:9000 minioadmin b18df41bed03c5168b6dfd5961e29b68 && mc mb local/dify-storage --ignore-existing; wait\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "minio/minio:latest"
                  },
                  "variables": {
                    "MINIO_ROOT_USER": {
                      "isOptional": false,
                      "description": "Root username",
                      "defaultValue": "minioadmin"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Root password",
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "ca7abb8d-166d-4e93-9ba4-a892fd799e68": {
                      "mountPath": "/data"
                    }
                  }
                },
                "ecfb253c-5b42-42a2-8f40-27cf95eac9ee": {
                  "icon": "https://cdn.sanity.io/images/sy1jschh/production/0ce0bfdcfbdbf69662b1116671f97c2dd788b655-157x157.svg",
                  "name": "Redis",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:8.2.1"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "description": "Internal Redis service hostname",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "isOptional": false,
                      "description": "Redis server listening port",
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "isOptional": false,
                      "description": "Redis default authentication user",
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Internal Redis connection string",
                      "defaultValue": "redis://${{REDISUSER}}:${{REDIS_PASSWORD}}@${{REDISHOST}}:${{REDISPORT}}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "description": "Redis password environment reference",
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Password for Redis authentication",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    },
                    "REDIS_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "Public Redis connection URL",
                      "defaultValue": "redis://default:${{REDIS_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}"
                    }
                  },
                  "volumeMounts": {
                    "ecfb253c-5b42-42a2-8f40-27cf95eac9ee": {
                      "mountPath": "/data"
                    }
                  },
                  "haTemplateCode": "redis-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxies",
                      "options": [
                        1,
                        2
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "HAProxy instances routing writes to the primary",
                      "defaultValue": 2
                    },
                    "replica": {
                      "label": "Redis Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "Redis",
                      "description": "Nodes running Redis + colocated Sentinel",
                      "defaultValue": 2
                    },
                    "internal": null,
                    "description": "This will convert your Redis instance to an HA cluster with Sentinel failover and HAProxy routing to the primary."
                  }
                },
                "ee718334-2b17-4d64-8ca9-9925f7c4aea2": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ssl:17"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "Postgres data storage directory",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "isOptional": false,
                      "description": "Internal Postgres host address",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "isOptional": false,
                      "description": "Postgres server listening port",
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "isOptional": false,
                      "description": "Default Postgres username",
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PGDATABASE": {
                      "isOptional": false,
                      "description": "Default database name",
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "isOptional": false,
                      "description": "Password for Postgres user",
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Initial database created on startup",
                      "defaultValue": "railway"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Internal Postgres connection string",
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Default database superuser name",
                      "defaultValue": "postgres"
                    },
                    "SSL_CERT_DAYS": {
                      "isOptional": false,
                      "description": "Self-signed SSL certificate validity",
                      "defaultValue": "820"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres database user password",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "DATABASE_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "Public Postgres connection string",
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}/${{PGDATABASE}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "description": "Graceful shutdown draining duration",
                      "defaultValue": "60"
                    }
                  },
                  "volumeMounts": {
                    "ee718334-2b17-4d64-8ca9-9925f7c4aea2": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  },
                  "haTemplateCode": "postgres-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxy",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "Routes traffic to the primary",
                      "defaultValue": 3
                    },
                    "replica": {
                      "label": "Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5,
                        6,
                        7
                      ],
                      "nodeLabel": "Postgres",
                      "description": "Streaming replicas for automatic failover",
                      "defaultValue": 2
                    },
                    "internal": {
                      "label": "Coordinator Nodes",
                      "options": [
                        3,
                        5,
                        7,
                        9
                      ],
                      "nodeLabel": "etcd",
                      "defaultValue": 3
                    },
                    "description": "This will convert your Postgres database to an HA cluster with Patroni failover and etcd consensus."
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 10,
    "needs_volume": true
  },
  "generated_at": "2026-09-21T22:14:44.200Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-20T14:09:12.038Z",
  "success_rate_30d": 0.3333,
  "validation": {
    "last_run_id": "run_6a08c720bea741d69d4c",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "SUCCESS,QUEUED,QUEUED,QUEUED,QUEUED,DEPLOYING,DEPLOYING,SUCCESS,FAILED,SUCCESS"
      }
    ],
    "typical_ready_seconds": 123,
    "typical_build_seconds": 5,
    "typical_start_seconds": 15,
    "slowest_service": "Dify-Worker"
  }
}
