{
  "manifest_version": "1.0.0",
  "template": {
    "id": "7b6dbfc5-a0b7-4f8e-9057-82def96b899a",
    "slug": "dify-w-ai-model-setup",
    "name": "Dify (w/ AI model setup)",
    "description": "Dify with your model key set up at deploy: OpenAI, Anthropic or OpenRouter.",
    "url": "https://railway.com/deploy/dify-w-ai-model-setup",
    "upstream": {
      "image": "nginx:1.31-alpine"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "Sandbox",
      "source": {
        "image": "langgenius/dify-sandbox:0.2.15"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Plugin daemon",
      "source": {
        "image": "langgenius/dify-plugin-daemon:0.6.12-local"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/storage",
      "http": false
    },
    {
      "name": "Scheduler",
      "source": {
        "image": "langgenius/dify-api:1.18.0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "API",
      "source": {
        "image": "langgenius/dify-api:1.18.0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Dify",
      "source": {
        "image": "nginx:1.31-alpine"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Redis",
      "source": {
        "image": "redis:8.2"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "Worker",
      "source": {
        "image": "langgenius/dify-api:1.18.0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Setup",
      "source": {
        "image": "ghcr.io/railwayapp/function-bun:1.3.0"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "pgvector/pgvector:pg17"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "Web",
      "source": {
        "image": "langgenius/dify-web:1.18.0"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "Sandbox",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8194"
    },
    {
      "key": "API_KEY",
      "service": "Sandbox",
      "description": "Provide a value for API_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GIN_MODE",
      "service": "Sandbox",
      "description": "Provide a value for GIN_MODE.",
      "secret": false,
      "strategy": "default",
      "default": "release"
    },
    {
      "key": "SANDBOX_PORT",
      "service": "Sandbox",
      "description": "Provide a value for SANDBOX_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8194"
    },
    {
      "key": "ENABLE_NETWORK",
      "service": "Sandbox",
      "description": "Provide a value for ENABLE_NETWORK.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "WORKER_TIMEOUT",
      "service": "Sandbox",
      "description": "Provide a value for WORKER_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "15"
    },
    {
      "key": "PORT",
      "service": "Plugin daemon",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5002"
    },
    {
      "key": "DB_HOST",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_TYPE.",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "REDIS_HOST",
      "service": "Plugin daemon",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Plugin daemon",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_KEY",
      "service": "Plugin daemon",
      "description": "Provide a value for SERVER_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DB_DATABASE",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "default",
      "default": "dify_plugin"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_SSL_MODE",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_SSL_MODE.",
      "secret": false,
      "strategy": "default",
      "default": "disable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Plugin daemon",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_PORT",
      "service": "Plugin daemon",
      "description": "Provide a value for SERVER_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5002"
    },
    {
      "key": "PPROF_ENABLED",
      "service": "Plugin daemon",
      "description": "Provide a value for PPROF_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Plugin daemon",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "Plugin daemon",
      "description": "Provide a value for RAILWAY_RUN_UID.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "DIFY_INNER_API_KEY",
      "service": "Plugin daemon",
      "description": "Provide a value for DIFY_INNER_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_INNER_API_URL",
      "service": "Plugin daemon",
      "description": "Provide a value for DIFY_INNER_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PLUGIN_STORAGE_TYPE",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_STORAGE_TYPE.",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "PLUGIN_WORKING_PATH",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_WORKING_PATH.",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage/cwd"
    },
    {
      "key": "PLUGIN_INSTALLED_PATH",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_INSTALLED_PATH.",
      "secret": false,
      "strategy": "default",
      "default": "plugin"
    },
    {
      "key": "MAX_PLUGIN_PACKAGE_SIZE",
      "service": "Plugin daemon",
      "description": "Provide a value for MAX_PLUGIN_PACKAGE_SIZE.",
      "secret": false,
      "strategy": "default",
      "default": "52428800"
    },
    {
      "key": "PLUGIN_MEDIA_CACHE_PATH",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_MEDIA_CACHE_PATH.",
      "secret": false,
      "strategy": "default",
      "default": "assets"
    },
    {
      "key": "PYTHON_ENV_INIT_TIMEOUT",
      "service": "Plugin daemon",
      "description": "Provide a value for PYTHON_ENV_INIT_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "120"
    },
    {
      "key": "FORCE_VERIFYING_SIGNATURE",
      "service": "Plugin daemon",
      "description": "Provide a value for FORCE_VERIFYING_SIGNATURE.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PLUGIN_PACKAGE_CACHE_PATH",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_PACKAGE_CACHE_PATH.",
      "secret": false,
      "strategy": "default",
      "default": "plugin_packages"
    },
    {
      "key": "PLUGIN_STORAGE_LOCAL_ROOT",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_STORAGE_LOCAL_ROOT.",
      "secret": false,
      "strategy": "default",
      "default": "/app/storage"
    },
    {
      "key": "PLUGIN_MAX_EXECUTION_TIMEOUT",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_MAX_EXECUTION_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "600"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_HOST",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_REMOTE_INSTALLING_HOST.",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "PLUGIN_REMOTE_INSTALLING_PORT",
      "service": "Plugin daemon",
      "description": "Provide a value for PLUGIN_REMOTE_INSTALLING_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5003"
    },
    {
      "key": "LANG",
      "service": "Scheduler",
      "description": "Provide a value for LANG.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MODE",
      "service": "Scheduler",
      "description": "Provide a value for MODE.",
      "secret": false,
      "strategy": "default",
      "default": "beat"
    },
    {
      "key": "LC_ALL",
      "service": "Scheduler",
      "description": "Provide a value for LC_ALL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_HOST",
      "service": "Scheduler",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Scheduler",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Scheduler",
      "description": "Provide a value for DB_TYPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_DB",
      "service": "Scheduler",
      "description": "Provide a value for REDIS_DB.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILES_URL",
      "service": "Scheduler",
      "description": "Provide a value for FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "Scheduler",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PORT",
      "service": "Scheduler",
      "description": "Provide a value for SMTP_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "Scheduler",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Scheduler",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "Scheduler",
      "description": "Provide a value for SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_API_URL",
      "service": "Scheduler",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_WEB_URL",
      "service": "Scheduler",
      "description": "Provide a value for APP_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_DATABASE",
      "service": "Scheduler",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Scheduler",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Scheduler",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Scheduler",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_SERVER",
      "service": "Scheduler",
      "description": "Provide a value for SMTP_SERVER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TRIGGER_URL",
      "service": "Scheduler",
      "description": "Provide a value for TRIGGER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_USE_TLS",
      "service": "Scheduler",
      "description": "Provide a value for SMTP_USE_TLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "Scheduler",
      "description": "Provide a value for STORAGE_TYPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VECTOR_STORE",
      "service": "Scheduler",
      "description": "Provide a value for VECTOR_STORE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_HOST",
      "service": "Scheduler",
      "description": "Provide a value for PGVECTOR_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_PORT",
      "service": "Scheduler",
      "description": "Provide a value for PGVECTOR_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_USER",
      "service": "Scheduler",
      "description": "Provide a value for PGVECTOR_USER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "Scheduler",
      "description": "Provide a value for S3_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "Scheduler",
      "description": "Provide a value for S3_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PASSWORD",
      "service": "Scheduler",
      "description": "Provide a value for SMTP_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_USERNAME",
      "service": "Scheduler",
      "description": "Provide a value for SMTP_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Scheduler",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "Scheduler",
      "description": "Provide a value for S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Scheduler",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Scheduler",
      "description": "Provide a value for CONSOLE_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "Scheduler",
      "description": "Provide a value for SERVICE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "Scheduler",
      "description": "Provide a value for S3_ADDRESS_STYLE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Scheduler",
      "description": "Provide a value for CELERY_BROKER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "Scheduler",
      "description": "Provide a value for MIGRATION_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PGVECTOR_DATABASE",
      "service": "Scheduler",
      "description": "Provide a value for PGVECTOR_DATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_PASSWORD",
      "service": "Scheduler",
      "description": "Provide a value for PGVECTOR_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "Scheduler",
      "description": "Provide a value for PLUGIN_DAEMON_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "Scheduler",
      "description": "Provide a value for PLUGIN_DAEMON_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "Scheduler",
      "description": "Provide a value for INTERNAL_FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "Scheduler",
      "description": "Provide a value for ENDPOINT_URL_TEMPLATE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "Scheduler",
      "description": "Provide a value for CODE_EXECUTION_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MAIL_DEFAULT_SEND_FROM",
      "service": "Scheduler",
      "description": "Provide a value for MAIL_DEFAULT_SEND_FROM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_USE_AWS_MANAGED_IAM",
      "service": "Scheduler",
      "description": "Provide a value for S3_USE_AWS_MANAGED_IAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_OPPORTUNISTIC_TLS",
      "service": "Scheduler",
      "description": "Provide a value for SMTP_OPPORTUNISTIC_TLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "Scheduler",
      "description": "Provide a value for CODE_EXECUTION_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INNER_API_KEY_FOR_PLUGIN",
      "service": "Scheduler",
      "description": "Provide a value for INNER_API_KEY_FOR_PLUGIN.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LANG",
      "service": "API",
      "description": "Provide a value for LANG.",
      "secret": false,
      "strategy": "default",
      "default": "C.UTF-8"
    },
    {
      "key": "MODE",
      "service": "API",
      "description": "Provide a value for MODE.",
      "secret": false,
      "strategy": "default",
      "default": "api"
    },
    {
      "key": "PORT",
      "service": "API",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5001"
    },
    {
      "key": "LC_ALL",
      "service": "API",
      "description": "Provide a value for LC_ALL.",
      "secret": false,
      "strategy": "default",
      "default": "C.UTF-8"
    },
    {
      "key": "DB_HOST",
      "service": "API",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "API",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "API",
      "description": "Provide a value for DB_TYPE.",
      "secret": false,
      "strategy": "default",
      "default": "postgresql"
    },
    {
      "key": "REDIS_DB",
      "service": "API",
      "description": "Provide a value for REDIS_DB.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "FILES_URL",
      "service": "API",
      "description": "Provide a value for FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_REGION",
      "service": "API",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PORT",
      "service": "API",
      "description": "Email: 587 (STARTTLS) works with most providers. For 465, set SMTP_OPPORTUNISTIC_TLS to false.",
      "secret": false,
      "strategy": "default",
      "default": "587"
    },
    {
      "key": "REDIS_HOST",
      "service": "API",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "API",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "API",
      "description": "Provide a value for SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "APP_API_URL",
      "service": "API",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "APP_WEB_URL",
      "service": "API",
      "description": "Provide a value for APP_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DB_DATABASE",
      "service": "API",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "API",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "API",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "API",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TRIGGER_URL",
      "service": "API",
      "description": "Provide a value for TRIGGER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SMTP_USE_TLS",
      "service": "API",
      "description": "Email: keep true.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "API",
      "description": "Provide a value for STORAGE_TYPE.",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "VECTOR_STORE",
      "service": "API",
      "description": "Provide a value for VECTOR_STORE.",
      "secret": false,
      "strategy": "default",
      "default": "pgvector"
    },
    {
      "key": "INIT_PASSWORD",
      "service": "API",
      "description": "Locks Dify's first-run page until Setup has created your admin. Generated per deploy; you never need it.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PGVECTOR_HOST",
      "service": "API",
      "description": "Provide a value for PGVECTOR_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_PORT",
      "service": "API",
      "description": "Provide a value for PGVECTOR_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_USER",
      "service": "API",
      "description": "Provide a value for PGVECTOR_USER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "API",
      "description": "Provide a value for S3_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "API",
      "description": "Provide a value for S3_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "API",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "API",
      "description": "Provide a value for S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "API",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "API",
      "description": "Provide a value for CONSOLE_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "API",
      "description": "Provide a value for SERVICE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "GUNICORN_TIMEOUT",
      "service": "API",
      "description": "Provide a value for GUNICORN_TIMEOUT.",
      "secret": false,
      "strategy": "default",
      "default": "360"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "API",
      "description": "Provide a value for S3_ADDRESS_STYLE.",
      "secret": false,
      "strategy": "default",
      "default": "virtual"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "API",
      "description": "Provide a value for CELERY_BROKER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_BIND_ADDRESS",
      "service": "API",
      "description": "Provide a value for DIFY_BIND_ADDRESS.",
      "secret": false,
      "strategy": "default",
      "default": "[::]"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "API",
      "description": "Provide a value for MIGRATION_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PGVECTOR_DATABASE",
      "service": "API",
      "description": "Provide a value for PGVECTOR_DATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_PASSWORD",
      "service": "API",
      "description": "Provide a value for PGVECTOR_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "API",
      "description": "Provide a value for PLUGIN_DAEMON_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "API",
      "description": "Provide a value for PLUGIN_DAEMON_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "API",
      "description": "Provide a value for INTERNAL_FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "API",
      "description": "Provide a value for ENDPOINT_URL_TEMPLATE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "API",
      "description": "Provide a value for CODE_EXECUTION_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_USE_AWS_MANAGED_IAM",
      "service": "API",
      "description": "Provide a value for S3_USE_AWS_MANAGED_IAM.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SMTP_OPPORTUNISTIC_TLS",
      "service": "API",
      "description": "Email: true for port 587 (STARTTLS), false for port 465 (TLS from the start).",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "API",
      "description": "Provide a value for CODE_EXECUTION_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "INNER_API_KEY_FOR_PLUGIN",
      "service": "API",
      "description": "Provide a value for INNER_API_KEY_FOR_PLUGIN.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SERVER_WORKER_CONNECTIONS",
      "service": "API",
      "description": "Provide a value for SERVER_WORKER_CONNECTIONS.",
      "secret": false,
      "strategy": "default",
      "default": "1000"
    },
    {
      "key": "RESPECT_XFORWARD_HEADERS_ENABLED",
      "service": "API",
      "description": "Provide a value for RESPECT_XFORWARD_HEADERS_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PORT",
      "service": "Dify",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "NGINX_CONF",
      "service": "Dify",
      "description": "Provide a value for NGINX_CONF.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NGINX_ENTRYPOINT_LOCAL_RESOLVERS",
      "service": "Dify",
      "description": "Provide a value for NGINX_ENTRYPOINT_LOCAL_RESOLVERS.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "REDISHOST",
      "service": "Redis",
      "description": "Provide a value for REDISHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDISPORT",
      "service": "Redis",
      "description": "Provide a value for REDISPORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDISUSER",
      "service": "Redis",
      "description": "Provide a value for REDISUSER.",
      "secret": false,
      "strategy": "default",
      "default": "default"
    },
    {
      "key": "REDIS_URL",
      "service": "Redis",
      "description": "Provide a value for REDIS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDISPASSWORD",
      "service": "Redis",
      "description": "Provide a value for REDISPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "LANG",
      "service": "Worker",
      "description": "Provide a value for LANG.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MODE",
      "service": "Worker",
      "description": "Provide a value for MODE.",
      "secret": false,
      "strategy": "default",
      "default": "worker"
    },
    {
      "key": "LC_ALL",
      "service": "Worker",
      "description": "Provide a value for LC_ALL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_HOST",
      "service": "Worker",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "Worker",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_TYPE",
      "service": "Worker",
      "description": "Provide a value for DB_TYPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_DB",
      "service": "Worker",
      "description": "Provide a value for REDIS_DB.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FILES_URL",
      "service": "Worker",
      "description": "Provide a value for FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "Worker",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PORT",
      "service": "Worker",
      "description": "Provide a value for SMTP_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "Worker",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PORT",
      "service": "Worker",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY",
      "service": "Worker",
      "description": "Provide a value for SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_API_URL",
      "service": "Worker",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "APP_WEB_URL",
      "service": "Worker",
      "description": "Provide a value for APP_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_DATABASE",
      "service": "Worker",
      "description": "Provide a value for DB_DATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PASSWORD",
      "service": "Worker",
      "description": "Provide a value for DB_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_USERNAME",
      "service": "Worker",
      "description": "Provide a value for DB_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Worker",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_SERVER",
      "service": "Worker",
      "description": "Provide a value for SMTP_SERVER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "TRIGGER_URL",
      "service": "Worker",
      "description": "Provide a value for TRIGGER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_USE_TLS",
      "service": "Worker",
      "description": "Provide a value for SMTP_USE_TLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STORAGE_TYPE",
      "service": "Worker",
      "description": "Provide a value for STORAGE_TYPE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "VECTOR_STORE",
      "service": "Worker",
      "description": "Provide a value for VECTOR_STORE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_HOST",
      "service": "Worker",
      "description": "Provide a value for PGVECTOR_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_PORT",
      "service": "Worker",
      "description": "Provide a value for PGVECTOR_PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_USER",
      "service": "Worker",
      "description": "Provide a value for PGVECTOR_USER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "Worker",
      "description": "Provide a value for S3_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "Worker",
      "description": "Provide a value for S3_SECRET_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PASSWORD",
      "service": "Worker",
      "description": "Provide a value for SMTP_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_USERNAME",
      "service": "Worker",
      "description": "Provide a value for SMTP_USERNAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "Worker",
      "description": "Provide a value for REDIS_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "Worker",
      "description": "Provide a value for S3_BUCKET_NAME.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Worker",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Worker",
      "description": "Provide a value for CONSOLE_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVICE_API_URL",
      "service": "Worker",
      "description": "Provide a value for SERVICE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ADDRESS_STYLE",
      "service": "Worker",
      "description": "Provide a value for S3_ADDRESS_STYLE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_BROKER_URL",
      "service": "Worker",
      "description": "Provide a value for CELERY_BROKER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MIGRATION_ENABLED",
      "service": "Worker",
      "description": "Provide a value for MIGRATION_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PGVECTOR_DATABASE",
      "service": "Worker",
      "description": "Provide a value for PGVECTOR_DATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGVECTOR_PASSWORD",
      "service": "Worker",
      "description": "Provide a value for PGVECTOR_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_KEY",
      "service": "Worker",
      "description": "Provide a value for PLUGIN_DAEMON_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PLUGIN_DAEMON_URL",
      "service": "Worker",
      "description": "Provide a value for PLUGIN_DAEMON_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INTERNAL_FILES_URL",
      "service": "Worker",
      "description": "Provide a value for INTERNAL_FILES_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CELERY_WORKER_AMOUNT",
      "service": "Worker",
      "description": "Provide a value for CELERY_WORKER_AMOUNT.",
      "secret": false,
      "strategy": "default",
      "default": "4"
    },
    {
      "key": "ENDPOINT_URL_TEMPLATE",
      "service": "Worker",
      "description": "Provide a value for ENDPOINT_URL_TEMPLATE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_API_KEY",
      "service": "Worker",
      "description": "Provide a value for CODE_EXECUTION_API_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MAIL_DEFAULT_SEND_FROM",
      "service": "Worker",
      "description": "Provide a value for MAIL_DEFAULT_SEND_FROM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_USE_AWS_MANAGED_IAM",
      "service": "Worker",
      "description": "Provide a value for S3_USE_AWS_MANAGED_IAM.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_OPPORTUNISTIC_TLS",
      "service": "Worker",
      "description": "Provide a value for SMTP_OPPORTUNISTIC_TLS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CODE_EXECUTION_ENDPOINT",
      "service": "Worker",
      "description": "Provide a value for CODE_EXECUTION_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "INNER_API_KEY_FOR_PLUGIN",
      "service": "Worker",
      "description": "Provide a value for INNER_API_KEY_FOR_PLUGIN.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIFY_URL",
      "service": "Setup",
      "description": "Provide a value for DIFY_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "ADMIN_EMAIL",
      "service": "Setup",
      "description": "Your email address. You sign in to Dify with it; Setup creates this admin on the first deploy.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "DIFY_API_URL",
      "service": "Setup",
      "description": "Provide a value for DIFY_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "INIT_PASSWORD",
      "service": "Setup",
      "description": "Provide a value for INIT_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ADMIN_PASSWORD",
      "service": "Setup",
      "description": "Your Dify password: at least 8 characters, with a letter and a number.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "PGHOST",
      "service": "Postgres",
      "description": "Provide a value for PGHOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PGPORT",
      "service": "Postgres",
      "description": "Provide a value for PGPORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGUSER",
      "service": "Postgres",
      "description": "Provide a value for PGUSER.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGDATABASE",
      "service": "Postgres",
      "description": "Provide a value for PGDATABASE.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGPASSWORD",
      "service": "Postgres",
      "description": "Provide a value for PGPASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "default",
      "default": "dify"
    },
    {
      "key": "DATABASE_URL",
      "service": "Postgres",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres",
      "description": "Provide a value for RAILWAY_DEPLOYMENT_DRAINING_SECONDS.",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "PORT",
      "service": "Web",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "HOSTNAME",
      "service": "Web",
      "description": "Provide a value for HOSTNAME.",
      "secret": false,
      "strategy": "default",
      "default": "::"
    },
    {
      "key": "APP_API_URL",
      "service": "Web",
      "description": "Provide a value for APP_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "MAX_TOOLS_NUM",
      "service": "Web",
      "description": "Provide a value for MAX_TOOLS_NUM.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "MAX_TREE_DEPTH",
      "service": "Web",
      "description": "Provide a value for MAX_TREE_DEPTH.",
      "secret": false,
      "strategy": "default",
      "default": "50"
    },
    {
      "key": "CONSOLE_API_URL",
      "service": "Web",
      "description": "Provide a value for CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "CONSOLE_WEB_URL",
      "service": "Web",
      "description": "Provide a value for CONSOLE_WEB_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "MARKETPLACE_URL",
      "service": "Web",
      "description": "Provide a value for MARKETPLACE_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "TOP_K_MAX_VALUE",
      "service": "Web",
      "description": "Provide a value for TOP_K_MAX_VALUE.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "MAX_ITERATIONS_NUM",
      "service": "Web",
      "description": "Provide a value for MAX_ITERATIONS_NUM.",
      "secret": false,
      "strategy": "default",
      "default": "99"
    },
    {
      "key": "MAX_PARALLEL_LIMIT",
      "service": "Web",
      "description": "Provide a value for MAX_PARALLEL_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "LOOP_NODE_MAX_COUNT",
      "service": "Web",
      "description": "Provide a value for LOOP_NODE_MAX_COUNT.",
      "secret": false,
      "strategy": "default",
      "default": "100"
    },
    {
      "key": "MARKETPLACE_API_URL",
      "service": "Web",
      "description": "Provide a value for MARKETPLACE_API_URL.",
      "secret": false,
      "strategy": "default",
      "default": "https://marketplace.dify.ai"
    },
    {
      "key": "NEXT_PUBLIC_SOCKET_URL",
      "service": "Web",
      "description": "Provide a value for NEXT_PUBLIC_SOCKET_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SERVER_CONSOLE_API_URL",
      "service": "Web",
      "description": "Provide a value for SERVER_CONSOLE_API_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NEXT_TELEMETRY_DISABLED",
      "service": "Web",
      "description": "Provide a value for NEXT_TELEMETRY_DISABLED.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "TEXT_GENERATION_TIMEOUT_MS",
      "service": "Web",
      "description": "Provide a value for TEXT_GENERATION_TIMEOUT_MS.",
      "secret": false,
      "strategy": "default",
      "default": "60000"
    },
    {
      "key": "NEXT_PUBLIC_ENABLE_AGENT_V2",
      "service": "Web",
      "description": "Provide a value for NEXT_PUBLIC_ENABLE_AGENT_V2.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH",
      "service": "Web",
      "description": "Provide a value for INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH.",
      "secret": true,
      "strategy": "default",
      "default": "4000"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "dify-w-ai-model-setup"
      }
    },
    "cli": "railway deploy --template dify-w-ai-model-setup",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "7b6dbfc5-a0b7-4f8e-9057-82def96b899a",
            "serializedConfig": {
              "buckets": {
                "95f977e5-9cc5-4489-a588-7f0de6738280": {
                  "name": "Bucket"
                }
              },
              "services": {
                "14b26ad6-eb75-47cd-8d80-f96fd0ed54f1": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "Sandbox",
                  "deploy": {
                    "startCommand": "/bin/bash -c \"if test -f $NODE_TAR_XZ; then tar -xf $NODE_TAR_XZ -C /opt; rm -f $NODE_TAR_XZ; fi; mkdir -p /usr/local/bin; ln -sf $NODE_DIR/bin/node /usr/local/bin/node; exec /main\"",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-sandbox:0.2.15"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8194"
                    },
                    "API_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{API_KEY}}"
                    },
                    "GIN_MODE": {
                      "isOptional": false,
                      "defaultValue": "release"
                    },
                    "SANDBOX_PORT": {
                      "isOptional": false,
                      "defaultValue": "8194"
                    },
                    "ENABLE_NETWORK": {
                      "isOptional": false,
                      "defaultValue": "true"
                    },
                    "WORKER_TIMEOUT": {
                      "isOptional": false,
                      "defaultValue": "15"
                    }
                  }
                },
                "153ed285-9a47-4856-bcc9-10c930ff6dcd": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "Plugin daemon",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/health/check",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-plugin-daemon:0.6.12-local"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "5002"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGPORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "defaultValue": "postgresql"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{Redis.REDISHOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{Redis.REDISPORT}}"
                    },
                    "SERVER_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{SERVER_KEY}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "dify_plugin"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_SSL_MODE": {
                      "isOptional": false,
                      "defaultValue": "disable"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "SERVER_PORT": {
                      "isOptional": false,
                      "defaultValue": "5002"
                    },
                    "PPROF_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "RAILWAY_RUN_UID": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "DIFY_INNER_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.INNER_API_KEY_FOR_PLUGIN}}"
                    },
                    "DIFY_INNER_API_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "PLUGIN_STORAGE_TYPE": {
                      "isOptional": false,
                      "defaultValue": "local"
                    },
                    "PLUGIN_WORKING_PATH": {
                      "isOptional": false,
                      "defaultValue": "/app/storage/cwd"
                    },
                    "PLUGIN_INSTALLED_PATH": {
                      "isOptional": false,
                      "defaultValue": "plugin"
                    },
                    "MAX_PLUGIN_PACKAGE_SIZE": {
                      "isOptional": false,
                      "defaultValue": "52428800"
                    },
                    "PLUGIN_MEDIA_CACHE_PATH": {
                      "isOptional": false,
                      "defaultValue": "assets"
                    },
                    "PYTHON_ENV_INIT_TIMEOUT": {
                      "isOptional": false,
                      "defaultValue": "120"
                    },
                    "FORCE_VERIFYING_SIGNATURE": {
                      "isOptional": false,
                      "defaultValue": "true"
                    },
                    "PLUGIN_PACKAGE_CACHE_PATH": {
                      "isOptional": false,
                      "defaultValue": "plugin_packages"
                    },
                    "PLUGIN_STORAGE_LOCAL_ROOT": {
                      "isOptional": false,
                      "defaultValue": "/app/storage"
                    },
                    "PLUGIN_MAX_EXECUTION_TIMEOUT": {
                      "isOptional": false,
                      "defaultValue": "600"
                    },
                    "PLUGIN_REMOTE_INSTALLING_HOST": {
                      "isOptional": false,
                      "defaultValue": "0.0.0.0"
                    },
                    "PLUGIN_REMOTE_INSTALLING_PORT": {
                      "isOptional": false,
                      "defaultValue": "5003"
                    }
                  },
                  "volumeMounts": {
                    "153ed285-9a47-4856-bcc9-10c930ff6dcd": {
                      "mountPath": "/app/storage"
                    }
                  }
                },
                "178663a8-29dd-481d-ab7c-c83dd16abebd": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "Scheduler",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.18.0"
                  },
                  "variables": {
                    "LANG": {
                      "isOptional": false,
                      "defaultValue": "${{API.LANG}}"
                    },
                    "MODE": {
                      "isOptional": false,
                      "defaultValue": "beat"
                    },
                    "LC_ALL": {
                      "isOptional": false,
                      "defaultValue": "${{API.LC_ALL}}"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_HOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_PORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_TYPE}}"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_DB}}"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.FILES_URL}}"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_REGION}}"
                    },
                    "SMTP_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.SMTP_PORT}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_HOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_PORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.APP_API_URL}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.APP_WEB_URL}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_DATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_PASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_USERNAME}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_ENDPOINT}}"
                    },
                    "SMTP_SERVER": {
                      "isOptional": true,
                      "defaultValue": "${{API.SMTP_SERVER}}"
                    },
                    "TRIGGER_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.TRIGGER_URL}}"
                    },
                    "SMTP_USE_TLS": {
                      "isOptional": false,
                      "defaultValue": "${{API.SMTP_USE_TLS}}"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "defaultValue": "${{API.STORAGE_TYPE}}"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "defaultValue": "${{API.VECTOR_STORE}}"
                    },
                    "PGVECTOR_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_HOST}}"
                    },
                    "PGVECTOR_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_PORT}}"
                    },
                    "PGVECTOR_USER": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_USER}}"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_ACCESS_KEY}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_SECRET_KEY}}"
                    },
                    "SMTP_PASSWORD": {
                      "isOptional": true,
                      "defaultValue": "${{API.SMTP_PASSWORD}}"
                    },
                    "SMTP_USERNAME": {
                      "isOptional": true,
                      "defaultValue": "${{API.SMTP_USERNAME}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_BUCKET_NAME}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.CONSOLE_API_URL}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.CONSOLE_WEB_URL}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.SERVICE_API_URL}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_ADDRESS_STYLE}}"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.CELERY_BROKER_URL}}"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "PGVECTOR_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_DATABASE}}"
                    },
                    "PGVECTOR_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_PASSWORD}}"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.PLUGIN_DAEMON_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.PLUGIN_DAEMON_URL}}"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.INTERNAL_FILES_URL}}"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "isOptional": false,
                      "defaultValue": "${{API.ENDPOINT_URL_TEMPLATE}}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.CODE_EXECUTION_API_KEY}}"
                    },
                    "MAIL_DEFAULT_SEND_FROM": {
                      "isOptional": true,
                      "defaultValue": "${{API.MAIL_DEFAULT_SEND_FROM}}"
                    },
                    "S3_USE_AWS_MANAGED_IAM": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_USE_AWS_MANAGED_IAM}}"
                    },
                    "SMTP_OPPORTUNISTIC_TLS": {
                      "isOptional": false,
                      "defaultValue": "${{API.SMTP_OPPORTUNISTIC_TLS}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "${{API.CODE_EXECUTION_ENDPOINT}}"
                    },
                    "INNER_API_KEY_FOR_PLUGIN": {
                      "isOptional": false,
                      "defaultValue": "${{API.INNER_API_KEY_FOR_PLUGIN}}"
                    }
                  }
                },
                "2c5426e4-5f6d-4bc3-b9c4-36dff5367fe1": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "API",
                  "deploy": {
                    "startCommand": "/bin/bash -c \"case x$SMTP_SERVER in x) ;; *) export MAIL_TYPE=smtp ;; esac; exec /bin/bash /entrypoint.sh\"",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.18.0"
                  },
                  "variables": {
                    "LANG": {
                      "isOptional": false,
                      "defaultValue": "C.UTF-8"
                    },
                    "MODE": {
                      "isOptional": false,
                      "defaultValue": "api"
                    },
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "5001"
                    },
                    "LC_ALL": {
                      "isOptional": false,
                      "defaultValue": "C.UTF-8"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGPORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "defaultValue": "postgresql"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "defaultValue": "0"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "defaultValue": "${{Bucket.REGION}}"
                    },
                    "SMTP_PORT": {
                      "description": "Email: 587 (STARTTLS) works with most providers. For 465, set SMTP_OPPORTUNISTIC_TLS to false.",
                      "defaultValue": "587"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{Redis.REDISHOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{Redis.REDISPORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGDATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "${{Bucket.ENDPOINT}}"
                    },
                    "SMTP_SERVER": {
                      "isOptional": true,
                      "description": "Email: your SMTP server, e.g. smtp.gmail.com, smtp-relay.brevo.com, smtp.sendgrid.net or smtp.resend.com. Email over SMTP needs a Railway Pro plan; Free, Trial and Hobby block it. Leave empty to skip email: invitations then give you a link to copy, and password resets aren't sent.",
                      "defaultValue": ""
                    },
                    "TRIGGER_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SMTP_USE_TLS": {
                      "description": "Email: keep true.",
                      "defaultValue": "true"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "defaultValue": "s3"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "defaultValue": "pgvector"
                    },
                    "INIT_PASSWORD": {
                      "description": "Locks Dify's first-run page until Setup has created your admin. Generated per deploy; you never need it.",
                      "defaultValue": "{{INIT_PASSWORD}}"
                    },
                    "PGVECTOR_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGHOST}}"
                    },
                    "PGVECTOR_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGPORT}}"
                    },
                    "PGVECTOR_USER": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGUSER}}"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{Bucket.ACCESS_KEY_ID}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{Bucket.SECRET_ACCESS_KEY}}"
                    },
                    "SMTP_PASSWORD": {
                      "isOptional": true,
                      "description": "Email: SMTP password. Gmail: turn on 2-Step Verification, create an app password at myaccount.google.com/apppasswords and paste its 16 characters without spaces. SendGrid, Brevo, Resend: your SMTP or API key.",
                      "defaultValue": ""
                    },
                    "SMTP_USERNAME": {
                      "isOptional": true,
                      "description": "Email: SMTP username. Gmail: your full Gmail address. SendGrid: apikey. Resend: resend. Brevo: the login shown on its SMTP page.",
                      "defaultValue": ""
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{Redis.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "${{Bucket.BUCKET}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "GUNICORN_TIMEOUT": {
                      "isOptional": false,
                      "defaultValue": "360"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "defaultValue": "virtual"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://:${{Redis.REDIS_PASSWORD}}@${{Redis.REDISHOST}}:${{Redis.REDISPORT}}/1"
                    },
                    "DIFY_BIND_ADDRESS": {
                      "isOptional": false,
                      "defaultValue": "[::]"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "true"
                    },
                    "PGVECTOR_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.PGDATABASE}}"
                    },
                    "PGVECTOR_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{Plugin daemon.SERVER_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{Plugin daemon.RAILWAY_PRIVATE_DOMAIN}}:5002"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}/e/{hook_id}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{Sandbox.API_KEY}}"
                    },
                    "MAIL_DEFAULT_SEND_FROM": {
                      "isOptional": true,
                      "description": "Email: the \"from\" address, e.g. Dify <you@gmail.com>. With Gmail, use your own Gmail address; with other providers, an address or domain they have verified.",
                      "defaultValue": ""
                    },
                    "S3_USE_AWS_MANAGED_IAM": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "SMTP_OPPORTUNISTIC_TLS": {
                      "description": "Email: true for port 587 (STARTTLS), false for port 465 (TLS from the start).",
                      "defaultValue": "true"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "http://${{Sandbox.RAILWAY_PRIVATE_DOMAIN}}:8194"
                    },
                    "INNER_API_KEY_FOR_PLUGIN": {
                      "isOptional": false,
                      "defaultValue": "{{INNER_API_KEY_FOR_PLUGIN}}"
                    },
                    "SERVER_WORKER_CONNECTIONS": {
                      "isOptional": false,
                      "defaultValue": "1000"
                    },
                    "RESPECT_XFORWARD_HEADERS_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "true"
                    }
                  }
                },
                "434e846f-a35c-4774-9938-82f3d2f2df00": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "Dify",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"mkdir -p /etc/nginx/templates && printenv NGINX_CONF > /etc/nginx/templates/default.conf.template && exec /docker-entrypoint.sh nginx -g 'daemon off;'\"",
                    "healthcheckPath": "/healthz",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nginx:1.31-alpine"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8080"
                    },
                    "NGINX_CONF": {
                      "isOptional": false,
                      "defaultValue": "map $http_upgrade $connection_upgrade {\n  default upgrade;\n  ''      '';\n}\n\nserver {\n  listen ${PORT};\n  listen [::]:${PORT};\n  server_name _;\n  client_max_body_size 100M;\n  resolver ${NGINX_LOCAL_RESOLVERS} valid=10s;\n\n  # The visitor's address, for Dify's rate limits and login records. Railway's edge sends it in X-Real-IP;\n  # its X-Forwarded-For ends with an edge hop instead.\n  set_real_ip_from 100.64.0.0/10;\n  set_real_ip_from fd00::/8;\n  real_ip_header X-Real-IP;\n\n  set $api http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001;\n  set $web http://${{Web.RAILWAY_PRIVATE_DOMAIN}}:3000;\n  set $plugin http://${{Plugin daemon.RAILWAY_PRIVATE_DOMAIN}}:5002;\n\n  proxy_http_version 1.1;\n  proxy_set_header Host $host;\n  proxy_set_header X-Forwarded-For $remote_addr;\n  proxy_set_header X-Forwarded-Proto https;\n  proxy_set_header Upgrade $http_upgrade;\n  proxy_set_header Connection $connection_upgrade;\n  proxy_buffering off;\n  proxy_read_timeout 3600s;\n  proxy_send_timeout 3600s;\n\n  location = /healthz { access_log off; return 200 \"ok\\n\"; }\n\n  location /console/api { proxy_pass $api; }\n  location /api { proxy_pass $api; }\n  location /v1 { proxy_pass $api; }\n  location /openapi { proxy_pass $api; }\n  location /files { proxy_pass $api; }\n  location /mcp { proxy_pass $api; }\n  location /triggers { proxy_pass $api; }\n  location /socket.io/ { proxy_pass $api; }\n  location /e/ { proxy_pass $plugin; }\n  location / { proxy_pass $web; }\n}\n"
                    },
                    "NGINX_ENTRYPOINT_LOCAL_RESOLVERS": {
                      "isOptional": false,
                      "defaultValue": "1"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "5ae487f7-0abe-457f-bccc-d59a81a4d0f1": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/redis.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"
                  },
                  "variables": {
                    "REDISHOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDISPORT": {
                      "isOptional": false,
                      "defaultValue": "6379"
                    },
                    "REDISUSER": {
                      "isOptional": false,
                      "defaultValue": "default"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "defaultValue": "redis://${{REDISUSER}}:${{REDIS_PASSWORD}}@${{REDISHOST}}:${{REDISPORT}}"
                    },
                    "REDISPASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{REDIS_PASSWORD}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "5ae487f7-0abe-457f-bccc-d59a81a4d0f1": {
                      "mountPath": "/data"
                    }
                  }
                },
                "77469f6e-62ac-433b-8c9e-aafa9702d84d": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "Worker",
                  "deploy": {
                    "startCommand": "/bin/bash -c \"case x$SMTP_SERVER in x) ;; *) export MAIL_TYPE=smtp ;; esac; exec /bin/bash /entrypoint.sh\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-api:1.18.0"
                  },
                  "variables": {
                    "LANG": {
                      "isOptional": false,
                      "defaultValue": "${{API.LANG}}"
                    },
                    "MODE": {
                      "isOptional": false,
                      "defaultValue": "worker"
                    },
                    "LC_ALL": {
                      "isOptional": false,
                      "defaultValue": "${{API.LC_ALL}}"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_HOST}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_PORT}}"
                    },
                    "DB_TYPE": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_TYPE}}"
                    },
                    "REDIS_DB": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_DB}}"
                    },
                    "FILES_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.FILES_URL}}"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_REGION}}"
                    },
                    "SMTP_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.SMTP_PORT}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_HOST}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_PORT}}"
                    },
                    "SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.SECRET_KEY}}"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.APP_API_URL}}"
                    },
                    "APP_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.APP_WEB_URL}}"
                    },
                    "DB_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_DATABASE}}"
                    },
                    "DB_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_PASSWORD}}"
                    },
                    "DB_USERNAME": {
                      "isOptional": false,
                      "defaultValue": "${{API.DB_USERNAME}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_ENDPOINT}}"
                    },
                    "SMTP_SERVER": {
                      "isOptional": true,
                      "defaultValue": "${{API.SMTP_SERVER}}"
                    },
                    "TRIGGER_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.TRIGGER_URL}}"
                    },
                    "SMTP_USE_TLS": {
                      "isOptional": false,
                      "defaultValue": "${{API.SMTP_USE_TLS}}"
                    },
                    "STORAGE_TYPE": {
                      "isOptional": false,
                      "defaultValue": "${{API.STORAGE_TYPE}}"
                    },
                    "VECTOR_STORE": {
                      "isOptional": false,
                      "defaultValue": "${{API.VECTOR_STORE}}"
                    },
                    "PGVECTOR_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_HOST}}"
                    },
                    "PGVECTOR_PORT": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_PORT}}"
                    },
                    "PGVECTOR_USER": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_USER}}"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_ACCESS_KEY}}"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_SECRET_KEY}}"
                    },
                    "SMTP_PASSWORD": {
                      "isOptional": true,
                      "defaultValue": "${{API.SMTP_PASSWORD}}"
                    },
                    "SMTP_USERNAME": {
                      "isOptional": true,
                      "defaultValue": "${{API.SMTP_USERNAME}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.REDIS_PASSWORD}}"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_BUCKET_NAME}}"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.CONSOLE_API_URL}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.CONSOLE_WEB_URL}}"
                    },
                    "SERVICE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.SERVICE_API_URL}}"
                    },
                    "S3_ADDRESS_STYLE": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_ADDRESS_STYLE}}"
                    },
                    "CELERY_BROKER_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.CELERY_BROKER_URL}}"
                    },
                    "MIGRATION_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "PGVECTOR_DATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_DATABASE}}"
                    },
                    "PGVECTOR_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.PGVECTOR_PASSWORD}}"
                    },
                    "PLUGIN_DAEMON_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.PLUGIN_DAEMON_KEY}}"
                    },
                    "PLUGIN_DAEMON_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.PLUGIN_DAEMON_URL}}"
                    },
                    "INTERNAL_FILES_URL": {
                      "isOptional": false,
                      "defaultValue": "${{API.INTERNAL_FILES_URL}}"
                    },
                    "CELERY_WORKER_AMOUNT": {
                      "isOptional": false,
                      "defaultValue": "4"
                    },
                    "ENDPOINT_URL_TEMPLATE": {
                      "isOptional": false,
                      "defaultValue": "${{API.ENDPOINT_URL_TEMPLATE}}"
                    },
                    "CODE_EXECUTION_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "${{API.CODE_EXECUTION_API_KEY}}"
                    },
                    "MAIL_DEFAULT_SEND_FROM": {
                      "isOptional": true,
                      "defaultValue": "${{API.MAIL_DEFAULT_SEND_FROM}}"
                    },
                    "S3_USE_AWS_MANAGED_IAM": {
                      "isOptional": false,
                      "defaultValue": "${{API.S3_USE_AWS_MANAGED_IAM}}"
                    },
                    "SMTP_OPPORTUNISTIC_TLS": {
                      "isOptional": false,
                      "defaultValue": "${{API.SMTP_OPPORTUNISTIC_TLS}}"
                    },
                    "CODE_EXECUTION_ENDPOINT": {
                      "isOptional": false,
                      "defaultValue": "${{API.CODE_EXECUTION_ENDPOINT}}"
                    },
                    "INNER_API_KEY_FOR_PLUGIN": {
                      "isOptional": false,
                      "defaultValue": "${{API.INNER_API_KEY_FOR_PLUGIN}}"
                    }
                  }
                },
                "789f16c6-60bd-43e1-b2d0-9723837b1a5b": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/setup.svg",
                  "name": "Setup",
                  "deploy": {
                    "startCommand": "./run.sh Ly8gT25lLXRpbWUgc2V0dXAgZm9yIHRoZSAiRGlmeSAody8gQUkgbW9kZWwgc2V0dXApIiB0ZW1wbGF0ZSwgcnVuIGFzIGEgUmFpbHdheSBGdW5jdGlvbiAoZ2hjci5pby9yYWlsd2F5YXBwL2Z1bmN0aW9uLWJ1bikuCi8vIDEuIENyZWF0ZXMgRGlmeSdzIGZpcnN0IGFkbWluIGZyb20gdGhlIGRlcGxveSBmb3JtLCBzbyBub2JvZHkgZWxzZSBjYW4gY2xhaW0gdGhlIC9pbnN0YWxsIHBhZ2UgZmlyc3QuCi8vIDIuIEZvciBlYWNoIG1vZGVsIGtleSBvbiB0aGUgZm9ybSAoT3BlbkFJLCBBbnRocm9waWMsIE9wZW5Sb3V0ZXIpOiBpbnN0YWxscyB0aGUgcHJvdmlkZXIncyBwbHVnaW4gZnJvbSBEaWZ5J3MKLy8gICAgbWFya2V0cGxhY2UsIGFkZHMgdGhlIGtleSwgYW5kIHNldHMgZGVmYXVsdCBjaGF0IGFuZCBlbWJlZGRpbmcgbW9kZWxzLCBzbyB0aGUgZmlyc3QgYXBwIHdvcmtzIHJpZ2h0IGFmdGVyIHNpZ24taW4uCi8vIFNhZmUgdG8gcnVuIGFnYWluOiBldmVyeSBzdGVwIGNoZWNrcyB3aGF0IGFscmVhZHkgZXhpc3RzLiBSZWRlcGxveSBTZXR1cCBhZnRlciBhZGRpbmcgYSBrZXkgbGF0ZXIuCi8vIEJ1aWxkIHRoZSB0ZW1wbGF0ZSdzIHN0YXJ0IGNvbW1hbmQgZnJvbSB0aGlzIGZpbGU6ICIuL3J1bi5zaCAiICsgYmFzZTY0KGZpbGUpLgovLwovLyBWYXJpYWJsZXM6IERJRllfQVBJX1VSTCAocHJpdmF0ZSBBUEkgVVJMKSwgRElGWV9VUkwgKHB1YmxpYyBVUkwsIGZvciB0aGUgbG9nKSwgSU5JVF9QQVNTV09SRCAodGhlIEFQSSdzKSwKLy8gQURNSU5fRU1BSUwsIEFETUlOX1BBU1NXT1JELCBBRE1JTl9OQU1FLCBPUEVOQUlfQVBJX0tFWSwgQU5USFJPUElDX0FQSV9LRVksIE9QRU5ST1VURVJfQVBJX0tFWS4KCmNvbnN0IEFQSSA9IChwcm9jZXNzLmVudi5ESUZZX0FQSV9VUkwgPz8gJycpLnJlcGxhY2UoL1wvJC8sICcnKTsKY29uc3QgVVJMXyA9IChwcm9jZXNzLmVudi5ESUZZX1VSTCA/PyAnJykucmVwbGFjZSgvXC8kLywgJycpOwpjb25zdCBJTklUID0gcHJvY2Vzcy5lbnYuSU5JVF9QQVNTV09SRCA/PyAnJzsKY29uc3QgRU1BSUwgPSAocHJvY2Vzcy5lbnYuQURNSU5fRU1BSUwgPz8gJycpLnRyaW0oKTsKY29uc3QgUEFTU1dPUkQgPSBwcm9jZXNzLmVudi5BRE1JTl9QQVNTV09SRCA/PyAnJzsKY29uc3QgTkFNRSA9IChwcm9jZXNzLmVudi5BRE1JTl9OQU1FID8/ICcnKS50cmltKCkgfHwgJ0FkbWluJzsKY29uc3QgTUFSS0VUUExBQ0UgPSAnaHR0cHM6Ly9tYXJrZXRwbGFjZS5kaWZ5LmFpL2FwaS92MS9wbHVnaW5zJzsKCi8vIFByb3ZpZGVycyBpbiB0aGUgb3JkZXIgdGhleSB3aW4gdGhlIGRlZmF1bHQgY2hhdCBtb2RlbC4gTW9kZWwgbGlzdHMgYXJlIHRyaWVkIGluIG9yZGVyOyB0aGUgZmlyc3Qgb25lIHRoZQovLyBwbHVnaW4gb2ZmZXJzIGJlY29tZXMgdGhlIGRlZmF1bHQsIHNvIG5ld2VyIHBsdWdpbiB2ZXJzaW9ucyB0aGF0IGRyb3AgYSBtb2RlbCBzdGlsbCBnZXQgYSBzZW5zaWJsZSBjaG9pY2UuCmNvbnN0IFBST1ZJREVSUyA9IFsKICB7IGtleTogcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVksIGxhYmVsOiAnT3BlbkFJJywgcGx1Z2luOiAnbGFuZ2dlbml1cy9vcGVuYWknLCBwcm92aWRlcjogJ2xhbmdnZW5pdXMvb3BlbmFpL29wZW5haScsIGZpZWxkOiAnb3BlbmFpX2FwaV9rZXknLAogICAgbGxtOiBbJ2dwdC01LjQtbWluaScsICdncHQtNS1taW5pJywgJ2dwdC00LjEtbWluaScsICdncHQtNG8tbWluaSddLCBlbWJlZGRpbmc6IFsndGV4dC1lbWJlZGRpbmctMy1zbWFsbCddIH0sCiAgeyBrZXk6IHByb2Nlc3MuZW52LkFOVEhST1BJQ19BUElfS0VZLCBsYWJlbDogJ0FudGhyb3BpYycsIHBsdWdpbjogJ2xhbmdnZW5pdXMvYW50aHJvcGljJywgcHJvdmlkZXI6ICdsYW5nZ2VuaXVzL2FudGhyb3BpYy9hbnRocm9waWMnLCBmaWVsZDogJ2FudGhyb3BpY19hcGlfa2V5JywKICAgIGxsbTogWydjbGF1ZGUtc29ubmV0LTUtNScsICdjbGF1ZGUtc29ubmV0LTUnLCAnY2xhdWRlLXNvbm5ldC00LTYnLCAnY2xhdWRlLXNvbm5ldC00LTUnXSwgZW1iZWRkaW5nOiBbXSB9LAogIHsga2V5OiBwcm9jZXNzLmVudi5PUEVOUk9VVEVSX0FQSV9LRVksIGxhYmVsOiAnT3BlblJvdXRlcicsIHBsdWdpbjogJ2xhbmdnZW5pdXMvb3BlbnJvdXRlcicsIHByb3ZpZGVyOiAnbGFuZ2dlbml1cy9vcGVucm91dGVyL29wZW5yb3V0ZXInLCBmaWVsZDogJ2FwaV9rZXknLAogICAgbGxtOiBbJ29wZW5haS9ncHQtNC4xLW1pbmknLCAnb3BlbmFpL2dwdC00by1taW5pJ10sIGVtYmVkZGluZzogWydvcGVuYWkvdGV4dC1lbWJlZGRpbmctMy1zbWFsbCddIH0sCl0ubWFwKChwKSA9PiAoeyAuLi5wLCBrZXk6IChwLmtleSA/PyAnJykudHJpbSgpIH0pKTsKCmNvbnN0IGxvZyA9IChtc2c6IHN0cmluZykgPT4gY29uc29sZS5sb2coYFtzZXR1cF0gJHttc2d9YCk7CmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7CmNvbnN0IEZJWCA9ICdDaGFuZ2UgaXQgaW4gdGhlIFNldHVwIHNlcnZpY2VcJ3MgVmFyaWFibGVzIGFuZCByZWRlcGxveSBTZXR1cC4nOwovLyBFeGl0IDAgb24gZmFpbHVyZSB0b28sIHNvIGEgc2V0dXAgcHJvYmxlbSBuZXZlciBtYXJrcyB0aGUgZGVwbG95IGFzIGZhaWxlZDsgdGhlIGxvZyBzYXlzIGhvdyB0byBmaW5pc2guCmNvbnN0IHN0b3AgPSAobXNnOiBzdHJpbmcpOiBuZXZlciA9PiB7IGxvZyhtc2cpOyBwcm9jZXNzLmV4aXQoMCk7IH07CgppZiAoIUFQSSB8fCAhRU1BSUwgfHwgIVBBU1NXT1JEKSBzdG9wKCdtaXNzaW5nIERJRllfQVBJX1VSTCwgQURNSU5fRU1BSUwgb3IgQURNSU5fUEFTU1dPUkQnKTsKaWYgKCEvXlteQFxzXStAW15AXHNdK1wuW15AXHNdKyQvLnRlc3QoRU1BSUwpKSBzdG9wKGBBRE1JTl9FTUFJTCAiJHtFTUFJTH0iIGlzIG5vdCBhbiBlbWFpbCBhZGRyZXNzLiAke0ZJWH1gKTsKLy8gRGlmeSdzIHBhc3N3b3JkIHJ1bGUgKGFwaS9saWJzL3Bhc3N3b3JkLnB5KTogOCsgY2hhcmFjdGVycyB3aXRoIGF0IGxlYXN0IG9uZSBsZXR0ZXIgYW5kIG9uZSBudW1iZXIuCmlmICghL14oPz0uKlthLXpBLVpdKSg/PS4qXGQpLns4LH0kLy50ZXN0KFBBU1NXT1JEKSkgewogIHN0b3AoYEFETUlOX1BBU1NXT1JEIGlzIHRvbyB3ZWFrIGZvciBEaWZ5OiBpdCBuZWVkcyBhdCBsZWFzdCA4IGNoYXJhY3RlcnMsIHdpdGggYSBsZXR0ZXIgYW5kIGEgbnVtYmVyLiAke0ZJWH1gKTsKfQoKLy8gVGhlIEFQSSBydW5zIGl0cyBkYXRhYmFzZSBtaWdyYXRpb25zIGJlZm9yZSBpdCBhbnN3ZXJzLCB3aGljaCB0YWtlcyBhIG1pbnV0ZSBvciB0d28gb24gdGhlIGZpcnN0IGRlcGxveS4KbGV0IHVwID0gZmFsc2U7CmZvciAobGV0IGkgPSAwOyBpIDwgOTAgJiYgIXVwOyBpKyspIHsKICB0cnkgeyB1cCA9IChhd2FpdCBmZXRjaChgJHtBUEl9L2hlYWx0aGApKS5vazsgfSBjYXRjaCB7fQogIGlmICghdXApIGF3YWl0IHNsZWVwKDEwXzAwMCk7Cn0KaWYgKCF1cCkgc3RvcChgdGhlIERpZnkgQVBJIGRpZCBub3QgY29tZSB1cCB3aXRoaW4gMTUgbWludXRlcyAoJHtBUEl9L2hlYWx0aClgKTsKbG9nKCdEaWZ5IEFQSSBpcyB1cCcpOwoKLy8gMS4gVGhlIGFkbWluLiBJTklUX1BBU1NXT1JEIGxvY2tzIERpZnkncyAvaW5zdGFsbCBwYWdlIHVudGlsIGl0IGlzIGVudGVyZWQ7IFNldHVwIGVudGVycyBpdCwgdGhlbiBjcmVhdGVzIHRoZSBhZG1pbi4KY29uc3Qgc3RhdGU6IGFueSA9IGF3YWl0IChhd2FpdCBmZXRjaChgJHtBUEl9L2NvbnNvbGUvYXBpL3NldHVwYCkpLmpzb24oKTsKaWYgKHN0YXRlLnN0ZXAgPT09ICdmaW5pc2hlZCcpIHsKICBsb2coJ0RpZnkgYWxyZWFkeSBoYXMgYW4gYWRtaW4nKTsKfSBlbHNlIHsKICBsZXQgY29va2llID0gJyc7CiAgaWYgKElOSVQpIHsKICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSX0vY29uc29sZS9hcGkvaW5pdGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhc3N3b3JkOiBJTklUIH0pIH0pOwogICAgaWYgKCFyZXMub2spIHN0b3AoYERpZnkgcmVmdXNlZCBJTklUX1BBU1NXT1JEIChIVFRQICR7cmVzLnN0YXR1c30pOyBpdCBtdXN0IG1hdGNoIHRoZSBBUEkgc2VydmljZSdzIElOSVRfUEFTU1dPUkRgKTsKICAgIGNvb2tpZSA9IChyZXMuaGVhZGVycy5nZXRTZXRDb29raWU/LigpID8/IFtdKS5tYXAoKGMpID0+IGMuc3BsaXQoJzsnKVswXSkuam9pbignOyAnKTsKICB9CiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJfS9jb25zb2xlL2FwaS9zZXR1cGAsIHsKICAgIG1ldGhvZDogJ1BPU1QnLAogICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb29raWUgfSwKICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW1haWw6IEVNQUlMLCBuYW1lOiBOQU1FLCBwYXNzd29yZDogUEFTU1dPUkQsIGxhbmd1YWdlOiAnZW4tVVMnIH0pLAogIH0pOwogIGlmICghcmVzLm9rKSBzdG9wKGBjcmVhdGluZyB0aGUgRGlmeSBhZG1pbiBmYWlsZWQgKEhUVFAgJHtyZXMuc3RhdHVzfTogJHsoYXdhaXQgcmVzLnRleHQoKSkuc2xpY2UoMCwgMjAwKX0pYCk7CiAgbG9nKGBjcmVhdGVkIHRoZSBEaWZ5IGFkbWluICR7RU1BSUx9YCk7Cn0KCmNvbnN0IHdhbnRlZCA9IFBST1ZJREVSUy5maWx0ZXIoKHApID0+IHAua2V5KTsKaWYgKCF3YW50ZWQubGVuZ3RoKSBzdG9wKGBubyBtb2RlbCBrZXkgZ2l2ZW47IGFkZCBvbmUgaW4gRGlmeSAoU2V0dGluZ3MsIE1vZGVsIFByb3ZpZGVyKS4gRGlmeSBpcyByZWFkeTogb3BlbiAke1VSTF8gfHwgJ3RoZSBEaWZ5IHNlcnZpY2UgVVJMJ30gYW5kIHNpZ24gaW4uYCk7CgovLyAyLiBTaWduIGluIGFzIHRoZSBhZG1pbiwgdGhlIHdheSB0aGUgd2ViIGFwcCBkb2VzIChwYXNzd29yZCBiYXNlNjQtZW5jb2RlZDsgc2Vzc2lvbiBpbiBjb29raWVzLCBDU1JGIHRva2VuIGluIGEgaGVhZGVyKS4KY29uc3QgamFyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307CmFzeW5jIGZ1bmN0aW9uIGNhbGwobWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pIHsKICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBjb29raWU6IE9iamVjdC5lbnRyaWVzKGphcikubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKS5qb2luKCc7ICcpIH07CiAgY29uc3QgY3NyZiA9IGphclsnX19Ib3N0LWNzcmZfdG9rZW4nXSA/PyBqYXIuY3NyZl90b2tlbjsKICBpZiAoY3NyZikgaGVhZGVyc1sneC1jc3JmLXRva2VuJ10gPSBjc3JmOwogIGlmIChib2R5ICE9PSB1bmRlZmluZWQpIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nOwogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSX0ke3BhdGh9YCwgeyBtZXRob2QsIGhlYWRlcnMsIGJvZHk6IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEpTT04uc3RyaW5naWZ5KGJvZHkpIH0pOwogIGZvciAoY29uc3QgYyBvZiByZXMuaGVhZGVycy5nZXRTZXRDb29raWU/LigpID8/IFtdKSB7IGNvbnN0IGt2ID0gYy5zcGxpdCgnOycpWzBdOyBjb25zdCBpID0ga3YuaW5kZXhPZignPScpOyBqYXJba3Yuc2xpY2UoMCwgaSldID0ga3Yuc2xpY2UoaSArIDEpOyB9CiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgbGV0IGpzb246IGFueSA9IG51bGw7CiAgdHJ5IHsganNvbiA9IEpTT04ucGFyc2UodGV4dCk7IH0gY2F0Y2gge30KICByZXR1cm4geyBzdGF0dXM6IHJlcy5zdGF0dXMsIG9rOiByZXMub2ssIGpzb24sIHRleHQgfTsKfQpjb25zdCBsb2dpbiA9IGF3YWl0IGNhbGwoJ1BPU1QnLCAnL2NvbnNvbGUvYXBpL2xvZ2luJywgeyBlbWFpbDogRU1BSUwsIHBhc3N3b3JkOiBCdWZmZXIuZnJvbShQQVNTV09SRCkudG9TdHJpbmcoJ2Jhc2U2NCcpLCByZW1lbWJlcl9tZTogdHJ1ZSB9KTsKaWYgKCFsb2dpbi5vaykgc3RvcChgY2Fubm90IHNpZ24gaW4gdG8gRGlmeSBhcyAke0VNQUlMfSAoSFRUUCAke2xvZ2luLnN0YXR1c30pOyBpZiB5b3UgY2hhbmdlZCB0aGUgcGFzc3dvcmQgaW4gRGlmeSwgdXBkYXRlIEFETUlOX1BBU1NXT1JEIGFuZCByZWRlcGxveSBTZXR1cGApOwoKLy8gMy4gRWFjaCBwcm92aWRlcjogcGx1Z2luLCBrZXksIHRoZW4gcGljayBpdHMgbW9kZWxzLgpjb25zdCByZWFkeTogeyBwOiB0eXBlb2YgUFJPVklERVJTW251bWJlcl07IG1vZGVsczogYW55W10gfVtdID0gW107CmZvciAoY29uc3QgcCBvZiB3YW50ZWQpIHsKICBjb25zdCBsaXN0ID0gYXdhaXQgY2FsbCgnR0VUJywgJy9jb25zb2xlL2FwaS93b3Jrc3BhY2VzL2N1cnJlbnQvcGx1Z2luL2xpc3Q/cGFnZT0xJnBhZ2Vfc2l6ZT0xMDAnKTsKICBpZiAoIShsaXN0Lmpzb24/LnBsdWdpbnMgPz8gW10pLnNvbWUoKHg6IGFueSkgPT4geC5wbHVnaW5faWQgPT09IHAucGx1Z2luKSkgewogICAgY29uc3QgaWQgPSAoYXdhaXQgKGF3YWl0IGZldGNoKGAke01BUktFVFBMQUNFfS8ke3AucGx1Z2lufWApKS5qc29uKCkgYXMgYW55KT8uZGF0YT8ucGx1Z2luPy5sYXRlc3RfcGFja2FnZV9pZGVudGlmaWVyOwogICAgaWYgKCFpZCkgeyBsb2coYCR7cC5sYWJlbH06IGNvdWxkIG5vdCBmaW5kICR7cC5wbHVnaW59IGluIERpZnkncyBtYXJrZXRwbGFjZTsgc2tpcHBlZGApOyBjb250aW51ZTsgfQogICAgY29uc3QgaW5zdCA9IGF3YWl0IGNhbGwoJ1BPU1QnLCAnL2NvbnNvbGUvYXBpL3dvcmtzcGFjZXMvY3VycmVudC9wbHVnaW4vaW5zdGFsbC9tYXJrZXRwbGFjZScsIHsgcGx1Z2luX3VuaXF1ZV9pZGVudGlmaWVyczogW2lkXSB9KTsKICAgIGlmICghaW5zdC5vaykgeyBsb2coYCR7cC5sYWJlbH06IGluc3RhbGxpbmcgJHtpZH0gZmFpbGVkIChIVFRQICR7aW5zdC5zdGF0dXN9OiAke2luc3QudGV4dC5zbGljZSgwLCAyMDApfSk7IHNraXBwZWRgKTsgY29udGludWU7IH0KICAgIGxldCBzdGF0dXMgPSBpbnN0Lmpzb24/LmFsbF9pbnN0YWxsZWQgPyAnc3VjY2VzcycgOiAncnVubmluZyc7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwICYmIHN0YXR1cyAhPT0gJ3N1Y2Nlc3MnICYmIHN0YXR1cyAhPT0gJ2ZhaWxlZCc7IGkrKykgewogICAgICBhd2FpdCBzbGVlcCg1MDAwKTsKICAgICAgc3RhdHVzID0gKGF3YWl0IGNhbGwoJ0dFVCcsIGAvY29uc29sZS9hcGkvd29ya3NwYWNlcy9jdXJyZW50L3BsdWdpbi90YXNrcy8ke2luc3QuanNvbi50YXNrX2lkfWApKS5qc29uPy50YXNrPy5zdGF0dXMgPz8gc3RhdHVzOwogICAgfQogICAgaWYgKHN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7IGxvZyhgJHtwLmxhYmVsfTogdGhlIHBsdWdpbiBpbnN0YWxsIGRpZCBub3QgZmluaXNoICgke3N0YXR1c30pOyBza2lwcGVkYCk7IGNvbnRpbnVlOyB9CiAgICBsb2coYCR7cC5sYWJlbH06IGluc3RhbGxlZCAke2lkLnNwbGl0KCdAJylbMF19YCk7CiAgfQogIGxldCBtb2RlbHMgPSAoYXdhaXQgY2FsbCgnR0VUJywgYC9jb25zb2xlL2FwaS93b3Jrc3BhY2VzL2N1cnJlbnQvbW9kZWwtcHJvdmlkZXJzLyR7cC5wcm92aWRlcn0vbW9kZWxzYCkpLmpzb24/LmRhdGEgPz8gW107CiAgaWYgKCFtb2RlbHMuc29tZSgobTogYW55KSA9PiBtLnN0YXR1cyA9PT0gJ2FjdGl2ZScpKSB7CiAgICBjb25zdCBjcmVkID0gYXdhaXQgY2FsbCgnUE9TVCcsIGAvY29uc29sZS9hcGkvd29ya3NwYWNlcy9jdXJyZW50L21vZGVsLXByb3ZpZGVycy8ke3AucHJvdmlkZXJ9L2NyZWRlbnRpYWxzYCwgeyBjcmVkZW50aWFsczogeyBbcC5maWVsZF06IHAua2V5IH0sIG5hbWU6ICdTZXR1cCcgfSk7CiAgICBpZiAoIWNyZWQub2spIHsgbG9nKGAke3AubGFiZWx9OiBEaWZ5IHJlZnVzZWQgdGhlIGtleSAoJHtjcmVkLmpzb24/Lm1lc3NhZ2UgPz8gY3JlZC50ZXh0LnNsaWNlKDAsIDIwMCl9KS4gQ2hlY2sgdGhlIGtleSwgdGhlbiByZWRlcGxveSBTZXR1cCBvciBhZGQgaXQgaW4gU2V0dGluZ3MsIE1vZGVsIFByb3ZpZGVyLmApOyBjb250aW51ZTsgfQogICAgbG9nKGAke3AubGFiZWx9OiBhZGRlZCB0aGUga2V5YCk7CiAgICBtb2RlbHMgPSAoYXdhaXQgY2FsbCgnR0VUJywgYC9jb25zb2xlL2FwaS93b3Jrc3BhY2VzL2N1cnJlbnQvbW9kZWwtcHJvdmlkZXJzLyR7cC5wcm92aWRlcn0vbW9kZWxzYCkpLmpzb24/LmRhdGEgPz8gW107CiAgfSBlbHNlIHsKICAgIGxvZyhgJHtwLmxhYmVsfTogYSBrZXkgaXMgYWxyZWFkeSBzZXQ7IGxlZnQgYXMgaXNgKTsKICB9CiAgcmVhZHkucHVzaCh7IHAsIG1vZGVscyB9KTsKfQppZiAoIXJlYWR5Lmxlbmd0aCkgc3RvcChgbm8gbW9kZWwgcHJvdmlkZXIgY291bGQgYmUgc2V0IHVwOyBhZGQgb25lIGluIERpZnkgKFNldHRpbmdzLCBNb2RlbCBQcm92aWRlcikuIERpZnkgaXMgcmVhZHk6IG9wZW4gJHtVUkxfIHx8ICd0aGUgRGlmeSBzZXJ2aWNlIFVSTCd9IGFuZCBzaWduIGluLmApOwoKLy8gNC4gRGVmYXVsdCBtb2RlbHM6IGNoYXQgZnJvbSB0aGUgZmlyc3QgcHJvdmlkZXIgdGhhdCBoYXMgb25lOyBlbWJlZGRpbmdzIChmb3Iga25vd2xlZGdlIGJhc2VzKSBsaWtld2lzZS4KLy8gQSBjaGF0IG1vZGVsIG91dHNpZGUgdGhlIHByZWZlcnJlZCBsaXN0cyBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBub25lLCBzbyBsbG0gZmFsbHMgYmFjayB0byB0aGUgZmlyc3QgYWN0aXZlIG9uZS4KY29uc3QgYWN0aXZlID0gKG1vZGVsczogYW55W10sIHR5cGU6IHN0cmluZykgPT4gbW9kZWxzLmZpbHRlcigobSkgPT4gbS5tb2RlbF90eXBlID09PSB0eXBlICYmIG0uc3RhdHVzID09PSAnYWN0aXZlJykubWFwKChtKSA9PiBtLm1vZGVsIGFzIHN0cmluZyk7CmNvbnN0IHBpY2sgPSAodHlwZTogJ2xsbScgfCAndGV4dC1lbWJlZGRpbmcnKSA9PiB7CiAgZm9yIChjb25zdCB7IHAsIG1vZGVscyB9IG9mIHJlYWR5KSB7CiAgICBjb25zdCBuYW1lID0gKHR5cGUgPT09ICdsbG0nID8gcC5sbG0gOiBwLmVtYmVkZGluZykuZmluZCgobikgPT4gYWN0aXZlKG1vZGVscywgdHlwZSkuaW5jbHVkZXMobikpOwogICAgaWYgKG5hbWUpIHJldHVybiB7IHByb3ZpZGVyOiBwLnByb3ZpZGVyLCBtb2RlbDogbmFtZSB9OwogIH0KICBjb25zdCBmaXJzdCA9IHR5cGUgPT09ICdsbG0nICYmIHJlYWR5LmZpbmQoKHsgbW9kZWxzIH0pID0+IGFjdGl2ZShtb2RlbHMsICdsbG0nKS5sZW5ndGgpOwogIHJldHVybiBmaXJzdCA/IHsgcHJvdmlkZXI6IGZpcnN0LnAucHJvdmlkZXIsIG1vZGVsOiBhY3RpdmUoZmlyc3QubW9kZWxzLCAnbGxtJylbMF0gfSA6IG51bGw7Cn07CmNvbnN0IGxsbSA9IHBpY2soJ2xsbScpOwpjb25zdCBlbWJlZGRpbmcgPSBwaWNrKCd0ZXh0LWVtYmVkZGluZycpOwpjb25zdCBjdXJyZW50ID0gYXN5bmMgKHR5cGU6IHN0cmluZykgPT4gKGF3YWl0IGNhbGwoJ0dFVCcsIGAvY29uc29sZS9hcGkvd29ya3NwYWNlcy9jdXJyZW50L2RlZmF1bHQtbW9kZWw/bW9kZWxfdHlwZT0ke3R5cGV9YCkpLmpzb24/LmRhdGE7CmNvbnN0IHNldHRpbmdzOiBhbnlbXSA9IFtdOwppZiAobGxtICYmICEoYXdhaXQgY3VycmVudCgnbGxtJykpKSBzZXR0aW5ncy5wdXNoKHsgbW9kZWxfdHlwZTogJ2xsbScsIHByb3ZpZGVyOiBsbG0ucHJvdmlkZXIsIG1vZGVsOiBsbG0ubW9kZWwgfSk7CmlmIChlbWJlZGRpbmcgJiYgIShhd2FpdCBjdXJyZW50KCd0ZXh0LWVtYmVkZGluZycpKSkgc2V0dGluZ3MucHVzaCh7IG1vZGVsX3R5cGU6ICd0ZXh0LWVtYmVkZGluZycsIHByb3ZpZGVyOiBlbWJlZGRpbmcucHJvdmlkZXIsIG1vZGVsOiBlbWJlZGRpbmcubW9kZWwgfSk7CmlmIChzZXR0aW5ncy5sZW5ndGgpIHsKICBjb25zdCByZXMgPSBhd2FpdCBjYWxsKCdQT1NUJywgJy9jb25zb2xlL2FwaS93b3Jrc3BhY2VzL2N1cnJlbnQvZGVmYXVsdC1tb2RlbCcsIHsgbW9kZWxfc2V0dGluZ3M6IHNldHRpbmdzIH0pOwogIGlmICghcmVzLm9rKSBsb2coYHNldHRpbmcgZGVmYXVsdCBtb2RlbHMgZmFpbGVkIChIVFRQICR7cmVzLnN0YXR1c30pOyBwaWNrIHRoZW0gaW4gU2V0dGluZ3MsIE1vZGVsIFByb3ZpZGVyLCBTeXN0ZW0gTW9kZWwgU2V0dGluZ3NgKTsKICBlbHNlIGZvciAoY29uc3QgcyBvZiBzZXR0aW5ncykgbG9nKGBkZWZhdWx0ICR7cy5tb2RlbF90eXBlID09PSAnbGxtJyA/ICdjaGF0JyA6ICdlbWJlZGRpbmcnfSBtb2RlbDogJHtzLm1vZGVsfWApOwp9IGVsc2UgewogIGxvZygnZGVmYXVsdCBtb2RlbHMgd2VyZSBhbHJlYWR5IHNldDsgbGVmdCBhcyB0aGV5IGFyZScpOwp9CmlmICghZW1iZWRkaW5nKSBsb2coJ25vIGVtYmVkZGluZyBtb2RlbCBhbW9uZyB5b3VyIGtleXM6IGtub3dsZWRnZSBiYXNlcyBuZWVkIG9uZSAoYWRkIGFuIE9wZW5BSSBvciBPcGVuUm91dGVyIGtleSksIG9yIHVzZSB0aGVpciBFY29ub215IGluZGV4IG1vZGUnKTsKbG9nKGBEaWZ5IGlzIHJlYWR5OiBvcGVuICR7VVJMXyB8fCAndGhlIERpZnkgc2VydmljZSBVUkwnfSBhbmQgc2lnbiBpbiB3aXRoIEFETUlOX0VNQUlMIGFuZCBBRE1JTl9QQVNTV09SRC5gKTsK",
                    "healthcheckPath": null,
                    "restartPolicyType": "NEVER",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp/function-bun:1.3.0"
                  },
                  "variables": {
                    "DIFY_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "ADMIN_NAME": {
                      "isOptional": true,
                      "description": "Your display name in Dify. Defaults to Admin.",
                      "defaultValue": ""
                    },
                    "ADMIN_EMAIL": {
                      "description": "Your email address. You sign in to Dify with it; Setup creates this admin on the first deploy.",
                      "defaultValue": "{{ADMIN_EMAIL}}"
                    },
                    "DIFY_API_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "INIT_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{API.INIT_PASSWORD}}"
                    },
                    "ADMIN_PASSWORD": {
                      "description": "Your Dify password: at least 8 characters, with a letter and a number.",
                      "defaultValue": "{{ADMIN_PASSWORD}}"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": true,
                      "description": "OpenAI API key (platform.openai.com/api-keys). Setup installs the OpenAI plugin, adds the key and makes gpt-4o-mini and text-embedding-3-small your defaults.",
                      "defaultValue": ""
                    },
                    "ANTHROPIC_API_KEY": {
                      "isOptional": true,
                      "description": "Anthropic API key (console.anthropic.com). Setup installs the Anthropic plugin and adds the key; Claude becomes the default chat model when no OpenAI key is given.",
                      "defaultValue": ""
                    },
                    "OPENROUTER_API_KEY": {
                      "isOptional": true,
                      "description": "OpenRouter API key (openrouter.ai/keys): one key for models from many providers. Setup installs the OpenRouter plugin and adds the key.",
                      "defaultValue": ""
                    }
                  }
                },
                "d11c7062-0a14-4edb-8436-162228b36998": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/postgresql.svg",
                  "name": "Postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "pgvector/pgvector:pg17"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "PGHOST": {
                      "isOptional": false,
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "PGPORT": {
                      "isOptional": false,
                      "defaultValue": "5432"
                    },
                    "PGUSER": {
                      "isOptional": false,
                      "defaultValue": "${{POSTGRES_USER}}"
                    },
                    "PGDATABASE": {
                      "isOptional": false,
                      "defaultValue": "${{POSTGRES_DB}}"
                    },
                    "PGPASSWORD": {
                      "isOptional": false,
                      "defaultValue": "${{POSTGRES_PASSWORD}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "defaultValue": "dify"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://${{PGUSER}}:${{POSTGRES_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:5432/${{PGDATABASE}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "defaultValue": "60"
                    }
                  },
                  "volumeMounts": {
                    "d11c7062-0a14-4edb-8436-162228b36998": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "f2248d9a-6f53-4ba5-8ebd-4f5662bce393": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@ff030029127cc39bd7212cc10fe36eefde0019ea/service-icons/dify.svg",
                  "name": "Web",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/signin",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "langgenius/dify-web:1.18.0"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "3000"
                    },
                    "HOSTNAME": {
                      "isOptional": false,
                      "defaultValue": "::"
                    },
                    "APP_API_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "MAX_TOOLS_NUM": {
                      "isOptional": false,
                      "defaultValue": "10"
                    },
                    "MAX_TREE_DEPTH": {
                      "isOptional": false,
                      "defaultValue": "50"
                    },
                    "CONSOLE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "CONSOLE_WEB_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "MARKETPLACE_URL": {
                      "isOptional": false,
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "TOP_K_MAX_VALUE": {
                      "isOptional": false,
                      "defaultValue": "10"
                    },
                    "MAX_ITERATIONS_NUM": {
                      "isOptional": false,
                      "defaultValue": "99"
                    },
                    "MAX_PARALLEL_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "10"
                    },
                    "LOOP_NODE_MAX_COUNT": {
                      "isOptional": false,
                      "defaultValue": "100"
                    },
                    "MARKETPLACE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "https://marketplace.dify.ai"
                    },
                    "NEXT_PUBLIC_SOCKET_URL": {
                      "isOptional": false,
                      "defaultValue": "wss://${{Dify.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SERVER_CONSOLE_API_URL": {
                      "isOptional": false,
                      "defaultValue": "http://${{API.RAILWAY_PRIVATE_DOMAIN}}:5001"
                    },
                    "NEXT_TELEMETRY_DISABLED": {
                      "isOptional": false,
                      "defaultValue": "1"
                    },
                    "TEXT_GENERATION_TIMEOUT_MS": {
                      "isOptional": false,
                      "defaultValue": "60000"
                    },
                    "NEXT_PUBLIC_ENABLE_AGENT_V2": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH": {
                      "isOptional": false,
                      "defaultValue": "4000"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "Dify",
      "method": "GET",
      "path": "/healthz",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 10,
    "needs_volume": true
  },
  "generated_at": "2026-10-29T04:15:00.444Z",
  "generator_version": "0.1.0"
}
